Verify Stripe Checkout safely
Use Stripe test mode to validate a real purchase path without a real card.
Verify Stripe Checkout without a real credit card
You do not need a customer card to prove your launch billing path works. PreFlight's Stripe Shadow Check runs a synthetic test-mode Checkout session, verifies webhook delivery, and confirms the Supabase side effect landed — end to end.
sk_test_…). It creates a real hosted Checkout session, waits for payment completion, then polls your mapped Supabase table for the fulfillment row your webhook handler should write.
What success proves
paid in Stripe |
| Side effect | `supabase_shadow_side_effect` | Expected row exists in mapped table/column |
A passing shadow run validates the same path Payment Sync reconciles in production.
Prerequisites
<DocChecklist items={[ "Stripe connected with a test-mode secret key (sk_test_…)", "Supabase connected with service role access for verification", "A test Price ID saved as priceId on the Stripe integration", "verifyTableName and verifyTraceColumn mapping where your webhook writes fulfillment rows", "A publicly reachable webhook URL (or tunnel) that accepts signed Stripe events", ]} />
Recommended workflow
priceId, verifyTableName, and verifyTraceColumn. Optionally set verifyStatusColumn, verifyExpectedStatus, verifyCreatedAtColumn, and verifyWindowSeconds for async handlers.
checkoutUrl and traceId.
4242 4242 4242 4242 (any future expiry, any CVC). No real card is charged.
Dashboard flow
- Open Checks for the project.
- Ensure Stripe and Supabase integrations show connected.
- Start Stripe Shadow Check from the checks workspace or Stripe integration panel.
- Complete the hosted Checkout session in a browser tab.
- Finalize and review the three probe rows in the run timeline.
API flow (CI and preview deploys)
Shadow endpoints are documented separately from API v1 because they are Stripe-specific:
previewUrl, source. Send Idempotency-Key from CI.
runId, traceId, checkoutSessionId.
Example start response:
{
"runId": "uuid",
"status": "running",
"traceId": "pf_trace_…",
"checkoutSessionId": "cs_test_…",
"checkoutUrl": "https://checkout.stripe.com/…"
}
PreFlight embeds preflight_trace_id in Checkout session metadata and client_reference_id so your webhook handler can write the same trace to Supabase.
Mapping discovery
If the saved mapping misses during a shadow run, PreFlight attempts discovered trace-bearing tables from the connected Supabase OpenAPI schema before failing. Still, explicit mapping is recommended — discovery is a fallback, not a substitute for knowing your schema.
Common failures
sk_test_ key and priceId; set previewUrl to a reachable origin |
| Payment succeeds, DB fails | Webhook route or trace mapping wrong | Check handler logs for the traceId; align verifyTraceColumn |
| Verification window expires | Async side effect too slow | Increase verifyWindowSeconds or optimize webhook handler |
| Shadow start rate limited | More than 4 starts/minute per project | Use Idempotency-Key in CI to reuse existing runs |
<RelatedLinks links={[ { href: "/docs/api/shadow-stripe-flow", title: "Shadow Stripe flow API", description: "Endpoint details, fields, and idempotency." }, { href: "/docs/guides/revenue-watch", title: "Payment Sync", description: "Production reconciliation after shadow passes." }, { href: "/docs/integrations/stripe", title: "Stripe integration", description: "Webhook secrets and verify field reference." }, { href: "/docs/guides/fixing-common-failures", title: "Fixing common failures", description: "Webhook and mapping failure patterns." }, ]} />
