Skip to main content
Checkout uses the same cart capability, revision, and idempotency protections as other cart mutations. Submitting an order is a write and is never an anonymous lookup by cart ID.
The published TypeScript SDK is 2.0.1. The order-first methods in this guide require SDK 3.0.0, which is not yet published. A consumer pinned to 2.0.1 lacks the current scoped menu/cart context, and its createPaymentIntent() and getOrderResult() methods target retired routes. Keep direct payment and result recovery blocked until a compatible package is released. Do not infer payment from a browser redirect or app return.
During the direct-charge cutover, ordinary Stripe payment admission is hard locked in sandbox and production. submitOrder() returns STRIPE_DIRECT_CHARGE_CUTOVER_INCOMPLETE; show checkout as temporarily unavailable and do not retry or bypass this response. Catalog and cart development can continue while the lock remains.

1. Finalize the cart

Each call uses the latest cart revision. If a call returns CART_CONFLICT, refresh the cart and require an explicit retry. Guest contact requires a customer name and at least one email address or phone number. This associates contact with the cart; it does not authenticate the shopper or claim the guest capability. Sign-in and OTP are not required for guest checkout.

2. Read the current collection options

Render only available server-returned choices. This preflight is not an admission lease; submission repeats the policy, certification, identity, and unpaid-exposure checks.

3. Submit the canonical order

The server persists one canonical order and submission attempt before it creates the Stripe PaymentIntent. Reusing the same idempotency key recovers the same attempt; it never creates a second order. Square, Clover, and Toast are not online processor choices.

4. Confirm Stripe customer action

When outcome.status is CUSTOMER_ACTION_REQUIRED, initialize Stripe.js with the returned connectedAccountId and confirm the returned clientSecret:
Never add the cart capability to return_url. A redirect recovery page may carry non-secret cart, attempt, and PaymentIntent identifiers, but it must recover the capability from tab-scoped storage and poll the same persisted attempt before treating payment as complete.

5. Recover the order outcome

Only PAID proves payment. For ACCEPTED, explain where the customer will pay and continue polling the same attempt. If provider evidence is delayed, show Verifying payment — do not charge again. Never infer success from a redirect, provider response, POS order status, or a settlement row whose submission attempt has not reached its terminal state.

Accept Payments

Integrate Stripe Elements without exposing server secrets.

Order Tracking

Implement bounded result polling and receipts.

Assisted Ordering

Drive one cart from a voice assistant and a browser at once.