beginner
rider-score
faq
questions

Rider Score FAQ

Common questions about Rider Score - rider, operator, legal, and integration questions answered.

Levy Fleets TeamMay 18, 20269 min read

Rider Score FAQ

General

Is Rider Score on by default?

No. It is per-subaccount opt-in at Dashboard > Rider Score > Settings. Until you toggle it on, no scoring runs, no rewards are issued, and no interventions fire.

Does scoring slow down ride completion?

No. The post-ride score job is async. Failures in the rider-score subsystem are logged but never block a ride from ending.

What if I want to disable it after enabling it?

Toggle the feature off. Existing scores are preserved (in case you re-enable). Pending rewards are not issued. Open interventions are paused, not deleted. You can re-enable any time without losing history.

Is my rider's score visible to other operators?

Not in v1. A score is per-subaccount. The same customer riding on Operator A and Operator B has two independent scores. Cross-subaccount signaling is a v4 feature and will be opt-in.

Scoring math

Why did a ride get a low score even though the rider did nothing obviously wrong?

The most common culprits, in order:

  1. Zone speed limit too low. Speed compliance compares against the zone limit. If the zone is set to 10 mph but the road is a 25-mph residential street, the rider gets penalized.
  2. Parking zone polygon wrong. Parking compliance is binary - either the end-of-ride event is inside an approved zone or it is not. A misshapen polygon penalizes legitimate parking.
  3. GPS noise. Short trips with sparse GPS samples score noisily. The min_ride_seconds and min_ride_meters thresholds exist to filter this out, but borderline rides still suffer.
  4. Open violation on the account. Each open violation removes 5 points. If a violation is closed (paid, waived, dispute accepted) the next score will not carry the penalty.

Why is sidewalk-event weight zero?

Because the CV pipeline that produces sidewalk events has not shipped yet (project 4). The signal is plumbed at weight zero so it can be turned on the day the CV pipeline goes live, with no schema or weights-snapshot migration needed.

Can I score using only my own signals and ignore the defaults?

Yes. Set every default weight to 0 in rider_score_weights and write your own logic against ride_safety_signals via a custom column. Levy support can help configure this.

Are weights public?

To the rider, yes. The breakdown screen surfaces every signal that contributed to the score along with its weight. This is by-design transparency.

Rewards

How do wallet credits get to the rider?

Through the existing ride-refund pipeline. Specifically:

  1. A rider_score_rewards row is inserted.
  2. A ride_refunds row is created.
  3. creditWalletForRefund() issues the credit against that refund row.
  4. The reward row is finalized with linked ids.

We never write wallet_balance directly. We never insert into wallet_transactions by hand. See CLAUDE.md refund guardrails.

Can I issue a one-off bonus wallet credit through Rider Score?

No. Rider Score only issues tier-driven rewards. For one-off credits, use the standard ride-refund or manual-credit flow in the wallet UI - but those, too, must go through the refund pipeline.

Why was a reward marked skipped_cap?

The per-rider monthly cap is calendar-month based. Once a rider hits their cap, further rewards are recorded for audit but not issued. The cap resets on the first of the next month in the subaccount's timezone.

What is the difference between skipped_cap and skipped_budget?

  • skipped_cap: the per-rider monthly limit was hit. Other riders are still eligible.
  • skipped_budget: the fleet-wide monthly budget was exhausted. No further rewards issue this month for any rider.

Interventions

What does the throttle cap actually do?

Step 4 of the ladder calls disableVehicleThrottle() from src/lib/iot/disable-throttle.ts. Today, vehicles fall back to full throttle disable as the conservative bound. Targeted partial caps (true Beginner-mode reduced top speed) are wired in per OEM as part of the v2 roadmap. OKAI, Segway, and Omni 4G are the candidates for true partial cap. Vehicles whose IoT does not support throttle commands skip step 4 and escalate to step 5 on the next unsafe trip.

Can I skip a ladder step?

You cannot remove a step from the ordered ladder. You can effectively skip it by setting its threshold to a value the rider will never hit (e.g. set step 4 threshold to 0).

Can a rider unlock a vehicle during a temp lockout?

No. The pre-unlock gate at the rides-start API returns 403 with reason='temp_lockout'. The lockout clears automatically at expires_at or earlier if an appeal is upheld.

What stops a rider from creating a new account to escape a low score?

KYC reuse, phone verification, device fingerprinting, and Stripe Identity (for repeat offenders). None of these are perfect on their own; together they make sock-puppet accounts costly enough that the gaming is rare. v3.1 may add cross-account fraud signaling.

Helmet selfie

Why is the table named rider_helmet_selfies and not helmet_verifications?

To avoid a collision with the computer-vision pipeline's helmet_verifications table (a different concept). The rider-score selfie verification table is rider_helmet_selfies. Older internal docs that reference helmet_verifications in the rider-score context are stale.

Does Levy do face recognition on the selfie?

No. We do not run face recognition. v3.0 trusts the live-capture timestamp. v3.1 will add a CV check that confirms a helmet is present in frame - and that is the only thing we check. Selfies are never used for face matching, identification, or law enforcement.

How long do selfies live in storage?

The image file is deleted by the helmet-verification-cleanup cron at ttl_expires_at + 30 days unless the verification is linked to an open dispute or appeal.

Can a rider reuse another rider's selfie?

No. Selfies are keyed to customer_uuid and the capture flow forces live camera. The mobile app does not allow camera-roll uploads for helmet verification.

Safe Ride Check (reaction test)

Is this a sobriety test?

No. The in-app copy is explicit: "This is not a medical or legal test of impairment." Frame the feature accordingly when communicating with riders, regulators, or insurers. Results are never shared with law enforcement except by warrant.

Why 450ms median reaction time?

Empirical defaults from the Voi and Bolt deployments. Adjust at Settings > Safe Ride Check if your demographic patterns suggest a different threshold. We do not recommend going below 350ms (too many false fails) or above 600ms (loses correlation with attentiveness).

Does failing the Safe Ride Check hurt my score?

No. A single fail produces a 30-minute cooldown. Three fails in 24h opens a step-6 temp lockout - that is the only score-adjacent consequence, and even then the lockout does not directly modify the rolling score.

Can a rider with a disability skip the reaction test?

Yes, via an operator-set exemption on the rider profile. The exemption skips the reaction test entirely. v3.0 is a manual operator flag; v3.1 will add an in-app accessibility flag the rider can request themselves.

Appeals

How long does the operator have to resolve an appeal?

Default 7 days. Editable per-subaccount at Settings > Appeals SLA. We do not recommend going below 3 days.

Who reviews appeals?

The operator, not Levy. Levy support can be pulled in on escalations (fraud, regulatory, bias). If a subaccount is paused with no available operator, Levy fields appeals to protect the SLA.

What happens to active interventions while an appeal is pending?

They are paused. Throttle caps do not apply on the next ride. Temp lockouts do not apply. The expiration timer also pauses - rejection restores the remaining time from where it stopped.

Can a rider file unlimited appeals?

Only one pending appeal per ride. Once resolved, the rider can file a new appeal on a different ride. The system does not currently rate-limit appeals across rides (open product question - revisit if abuse emerges).

Is rider score data shared with insurers?

Only in aggregate, with no rider PII. Per-rider data goes to insurers only with explicit rider consent or via the per-ride micro-insurance webhook (v4) which routes premium tiers, not full breakdowns.

Is rider score data shared with cities for permit reports?

Yes, in aggregate. Cities get rollups (safe-rider %, parking compliance %, geofence violation rate per 1k rides) - no per-rider data unless legally compelled.

Is rider score data shared with law enforcement?

Only by warrant or subpoena - same standard as our existing data-request policy. The reaction-test framing in particular is structured to not produce data law enforcement would want as a routine matter.

Does Rider Score comply with GDPR?

The appeal flow is the GDPR / CCPA right-to-correction mechanism. Riders can also request full export and deletion of their score data through the standard data-rights workflow at /account/privacy.

Integration and dev

Can I read trip scores via API?

Yes. GET /api/mobile/rider/score/[rideId] returns the per-trip breakdown for a rider. Operator-side dashboards read from ride_safety_signals via the standard subaccount-scoped Supabase clients.

Does Rider Score have a webhook?

In v4, yes - rider_score_events are dispatched to the per-subaccount insurance webhook with HMAC-SHA256 signatures. Outside the insurance hook, no public webhook in v1-v3.

How do I trigger a manual recompute?

POST /api/internal/rider-score/recompute with { rideId, customerId, or subaccountId }. The nightly cron also recomputes any stale rows.

Where do I file a bug?

support@levyelectric.com with the affected customer_uuid, ride_uuid, and a short description. Bugs in the rider-score subsystem are triaged at the same priority as billing bugs.


Did not see your question?

Email support@levyelectric.com and we will add it here.