Per-Ride Opt-In - Rider Flow
The Levy Cover opt-in card is the single point of contact between the rider and the insurance product. It sits on the unlock screen, after waiver acceptance and before motor engagement. This page describes exactly what the rider sees, how the decision is recorded, and what happens after.
When the card appears
The opt-in card appears when all of the following are true:
- The vehicle's unlock location resolves to a jurisdiction marked
available: truein the matrix. - The subaccount has Levy Cover enabled at
/dashboard/insurance/settings. - The carrier returned a successful quote within the 2-second budget at unlock.
- The rider has accepted the rental waiver.
If any of these is false, the card never appears. Levy fails open - the absence of insurance never blocks an unlock.
What the card shows
| Element | Detail |
|---|---|
| Tier name | "Standard" in v1; selector with three tiers in v2 |
| Coverage summary | Three plain-language bullets: what's covered, what's not, claim TTL |
| Price | Exact premium for this ride, in the rider's currency (e.g. "$1.00 for this ride") |
| Policy wording link | Opens the full carrier policy wording in the rider's locale |
| Decline link | Plain text, fully tappable, no visual de-emphasis |
| Add coverage button | Primary CTA |
| Remember preference toggle | Default off; if on, the rider's decision applies to future rides until they change it |
The card is rendered by LevyCoverOptInCard in the mobile app. It uses libraries already present in the app - no new native modules.
Languages
The card supports all five Levy languages: English, German, Spanish, French, Portuguese. The policy wording is shown in the rider's locale when the carrier supports it. If the carrier does not have wording in the rider's locale, the card falls back to English and shows an explicit disclosure that the wording is in English.
How acceptance is recorded
When the rider taps Add coverage:
- The mobile app calls
POST /api/mobile/insurance/cover/bindwith the chosen tier. - The Levy backend calls Cover Genius
POST /bookingswith idempotency-keyed payload. - The carrier returns a policy ID, which Levy stores on
ride_insurance_policies:carrier_policy_idtierpremium_amountandpremium_currencylevy_commission_amountandoperator_commission_amountpolicy_wording_version- the exact wording version the rider saw, stored verbatimbound_attimestamp
- The vehicle unlocks. The ride starts. The policy is active.
The wording version stamp is important. If wording changes mid-quarter, every existing bound policy still references the version the rider actually saw.
What "decline" does
When the rider taps Decline:
- The mobile app calls the unlock endpoint without an insurance payload.
- The ride is marked
insurance_offered = trueandinsurance_accepted = false. - No premium is charged. No policy is bound.
- If "Remember my choice" is toggled on, the rider preference is recorded against their profile. Future rides on enabled subaccounts skip the card until they change the preference.
Declines are stored. This is necessary for DOI reporting in jurisdictions that require us to demonstrate transparent opt-in (vs forced enrollment).
Quote timing and TTL
Quotes are fetched at unlock. They are valid for 5 minutes. If the rider holds the unlock screen for more than 5 minutes, the next bind call re-quotes automatically before binding. This prevents stale pricing if carrier-side risk factors changed (e.g. weather, time of day, zone).
If the bind call fails - carrier API timeout, declined card on premium charge, etc. - see Troubleshooting.
Multi-ride and family scenarios
v1 covers only the account holder. If a rider opens a vehicle for a friend or a family member, only the account holder is named on the policy. Passenger coverage is not in scope for v1 and the UX must say this explicitly on the policy wording.
For car-share rides with multiple occupants, the same rule applies. The driver is the named insured.
Cross-jurisdiction rides
Coverage is determined by unlock location. A ride that starts in a covered jurisdiction and ends in an uncovered one is still bound under the unlock-location policy. The carrier's policy wording specifies the geographic scope of coverage and what happens if the ride leaves it.
We do not currently re-bind mid-ride. v1 commits to one policy per ride, decided at unlock.
Persistent rider preference
The "Remember my choice" toggle stores the rider's decision in their mobile profile. Three states:
- No preference - card is shown every ride.
- Always accept Standard - card shows briefly with a "you've enabled Cover" confirmation, then auto-binds.
- Always decline - card does not appear at all.
The rider can change this anywhere in the app's settings menu. DOI guidance in some states requires that "always decline" be re-prompted periodically; the prompt cadence is configurable per jurisdiction.
No dark patterns
The decline link is plain text, fully tappable, and visually equal-weight to the accept button. This is deliberate. DOI scrutiny on dark patterns in embedded insurance is high.
Receipt presentation
At ride end, the premium appears on the receipt as a separate line item:
Levy Cover - Standard $1.00
The premium is part of the ride total but is tax-isolated - rides.tax_amount excludes the premium because insurance premium tax is handled by the carrier in most jurisdictions. The commission split (carrier net, Levy commission, operator commission) is not disclosed to the rider.
Next
Read Coverage Tiers for what each tier protects against, or Filing a Claim - Rider Flow for the post-ride claim path.
Need help?
Questions on the rider opt-in flow, contact support@levyelectric.com.