intermediate
juicer
onboarding
KYC

Juicer Onboarding

How Juicers sign up, complete Stripe Identity KYC, set up Stripe Connect Express payouts, and pass the state allow-list check

Levy Fleets TeamMay 18, 20267 min read

Juicer Onboarding

A Juicer cannot claim a single bounty until they've cleared KYC, set up a payout account, and signed the safe-charging acknowledgement. The flow is designed to take under 10 minutes from "tap apply" to "first claimable bounty."

What a Juicer Needs Before Starting

  • A smartphone (iOS 16+ or Android 12+) with the Juicer app installed
  • A government-issued ID (driver's license, passport, or state ID)
  • The last 4 digits of their Social Security Number
  • A US bank account that supports ACH (for payouts)
  • A residential address inside an allowed state (more on that below)

Step 1: Application

The Juicer downloads the Juicer app (today shipped as a role-gated mode inside the operator-app — a role === 'juicer' membership row gates the UI), opens it, and taps Apply to be a Juicer.

They enter:

  • Legal name (must match the ID they'll upload)
  • Phone number
  • Email
  • Home address — used to set their home_geo PostGIS point and enforce the per-Juicer claim radius later

The app hits POST /api/juicer/onboarding, which:

  1. Upserts a juicers row tied to their auth.users.id
  2. Creates a Stripe Identity verification session
  3. Creates a Stripe Connect Express account
  4. Returns two URLs: the Identity onboarding URL and the Connect onboarding URL

Step 2: State Allow-List Check

The home address is checked against the launch state allow-list. The default allow-list for the initial pilot is:

  • TX (Texas)
  • FL (Florida)
  • GA (Georgia)
  • NC (North Carolina)
  • AZ (Arizona)

These are states with operationally defensible gig-worker rules — clear 1099 contractor classification, no minimum-hourly-wage requirements specific to gig workers, and no recent legislation (à la AB5 in CA) reclassifying contractors as employees.

If the Juicer's address is outside the allow-list, the application gets a "Not yet available in your state" message and the juicers row is held in pending state until either:

  • The Juicer updates to an address inside the allow-list
  • Levy expands the allow-list (which is a Legal + Insurance signoff away)

The allow-list is per-state, not per-city, and is configurable on the platform — but operators should not flip it without a legal review.

Step 3: Stripe Identity KYC

The Juicer opens the Stripe Identity URL on their phone. Stripe walks them through:

  • Government ID upload (front and back)
  • Selfie liveness check
  • SSN-last-4 entry
  • Address verification

Stripe runs the checks server-side. Most verifications come back within a few minutes; some take up to 24 hours when manual review kicks in.

The Levy platform listens for identity.verification_session.verified webhooks. When the webhook arrives, it sets:

  • juicers.kyc_status = 'verified'
  • juicers.status = 'active' (assuming the Connect Express side is also done)
  • juicers.stripe_identity_session_id to the session

If the verification fails (requires_input or canceled), the Juicer sees a "complete verification" prompt with a retry link.

Why Stripe Identity

Stripe Identity is roughly $1.50 per check, supports US-issued IDs across all states we launch in, and integrates cleanly with the Stripe Connect side. We don't store the ID image — Stripe does — which keeps our liability surface small.

Step 4: Stripe Connect Express

In parallel, the Juicer completes the Connect Express onboarding:

  • Enters their bank account (routing + account number, or instant verification via Plaid in supported regions)
  • Confirms the legal name matches the Identity check
  • Agrees to Stripe's Connect Services Agreement

When account.updated fires from Stripe with payouts_enabled: true, the platform sets juicers.stripe_account_payouts_enabled = true. Both kyc_status = 'verified' and payouts_enabled = true must be true before the Juicer can claim a bounty.

Connect Express handles the 1099 generation at year-end — Stripe issues the 1099-NEC and emails the Juicer directly. Levy reports its platform fee separately.

Step 5: Safe-Charging Acknowledgement

Before the first claim is enabled, the Juicer signs a one-page acknowledgement that covers:

  • Don't charge damaged packs (visible swelling, leaking, smoke, hot to the touch)
  • Don't open the pack or modify the connector
  • Use the provided charger only — never an off-brand fast charger
  • Charge in a well-ventilated area
  • Keep a fire extinguisher rated for lithium-ion fires nearby (operators can opt-in to a $25 starter kit that includes one)

This is required by Levy's insurance endorsement (Christensen Group). The signed PDF is stored in the Juicer's profile and surfaced on warranty / incident audits.

Step 6: Operator Review (Optional)

Some operators require a human review step before activating new Juicers in their subaccount — a quick eyeball on the application, sometimes a 10-minute phone interview. The dashboard exposes a "Pending Activation" list under Dashboard → Juicers where operators can approve, reject, or hold pending more info.

If your subaccount has require_juicer_review = true in settings, the platform won't activate a Juicer just because Identity + Connect cleared — it waits for the operator's approve action.

Activation

Once all of these are true, the Juicer is active:

  • kyc_status = 'verified'
  • stripe_account_payouts_enabled = true
  • Address inside the state allow-list
  • Safe-charging acknowledgement signed
  • Operator review passed (if required)

The Juicer app refreshes, the bounty map populates, and they can claim their first bounty.

Suspending and Banning

Operators can suspend or ban a Juicer at any time from the dashboard:

  • Suspendjuicers.status = 'suspended'. Cancels any open claims and holds queued payouts. The Juicer can be unsuspended later.
  • Banjuicers.status = 'banned'. Same effect as suspend but final. Open claims canceled, queued payouts held for review.

The trigger is often a fraud-score threshold — see Juicer Fraud Detection — but operators can also act on a single bad incident.

Common Onboarding Issues

  • "Verification failed" on Stripe Identity — the most common cause is a blurry or expired ID. The Juicer can retry; the retry URL is sent automatically.
  • "State not yet available" — the home address isn't in the allow-list. Confirm the address is correct; if it is, the Juicer can re-apply once Levy adds the state.
  • "Payouts not enabled" — Stripe Connect Express is waiting on bank account verification. Often resolves within an hour once Plaid finishes the bank check.
  • First bounty doesn't appear — confirm the operator hasn't required a review step. Also confirm the subaccount has at least one open bounty within the Juicer's claim radius.