01 · Executive summary
The payment works. Fulfilment does not.
A buyer can complete Stripe Checkout, but the application never creates a durable paid-access record. The redirect page masks the missing fulfilment step, so the team sees “success” while the buyer remains locked out.
Launch risk
Stop-ship
Likely repair
1 integration
Rebuild needed
No
02 · Evidence and impact
What blocks launch, in order.
Fulfilment
Verified evidence
Stripe marks the Checkout Session as paid, but the webhook handler only records the event ID. No durable entitlement or order is created.
Buyer impact
A real customer can pay and still remain locked out.
Success state
Verified evidence
The success screen treats the redirect query parameter as the final source of truth instead of reading a server-verified order state.
Buyer impact
The UI can claim success without proving fulfilment.
Reliability
Verified evidence
There is no idempotency record keyed by the Stripe event or Checkout Session. A retry could repeat future fulfilment work.
Buyer impact
Webhook retries could create duplicate access or inconsistent records.
Operations
Verified evidence
No controlled live payment/refund checklist or alert exists for a paid session that has no matching entitlement.
Buyer impact
The first broken order may be discovered by the customer.
03 · Root cause
The missing boundary is server-side fulfilment.
Checkout and payment are separate from granting product access. The current implementation redirects the browser after payment, but never turns the signed Stripe webhook into an authoritative order and entitlement. The repair belongs in the server path, not in another checkout button or a client-side workaround.
Decision: repair the fulfilment boundary. Do not rebuild the app.
04 · Safest repair order
Fix the authority first, then the screen.
- 01
Create an authoritative order record
Store the Checkout Session ID, customer, amount, status and selected offer in a server-only table with a unique constraint.
- 02
Make the webhook idempotent
Verify the raw-body signature, ignore processed event IDs and complete fulfilment inside a retry-safe transaction.
- 03
Render success from server state
Retrieve the verified Stripe session and matching order on the server. Show a pending state until fulfilment is durable.
- 04
Prove the production path
Run a sandbox payment, webhook retry and failed-event replay, then one controlled live payment and refund.
05 · Acceptance checks
Proof required before handoff.
- □A completed Checkout Session creates exactly one order.
- □A repeated Stripe event does not duplicate access.
- □A paid buyer sees access only after server fulfilment.
- □A failed or unpaid session never grants access.
- □The seller can trace session → order → entitlement.
- □One controlled live payment and refund complete cleanly.
Illustrative recommendation
Integration Rescue
One agreed Stripe-to-entitlement repair, implementation verification and handoff notes. Example starting scope: $799 USD, less the $299 triage credit, leaving a $500 balance if approved within 7 days.
What the triage buyer keeps
The report is yours.
Use the evidence and acceptance checks with ShipRescue, your own team or another developer. There is no obligation to purchase the follow-on repair.
Your app, your evidence
Get the same decision-ready format for your blocker.
$299 USD. Written delivery within one business day after the required access is available.
Start the secure intake