Connect rail

Stripe Connect webhooks land here. The orchestrator records the event and moves the ledger. It does not move money. Live charges stay blocked.

Endpoint

POST /api/webhooks/stripe

Signature required. Secret source: sandbox (not Stripe live). Live mode blocked.

Gates

  • Webhook signature verification

    IMPLEMENTED

    Sandbox secret — not Stripe live

  • Idempotency on event.id

    IMPLEMENTED

    Duplicates return 200 and do not write a second ledger row

  • Ledger state machine

    IMPLEMENTED

    CREATED → PROCESSING → SUBMITTED → SETTLED / RECONCILED

  • Live mode blocked

    IMPLEMENTED

    livemode events are rejected

  • Provider sandbox account

    NOT_EXECUTED

    No Stripe platform keys in this workspace

  • Connected-account KYC

    NOT_EXECUTED

    Express onboarding is not wired

  • Destination charge / application fee

    NOT_EXECUTED

    Events can be simulated; Stripe is not charged

  • Beneficiary / account-name verification

    NOT_EXECUTED

    Requires a licensed payout rail

  • Three-way bank reconciliation

    NOT_EXECUTED

    No bank statement feed

  • Production authorization

    BLOCKED

    Do not move real money from this app

Ledger

Empty until a signed event arrives or you run TEST 01.

Inbox

No webhook events stored yet.

Stripe Dashboard → Developers → Webhooks → add this path. Signing secret stays in STRIPE_WEBHOOK_SECRET on the server. Never in the browser, never in chat.