Persist an order first, use Stripe online or certified POS-native pay at store, and recover its authoritative outcome.
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.
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.
Render only available server-returned choices. This preflight is not an
admission lease; submission repeats the policy, certification, identity, and
unpaid-exposure checks.
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.
When outcome.status is CUSTOMER_ACTION_REQUIRED, initialize Stripe.js with
the returned connectedAccountId and confirm the returned clientSecret:
const { error, paymentIntent } = await stripe.confirmPayment({ elements, confirmParams: { return_url: `${window.location.origin}/checkout/stripe-return`, }, redirect: "if_required",});if (error) throw error;if ( !paymentIntent || !["requires_capture", "succeeded"].includes(paymentIntent.status)) { throw new Error("Stripe payment is not ready for capture");}
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.
const result = await storefront.checkout.getOrderSubmissionOutcome( "loc_123", cartId, outcome.attemptId,);switch (result.status) { case "PROCESSING": case "CUSTOMER_ACTION_REQUIRED": // Poll again with bounded backoff or complete the requested Stripe action. break; case "PAID": // Online payment and canonical settlement are complete. break; case "ACCEPTED": // PAY_AT_STORE only: the order exists, but native POS payment is still due. // Read result.verification?.state for PENDING, WARNING, ACTION_REQUIRED, // VERIFIED, CONCLUSIVE_FAILURE, or CANCELED counter-verification state. break; case "ACTION_REQUIRED": // Show the retry-safe operator/customer action without creating another order. break;}
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.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Crave Cloud Documentation","description":"Developer documentation for Crave Cloud, Crave.js, Storefront APIs, and restaurant franchise integrations.","colors":{"primary":"#133B2F","light":"#1F5A49","dark":"#0B1F19"},"logo":{"light":"https://mintcdn.com/craveup-1493c4c7/P4icpH7dO6tjC3GV/logo/crave-wordmark.png?fit=max\u0026auto=format\u0026n=P4icpH7dO6tjC3GV\u0026q=85\u0026s=c6965caeaa3bfbd9e84cf5416bbf2576","dark":"https://mintcdn.com/craveup-1493c4c7/P4icpH7dO6tjC3GV/logo/crave-wordmark-dark.svg?fit=max\u0026auto=format\u0026n=P4icpH7dO6tjC3GV\u0026q=85\u0026s=d379668f5b2407f7092bbc4603c403bc","href":"https://developer.craveup.com"},"favicon":"https://mintcdn.com/craveup-1493c4c7/Nv2UkyJdWuAjqtql/favicon.svg?fit=max\u0026auto=format\u0026n=Nv2UkyJdWuAjqtql\u0026q=85\u0026s=7a4dc1dfa23901b208e854d9b64f0448","navbar":{"links":[{"href":"mailto:hello@craveup.com","label":"Support"},{"icon":"slack","href":"https://join.slack.com/t/cravejscommunity/shared_invite/zt-3hfr081io-aYuLC3n6gBFKQuho0HrTng","label":""}],"primary":{"type":"button","label":"Developer Console","href":"https://developer.craveup.com/console"}},"footer":{"socials":{"github":"https://github.com/crave-up","linkedin":"https://www.linkedin.com/company/craveup","x":"https://twitter.com/craveupcom"}},"search":{},"seo":{"metatags":{"canonical":"https://developer.craveup.com/docs"}},"icons":{"library":"lucide"},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode",{"title":"Open in T3 Chat","description":"Open this page in T3 Chat","icon":"message-circle","href":"https://t3.chat/new?q=Read+this+documentation+page+and+help+me+implement+it:+$page"},{"title":"Open in Zed","description":"Open this page in Zed","icon":"terminal","href":"zed://docs?url=$page"}],"display":"header"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"craveup-1493c4c7","hasAudioNarration":false,"actualSubdomain":"craveup-1493c4c7","customDomains":[],"gitSource":{"type":"github","owner":"craveup","repo":"craveup-turborepo","deployBranch":"main","contentDirectory":"apps/api-docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6aeb30f6b75ff94b1a016231","collectionId":"7b5e1815-7d84-4b90-8de3-5c6b7834e1d8","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aeb30f6b75ff94b1a016231"},"entitlements":{},"buildId":"6aeb8d652c1bbfeaed9a2742","clientVersion":"0.0.4064","searchFilterCounts":[{"language":"default","tag":"API Reference","count":113},{"language":"default","tag":"API Endpoints","count":88},{"language":"default","tag":"Documentation","count":37},{"language":"default","tag":"Components","count":26},{"language":"default","tag":"Checkout","count":16},{"language":"default","tag":"Carts","count":15},{"language":"default","tag":"Catering","count":13},{"language":"default","tag":"Customers","count":12},{"language":"default","tag":"Staff Menu Manager authoring","count":8},{"language":"default","tag":"Loyalty","count":8}]},"assistantConfig":{},"basePath":"/docs","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"styles.css","content":"#navbar a[aria-label=\"Join the Crave Slack community\"]{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;overflow:hidden;white-space:nowrap;gap:0}#navbar a[aria-label=\"Join the Crave Slack community\"] svg{width:1.125rem;height:1.125rem}.preview-device{width:100%}.preview-device-toggle{display:inline-flex;gap:0.25rem;margin-bottom:0.75rem;padding:0.25rem;border:1px solid #d8ded9;border-radius:6px;background:#ffffff}.preview-device-toggle button{min-width:5.5rem;min-height:2rem;padding:0.375rem 0.75rem;border:0;border-radius:4px;color:inherit;background:transparent;cursor:pointer}.preview-device-toggle button.is-active{color:white;background:#133b2f}.preview-device-stage{width:100%;overflow:hidden;border:1px solid var(--border-color);border-radius:6px;background:#f6f1e9}.preview-device-stage.is-mobile{max-width:430px;margin-inline:auto}.preview-device-stage.is-mobile.is-local-mobile{position:relative;aspect-ratio:var(--preview-mobile-ratio, 430 / 560);container-type:inline-size}.preview-device-stage iframe{display:block;width:100%;border:0}.preview-device-stage.is-mobile.is-local-mobile iframe{position:absolute;inset:0;width:430px;height:var(--preview-mobile-height, 560px);transform:scale(calc(100cqw / 430));transform-origin:top left}"}],"page":{"pagePath":"guides/checkout-flow","slug":"/guides/checkout-flow","pageMetadata":{"title":"Checkout Flow","description":"Persist an order first, use Stripe online or certified POS-native pay at store, and recover its authoritative outcome.","href":"/guides/checkout-flow"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Persist an order first, use Stripe online or certified POS-native pay at store, and recover its authoritative outcome.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,..._provideComponents(),...props.components},{Card,CardGroup,CodeBlock,Heading,Warning}=_components;if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Checkout uses the same cart capability, revision, and idempotency protections as\nother cart mutations. Submitting an order is a write and is never an anonymous\nlookup by cart ID.`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`The published TypeScript SDK is 2.0.1. The order-first methods in this guide\nrequire SDK 3.0.0, which is not yet published. A consumer pinned to 2.0.1\nlacks the current scoped menu/cart context, and its `,_jsx(_components.code,{children:`createPaymentIntent()`}),`\nand `,_jsx(_components.code,{children:`getOrderResult()`}),` methods target retired routes.\nKeep direct payment and result recovery blocked until a compatible package is\nreleased. Do not infer payment from a browser redirect or app return.`]})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`During the direct-charge cutover, ordinary Stripe payment admission is hard\nlocked in sandbox and production. `,_jsx(_components.code,{children:`submitOrder()`}),` returns\n`,_jsx(_components.code,{children:`STRIPE_DIRECT_CHARGE_CUTOVER_INCOMPLETE`}),`; show checkout as temporarily\nunavailable and do not retry or bypass this response. Catalog and cart\ndevelopment can continue while the lock remains.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`1-finalize-the-cart`,children:`1. Finalize the cart`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`13`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`13`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` storefront`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`cart`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`update`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"loc_123\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`cartId`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` fulfillmentMethod:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"takeout\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` storefront`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`cart`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`updateOrderTime`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"loc_123\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`cartId`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` pickupType:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"ASAP\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` storefront`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`cart`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`validateAndUpdateCustomer`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"loc_123\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`cartId`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` customerName:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Alex Johnson\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` emailAddress:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"alex@example.com\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` phoneNumber:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"+1234567890\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Each call uses the latest cart revision. If a call returns `,_jsx(_components.code,{children:`CART_CONFLICT`}),`,\nrefresh the cart and require an explicit retry.`]}),`\n`,_jsx(_components.p,{children:`Guest contact requires a customer name and at least one email address or phone\nnumber. This associates contact with the cart; it does not authenticate the\nshopper or claim the guest capability. Sign-in and OTP are not required for\nguest checkout.`}),`\n`,_jsx(Heading,{level:`2`,id:`2-read-the-current-collection-options`,children:`2. Read the current collection options`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` choices`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` storefront`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`checkout`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`getCollectionOptions`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"loc_123\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` cartId`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`revision:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` cart`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`revision`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Render only available server-returned choices. This preflight is not an\nadmission lease; submission repeats the policy, certification, identity, and\nunpaid-exposure checks.`}),`\n`,_jsx(Heading,{level:`2`,id:`3-submit-the-canonical-order`,children:`3. Submit the canonical order`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`12`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`12`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` outcome`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` storefront`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`checkout`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`submitOrder`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"loc_123\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` cartId`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` acceptedCatalogEvidence`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` acceptedDiscountEvidence`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` collectionMode:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"ONLINE\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` customerConfirmationRevision`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` quoteFingerprint`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`idempotencyKey:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` crypto`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`randomUUID`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(), `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`revision:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` cart`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`revision`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})}),`\n`]})})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://api.craveup.com/api/v1/storefront/locations/loc_123/carts/cart_456/submissions\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"X-Cart-Token: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$CART_ACCESS_TOKEN`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'If-Match: \"cart-4\"'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Idempotency-Key: order_01\"`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`The server persists one canonical order and submission attempt before it creates\nthe Stripe PaymentIntent. Reusing the same idempotency key recovers the same\nattempt; it never creates a second order. Square, Clover, and Toast are not\nonline processor choices.`}),`\n`,_jsx(Heading,{level:`2`,id:`4-confirm-stripe-customer-action`,children:`4. Confirm Stripe customer action`}),`\n`,_jsxs(_components.p,{children:[`When `,_jsx(_components.code,{children:`outcome.status`}),` is `,_jsx(_components.code,{children:`CUSTOMER_ACTION_REQUIRED`}),`, initialize Stripe.js with\nthe returned `,_jsx(_components.code,{children:`connectedAccountId`}),` and confirm the returned `,_jsx(_components.code,{children:`clientSecret`}),`:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`15`,language:`tsx`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`tsx`,children:_jsxs(_components.code,{language:`tsx`,numberOfLines:`15`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:`error`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:`paymentIntent`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` } `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` stripe`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`confirmPayment`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` elements`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` confirmParams:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` return_url:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\" `\"}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:\"${\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`window`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`location`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`origin`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"/checkout/stripe-return`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` redirect:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"if_required\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`error`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`throw`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` error`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` !`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`paymentIntent`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` ||`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` !`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"requires_capture\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"succeeded\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`].`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`includes`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`paymentIntent`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`status`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` throw`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` new`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` Error`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Stripe payment is not ready for capture\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Never add the cart capability to `,_jsx(_components.code,{children:`return_url`}),`. A redirect recovery page may carry\nnon-secret cart, attempt, and PaymentIntent identifiers, but it must recover the\ncapability from tab-scoped storage and poll the same persisted attempt before\ntreating payment as complete.`]}),`\n`,_jsx(Heading,{level:`2`,id:`5-recover-the-order-outcome`,children:`5. Recover the order outcome`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`23`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`23`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` result`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` storefront`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`checkout`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`getOrderSubmissionOutcome`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"loc_123\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` cartId`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` outcome`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`attemptId`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`switch`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`result`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`status`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` case`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"PROCESSING\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` case`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"CUSTOMER_ACTION_REQUIRED\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // Poll again with bounded backoff or complete the requested Stripe action.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` break`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` case`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"PAID\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // Online payment and canonical settlement are complete.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` break`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` case`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"ACCEPTED\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // PAY_AT_STORE only: the order exists, but native POS payment is still due.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // Read result.verification?.state for PENDING, WARNING, ACTION_REQUIRED,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // VERIFIED, CONCLUSIVE_FAILURE, or CANCELED counter-verification state.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` break`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` case`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"ACTION_REQUIRED\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // Show the retry-safe operator/customer action without creating another order.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` break`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Only `,_jsx(_components.code,{children:`PAID`}),` proves payment. For `,_jsx(_components.code,{children:`ACCEPTED`}),`, explain where the customer will pay\nand continue polling the same attempt. If provider evidence is delayed, show\n`,_jsx(_components.strong,{children:`Verifying payment — do not charge again`}),`. Never infer success from a\nredirect, provider response, POS order status, or a settlement row whose\nsubmission attempt has not reached its terminal state.`]}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Accept Payments`,icon:`money-bill`,href:`/guides/accept-payments`,children:_jsx(_components.p,{children:`Integrate Stripe Elements without exposing server secrets.`})}),_jsx(Card,{title:`Order Tracking`,icon:`location-dot`,href:`/guides/order-tracking`,children:_jsx(_components.p,{children:`Implement bounded result polling and receipts.`})}),_jsx(Card,{title:`Assisted Ordering`,icon:`headset`,href:`/guides/assisted-ordering`,children:_jsx(_components.p,{children:`Drive one cart from a voice assistant and a browser at once.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Checkout Flow","description":"Persist an order first, use Stripe online or certified POS-native pay at store, and recover its authoritative outcome.","href":"/guides/checkout-flow"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"1. Finalize the cart","slug":"1-finalize-the-cart","depth":2,"children":[]},{"title":"2. Read the current collection options","slug":"2-read-the-current-collection-options","depth":2,"children":[]},{"title":"3. Submit the canonical order","slug":"3-submit-the-canonical-order","depth":2,"children":[]},{"title":"4. Confirm Stripe customer action","slug":"4-confirm-stripe-customer-action","depth":2,"children":[]},{"title":"5. Recover the order outcome","slug":"5-recover-the-order-outcome","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"craveup-1493c4c7","siteName":"Crave Cloud Documentation","title":"Checkout Flow - Crave Cloud Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-30T05:15:10.889Z","originalFileLocation":"guides/checkout-flow.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Persist an order first, use Stripe online or certified POS-native pay at store, and recover its authoritative outcome.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Crave Cloud Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/craveup-1493c4c7/xHUpRIXxnvFKaY61/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/docs/mintlify-assets/_mintlify/favicons/craveup-1493c4c7/xHUpRIXxnvFKaY61/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/craveup-1493c4c7/xHUpRIXxnvFKaY61/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/craveup-1493c4c7/xHUpRIXxnvFKaY61/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/craveup-1493c4c7/xHUpRIXxnvFKaY61/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/craveup-1493c4c7/xHUpRIXxnvFKaY61/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/craveup-1493c4c7/xHUpRIXxnvFKaY61/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/craveup-1493c4c7/xHUpRIXxnvFKaY61/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/craveup-1493c4c7/xHUpRIXxnvFKaY61/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Checkout Flow - Crave Cloud Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Persist an order first, use Stripe online or certified POS-native pay at store, and recover its authoritative outcome.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Crave Cloud Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://developer.craveup.com/docs/guides/checkout-flow\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://craveup-1493c4c7.mintlify.app/_mintlify/api/og/v2?division=Ordering+Flow\u0026amp;title=Checkout+Flow\u0026amp;description=Persist+an+order+first%2C+use+Stripe+online+or+certified+POS-native+pay+at+store%2C+and+recover+its+authoritative+outcome.\u0026amp;theme=b98c5e909d3955315eca9dcf\u0026amp;signature=136c8e92bd470c610632b6cfa652d9e638dce7f3fdf1fa614e4987cc30b2f663\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Checkout Flow - Crave Cloud Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Persist an order first, use Stripe online or certified POS-native pay at store, and recover its authoritative outcome.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://craveup-1493c4c7.mintlify.app/_mintlify/api/og/v2?division=Ordering+Flow\u0026amp;title=Checkout+Flow\u0026amp;description=Persist+an+order+first%2C+use+Stripe+online+or+certified+POS-native+pay+at+store%2C+and+recover+its+authoritative+outcome.\u0026amp;theme=b98c5e909d3955315eca9dcf\u0026amp;signature=136c8e92bd470c610632b6cfa652d9e638dce7f3fdf1fa614e4987cc30b2f663\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/docs/mintlify-assets/_mintlify/favicons/craveup-1493c4c7/xHUpRIXxnvFKaY61/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Crave Cloud Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#133B2F\">\u003clink data-mint-head rel=\"canonical\" href=\"https://developer.craveup.com/docs/guides/checkout-flow\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/guides/checkout-flow.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://developer.craveup.com/#organization\",\"name\":\"Crave Cloud Documentation\",\"url\":\"https://developer.craveup.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/craveup-1493c4c7/P4icpH7dO6tjC3GV/logo/crave-wordmark.png?fit=max\u0026auto=format\u0026n=P4icpH7dO6tjC3GV\u0026q=85\u0026s=c6965caeaa3bfbd9e84cf5416bbf2576\"}},{\"@type\":\"WebSite\",\"@id\":\"https://developer.craveup.com/docs#website\",\"name\":\"Crave Cloud Documentation\",\"url\":\"https://developer.craveup.com/docs\",\"publisher\":{\"@id\":\"https://developer.craveup.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://developer.craveup.com/docs/guides/checkout-flow#webpage\",\"url\":\"https://developer.craveup.com/docs/guides/checkout-flow\",\"name\":\"Checkout Flow\",\"description\":\"Persist an order first, use Stripe online or certified POS-native pay at store, and recover its authoritative outcome.\",\"dateModified\":\"2026-10-30T05:15:10.889Z\",\"isPartOf\":{\"@id\":\"https://developer.craveup.com/docs#website\"},\"breadcrumb\":{\"@id\":\"https://developer.craveup.com/docs/guides/checkout-flow#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://developer.craveup.com/docs/guides/checkout-flow#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ordering Flow\",\"item\":\"https://developer.craveup.com/docs/guides/display-menu\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Checkout Flow\",\"item\":\"https://developer.craveup.com/docs/guides/checkout-flow\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://developer.craveup.com/docs/guides/checkout-flow#article\",\"headline\":\"Checkout Flow\",\"name\":\"Checkout Flow\",\"description\":\"Persist an order first, use Stripe online or certified POS-native pay at store, and recover its authoritative outcome.\",\"url\":\"https://developer.craveup.com/docs/guides/checkout-flow\",\"mainEntityOfPage\":{\"@id\":\"https://developer.craveup.com/docs/guides/checkout-flow#webpage\"},\"dateModified\":\"2026-10-30T05:15:10.889Z\",\"publisher\":{\"@id\":\"https://developer.craveup.com/#organization\"},\"isPartOf\":{\"@id\":\"https://developer.craveup.com/docs#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Crave Cloud Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Crave Cloud Documentation","nav":{"global":null,"tabs":[{"tab":"Documentation","icon":"book-open","groups":[{"group":"Start here","icon":"sparkles","pages":[{"title":"Set up Crave with an agent","icon":"sparkles","href":"/ai-onboarding"},{"title":"Build with Crave","href":"/getting-started/introduction"}]},{"group":"Platform","icon":"cloud","pages":[{"title":"Crave Cloud Overview","href":"/guides/crave-cloud-overview"},{"title":"Developer Package and Crave Cloud","href":"/guides/open-source-and-cloud"}]},{"group":"Getting Started","icon":"compass","pages":[{"title":"CLI Quickstart","href":"/getting-started/cli-quickstart"},{"title":"Storefront SDK","href":"/getting-started/storefront-sdk"},{"title":"Dart and Flutter Storefront SDK","href":"/getting-started/flutter-storefront-sdk"},{"title":"REST API Essentials","href":"/getting-started/rest-api"}]},{"group":"Quickstarts","icon":"zap","pages":[{"title":"Next.js Quickstart","href":"/quickstarts/nextjs"},{"title":"React Quickstart","href":"/quickstarts/react"},{"title":"Vanilla JavaScript Quickstart","href":"/quickstarts/vanilla-js"},{"title":"React Native / Expo Quickstart","href":"/quickstarts/mobile"},{"title":"Flutter quickstart","href":"/quickstarts/flutter"}]},{"group":"Implementation","icon":"wrench","pages":[{"title":"Generate a Private Integration API Key","href":"/guides/generate-api-key"},{"title":"Build a Custom Storefront","href":"/guides/build-custom-storefront"},{"title":"Customer identity","href":"/guides/customer-identity"},{"title":"Organization discounts","href":"/guides/organization-discounts"}]},{"group":"Agent tools","icon":"bot","pages":[{"title":"Use the CraveUp MCP Server","href":"/guides/ai/craveup-mcp-server"},{"title":"Prebuilt Storefront Prompt","href":"/guides/ai/build-storefront-prompt"}]},{"group":"Ordering Flow","icon":"shopping-basket","pages":[{"title":"Display Menu","href":"/guides/display-menu"},{"title":"Manage Cart","description":"Create and mutate a cart with capability, revision, and idempotency protection.","href":"/guides/manage-cart"},{"title":"Checkout Flow","href":"/guides/checkout-flow"},{"title":"Assisted Ordering","description":"Drive one cart from a voice assistant and a browser at the same time without either losing a write.","href":"/guides/assisted-ordering"},{"title":"Fulfillment Methods","href":"/guides/fulfillment-methods"},{"title":"Accept Payments","href":"/guides/accept-payments"},{"title":"Order Tracking","href":"/guides/order-tracking"}]},{"group":"More Guides","icon":"lightbulb","pages":[{"title":"Theming","href":"/guides/theming"},{"title":"Outbound Webhooks","href":"/guides/webhooks"},{"title":"Testing","href":"/guides/testing"},{"title":"Deployment","href":"/guides/deployment"},{"title":"Analytics","href":"/guides/analytics"}]},{"group":"Integrations","icon":"plug","pages":[{"title":"Square POS-native commerce setup","href":"/guides/integrations/square"},{"title":"Stripe Payments","href":"/guides/integrations/stripe"},{"title":"Toast POS","href":"/guides/integrations/toast"},{"title":"Clover POS","href":"/guides/integrations/clover"}]},{"group":"Reference","icon":"book-text","pages":[{"title":"Glossary","href":"/guides/glossary"},{"title":"Troubleshooting","href":"/guides/troubleshooting"},{"title":"Upgrade Guide","href":"/guides/upgrade-guide"}]}]},{"tab":"API Reference","icon":"square-terminal","pages":[{"title":"API Reference","href":"/api-reference/overview/api-overview"}]},{"tab":"Components","icon":"puzzle","pages":[{"title":"Components","href":"/components/overview"}]},{"tab":"Changelog","icon":"clock","pages":[{"title":"Changelog","href":"/changelog"}]}]},"basePath":"","title":"Checkout Flow - Crave Cloud Documentation","buildId":"dpl_F7QnsMdhpvrmhP3frsJmZHKN4aG5","deploymentId":"dpl_F7QnsMdhpvrmhP3frsJmZHKN4aG5","dynamics":[],"chunks":[]}