Getting Started with Levy Cover
This guide walks you through enabling Levy Cover on a subaccount from a cold start. It assumes the carrier partnership has been signed and you have sandbox or production credentials from Cover Genius.
Partnership-gated
Levy Cover requires a signed distributor agreement with Cover Genius (or another supported carrier) before it can run against production. Until credentials are populated, the carrier client throws CarrierNotConfiguredError and the mock carrier is used in non-prod environments only.
Prerequisites
Before you start, confirm:
- The subaccount has Stripe Connect onboarding completed.
- The subaccount operates in at least one jurisdiction in the Jurisdiction Matrix.
- You have Cover Genius
API_KEYandPARTNER_IDvalues (sandbox or production). - Riders on this subaccount are using a mobile-app build that includes the Levy Cover opt-in card (shipped with mobile-app SDK runtime version covering project #09).
Step 1 - Set the carrier credentials
Set the two environment variables on Vercel for every environment that will hit production traffic:
COVER_GENIUS_API_KEY=<from Cover Genius portal>
COVER_GENIUS_PARTNER_ID=<from Cover Genius portal>
Full instructions are in Carrier Credentials Setup. The carrier client reads these at runtime - no deploy required after rotation, but a redeploy is required the first time you set them.
Step 2 - Verify the jurisdiction matrix
Open the matrix at /dashboard/insurance/settings and confirm the unlock locations you serve are marked available: true with the carrier you intend to use. Initial supported jurisdictions:
- US: California, Texas, Florida, North Carolina, Massachusetts (Phase 1). Colorado, Arizona, Georgia, Oregon, Tennessee added in Phase 2.
- EU: Germany, France, Netherlands, Portugal.
- Excluded: New York, Washington (DOI friction). Out of scope in v1.
If your jurisdiction is missing, contact support - we either add it to the matrix and the insurance_offerings table, or the carrier is not yet licensed there.
Step 3 - Configure the offering
Still at /dashboard/insurance/settings:
- Toggle Levy Cover on for the subaccount.
- Choose which tiers to offer. v1 ships only "Standard"; v2 unlocks "Minimal" and "Premium".
- Set the operator commission percentage. The default comes from the global
INSURANCE_OPERATOR_SHARE_PCTenv var (typically 50% of Levy's gross commission); per-subaccount values override that. - Save.
The settings page writes to the insurance_offerings table, which is the runtime source of truth for opt-in availability and commission math.
Step 4 - Test in sandbox
Before going live:
- Configure Cover Genius sandbox credentials in a preview environment.
- Unlock a vehicle on a sandbox subaccount. Confirm the opt-in card appears.
- Accept the offer, complete the ride, and check the receipt - "Levy Cover - Standard - $1.00" should appear as a separate line item.
- File a test claim from ride history. Upload at least one photo. Confirm the claim lands in the operator queue at
/dashboard/insurance/claims. - Inspect
ride_insurance_policiesandinsurance_claimsin the database - both should have the carrier IDs returned by Cover Genius sandbox.
Step 5 - Promote to production
When sandbox UAT is clean and Cover Genius has signed off:
- Set production
COVER_GENIUS_API_KEYandCOVER_GENIUS_PARTNER_IDin Vercel production env. - Verify the webhook receiver URL is registered with the carrier:
https://fleets.levyelectric.com/api/webhooks/insurance/cover-genius. - Enable the subaccount toggle in production.
- Watch the first 10-20 insured rides. Monitor
insurance_webhook_logforsignature_verified = trueon every inbound event.
Step 6 - Hand off to ops
Tell Levy ops:
- Which subaccount is now live.
- Which jurisdictions are covered.
- Operator commission percentage.
- Sandbox vs production carrier credentials in use.
Support tickets for "I crashed and want my money back" now route through the carrier claim flow rather than goodwill refunds.
Common first-day issues
| Symptom | Cause | Fix |
|---|---|---|
| Opt-in card never appears | Subaccount toggle off, or jurisdiction not in matrix | Re-check /dashboard/insurance/settings; confirm unlock location resolves to a supported region |
CarrierNotConfiguredError in logs | Env vars not set | Set COVER_GENIUS_API_KEY and COVER_GENIUS_PARTNER_ID, redeploy |
| Bind call returns 200 but no policy in DB | Webhook URL not registered with carrier | Register /api/webhooks/insurance/cover-genius with Cover Genius; rerun reconciliation cron |
| Premium not on receipt | Ride completion pipeline did not apply the helper | Verify process-ride-completion.ts includes applyRideInsuranceToPricing |
| Claim upload fails | Storage bucket policies not applied | Confirm the insurance-claims private bucket exists with rider upload/read policy |
Next
Once the carrier is enabled, read Per-Ride Opt-In - Rider Flow to understand what the rider sees, and Filing a Claim - Rider Flow for the claim path.
Need help?
Questions on Levy Cover setup, contact support@levyelectric.com.