Crossdeck Docs
Dashboard

Connect Stripe

Payment rails 4 min read · Updated May 7, 2025

Wire Stripe as a verified payment rail. Crossdeck signature-verifies inbound webhooks, reconciles against the Stripe API, and projects subscriptions, refunds, and disputes into the unified revenue ledger — across the same customer record as your App Store and Google Play subscriptions.

What this gives you

Verified Stripe events flowing into your dashboard within ~2 seconds of delivery, automatic signature checks, idempotent processing, and continuous reconciliation against Stripe's API to repair any missed webhooks.

Before you start

You'll need:

Step 1 · Find your Stripe Account ID

Crossdeck stores your Account ID alongside your project so it can attribute incoming webhooks to the correct rail.

1
Open your Stripe account settings

Go to dashboard.stripe.com/settings/account, or click the account name in the top-right of the Stripe Dashboard → Account info.

2
Copy the Account ID

It starts with acct_ — for example acct_1NxYz123456789. Same ID across test and live mode.

3
Paste it into the Connect Stripe step in onboarding

Enter the email associated with the account too — Crossdeck uses it for rail-related notifications (webhook delivery issues, billing-retry summaries, reconciliation drift).

Step 2 · Add the webhook endpoint

Crossdeck issues a unique endpoint URL per project. Webhooks delivered to that URL are signature-verified before they touch your ledger.

1
Open Stripe → Developers → Webhooks

dashboard.stripe.com/webhooks · click Add an endpoint.

2
Paste your Crossdeck endpoint URL

Crossdeck displays this on the Connect Stripe step — it looks like https://api.cross-deck.com/v1/webhooks/stripe/proj_xxx. Each project has its own endpoint, so events are routed correctly.

3
Select the latest API version

Toggle "Listen on the latest API version". This keeps event payloads consistent with what Crossdeck expects.

Don't skip event selection

Stripe only delivers events you explicitly subscribe to. The default selection is empty — if you save the endpoint without ticking events, Crossdeck will never receive anything.

Step 3 · Select the events Crossdeck needs

Click "Select events" in the endpoint setup and tick the nine events below. Crossdeck needs all of them to maintain the ledger correctly — missing any one creates a gap that the reconciliation worker can't always close.

Event Why Crossdeck needs it
checkout.session.completed New checkout completed — opens a customer record and provisional entitlement.
customer.subscription.created Subscription started — moves the customer to TRIAL or ACTIVE.
customer.subscription.updated Plan change, billing cycle change, status change — all subscription transitions.
customer.subscription.deleted Subscription cancelled — moves the customer to EXPIRED at period end.
invoice.payment_succeeded Renewal succeeded — extends the entitlement period.
invoice.payment_failed Renewal failed — moves the customer to BILLING_RETRY. Access stays granted.
payment_intent.payment_failed One-off payment failure — surfaces in Operations queue.
charge.refunded Refund issued — revokes the matching entitlement.
charge.dispute.created Dispute opened — flags the customer in the at-risk view.
Use the Copy all events button

The Connect Stripe onboarding step has a Copy all events button — paste the list straight into Stripe's event picker search box and tick them in one pass instead of scrolling.

Step 4 · Verify the connection

Save the endpoint in Stripe. Crossdeck will mark this step verified once it has:

To trigger a quick verification event, run any of the following in test mode:

stripe CLI
# Trigger a fake checkout.session.completed event
stripe trigger checkout.session.completed

# Or send a payment_succeeded
stripe trigger invoice.payment_succeeded

Or do a real test purchase using a test card through your live checkout flow. Either way, the Connect Stripe step in your onboarding should flip to verified within a few seconds.

How webhook signing works

Crossdeck never trusts an unverified webhook. Every inbound delivery is checked against the signing secret Stripe generated when you saved the endpoint:

Webhooks are signals, not truth

Even after signature verification passes, Crossdeck calls Stripe back via the API to confirm the event before mutating state. Webhooks tell us something happened; the API call confirms what actually exists.

Troubleshooting

No events appearing in Crossdeck

Signature verification keeps failing

I'm seeing duplicate subscription state changes

Crossdeck is asking for the webhook secret manually

Reference

Endpoint URL format

Crossdeck issues one endpoint URL per project, distinct for production and sandbox:

URL
# Production
https://api.cross-deck.com/v1/webhooks/stripe/proj_xxx

# Sandbox (only delivered Stripe test-mode events)
https://api.cross-deck.com/v1/webhooks/stripe/proj_xxx?env=sandbox

What Crossdeck does per event

Event State transition Default access
customer.subscription.created (trial)TRIALGranted
customer.subscription.created (active)ACTIVEGranted
invoice.payment_succeededACTIVEGranted
invoice.payment_failedBILLING_RETRYGranted (default)
customer.subscription.updated (canceled, period not ended)ACTIVE until period endGranted until expiry
customer.subscription.deletedEXPIREDRevoked
charge.refundedREFUNDEDRevoked immediately
charge.dispute.created(no state change — flagged)Granted, surfaced in operations

What's next

With Stripe wired: