v2.0

GoRules Version 2 is here - redesigned, now with managed cloud.GoRules Version 2 is here!

Watch the launch videoWatch

Traffic Violation Penalty Calculator

Automated system that determines appropriate fines, points, and penalties for traffic violations based on severity, driver history, and circumstances.

Solution

This traffic violation assessment system calculates fair and consistent penalties by analyzing multiple factors in each case. The system first classifies violations by type and severity, assigning base fines and points according to established guidelines. For speeding violations, the system factors in the exact speed over the limit, with higher excesses resulting in steeper penalties.

The system then applies circumstantial modifiers based on location (with special attention to school zones), the driver's violation history, and the overall severity classification. When violations occur in school zones or are committed by repeat offenders, penalties are appropriately increased. For severe violations with multiple previous offenses, the system can recommend license suspension. The final assessment includes a calculated risk level and payment deadline, with higher-risk violations receiving shorter payment windows and closer monitoring.

How it works

The decision graph processes violations through four interconnected stages:

  1. Violation Classification: Categorizes the offense based on type (speeding, DUI, etc.) and assigns initial severity level, points, and base fine amount.
  2. Penalty Calculation: Applies multipliers to the base penalty based on contextual factors like previous violations and school zone location. Determines if license suspension is warranted for severe cases.
  3. Assessment Finalization: Rounds calculated values to ensure clean, whole-number fines and point assessments.
  4. Risk Analysis: Evaluates the driver's risk level based on final point count and violation severity, then assigns appropriate payment deadlines-shorter for high-risk cases and longer for minor infractions.

Where teams use it

  • Municipal traffic courts
  • Police departments
  • Highway patrol agencies
  • DMV violation processing
  • Traffic enforcement agencies
  • Automated citation systems
  • Driver education programs
  • Insurance penalty assessments

Inside the decision model

Traffic Violation Penalty Calculator ships as a JDM decision graph with 5 nodes, 3 decision tables and 23 rules. Download it, load it into GoRules, and run it as-is on Zen Engine.

Decision graph5 nodes · read-only
input requesttable classify_violationtable calculate_penaltyexpression finalize_assessmenttable assess_risk_and_deadlines
01

Request

input

Two objects arrive with each citation: violation carries the type, speed_over_limit, and in_school_zone flag that determine the base penalty and modifiers, while driver contributes previous_violations for the repeat-offender rules. The date, location, and license_number fields are recorded but not used in any rule.

Sample requestJSON
{
  "violation": {
    "type": "speeding",
    "speed_over_limit": 25,
    "in_school_zone": true,
    "date": "2025-03-15T14:30:00Z",
    "location": "Main St & 5th Ave"
  },
  "driver": {
    "license_number": "DL123456789",
    "previous_violations": 1,
    "license_issue_date": "2020-06-15"
  }
}
02

Classify Violation

table

Offense type sets the baseline in a first-hit table over violation.type and violation.speed_over_limit. Speeding is graduated: > 30 over the limit is 'severe' with 4 points and a 300 base fine, > 15 is 'moderate' with 3 points and 150, and any lesser excess is 'minor' at 2 points and 75. Named offenses get fixed rows, 'dui' at the top with 6 points and 500, 'reckless_driving' at 5 points and 350, 'running_red_light' and 'driving_without_license' as 'moderate', and the empty catch-all prices unknown violation types as 'minor' with 1 point and 50.

Graduating speeding penalties by the margin over the limit is exactly how real fine schedules work, and placing DUI and reckless driving at the top of the point scale matches demerit systems everywhere, since points are meant to track crash risk rather than revenue. A nonzero default row is a deliberate safety net so an unrecognized offense still produces an enforceable minimum penalty instead of an error.

Decision tablefirst hit policy
Violation Typeviolation.typeSpeed Over Limitviolation.speed_over_limitSeverityassessment.severityPointsassessment.base_pointsBase Fineassessment.base_fine
'speeding'> 30'severe'4300
'speeding'> 15'moderate'3150
'speeding'-'minor'275
'running_red_light'-'moderate'3200
'illegal_turn'-'minor'2100
'dui'-'severe'6500

+3 more rows in the downloadable template

03

Calculate Penalty

table

Context scales the baseline here: the table crosses assessment.severity with driver.previous_violations and violation.in_school_zone under a first hit policy. The harshest row, 'severe' with > 2 priors in a school zone, doubles the fine via assessment.base_fine * 2, multiplies points by 1.5, and is the only row that sets license_suspension_recommended to true. Below it, plain 'severe' cases take a 1.5x fine, 'moderate' repeat offenders 1.25x on both fine and points, a 'moderate' school-zone offense 1.2x, 'minor' with > 3 priors 1.1x, and the default row passes base_fine and base_points through untouched.

Each multiplier has a real-world counterpart: many jurisdictions double fines in school zones, repeat offenders face enhanced penalties under habitual-offender provisions, and license suspension is normally reserved for the combination of a serious offense and a bad record rather than any single factor. The strictly decreasing multiplier ladder keeps the table's first-hit ordering honest, the worst applicable enhancement always wins.

Decision tablefirst hit policy
Severityassessment.severityPrevious Violationsdriver.previous_violationsIn School Zoneviolation.in_school_zoneFinal Fineassessment.final_fineFinal Pointsassessment.final_pointsLicense Suspension Recommendedassessment.license_suspension_recommended
'severe'> 2trueassessment.base_fine * 2assessment.base_points * 1.5true
'severe'--assessment.base_fine * 1.5assessment.base_pointsfalse
'moderate'> 2-assessment.base_fine * 1.25assessment.base_points * 1.25false
'moderate'-trueassessment.base_fine * 1.2assessment.base_pointsfalse
'minor'> 3-assessment.base_fine * 1.1assessment.base_pointsfalse
---assessment.base_fineassessment.base_pointsfalse
04

Finalize Assessment

expression

A small cleanup step applies round(assessment.final_fine) and round(assessment.final_points) before the risk stage. The 1.5x and 1.25x multipliers upstream can produce fractional values like 4.5 points, and citations must state whole-dollar fines and integer point assessments, so rounding here keeps the downstream >= 3 and >= 5 point comparisons and the printed penalty consistent.

Expressions2 fields
assessment.final_fineround(assessment.final_fine)
assessment.final_pointsround(assessment.final_points)
05

Assess Risk And Deadlines

table

Driver risk and the payment window come from crossing assessment.final_points with severity, first hit wins. A 'severe' violation carrying >= 5 points is the only 'high' risk outcome; >= 3 points yields 'medium' at any severity; and the point-agnostic rows at the bottom default to 'low', including a final empty catch-all. Deadlines run opposite to risk: every 'severe' row gets 15 days to pay, 'moderate' rows 30, and 'minor' or unmatched rows 45.

Using the points actually assessed, after enhancement, rather than the base offense makes the risk label reflect the full circumstances of the case. Shorter deadlines for serious violations are a sensible collections policy, keeping high-risk drivers from sitting on unpaid penalties, while the 45-day window for minor infractions mirrors the more lenient response periods typical for ordinary citations.

Decision tablefirst hit policy
Final Pointsassessment.final_pointsSeverityassessment.severityRisk Levelassessment.risk_levelPayment Deadline Daysassessment.payment_deadline_days
>= 5'severe''high'15
>= 3'severe''medium'15
>= 3'moderate''medium'30
>= 3'minor''medium'45
-'severe''low'15
-'moderate''low'30

+2 more rows in the downloadable template

Make this template
your own.

Load Traffic Violation Penalty Calculator into GoRules, adjust the rules to your policy, and ship it behind your own API.