advanced
rider-score
settings
weights

Weights and Settings

Every configurable knob in Rider Score - weights, thresholds, tier rules, ladder rules, reward caps, helmet TTL, Safe Ride Check.

Levy Fleets TeamMay 18, 202610 min read

Weights and Settings

Every important knob in Rider Score is per-subaccount. The defaults are conservative; the levers below let you reshape the system for your fleet's risk profile, pricing model, and rider demographics.

Navigation

All settings live at Dashboard > Rider Score > Settings. Sub-tabs: General, Weights, Tiers, Ladder rules, Helmet selfie, Safe Ride Check, Reward budget.

General settings

subaccount_rider_score_settings row.

SettingDefaultDescription
enabledfalseMaster toggle. Off means no scoring, no rewards, no interventions.
cold_start_min_rides3Number of scored rides before the rider exits Beginner tier.
min_ride_seconds60Rides shorter than this do not contribute to rolling score.
min_ride_meters200Rides shorter than this do not contribute to rolling score.
window_days90Rolling-score window.
halflife_days30EWMA halflife inside the window.
reward_cap_cents_per_rider_month1000 ($10)Per-rider monthly wallet credit cap across all tiers.
monthly_subaccount_budget_cents25000 ($250)Fleet-wide monthly cap.
appeal_sla_days7Operator SLA for resolving appeals.
insurance_webhook_urlnullv4 only - per-subaccount webhook for rider_score_events.
insurance_webhook_secretnullv4 only - HMAC secret for webhook signatures.

Weights

rider_score_weights row.

WeightDefaultRange
speed_compliance200-100
parking_compliance150-100
geofence_violation150-100
hard_brake100-100
throttle_aggression100-100
clean_end100-100
helmet_verified100-100
sidewalk_event10 (effective 0 until CV ships)0-100
open_violation_penalty5 per0-25
open_intervention_penalty2 per0-10

Thresholds:

ThresholdDefaultWhat it does
hard_brake_threshold_mps23.5Deceleration above this counts as a hard brake event
throttle_high_pct85Throttle position above this counts as "aggressive" for the throttle-aggression %
geofence_decay_minutes30Mid-ride geofence violations decay linearly to 0 weight at this many minutes after they happened

We recommend leaving the defaults for the first 4 weeks after enabling. Adjust based on the Distribution histogram - if too many riders are clustered in At Risk or Bronze, your penalty weights are too high.

Tiers

rider_score_tiers rows (one per tier per subaccount, six default tiers).

For each tier, the editable fields are:

FieldUsed for
min_score, max_scoreScore range
unlock_discount_pctDiscount at ride start
ride_discount_pctDiscount at ride end
free_unlock_count_per_monthFree unlocks per calendar month
per_ride_credit_centsAuto wallet credit per qualifying scored ride
monthly_credit_cap_cents_per_riderPer-tier cap (composed with subaccount cap)
price_uplift_pctAt Risk tier only - positive uplift
badge_colorHex color for the tier badge
perksJSONB of customer-facing perk strings

See Reward Tiers for the full structure.

Ladder rules

rider_intervention_rules row. JSONB with the ladder configuration.

FieldDefaultDescription
step1_threshold70Score below this triggers step 1
step2_consecutive_count2Number of consecutive sub-60 rides for step 2
step2_threshold60Score floor for step 2
step3_threshold50Score below this OR an open violation triggers step 3
step4_threshold40Score below this triggers step 4 (throttle cap)
step5_threshold30Score below this triggers step 5 (price uplift)
step5_ride_count10Number of rides the uplift applies to
step5_uplift_pct25Uplift percentage
step6_threshold20Score below this OR 3 unpaid violations triggers step 6
step6_unpaid_violation_count3Threshold for step 6 violation trigger
step6_lockout_hours1687 days
step7_repeat_window_days60If step 6 fired within this many days, step 7 fires
step7_requires_manual_reviewtruePermanent ban gated behind operator approval (recommended on)

See Intervention Ladder for what each step actually does.

Helmet selfie

SettingDefaultDescription
helmet_discount_unlock_fee_cents50 ($0.50)Cents off the unlock fee per verified ride
helmet_ttl_hours24Verification validity window
helmet_single_usefalseIf true, the verification is consumed at first unlock
helmet_unlocks_silver_for_beginnerstrueCold-start riders with a verified selfie get Silver-tier perks

Storage retention is fixed: image deleted at ttl_expires_at + 30 days unless a dispute references it.

Safe Ride Check

SettingDefaultDescription
reaction_window_enabledtrueEnable the night-window trigger
reaction_window_start_local22:00Trigger window start (local time)
reaction_window_end_local04:00Trigger window end (wraps midnight - handled in code)
reaction_median_threshold_ms450Max median reaction time to pass
reaction_max_misses1Max misses to pass
reaction_test_round_count5Number of rounds
reaction_test_timeout_ms3000Per-round timeout
reaction_repeat_hours6Do not re-prompt the same rider within this many hours of a pass
reaction_random_trigger_pct0Random unlocks (any time) that get the test - keep low
reaction_appeal_trigger_enabledfalseRequire a pass before resolving a step-6 lockout appeal

See Reaction-Time Safe Ride Check for the full flow.

Reward budget

The budget governs how much money Rider Score is allowed to issue as wallet credit per month.

SettingDefaultDescription
monthly_subaccount_budget_cents25000 ($250)Hard fleet-wide cap
monthly_subaccount_soft_warning_pct80When we hit this % of the cap, an in-dashboard warning surfaces
reward_cap_cents_per_rider_month1000 ($10)Per-rider cap, composed with per-tier cap

When the fleet budget is exhausted for the month, new rewards are recorded as status='skipped_budget' instead of being issued. They are NOT retroactively granted when the month rolls over.

How to change settings safely

  1. Toggle changes (enable/disable, ladder step on/off) take effect immediately.
  2. Threshold changes (weights, tier thresholds, ladder thresholds) only affect future scores. Existing trip scores keep their weights_snapshot and do not retroactively change.
  3. Rolling score recomputes overnight using the new weights via the rider-score-recompute cron. Tier reassignments are pushed to riders as push notifications.
  4. Hard config changes (e.g. changing the window from 90 days to 60 days) trigger a one-time full recompute across the subaccount on the next cron run.

API surface

EndpointNotes
GET/PUT /api/dashboard/rider-score/settingsGeneral settings
GET/PUT /api/dashboard/rider-score/weightsWeights and thresholds
GET/PUT /api/dashboard/rider-score/tiersTier rows
GET/PUT /api/dashboard/rider-score/rulesLadder rules

All four endpoints require operator role permissions, RLS-scoped to your subaccount.

Crons that read these settings

CronFrequencyReads
/api/cron/rider-score-recomputeNightlyAll settings - full recompute, expires stale interventions
/api/cron/rider-score-insurance-dispatchEvery 10 minInsurance webhook URL, secret
/api/cron/helmet-verification-cleanupDailyHelmet TTL, storage retention

If any of these are missing from your vercel.json, the operator setup checklist will surface a warning at Settings > Health.


Next

See Troubleshooting if a setting change does not appear to take effect. See Rider-Facing Experience to understand what the rider sees when you change a setting.