[{"data":1,"prerenderedAt":5084},["ShallowReactive",2],{"navigation_docs":3,"-docs-products-sites-checkout":984},[4,8,44,50,86,583,625,918],{"title":5,"path":6,"stem":7},"Home","\u002Fdocs","docs\u002Findex",{"title":9,"path":10,"stem":11,"children":12},"API usage","\u002Fdocs\u002Fapi-usage","docs\u002Fapi-usage\u002Findex",[13,14,20,26,32,38],{"title":9,"path":10,"stem":11},{"title":15,"path":16,"stem":17,"children":18},"Errors","\u002Fdocs\u002Fapi-usage\u002Ferrors","docs\u002Fapi-usage\u002Ferrors\u002Findex",[19],{"title":15,"path":16,"stem":17},{"title":21,"path":22,"stem":23,"children":24},"Retries & idempotency","\u002Fdocs\u002Fapi-usage\u002Fidempotency","docs\u002Fapi-usage\u002Fidempotency\u002Findex",[25],{"title":21,"path":22,"stem":23},{"title":27,"path":28,"stem":29,"children":30},"Pagination & filtering","\u002Fdocs\u002Fapi-usage\u002Fpagination","docs\u002Fapi-usage\u002Fpagination\u002Findex",[31],{"title":27,"path":28,"stem":29},{"title":33,"path":34,"stem":35,"children":36},"Rate limits","\u002Fdocs\u002Fapi-usage\u002Frate-limits","docs\u002Fapi-usage\u002Frate-limits\u002Findex",[37],{"title":33,"path":34,"stem":35},{"title":39,"path":40,"stem":41,"children":42},"Versioning & stability","\u002Fdocs\u002Fapi-usage\u002Fversioning","docs\u002Fapi-usage\u002Fversioning\u002Findex",[43],{"title":39,"path":40,"stem":41},{"title":45,"path":46,"stem":47,"children":48},"What's new","\u002Fdocs\u002Fchangelog","docs\u002Fchangelog\u002Findex",[49],{"title":45,"path":46,"stem":47},{"title":51,"path":52,"stem":53,"children":54},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002Fgetting-started\u002Findex",[55,56,62,68,74,80],{"title":51,"path":52,"stem":53},{"title":57,"path":58,"stem":59,"children":60},"Architecture Overview","\u002Fdocs\u002Fgetting-started\u002Farchitecture","docs\u002Fgetting-started\u002Farchitecture\u002Findex",[61],{"title":57,"path":58,"stem":59},{"title":63,"path":64,"stem":65,"children":66},"Glossary","\u002Fdocs\u002Fgetting-started\u002Fglossary","docs\u002Fgetting-started\u002Fglossary\u002Findex",[67],{"title":63,"path":64,"stem":65},{"title":69,"path":70,"stem":71,"children":72},"Platform Overview","\u002Fdocs\u002Fgetting-started\u002Fplatform-overview","docs\u002Fgetting-started\u002Fplatform-overview\u002Findex",[73],{"title":69,"path":70,"stem":71},{"title":75,"path":76,"stem":77,"children":78},"Prerequisites","\u002Fdocs\u002Fgetting-started\u002Fprerequisites","docs\u002Fgetting-started\u002Fprerequisites\u002Findex",[79],{"title":75,"path":76,"stem":77},{"title":81,"path":82,"stem":83,"children":84},"Your First App in 15 Minutes","\u002Fdocs\u002Fgetting-started\u002Fquick-start","docs\u002Fgetting-started\u002Fquick-start\u002Findex",[85],{"title":81,"path":82,"stem":83},{"title":87,"path":88,"stem":89,"children":90},"Products","\u002Fdocs\u002Fproducts","docs\u002Fproducts\u002Findex",[91,92,98,170,200,218,254,320,517,565],{"title":87,"path":88,"stem":89},{"title":93,"path":94,"stem":95,"children":96},"AI Studio","\u002Fdocs\u002Fproducts\u002Fai","docs\u002Fproducts\u002Fai\u002Findex",[97],{"title":93,"path":94,"stem":95},{"title":99,"path":100,"stem":101,"children":102},"App Studio","\u002Fdocs\u002Fproducts\u002Fapps","docs\u002Fproducts\u002Fapps\u002Findex",[103,104,110,116,122,128,134,140,146,152,158,164],{"title":99,"path":100,"stem":101},{"title":105,"path":106,"stem":107,"children":108},"App Model","\u002Fdocs\u002Fproducts\u002Fapps\u002Fapp-model","docs\u002Fproducts\u002Fapps\u002Fapp-model\u002Findex",[109],{"title":105,"path":106,"stem":107},{"title":111,"path":112,"stem":113,"children":114},"Auto-generated data APIs","\u002Fdocs\u002Fproducts\u002Fapps\u002Fauto-generated-data-apis","docs\u002Fproducts\u002Fapps\u002Fauto-generated-data-apis\u002Findex",[115],{"title":111,"path":112,"stem":113},{"title":117,"path":118,"stem":119,"children":120},"Billing & Events","\u002Fdocs\u002Fproducts\u002Fapps\u002Fbilling-events","docs\u002Fproducts\u002Fapps\u002Fbilling-events\u002Findex",[121],{"title":117,"path":118,"stem":119},{"title":123,"path":124,"stem":125,"children":126},"Cockpit Integration","\u002Fdocs\u002Fproducts\u002Fapps\u002Fcockpit-integration","docs\u002Fproducts\u002Fapps\u002Fcockpit-integration\u002Findex",[127],{"title":123,"path":124,"stem":125},{"title":129,"path":130,"stem":131,"children":132},"App Model Concept","\u002Fdocs\u002Fproducts\u002Fapps\u002Fconcept","docs\u002Fproducts\u002Fapps\u002Fconcept\u002Findex",[133],{"title":129,"path":130,"stem":131},{"title":135,"path":136,"stem":137,"children":138},"App Lifecycle","\u002Fdocs\u002Fproducts\u002Fapps\u002Flifecycle","docs\u002Fproducts\u002Fapps\u002Flifecycle\u002Findex",[139],{"title":135,"path":136,"stem":137},{"title":141,"path":142,"stem":143,"children":144},"Manifest Reference","\u002Fdocs\u002Fproducts\u002Fapps\u002Fmanifest-reference","docs\u002Fproducts\u002Fapps\u002Fmanifest-reference\u002Findex",[145],{"title":141,"path":142,"stem":143},{"title":147,"path":148,"stem":149,"children":150},"Market Concept","\u002Fdocs\u002Fproducts\u002Fapps\u002Fmarket-concept","docs\u002Fproducts\u002Fapps\u002Fmarket-concept\u002Findex",[151],{"title":147,"path":148,"stem":149},{"title":153,"path":154,"stem":155,"children":156},"Policies","\u002Fdocs\u002Fproducts\u002Fapps\u002Fpolicies","docs\u002Fproducts\u002Fapps\u002Fpolicies\u002Findex",[157],{"title":153,"path":154,"stem":155},{"title":159,"path":160,"stem":161,"children":162},"Schema migrations","\u002Fdocs\u002Fproducts\u002Fapps\u002Fschema-migrator","docs\u002Fproducts\u002Fapps\u002Fschema-migrator\u002Findex",[163],{"title":159,"path":160,"stem":161},{"title":165,"path":166,"stem":167,"children":168},"Schema Reference","\u002Fdocs\u002Fproducts\u002Fapps\u002Fschema-reference","docs\u002Fproducts\u002Fapps\u002Fschema-reference\u002Findex",[169],{"title":165,"path":166,"stem":167},{"title":171,"path":172,"stem":173,"children":174},"Authentication","\u002Fdocs\u002Fproducts\u002Fauth","docs\u002Fproducts\u002Fauth\u002Findex",[175,176,182,188,194],{"title":171,"path":172,"stem":173},{"title":177,"path":178,"stem":179,"children":180},"API keys","\u002Fdocs\u002Fproducts\u002Fauth\u002Fapi-keys","docs\u002Fproducts\u002Fauth\u002Fapi-keys\u002Findex",[181],{"title":177,"path":178,"stem":179},{"title":183,"path":184,"stem":185,"children":186},"Multi-factor authentication","\u002Fdocs\u002Fproducts\u002Fauth\u002Fmfa","docs\u002Fproducts\u002Fauth\u002Fmfa\u002Findex",[187],{"title":183,"path":184,"stem":185},{"title":189,"path":190,"stem":191,"children":192},"Social sign-in","\u002Fdocs\u002Fproducts\u002Fauth\u002Foauth2","docs\u002Fproducts\u002Fauth\u002Foauth2\u002Findex",[193],{"title":189,"path":190,"stem":191},{"title":195,"path":196,"stem":197,"children":198},"Sessions","\u002Fdocs\u002Fproducts\u002Fauth\u002Fsessions","docs\u002Fproducts\u002Fauth\u002Fsessions\u002Findex",[199],{"title":195,"path":196,"stem":197},{"title":201,"path":202,"stem":203,"children":204},"Events","\u002Fdocs\u002Fproducts\u002Fevents","docs\u002Fproducts\u002Fevents\u002Findex",[205,206,212],{"title":201,"path":202,"stem":203},{"title":207,"path":208,"stem":209,"children":210},"Consuming events","\u002Fdocs\u002Fproducts\u002Fevents\u002Fconsuming-events","docs\u002Fproducts\u002Fevents\u002Fconsuming-events\u002Findex",[211],{"title":207,"path":208,"stem":209},{"title":213,"path":214,"stem":215,"children":216},"Event types","\u002Fdocs\u002Fproducts\u002Fevents\u002Fevent-types","docs\u002Fproducts\u002Fevents\u002Fevent-types\u002Findex",[217],{"title":213,"path":214,"stem":215},{"title":219,"path":220,"stem":221,"children":222},"Integration Studio","\u002Fdocs\u002Fproducts\u002Fintegration-studio","docs\u002Fproducts\u002Fintegration-studio\u002Findex",[223,224,230,236,242,248],{"title":219,"path":220,"stem":221},{"title":225,"path":226,"stem":227,"children":228},"Expression Syntax","\u002Fdocs\u002Fproducts\u002Fintegration-studio\u002Fexpression-syntax","docs\u002Fproducts\u002Fintegration-studio\u002Fexpression-syntax\u002Findex",[229],{"title":225,"path":226,"stem":227},{"title":231,"path":232,"stem":233,"children":234},"Node Types","\u002Fdocs\u002Fproducts\u002Fintegration-studio\u002Fnode-types","docs\u002Fproducts\u002Fintegration-studio\u002Fnode-types\u002Findex",[235],{"title":231,"path":232,"stem":233},{"title":237,"path":238,"stem":239,"children":240},"Dual-engine architecture","\u002Fdocs\u002Fproducts\u002Fintegration-studio\u002Foverview","docs\u002Fproducts\u002Fintegration-studio\u002Foverview\u002Findex",[241],{"title":237,"path":238,"stem":239},{"title":243,"path":244,"stem":245,"children":246},"Triggers","\u002Fdocs\u002Fproducts\u002Fintegration-studio\u002Ftriggers","docs\u002Fproducts\u002Fintegration-studio\u002Ftriggers\u002Findex",[247],{"title":243,"path":244,"stem":245},{"title":249,"path":250,"stem":251,"children":252},"Workflow Builder","\u002Fdocs\u002Fproducts\u002Fintegration-studio\u002Fworkflow-builder","docs\u002Fproducts\u002Fintegration-studio\u002Fworkflow-builder\u002Findex",[253],{"title":249,"path":250,"stem":251},{"title":255,"path":256,"stem":257,"children":258},"Network","\u002Fdocs\u002Fproducts\u002Fnetwork","docs\u002Fproducts\u002Fnetwork\u002Findex",[259,260,266,272,278,284,290,296,302,308,314],{"title":255,"path":256,"stem":257},{"title":261,"path":262,"stem":263,"children":264},"Caching","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fcaching","docs\u002Fproducts\u002Fnetwork\u002Fcaching\u002Findex",[265],{"title":261,"path":262,"stem":263},{"title":267,"path":268,"stem":269,"children":270},"Content delivery (CDN)","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fcdn","docs\u002Fproducts\u002Fnetwork\u002Fcdn\u002Findex",[271],{"title":267,"path":268,"stem":269},{"title":273,"path":274,"stem":275,"children":276},"Compression","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fcompression","docs\u002Fproducts\u002Fnetwork\u002Fcompression\u002Findex",[277],{"title":273,"path":274,"stem":275},{"title":279,"path":280,"stem":281,"children":282},"DDoS mitigation","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fddos","docs\u002Fproducts\u002Fnetwork\u002Fddos\u002Findex",[283],{"title":279,"path":280,"stem":281},{"title":285,"path":286,"stem":287,"children":288},"revenexx DNS service","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fdns","docs\u002Fproducts\u002Fnetwork\u002Fdns\u002Findex",[289],{"title":285,"path":286,"stem":287},{"title":291,"path":292,"stem":293,"children":294},"Edges","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fedges","docs\u002Fproducts\u002Fnetwork\u002Fedges\u002Findex",[295],{"title":291,"path":292,"stem":293},{"title":297,"path":298,"stem":299,"children":300},"Endpoints","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fendpoints","docs\u002Fproducts\u002Fnetwork\u002Fendpoints\u002Findex",[301],{"title":297,"path":298,"stem":299},{"title":303,"path":304,"stem":305,"children":306},"Regions","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fregions","docs\u002Fproducts\u002Fnetwork\u002Fregions\u002Findex",[307],{"title":303,"path":304,"stem":305},{"title":309,"path":310,"stem":311,"children":312},"Transport Layer Security (TLS)","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Ftls","docs\u002Fproducts\u002Fnetwork\u002Ftls\u002Findex",[313],{"title":309,"path":310,"stem":311},{"title":315,"path":316,"stem":317,"children":318},"Web application firewall (WAF)","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fwaf","docs\u002Fproducts\u002Fnetwork\u002Fwaf\u002Findex",[319],{"title":315,"path":316,"stem":317},{"title":321,"path":322,"stem":323,"children":324},"Experience Studio","\u002Fdocs\u002Fproducts\u002Fsites","docs\u002Fproducts\u002Fsites\u002Findex",[325,326,332,337,343,349,355,361,367,373,379,385,391,397,403,409,487,505,511],{"title":321,"path":322,"stem":323},{"title":327,"path":328,"stem":329,"children":330},"Storefront Architecture","\u002Fdocs\u002Fproducts\u002Fsites\u002Farchitecture","docs\u002Fproducts\u002Fsites\u002Farchitecture\u002Findex",[331],{"title":327,"path":328,"stem":329},{"title":171,"path":333,"stem":334,"children":335},"\u002Fdocs\u002Fproducts\u002Fsites\u002Fauthentication","docs\u002Fproducts\u002Fsites\u002Fauthentication\u002Findex",[336],{"title":171,"path":333,"stem":334},{"title":338,"path":339,"stem":340,"children":341},"Blökkli Blocks","\u002Fdocs\u002Fproducts\u002Fsites\u002Fblokki-blocks","docs\u002Fproducts\u002Fsites\u002Fblokki-blocks\u002Findex",[342],{"title":338,"path":339,"stem":340},{"title":344,"path":345,"stem":346,"children":347},"Checkout","\u002Fdocs\u002Fproducts\u002Fsites\u002Fcheckout","docs\u002Fproducts\u002Fsites\u002Fcheckout\u002Findex",[348],{"title":344,"path":345,"stem":346},{"title":350,"path":351,"stem":352,"children":353},"Deploy from CLI","\u002Fdocs\u002Fproducts\u002Fsites\u002Fdeploy-from-cli","docs\u002Fproducts\u002Fsites\u002Fdeploy-from-cli\u002Findex",[354],{"title":350,"path":351,"stem":352},{"title":356,"path":357,"stem":358,"children":359},"Deploy from Git","\u002Fdocs\u002Fproducts\u002Fsites\u002Fdeploy-from-git","docs\u002Fproducts\u002Fsites\u002Fdeploy-from-git\u002Findex",[360],{"title":356,"path":357,"stem":358},{"title":362,"path":363,"stem":364,"children":365},"Deploy manually","\u002Fdocs\u002Fproducts\u002Fsites\u002Fdeploy-manually","docs\u002Fproducts\u002Fsites\u002Fdeploy-manually\u002Findex",[366],{"title":362,"path":363,"stem":364},{"title":368,"path":369,"stem":370,"children":371},"Deployments","\u002Fdocs\u002Fproducts\u002Fsites\u002Fdeployments","docs\u002Fproducts\u002Fsites\u002Fdeployments\u002Findex",[372],{"title":368,"path":369,"stem":370},{"title":374,"path":375,"stem":376,"children":377},"Develop revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fdevelop","docs\u002Fproducts\u002Fsites\u002Fdevelop\u002Findex",[378],{"title":374,"path":375,"stem":376},{"title":380,"path":381,"stem":382,"children":383},"Domains","\u002Fdocs\u002Fproducts\u002Fsites\u002Fdomains","docs\u002Fproducts\u002Fsites\u002Fdomains\u002Findex",[384],{"title":380,"path":381,"stem":382},{"title":386,"path":387,"stem":388,"children":389},"Frameworks","\u002Fdocs\u002Fproducts\u002Fsites\u002Fframeworks","docs\u002Fproducts\u002Fsites\u002Fframeworks\u002Findex",[390],{"title":386,"path":387,"stem":388},{"title":392,"path":393,"stem":394,"children":395},"Instant rollbacks","\u002Fdocs\u002Fproducts\u002Fsites\u002Finstant-rollbacks","docs\u002Fproducts\u002Fsites\u002Finstant-rollbacks\u002Findex",[396],{"title":392,"path":393,"stem":394},{"title":398,"path":399,"stem":400,"children":401},"Logs","\u002Fdocs\u002Fproducts\u002Fsites\u002Flogs","docs\u002Fproducts\u002Fsites\u002Flogs\u002Findex",[402],{"title":398,"path":399,"stem":400},{"title":404,"path":405,"stem":406,"children":407},"Previews","\u002Fdocs\u002Fproducts\u002Fsites\u002Fpreviews","docs\u002Fproducts\u002Fsites\u002Fpreviews\u002Findex",[408],{"title":404,"path":405,"stem":406},{"title":410,"path":411,"stem":412,"children":413},"Start with Sites","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Findex",[414,415,421,427,433,439,445,451,457,463,469,475,481],{"title":410,"path":411,"stem":412},{"title":416,"path":417,"stem":418,"children":419},"Deploy an Angular app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fangular","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fangular\u002Findex",[420],{"title":416,"path":417,"stem":418},{"title":422,"path":423,"stem":424,"children":425},"Deploy a Astro app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fastro","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fastro\u002Findex",[426],{"title":422,"path":423,"stem":424},{"title":428,"path":429,"stem":430,"children":431},"Deploy a Flutter Web app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fflutter","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fflutter\u002Findex",[432],{"title":428,"path":429,"stem":430},{"title":434,"path":435,"stem":436,"children":437},"Deploy a Next.js app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fnextjs","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fnextjs\u002Findex",[438],{"title":434,"path":435,"stem":436},{"title":440,"path":441,"stem":442,"children":443},"Deploy a Nuxt app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fnuxt","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fnuxt\u002Findex",[444],{"title":440,"path":441,"stem":442},{"title":446,"path":447,"stem":448,"children":449},"Deploy a React Native app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Freact-native","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Freact-native\u002Findex",[450],{"title":446,"path":447,"stem":448},{"title":452,"path":453,"stem":454,"children":455},"Deploy a React app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Freact","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Freact\u002Findex",[456],{"title":452,"path":453,"stem":454},{"title":458,"path":459,"stem":460,"children":461},"Deploy a Remix app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fremix","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fremix\u002Findex",[462],{"title":458,"path":459,"stem":460},{"title":464,"path":465,"stem":466,"children":467},"Deploy a SvelteKit app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fsveltekit","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fsveltekit\u002Findex",[468],{"title":464,"path":465,"stem":466},{"title":470,"path":471,"stem":472,"children":473},"Deploy a TanStack Start app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Ftanstack-start","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Ftanstack-start\u002Findex",[474],{"title":470,"path":471,"stem":472},{"title":476,"path":477,"stem":478,"children":479},"Deploy a Vanilla JS app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fvanilla","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fvanilla\u002Findex",[480],{"title":476,"path":477,"stem":478},{"title":482,"path":483,"stem":484,"children":485},"Deploy a Vue.js app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fvue","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fvue\u002Findex",[486],{"title":482,"path":483,"stem":484},{"title":488,"path":489,"stem":490,"children":491},"Rendering","\u002Fdocs\u002Fproducts\u002Fsites\u002Frendering","docs\u002Fproducts\u002Fsites\u002Frendering\u002Findex",[492,493,499],{"title":488,"path":489,"stem":490},{"title":494,"path":495,"stem":496,"children":497},"Server Side Rendering","\u002Fdocs\u002Fproducts\u002Fsites\u002Frendering\u002Fssr","docs\u002Fproducts\u002Fsites\u002Frendering\u002Fssr\u002Findex",[498],{"title":494,"path":495,"stem":496},{"title":500,"path":501,"stem":502,"children":503},"Static","\u002Fdocs\u002Fproducts\u002Fsites\u002Frendering\u002Fstatic","docs\u002Fproducts\u002Fsites\u002Frendering\u002Fstatic\u002Findex",[504],{"title":500,"path":501,"stem":502},{"title":506,"path":507,"stem":508,"children":509},"Templates","\u002Fdocs\u002Fproducts\u002Fsites\u002Ftemplates","docs\u002Fproducts\u002Fsites\u002Ftemplates\u002Findex",[510],{"title":506,"path":507,"stem":508},{"title":512,"path":513,"stem":514,"children":515},"Theming","\u002Fdocs\u002Fproducts\u002Fsites\u002Ftheming","docs\u002Fproducts\u002Fsites\u002Ftheming\u002Findex",[516],{"title":512,"path":513,"stem":514},{"title":518,"path":519,"stem":520,"children":521},"Storage","\u002Fdocs\u002Fproducts\u002Fstorage","docs\u002Fproducts\u002Fstorage\u002Findex",[522,523,529,535,541,547,553,559],{"title":518,"path":519,"stem":520},{"title":524,"path":525,"stem":526,"children":527},"Folders","\u002Fdocs\u002Fproducts\u002Fstorage\u002Fbuckets","docs\u002Fproducts\u002Fstorage\u002Fbuckets\u002Findex",[528],{"title":524,"path":525,"stem":526},{"title":530,"path":531,"stem":532,"children":533},"Signed URLs and access","\u002Fdocs\u002Fproducts\u002Fstorage\u002Ffile-tokens","docs\u002Fproducts\u002Fstorage\u002Ffile-tokens\u002Findex",[534],{"title":530,"path":531,"stem":532},{"title":536,"path":537,"stem":538,"children":539},"Serve and transform images","\u002Fdocs\u002Fproducts\u002Fstorage\u002Fimages","docs\u002Fproducts\u002Fstorage\u002Fimages\u002Findex",[540],{"title":536,"path":537,"stem":538},{"title":542,"path":543,"stem":544,"children":545},"3D assets","\u002Fdocs\u002Fproducts\u002Fstorage\u002Fmodel-viewer","docs\u002Fproducts\u002Fstorage\u002Fmodel-viewer\u002Findex",[546],{"title":542,"path":543,"stem":544},{"title":548,"path":549,"stem":550,"children":551},"Access control and visibility","\u002Fdocs\u002Fproducts\u002Fstorage\u002Fpermissions","docs\u002Fproducts\u002Fstorage\u002Fpermissions\u002Findex",[552],{"title":548,"path":549,"stem":550},{"title":554,"path":555,"stem":556,"children":557},"Quick start","\u002Fdocs\u002Fproducts\u002Fstorage\u002Fquick-start","docs\u002Fproducts\u002Fstorage\u002Fquick-start\u002Findex",[558],{"title":554,"path":555,"stem":556},{"title":560,"path":561,"stem":562,"children":563},"Upload and manage files","\u002Fdocs\u002Fproducts\u002Fstorage\u002Fupload-download","docs\u002Fproducts\u002Fstorage\u002Fupload-download\u002Findex",[564],{"title":560,"path":561,"stem":562},{"title":566,"path":567,"stem":568,"children":569},"Webhooks","\u002Fdocs\u002Fproducts\u002Fwebhooks","docs\u002Fproducts\u002Fwebhooks\u002Findex",[570,571,577],{"title":566,"path":567,"stem":568},{"title":572,"path":573,"stem":574,"children":575},"Delivery","\u002Fdocs\u002Fproducts\u002Fwebhooks\u002Fdelivery","docs\u002Fproducts\u002Fwebhooks\u002Fdelivery\u002Findex",[576],{"title":572,"path":573,"stem":574},{"title":578,"path":579,"stem":580,"children":581},"Security","\u002Fdocs\u002Fproducts\u002Fwebhooks\u002Fsecurity","docs\u002Fproducts\u002Fwebhooks\u002Fsecurity\u002Findex",[582],{"title":578,"path":579,"stem":580},{"title":584,"path":585,"stem":586,"children":587},"SDKs","\u002Fdocs\u002Fsdks","docs\u002Fsdks\u002Findex",[588,589,595,601,607,613,619],{"title":584,"path":585,"stem":586},{"title":590,"path":591,"stem":592,"children":593},"App SDK","\u002Fdocs\u002Fsdks\u002Fapp-sdk","docs\u002Fsdks\u002Fapp-sdk\u002Findex",[594],{"title":590,"path":591,"stem":592},{"title":596,"path":597,"stem":598,"children":599},"CLI","\u002Fdocs\u002Fsdks\u002Fcli","docs\u002Fsdks\u002Fcli\u002Findex",[600],{"title":596,"path":597,"stem":598},{"title":602,"path":603,"stem":604,"children":605},"Integration Node SDK","\u002Fdocs\u002Fsdks\u002Fintegration-nodes","docs\u002Fsdks\u002Fintegration-nodes\u002Findex",[606],{"title":602,"path":603,"stem":604},{"title":608,"path":609,"stem":610,"children":611},"Node SDK","\u002Fdocs\u002Fsdks\u002Fnode","docs\u002Fsdks\u002Fnode\u002Findex",[612],{"title":608,"path":609,"stem":610},{"title":614,"path":615,"stem":616,"children":617},"PHP SDK","\u002Fdocs\u002Fsdks\u002Fphp","docs\u002Fsdks\u002Fphp\u002Findex",[618],{"title":614,"path":615,"stem":616},{"title":620,"path":621,"stem":622,"children":623},"Web \u002F JavaScript SDK","\u002Fdocs\u002Fsdks\u002Fweb","docs\u002Fsdks\u002Fweb\u002Findex",[624],{"title":620,"path":621,"stem":622},{"title":626,"path":627,"stem":628,"children":629},"Tooling","\u002Fdocs\u002Ftooling","docs\u002Ftooling\u002Findex",[630,631,637,864],{"title":626,"path":627,"stem":628},{"title":632,"path":633,"stem":634,"children":635},"Command Center","\u002Fdocs\u002Ftooling\u002Fcommand-center","docs\u002Ftooling\u002Fcommand-center\u002Findex",[636],{"title":632,"path":633,"stem":634},{"title":638,"path":639,"stem":640,"children":641},"Command line","\u002Fdocs\u002Ftooling\u002Fcommand-line","docs\u002Ftooling\u002Fcommand-line\u002Findex",[642,643,649,654,660,666,672,678,684,828,834,840,846,852,858],{"title":638,"path":639,"stem":640},{"title":644,"path":645,"stem":646,"children":647},"Aliases","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Faliases","docs\u002Ftooling\u002Fcommand-line\u002Faliases\u002Findex",[648],{"title":644,"path":645,"stem":646},{"title":171,"path":650,"stem":651,"children":652},"\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Fauthentication","docs\u002Ftooling\u002Fcommand-line\u002Fauthentication\u002Findex",[653],{"title":171,"path":650,"stem":651},{"title":655,"path":656,"stem":657,"children":658},"Commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Fcommands","docs\u002Ftooling\u002Fcommand-line\u002Fcommands\u002Findex",[659],{"title":655,"path":656,"stem":657},{"title":661,"path":662,"stem":663,"children":664},"Installation","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Finstallation","docs\u002Ftooling\u002Fcommand-line\u002Finstallation\u002Findex",[665],{"title":661,"path":662,"stem":663},{"title":667,"path":668,"stem":669,"children":670},"Interactive use","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Finteractive","docs\u002Ftooling\u002Fcommand-line\u002Finteractive\u002Findex",[671],{"title":667,"path":668,"stem":669},{"title":673,"path":674,"stem":675,"children":676},"Non-interactive use","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Fnon-interactive","docs\u002Ftooling\u002Fcommand-line\u002Fnon-interactive\u002Findex",[677],{"title":673,"path":674,"stem":675},{"title":679,"path":680,"stem":681,"children":682},"Project configuration","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Fproject-configuration","docs\u002Ftooling\u002Fcommand-line\u002Fproject-configuration\u002Findex",[683],{"title":679,"path":680,"stem":681},{"title":685,"path":686,"stem":687,"children":688},"Command reference","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Findex",[689,690,696,702,708,714,720,726,732,738,744,750,756,762,768,774,780,786,792,798,804,810,816,822],{"title":685,"path":686,"stem":687},{"title":691,"path":692,"stem":693,"children":694},"About commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fabout","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fabout\u002Findex",[695],{"title":691,"path":692,"stem":693},{"title":697,"path":698,"stem":699,"children":700},"Apps commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fapps","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fapps\u002Findex",[701],{"title":697,"path":698,"stem":699},{"title":703,"path":704,"stem":705,"children":706},"Carts commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fcarts","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fcarts\u002Findex",[707],{"title":703,"path":704,"stem":705},{"title":709,"path":710,"stem":711,"children":712},"Channels commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fchannels","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fchannels\u002Findex",[713],{"title":709,"path":710,"stem":711},{"title":715,"path":716,"stem":717,"children":718},"Create commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fcreate","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fcreate\u002Findex",[719],{"title":715,"path":716,"stem":717},{"title":721,"path":722,"stem":723,"children":724},"Customers commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fcustomers","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fcustomers\u002Findex",[725],{"title":721,"path":722,"stem":723},{"title":727,"path":728,"stem":729,"children":730},"Deploy commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fdeploy","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fdeploy\u002Findex",[731],{"title":727,"path":728,"stem":729},{"title":733,"path":734,"stem":735,"children":736},"Forms commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fforms","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fforms\u002Findex",[737],{"title":733,"path":734,"stem":735},{"title":739,"path":740,"stem":741,"children":742},"Inventories commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Finventories","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Finventories\u002Findex",[743],{"title":739,"path":740,"stem":741},{"title":745,"path":746,"stem":747,"children":748},"Markets commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fmarkets","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fmarkets\u002Findex",[749],{"title":745,"path":746,"stem":747},{"title":751,"path":752,"stem":753,"children":754},"Order lists commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Forderlists","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Forderlists\u002Findex",[755],{"title":751,"path":752,"stem":753},{"title":757,"path":758,"stem":759,"children":760},"Orders commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Forders","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Forders\u002Findex",[761],{"title":757,"path":758,"stem":759},{"title":763,"path":764,"stem":765,"children":766},"Pages commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fpages","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fpages\u002Findex",[767],{"title":763,"path":764,"stem":765},{"title":769,"path":770,"stem":771,"children":772},"Payments commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fpayments","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fpayments\u002Findex",[773],{"title":769,"path":770,"stem":771},{"title":775,"path":776,"stem":777,"children":778},"Prices commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fprices","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fprices\u002Findex",[779],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783,"children":784},"Products commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fproducts","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fproducts\u002Findex",[785],{"title":781,"path":782,"stem":783},{"title":787,"path":788,"stem":789,"children":790},"Search commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fsearch","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fsearch\u002Findex",[791],{"title":787,"path":788,"stem":789},{"title":793,"path":794,"stem":795,"children":796},"Settings commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fsettings","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fsettings\u002Findex",[797],{"title":793,"path":794,"stem":795},{"title":799,"path":800,"stem":801,"children":802},"Shipping commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fshipping","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fshipping\u002Findex",[803],{"title":799,"path":800,"stem":801},{"title":805,"path":806,"stem":807,"children":808},"Sites commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fsites","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fsites\u002Findex",[809],{"title":805,"path":806,"stem":807},{"title":811,"path":812,"stem":813,"children":814},"Skills commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fskills","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fskills\u002Findex",[815],{"title":811,"path":812,"stem":813},{"title":817,"path":818,"stem":819,"children":820},"Storage commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fstorage","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fstorage\u002Findex",[821],{"title":817,"path":818,"stem":819},{"title":823,"path":824,"stem":825,"children":826},"Tokens commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Ftokens","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Ftokens\u002Findex",[827],{"title":823,"path":824,"stem":825},{"title":829,"path":830,"stem":831,"children":832},"Interactive shell (REPL)","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Frepl","docs\u002Ftooling\u002Fcommand-line\u002Frepl\u002Findex",[833],{"title":829,"path":830,"stem":831},{"title":835,"path":836,"stem":837,"children":838},"Scaffolding","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Fscaffolding","docs\u002Ftooling\u002Fcommand-line\u002Fscaffolding\u002Findex",[839],{"title":835,"path":836,"stem":837},{"title":841,"path":842,"stem":843,"children":844},"Scripting & output","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Fscripting","docs\u002Ftooling\u002Fcommand-line\u002Fscripting\u002Findex",[845],{"title":841,"path":842,"stem":843},{"title":847,"path":848,"stem":849,"children":850},"Skills","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Fskills","docs\u002Ftooling\u002Fcommand-line\u002Fskills\u002Findex",[851],{"title":847,"path":848,"stem":849},{"title":853,"path":854,"stem":855,"children":856},"Full-screen app (TUI)","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Ftui","docs\u002Ftooling\u002Fcommand-line\u002Ftui\u002Findex",[857],{"title":853,"path":854,"stem":855},{"title":859,"path":860,"stem":861,"children":862},"Type generation","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Ftype-generation","docs\u002Ftooling\u002Fcommand-line\u002Ftype-generation\u002Findex",[863],{"title":859,"path":860,"stem":861},{"title":865,"path":866,"stem":867,"children":868},"Model Context Protocol","\u002Fdocs\u002Ftooling\u002Fmcp","docs\u002Ftooling\u002Fmcp\u002Findex",[869,870,876,882,888,894,900,906,912],{"title":865,"path":866,"stem":867},{"title":871,"path":872,"stem":873,"children":874},"revenexx docs MCP in Google Antigravity","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fantigravity","docs\u002Ftooling\u002Fmcp\u002Fantigravity\u002Findex",[875],{"title":871,"path":872,"stem":873},{"title":877,"path":878,"stem":879,"children":880},"revenexx docs MCP in Claude Code","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fclaude-code","docs\u002Ftooling\u002Fmcp\u002Fclaude-code\u002Findex",[881],{"title":877,"path":878,"stem":879},{"title":883,"path":884,"stem":885,"children":886},"revenexx docs MCP in Claude Desktop","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fclaude-desktop","docs\u002Ftooling\u002Fmcp\u002Fclaude-desktop\u002Findex",[887],{"title":883,"path":884,"stem":885},{"title":889,"path":890,"stem":891,"children":892},"revenexx docs MCP in Cursor","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fcursor","docs\u002Ftooling\u002Fmcp\u002Fcursor\u002Findex",[893],{"title":889,"path":890,"stem":891},{"title":895,"path":896,"stem":897,"children":898},"revenexx docs MCP in OpenCode","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fopencode","docs\u002Ftooling\u002Fmcp\u002Fopencode\u002Findex",[899],{"title":895,"path":896,"stem":897},{"title":901,"path":902,"stem":903,"children":904},"revenexx docs MCP in VS Code","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fvscode","docs\u002Ftooling\u002Fmcp\u002Fvscode\u002Findex",[905],{"title":901,"path":902,"stem":903},{"title":907,"path":908,"stem":909,"children":910},"revenexx docs MCP in Windsurf","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fwindsurf","docs\u002Ftooling\u002Fmcp\u002Fwindsurf\u002Findex",[911],{"title":907,"path":908,"stem":909},{"title":913,"path":914,"stem":915,"children":916},"revenexx docs MCP in Zenflow","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fzenflow","docs\u002Ftooling\u002Fmcp\u002Fzenflow\u002Findex",[917],{"title":913,"path":914,"stem":915},{"title":919,"path":920,"stem":921,"children":922},"Tutorials","\u002Fdocs\u002Ftutorials","docs\u002Ftutorials\u002Findex",[923,924,948,954],{"title":919,"path":920,"stem":921},{"title":925,"path":926,"stem":927,"children":928},"Build a revenexx App","\u002Fdocs\u002Ftutorials\u002Fapps","docs\u002Ftutorials\u002Fapps\u002Findex",[929,930,936,942],{"title":925,"path":926,"stem":927},{"title":931,"path":932,"stem":933,"children":934},"Add a data model","\u002Fdocs\u002Ftutorials\u002Fapps\u002Fadd-a-data-model","docs\u002Ftutorials\u002Fapps\u002Fadd-a-data-model\u002Findex",[935],{"title":931,"path":932,"stem":933},{"title":937,"path":938,"stem":939,"children":940},"Build your first app","\u002Fdocs\u002Ftutorials\u002Fapps\u002Fbuild-your-first-app","docs\u002Ftutorials\u002Fapps\u002Fbuild-your-first-app\u002Findex",[941],{"title":937,"path":938,"stem":939},{"title":943,"path":944,"stem":945,"children":946},"Deploy with the CLI","\u002Fdocs\u002Ftutorials\u002Fapps\u002Fdeploy-with-the-cli","docs\u002Ftutorials\u002Fapps\u002Fdeploy-with-the-cli\u002Findex",[947],{"title":943,"path":944,"stem":945},{"title":949,"path":950,"stem":951,"children":952},"Examples","\u002Fdocs\u002Ftutorials\u002Fexamples","docs\u002Ftutorials\u002Fexamples\u002Findex",[953],{"title":949,"path":950,"stem":951},{"title":955,"path":956,"stem":957,"children":958},"Build a storefront Theme","\u002Fdocs\u002Ftutorials\u002Fthemes","docs\u002Ftutorials\u002Fthemes\u002Findex",[959,960,966,972,978],{"title":955,"path":956,"stem":957},{"title":961,"path":962,"stem":963,"children":964},"Build your first Theme","\u002Fdocs\u002Ftutorials\u002Fthemes\u002Fbuild-your-first-theme","docs\u002Ftutorials\u002Fthemes\u002Fbuild-your-first-theme\u002Findex",[965],{"title":961,"path":962,"stem":963},{"title":967,"path":968,"stem":969,"children":970},"Customize blocks","\u002Fdocs\u002Ftutorials\u002Fthemes\u002Fcustomize-blocks","docs\u002Ftutorials\u002Fthemes\u002Fcustomize-blocks\u002Findex",[971],{"title":967,"path":968,"stem":969},{"title":973,"path":974,"stem":975,"children":976},"Deploy your storefront","\u002Fdocs\u002Ftutorials\u002Fthemes\u002Fdeploy-your-storefront","docs\u002Ftutorials\u002Fthemes\u002Fdeploy-your-storefront\u002Findex",[977],{"title":973,"path":974,"stem":975},{"title":979,"path":980,"stem":981,"children":982},"Theme tokens and styling","\u002Fdocs\u002Ftutorials\u002Fthemes\u002Ftheme-tokens-and-styling","docs\u002Ftutorials\u002Fthemes\u002Ftheme-tokens-and-styling\u002Findex",[983],{"title":979,"path":980,"stem":981},{"id":985,"title":344,"body":986,"description":5076,"extension":5077,"landing":5078,"links":5078,"meta":5079,"navigation":1117,"path":345,"seo":5081,"sitemap":5082,"stem":346,"__hash__":5083},"docs\u002Fdocs\u002Fproducts\u002Fsites\u002Fcheckout\u002Findex.md",{"type":987,"value":988,"toc":5062},"minimark",[989,998,1013,1021,1026,1037,1042,1045,1048,1265,1268,1491,1495,1498,2406,2409,2600,2603,2609,2613,2616,2624,2949,2952,2957,2981,2989,3330,3339,3811,3821,3825,3832,3835,4286,4290,4293,4298,4477,4482,4608,4612,4615,4667,4671,4674,4686,4931,4935,4938,4942,4945,5027,5031,5058],[990,991,992,993,997],"p",{},"This page is for ",[994,995,996],"strong",{},"frontend developers"," customizing the buyer-side checkout. The default storefront ships with a 4-step flow (Cart → Address → Payment → Confirmation) that handles the common case. Your job, on most projects, is to adapt it to the customer's specific order process — typical B2B requirements include cost-center routing, contract-priced line items, ERP-validated SKUs, approval workflows, multi-shipment addresses, net-30 payment terms, and bespoke validation rules.",[990,999,1000,1001,1004,1005,1012],{},"The checkout is ",[994,1002,1003],{},"schema-driven"," via ",[1006,1007,1011],"a",{"href":1008,"rel":1009},"https:\u002F\u002Fformilyjs.org\u002F",[1010],"nofollow","Formily",". This is the lever that lets you customize per customer without forking the storefront: each step's form is defined by a JSON schema (fields, validation, conditional visibility), so you can drop in customer-specific fields by editing config rather than rebuilding Vue components. The pages below walk through each step in detail.",[990,1014,1015,1016,1020],{},"The Payment step is the one most likely to bite you. We use Stripe Elements (or equivalent) to keep card data out of your backend entirely — see the ",[1006,1017,1019],{"href":1018},"#payment-processing","Payment Processing section"," below for the PCI-safe pattern.",[1022,1023,1025],"h2",{"id":1024},"checkout-flow-4-steps","Checkout Flow: 4 Steps",[1027,1028,1033],"pre",{"className":1029,"code":1031,"language":1032},[1030],"language-text","Step 1: Cart Review\n  ↓\nStep 2: Shipping Address\n  ↓\nStep 3: Payment\n  ↓\nStep 4: Confirmation\n","text",[1034,1035,1031],"code",{"__ignoreMap":1036},"",[1038,1039,1041],"h3",{"id":1040},"step-1-cart-review","Step 1: Cart Review",[990,1043,1044],{},"The first step exists to let the buyer confirm what they're about to order — the items, the quantities, and the running total — before they commit to anything. The page shows a product list with image, name, SKU, quantity, and price; the line-item totals broken into subtotal, tax, and a shipping estimate; controls to adjust quantities or remove items; and a button to continue to shipping.",[990,1046,1047],{},"The one bit of real logic here is a stock re-check: between adding an item and reaching checkout, inventory may have moved, so the server confirms each line is still available before letting the buyer proceed:",[1027,1049,1053],{"className":1050,"code":1051,"language":1052,"meta":1036,"style":1036},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Check inventory for each cart item\nconst cartItems = getCart(tenantId)\nconst inventory = await cockpit.checkInventory(cartItems)\n\n\u002F\u002F Validate all items are still in stock\nfor (const item of cartItems) {\n  if (inventory[item.id].available \u003C item.quantity) {\n    throw new Error(`${item.name}: only ${inventory[item.id].available} left`)\n  }\n}\n","typescript",[1034,1054,1055,1064,1086,1112,1119,1125,1148,1195,1253,1259],{"__ignoreMap":1036},[1056,1057,1060],"span",{"class":1058,"line":1059},"line",1,[1056,1061,1063],{"class":1062},"sHwdD","\u002F\u002F Check inventory for each cart item\n",[1056,1065,1067,1071,1075,1079,1083],{"class":1058,"line":1066},2,[1056,1068,1070],{"class":1069},"spNyl","const",[1056,1072,1074],{"class":1073},"sTEyZ"," cartItems ",[1056,1076,1078],{"class":1077},"sMK4o","=",[1056,1080,1082],{"class":1081},"s2Zo4"," getCart",[1056,1084,1085],{"class":1073},"(tenantId)\n",[1056,1087,1089,1091,1094,1096,1100,1103,1106,1109],{"class":1058,"line":1088},3,[1056,1090,1070],{"class":1069},[1056,1092,1093],{"class":1073}," inventory ",[1056,1095,1078],{"class":1077},[1056,1097,1099],{"class":1098},"s7zQu"," await",[1056,1101,1102],{"class":1073}," cockpit",[1056,1104,1105],{"class":1077},".",[1056,1107,1108],{"class":1081},"checkInventory",[1056,1110,1111],{"class":1073},"(cartItems)\n",[1056,1113,1115],{"class":1058,"line":1114},4,[1056,1116,1118],{"emptyLinePlaceholder":1117},true,"\n",[1056,1120,1122],{"class":1058,"line":1121},5,[1056,1123,1124],{"class":1062},"\u002F\u002F Validate all items are still in stock\n",[1056,1126,1128,1131,1134,1136,1139,1142,1145],{"class":1058,"line":1127},6,[1056,1129,1130],{"class":1098},"for",[1056,1132,1133],{"class":1073}," (",[1056,1135,1070],{"class":1069},[1056,1137,1138],{"class":1073}," item ",[1056,1140,1141],{"class":1077},"of",[1056,1143,1144],{"class":1073}," cartItems) ",[1056,1146,1147],{"class":1077},"{\n",[1056,1149,1151,1154,1157,1160,1163,1166,1168,1171,1174,1176,1179,1182,1185,1187,1190,1193],{"class":1058,"line":1150},7,[1056,1152,1153],{"class":1098},"  if",[1056,1155,1133],{"class":1156},"swJcz",[1056,1158,1159],{"class":1073},"inventory",[1056,1161,1162],{"class":1156},"[",[1056,1164,1165],{"class":1073},"item",[1056,1167,1105],{"class":1077},[1056,1169,1170],{"class":1073},"id",[1056,1172,1173],{"class":1156},"]",[1056,1175,1105],{"class":1077},[1056,1177,1178],{"class":1073},"available",[1056,1180,1181],{"class":1077}," \u003C",[1056,1183,1184],{"class":1073}," item",[1056,1186,1105],{"class":1077},[1056,1188,1189],{"class":1073},"quantity",[1056,1191,1192],{"class":1156},") ",[1056,1194,1147],{"class":1077},[1056,1196,1198,1201,1204,1207,1210,1213,1215,1217,1220,1223,1227,1230,1233,1235,1238,1240,1242,1244,1247,1250],{"class":1058,"line":1197},8,[1056,1199,1200],{"class":1098},"    throw",[1056,1202,1203],{"class":1077}," new",[1056,1205,1206],{"class":1081}," Error",[1056,1208,1209],{"class":1156},"(",[1056,1211,1212],{"class":1077},"`${",[1056,1214,1165],{"class":1073},[1056,1216,1105],{"class":1077},[1056,1218,1219],{"class":1073},"name",[1056,1221,1222],{"class":1077},"}",[1056,1224,1226],{"class":1225},"sfazB",": only ",[1056,1228,1229],{"class":1077},"${",[1056,1231,1232],{"class":1073},"inventory[item",[1056,1234,1105],{"class":1077},[1056,1236,1237],{"class":1073},"id]",[1056,1239,1105],{"class":1077},[1056,1241,1178],{"class":1073},[1056,1243,1222],{"class":1077},[1056,1245,1246],{"class":1225}," left",[1056,1248,1249],{"class":1077},"`",[1056,1251,1252],{"class":1156},")\n",[1056,1254,1256],{"class":1058,"line":1255},9,[1056,1257,1258],{"class":1077},"  }\n",[1056,1260,1262],{"class":1058,"line":1261},10,[1056,1263,1264],{"class":1077},"}\n",[990,1266,1267],{},"The cart object the page renders is straightforward — the line items plus the computed totals:",[1027,1269,1273],{"className":1270,"code":1271,"language":1272,"meta":1036,"style":1036},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"items\": [\n    {\n      \"product_id\": \"SKU-001\",\n      \"name\": \"Winter Jacket\",\n      \"quantity\": 1,\n      \"unit_price\": 89.99,\n      \"line_total\": 89.99,\n      \"image_url\": \"https:\u002F\u002F...\"\n    }\n  ],\n  \"subtotal\": 89.99,\n  \"tax\": 17.98,\n  \"shipping\": 10.00,\n  \"total\": 117.97\n}\n","json",[1034,1274,1275,1279,1296,1301,1325,1344,1360,1376,1391,1410,1415,1421,1437,1454,1471,1486],{"__ignoreMap":1036},[1056,1276,1277],{"class":1058,"line":1059},[1056,1278,1147],{"class":1077},[1056,1280,1281,1284,1287,1290,1293],{"class":1058,"line":1066},[1056,1282,1283],{"class":1077},"  \"",[1056,1285,1286],{"class":1069},"items",[1056,1288,1289],{"class":1077},"\"",[1056,1291,1292],{"class":1077},":",[1056,1294,1295],{"class":1077}," [\n",[1056,1297,1298],{"class":1058,"line":1088},[1056,1299,1300],{"class":1077},"    {\n",[1056,1302,1303,1306,1310,1312,1314,1317,1320,1322],{"class":1058,"line":1114},[1056,1304,1305],{"class":1077},"      \"",[1056,1307,1309],{"class":1308},"sBMFI","product_id",[1056,1311,1289],{"class":1077},[1056,1313,1292],{"class":1077},[1056,1315,1316],{"class":1077}," \"",[1056,1318,1319],{"class":1225},"SKU-001",[1056,1321,1289],{"class":1077},[1056,1323,1324],{"class":1077},",\n",[1056,1326,1327,1329,1331,1333,1335,1337,1340,1342],{"class":1058,"line":1121},[1056,1328,1305],{"class":1077},[1056,1330,1219],{"class":1308},[1056,1332,1289],{"class":1077},[1056,1334,1292],{"class":1077},[1056,1336,1316],{"class":1077},[1056,1338,1339],{"class":1225},"Winter Jacket",[1056,1341,1289],{"class":1077},[1056,1343,1324],{"class":1077},[1056,1345,1346,1348,1350,1352,1354,1358],{"class":1058,"line":1127},[1056,1347,1305],{"class":1077},[1056,1349,1189],{"class":1308},[1056,1351,1289],{"class":1077},[1056,1353,1292],{"class":1077},[1056,1355,1357],{"class":1356},"sbssI"," 1",[1056,1359,1324],{"class":1077},[1056,1361,1362,1364,1367,1369,1371,1374],{"class":1058,"line":1150},[1056,1363,1305],{"class":1077},[1056,1365,1366],{"class":1308},"unit_price",[1056,1368,1289],{"class":1077},[1056,1370,1292],{"class":1077},[1056,1372,1373],{"class":1356}," 89.99",[1056,1375,1324],{"class":1077},[1056,1377,1378,1380,1383,1385,1387,1389],{"class":1058,"line":1197},[1056,1379,1305],{"class":1077},[1056,1381,1382],{"class":1308},"line_total",[1056,1384,1289],{"class":1077},[1056,1386,1292],{"class":1077},[1056,1388,1373],{"class":1356},[1056,1390,1324],{"class":1077},[1056,1392,1393,1395,1398,1400,1402,1404,1407],{"class":1058,"line":1255},[1056,1394,1305],{"class":1077},[1056,1396,1397],{"class":1308},"image_url",[1056,1399,1289],{"class":1077},[1056,1401,1292],{"class":1077},[1056,1403,1316],{"class":1077},[1056,1405,1406],{"class":1225},"https:\u002F\u002F...",[1056,1408,1409],{"class":1077},"\"\n",[1056,1411,1412],{"class":1058,"line":1261},[1056,1413,1414],{"class":1077},"    }\n",[1056,1416,1418],{"class":1058,"line":1417},11,[1056,1419,1420],{"class":1077},"  ],\n",[1056,1422,1424,1426,1429,1431,1433,1435],{"class":1058,"line":1423},12,[1056,1425,1283],{"class":1077},[1056,1427,1428],{"class":1069},"subtotal",[1056,1430,1289],{"class":1077},[1056,1432,1292],{"class":1077},[1056,1434,1373],{"class":1356},[1056,1436,1324],{"class":1077},[1056,1438,1440,1442,1445,1447,1449,1452],{"class":1058,"line":1439},13,[1056,1441,1283],{"class":1077},[1056,1443,1444],{"class":1069},"tax",[1056,1446,1289],{"class":1077},[1056,1448,1292],{"class":1077},[1056,1450,1451],{"class":1356}," 17.98",[1056,1453,1324],{"class":1077},[1056,1455,1457,1459,1462,1464,1466,1469],{"class":1058,"line":1456},14,[1056,1458,1283],{"class":1077},[1056,1460,1461],{"class":1069},"shipping",[1056,1463,1289],{"class":1077},[1056,1465,1292],{"class":1077},[1056,1467,1468],{"class":1356}," 10.00",[1056,1470,1324],{"class":1077},[1056,1472,1474,1476,1479,1481,1483],{"class":1058,"line":1473},15,[1056,1475,1283],{"class":1077},[1056,1477,1478],{"class":1069},"total",[1056,1480,1289],{"class":1077},[1056,1482,1292],{"class":1077},[1056,1484,1485],{"class":1356}," 117.97\n",[1056,1487,1489],{"class":1058,"line":1488},16,[1056,1490,1264],{"class":1077},[1038,1492,1494],{"id":1493},"step-2-shipping-address","Step 2: Shipping Address",[990,1496,1497],{},"The second step collects where the order is going and checks that you can actually ship there. This is the first step driven by a Formily schema, so it's the clearest illustration of the pattern that makes the whole checkout customizable: the form's fields, validation rules, and dependencies are all declared as JSON rather than written as Vue, which is exactly what lets you add a customer-specific field — a cost center, a delivery note — without touching component code.",[1027,1499,1501],{"className":1270,"code":1500,"language":1272,"meta":1036,"style":1036},"{\n  \"type\": \"object\",\n  \"properties\": {\n    \"first_name\": {\n      \"type\": \"string\",\n      \"title\": \"First Name\",\n      \"pattern\": \"^[a-zA-Z\\\\s-]+$\",\n      \"minLength\": 2,\n      \"maxLength\": 50,\n      \"required\": true,\n      \"x-component\": \"Input\",\n      \"x-component-props\": {\n        \"placeholder\": \"John\"\n      }\n    },\n    \"last_name\": {\n      \"type\": \"string\",\n      \"title\": \"Last Name\",\n      \"required\": true,\n      \"x-component\": \"Input\"\n    },\n    \"street\": {\n      \"type\": \"string\",\n      \"title\": \"Street Address\",\n      \"required\": true,\n      \"x-component\": \"Input\"\n    },\n    \"city\": {\n      \"type\": \"string\",\n      \"title\": \"City\",\n      \"required\": true,\n      \"x-component\": \"Input\"\n    },\n    \"postal_code\": {\n      \"type\": \"string\",\n      \"title\": \"Postcode\",\n      \"required\": true,\n      \"x-component\": \"Input\"\n    },\n    \"country\": {\n      \"type\": \"string\",\n      \"title\": \"Country\",\n      \"required\": true,\n      \"x-component\": \"Select\",\n      \"x-component-props\": {\n        \"options\": [\n          { \"label\": \"Switzerland\", \"value\": \"CH\" },\n          { \"label\": \"Germany\", \"value\": \"DE\" },\n          { \"label\": \"France\", \"value\": \"FR\" }\n        ]\n      }\n    }\n  },\n  \"required\": [\"first_name\", \"last_name\", \"street\", \"city\", \"postal_code\", \"country\"]\n}\n",[1034,1502,1503,1507,1527,1541,1555,1574,1594,1620,1636,1652,1666,1686,1699,1718,1723,1728,1741,1760,1780,1793,1810,1815,1829,1848,1868,1881,1898,1903,1917,1936,1956,1969,1986,1991,2005,2024,2044,2057,2074,2079,2093,2112,2132,2145,2165,2178,2192,2237,2276,2316,2322,2327,2332,2338,2401],{"__ignoreMap":1036},[1056,1504,1505],{"class":1058,"line":1059},[1056,1506,1147],{"class":1077},[1056,1508,1509,1511,1514,1516,1518,1520,1523,1525],{"class":1058,"line":1066},[1056,1510,1283],{"class":1077},[1056,1512,1513],{"class":1069},"type",[1056,1515,1289],{"class":1077},[1056,1517,1292],{"class":1077},[1056,1519,1316],{"class":1077},[1056,1521,1522],{"class":1225},"object",[1056,1524,1289],{"class":1077},[1056,1526,1324],{"class":1077},[1056,1528,1529,1531,1534,1536,1538],{"class":1058,"line":1088},[1056,1530,1283],{"class":1077},[1056,1532,1533],{"class":1069},"properties",[1056,1535,1289],{"class":1077},[1056,1537,1292],{"class":1077},[1056,1539,1540],{"class":1077}," {\n",[1056,1542,1543,1546,1549,1551,1553],{"class":1058,"line":1114},[1056,1544,1545],{"class":1077},"    \"",[1056,1547,1548],{"class":1308},"first_name",[1056,1550,1289],{"class":1077},[1056,1552,1292],{"class":1077},[1056,1554,1540],{"class":1077},[1056,1556,1557,1559,1561,1563,1565,1567,1570,1572],{"class":1058,"line":1121},[1056,1558,1305],{"class":1077},[1056,1560,1513],{"class":1356},[1056,1562,1289],{"class":1077},[1056,1564,1292],{"class":1077},[1056,1566,1316],{"class":1077},[1056,1568,1569],{"class":1225},"string",[1056,1571,1289],{"class":1077},[1056,1573,1324],{"class":1077},[1056,1575,1576,1578,1581,1583,1585,1587,1590,1592],{"class":1058,"line":1127},[1056,1577,1305],{"class":1077},[1056,1579,1580],{"class":1356},"title",[1056,1582,1289],{"class":1077},[1056,1584,1292],{"class":1077},[1056,1586,1316],{"class":1077},[1056,1588,1589],{"class":1225},"First Name",[1056,1591,1289],{"class":1077},[1056,1593,1324],{"class":1077},[1056,1595,1596,1598,1601,1603,1605,1607,1610,1613,1616,1618],{"class":1058,"line":1150},[1056,1597,1305],{"class":1077},[1056,1599,1600],{"class":1356},"pattern",[1056,1602,1289],{"class":1077},[1056,1604,1292],{"class":1077},[1056,1606,1316],{"class":1077},[1056,1608,1609],{"class":1225},"^[a-zA-Z",[1056,1611,1612],{"class":1073},"\\\\",[1056,1614,1615],{"class":1225},"s-]+$",[1056,1617,1289],{"class":1077},[1056,1619,1324],{"class":1077},[1056,1621,1622,1624,1627,1629,1631,1634],{"class":1058,"line":1197},[1056,1623,1305],{"class":1077},[1056,1625,1626],{"class":1356},"minLength",[1056,1628,1289],{"class":1077},[1056,1630,1292],{"class":1077},[1056,1632,1633],{"class":1356}," 2",[1056,1635,1324],{"class":1077},[1056,1637,1638,1640,1643,1645,1647,1650],{"class":1058,"line":1255},[1056,1639,1305],{"class":1077},[1056,1641,1642],{"class":1356},"maxLength",[1056,1644,1289],{"class":1077},[1056,1646,1292],{"class":1077},[1056,1648,1649],{"class":1356}," 50",[1056,1651,1324],{"class":1077},[1056,1653,1654,1656,1659,1661,1663],{"class":1058,"line":1261},[1056,1655,1305],{"class":1077},[1056,1657,1658],{"class":1356},"required",[1056,1660,1289],{"class":1077},[1056,1662,1292],{"class":1077},[1056,1664,1665],{"class":1077}," true,\n",[1056,1667,1668,1670,1673,1675,1677,1679,1682,1684],{"class":1058,"line":1417},[1056,1669,1305],{"class":1077},[1056,1671,1672],{"class":1356},"x-component",[1056,1674,1289],{"class":1077},[1056,1676,1292],{"class":1077},[1056,1678,1316],{"class":1077},[1056,1680,1681],{"class":1225},"Input",[1056,1683,1289],{"class":1077},[1056,1685,1324],{"class":1077},[1056,1687,1688,1690,1693,1695,1697],{"class":1058,"line":1423},[1056,1689,1305],{"class":1077},[1056,1691,1692],{"class":1356},"x-component-props",[1056,1694,1289],{"class":1077},[1056,1696,1292],{"class":1077},[1056,1698,1540],{"class":1077},[1056,1700,1701,1704,1707,1709,1711,1713,1716],{"class":1058,"line":1439},[1056,1702,1703],{"class":1077},"        \"",[1056,1705,1706],{"class":1156},"placeholder",[1056,1708,1289],{"class":1077},[1056,1710,1292],{"class":1077},[1056,1712,1316],{"class":1077},[1056,1714,1715],{"class":1225},"John",[1056,1717,1409],{"class":1077},[1056,1719,1720],{"class":1058,"line":1456},[1056,1721,1722],{"class":1077},"      }\n",[1056,1724,1725],{"class":1058,"line":1473},[1056,1726,1727],{"class":1077},"    },\n",[1056,1729,1730,1732,1735,1737,1739],{"class":1058,"line":1488},[1056,1731,1545],{"class":1077},[1056,1733,1734],{"class":1308},"last_name",[1056,1736,1289],{"class":1077},[1056,1738,1292],{"class":1077},[1056,1740,1540],{"class":1077},[1056,1742,1744,1746,1748,1750,1752,1754,1756,1758],{"class":1058,"line":1743},17,[1056,1745,1305],{"class":1077},[1056,1747,1513],{"class":1356},[1056,1749,1289],{"class":1077},[1056,1751,1292],{"class":1077},[1056,1753,1316],{"class":1077},[1056,1755,1569],{"class":1225},[1056,1757,1289],{"class":1077},[1056,1759,1324],{"class":1077},[1056,1761,1763,1765,1767,1769,1771,1773,1776,1778],{"class":1058,"line":1762},18,[1056,1764,1305],{"class":1077},[1056,1766,1580],{"class":1356},[1056,1768,1289],{"class":1077},[1056,1770,1292],{"class":1077},[1056,1772,1316],{"class":1077},[1056,1774,1775],{"class":1225},"Last Name",[1056,1777,1289],{"class":1077},[1056,1779,1324],{"class":1077},[1056,1781,1783,1785,1787,1789,1791],{"class":1058,"line":1782},19,[1056,1784,1305],{"class":1077},[1056,1786,1658],{"class":1356},[1056,1788,1289],{"class":1077},[1056,1790,1292],{"class":1077},[1056,1792,1665],{"class":1077},[1056,1794,1796,1798,1800,1802,1804,1806,1808],{"class":1058,"line":1795},20,[1056,1797,1305],{"class":1077},[1056,1799,1672],{"class":1356},[1056,1801,1289],{"class":1077},[1056,1803,1292],{"class":1077},[1056,1805,1316],{"class":1077},[1056,1807,1681],{"class":1225},[1056,1809,1409],{"class":1077},[1056,1811,1813],{"class":1058,"line":1812},21,[1056,1814,1727],{"class":1077},[1056,1816,1818,1820,1823,1825,1827],{"class":1058,"line":1817},22,[1056,1819,1545],{"class":1077},[1056,1821,1822],{"class":1308},"street",[1056,1824,1289],{"class":1077},[1056,1826,1292],{"class":1077},[1056,1828,1540],{"class":1077},[1056,1830,1832,1834,1836,1838,1840,1842,1844,1846],{"class":1058,"line":1831},23,[1056,1833,1305],{"class":1077},[1056,1835,1513],{"class":1356},[1056,1837,1289],{"class":1077},[1056,1839,1292],{"class":1077},[1056,1841,1316],{"class":1077},[1056,1843,1569],{"class":1225},[1056,1845,1289],{"class":1077},[1056,1847,1324],{"class":1077},[1056,1849,1851,1853,1855,1857,1859,1861,1864,1866],{"class":1058,"line":1850},24,[1056,1852,1305],{"class":1077},[1056,1854,1580],{"class":1356},[1056,1856,1289],{"class":1077},[1056,1858,1292],{"class":1077},[1056,1860,1316],{"class":1077},[1056,1862,1863],{"class":1225},"Street Address",[1056,1865,1289],{"class":1077},[1056,1867,1324],{"class":1077},[1056,1869,1871,1873,1875,1877,1879],{"class":1058,"line":1870},25,[1056,1872,1305],{"class":1077},[1056,1874,1658],{"class":1356},[1056,1876,1289],{"class":1077},[1056,1878,1292],{"class":1077},[1056,1880,1665],{"class":1077},[1056,1882,1884,1886,1888,1890,1892,1894,1896],{"class":1058,"line":1883},26,[1056,1885,1305],{"class":1077},[1056,1887,1672],{"class":1356},[1056,1889,1289],{"class":1077},[1056,1891,1292],{"class":1077},[1056,1893,1316],{"class":1077},[1056,1895,1681],{"class":1225},[1056,1897,1409],{"class":1077},[1056,1899,1901],{"class":1058,"line":1900},27,[1056,1902,1727],{"class":1077},[1056,1904,1906,1908,1911,1913,1915],{"class":1058,"line":1905},28,[1056,1907,1545],{"class":1077},[1056,1909,1910],{"class":1308},"city",[1056,1912,1289],{"class":1077},[1056,1914,1292],{"class":1077},[1056,1916,1540],{"class":1077},[1056,1918,1920,1922,1924,1926,1928,1930,1932,1934],{"class":1058,"line":1919},29,[1056,1921,1305],{"class":1077},[1056,1923,1513],{"class":1356},[1056,1925,1289],{"class":1077},[1056,1927,1292],{"class":1077},[1056,1929,1316],{"class":1077},[1056,1931,1569],{"class":1225},[1056,1933,1289],{"class":1077},[1056,1935,1324],{"class":1077},[1056,1937,1939,1941,1943,1945,1947,1949,1952,1954],{"class":1058,"line":1938},30,[1056,1940,1305],{"class":1077},[1056,1942,1580],{"class":1356},[1056,1944,1289],{"class":1077},[1056,1946,1292],{"class":1077},[1056,1948,1316],{"class":1077},[1056,1950,1951],{"class":1225},"City",[1056,1953,1289],{"class":1077},[1056,1955,1324],{"class":1077},[1056,1957,1959,1961,1963,1965,1967],{"class":1058,"line":1958},31,[1056,1960,1305],{"class":1077},[1056,1962,1658],{"class":1356},[1056,1964,1289],{"class":1077},[1056,1966,1292],{"class":1077},[1056,1968,1665],{"class":1077},[1056,1970,1972,1974,1976,1978,1980,1982,1984],{"class":1058,"line":1971},32,[1056,1973,1305],{"class":1077},[1056,1975,1672],{"class":1356},[1056,1977,1289],{"class":1077},[1056,1979,1292],{"class":1077},[1056,1981,1316],{"class":1077},[1056,1983,1681],{"class":1225},[1056,1985,1409],{"class":1077},[1056,1987,1989],{"class":1058,"line":1988},33,[1056,1990,1727],{"class":1077},[1056,1992,1994,1996,1999,2001,2003],{"class":1058,"line":1993},34,[1056,1995,1545],{"class":1077},[1056,1997,1998],{"class":1308},"postal_code",[1056,2000,1289],{"class":1077},[1056,2002,1292],{"class":1077},[1056,2004,1540],{"class":1077},[1056,2006,2008,2010,2012,2014,2016,2018,2020,2022],{"class":1058,"line":2007},35,[1056,2009,1305],{"class":1077},[1056,2011,1513],{"class":1356},[1056,2013,1289],{"class":1077},[1056,2015,1292],{"class":1077},[1056,2017,1316],{"class":1077},[1056,2019,1569],{"class":1225},[1056,2021,1289],{"class":1077},[1056,2023,1324],{"class":1077},[1056,2025,2027,2029,2031,2033,2035,2037,2040,2042],{"class":1058,"line":2026},36,[1056,2028,1305],{"class":1077},[1056,2030,1580],{"class":1356},[1056,2032,1289],{"class":1077},[1056,2034,1292],{"class":1077},[1056,2036,1316],{"class":1077},[1056,2038,2039],{"class":1225},"Postcode",[1056,2041,1289],{"class":1077},[1056,2043,1324],{"class":1077},[1056,2045,2047,2049,2051,2053,2055],{"class":1058,"line":2046},37,[1056,2048,1305],{"class":1077},[1056,2050,1658],{"class":1356},[1056,2052,1289],{"class":1077},[1056,2054,1292],{"class":1077},[1056,2056,1665],{"class":1077},[1056,2058,2060,2062,2064,2066,2068,2070,2072],{"class":1058,"line":2059},38,[1056,2061,1305],{"class":1077},[1056,2063,1672],{"class":1356},[1056,2065,1289],{"class":1077},[1056,2067,1292],{"class":1077},[1056,2069,1316],{"class":1077},[1056,2071,1681],{"class":1225},[1056,2073,1409],{"class":1077},[1056,2075,2077],{"class":1058,"line":2076},39,[1056,2078,1727],{"class":1077},[1056,2080,2082,2084,2087,2089,2091],{"class":1058,"line":2081},40,[1056,2083,1545],{"class":1077},[1056,2085,2086],{"class":1308},"country",[1056,2088,1289],{"class":1077},[1056,2090,1292],{"class":1077},[1056,2092,1540],{"class":1077},[1056,2094,2096,2098,2100,2102,2104,2106,2108,2110],{"class":1058,"line":2095},41,[1056,2097,1305],{"class":1077},[1056,2099,1513],{"class":1356},[1056,2101,1289],{"class":1077},[1056,2103,1292],{"class":1077},[1056,2105,1316],{"class":1077},[1056,2107,1569],{"class":1225},[1056,2109,1289],{"class":1077},[1056,2111,1324],{"class":1077},[1056,2113,2115,2117,2119,2121,2123,2125,2128,2130],{"class":1058,"line":2114},42,[1056,2116,1305],{"class":1077},[1056,2118,1580],{"class":1356},[1056,2120,1289],{"class":1077},[1056,2122,1292],{"class":1077},[1056,2124,1316],{"class":1077},[1056,2126,2127],{"class":1225},"Country",[1056,2129,1289],{"class":1077},[1056,2131,1324],{"class":1077},[1056,2133,2135,2137,2139,2141,2143],{"class":1058,"line":2134},43,[1056,2136,1305],{"class":1077},[1056,2138,1658],{"class":1356},[1056,2140,1289],{"class":1077},[1056,2142,1292],{"class":1077},[1056,2144,1665],{"class":1077},[1056,2146,2148,2150,2152,2154,2156,2158,2161,2163],{"class":1058,"line":2147},44,[1056,2149,1305],{"class":1077},[1056,2151,1672],{"class":1356},[1056,2153,1289],{"class":1077},[1056,2155,1292],{"class":1077},[1056,2157,1316],{"class":1077},[1056,2159,2160],{"class":1225},"Select",[1056,2162,1289],{"class":1077},[1056,2164,1324],{"class":1077},[1056,2166,2168,2170,2172,2174,2176],{"class":1058,"line":2167},45,[1056,2169,1305],{"class":1077},[1056,2171,1692],{"class":1356},[1056,2173,1289],{"class":1077},[1056,2175,1292],{"class":1077},[1056,2177,1540],{"class":1077},[1056,2179,2181,2183,2186,2188,2190],{"class":1058,"line":2180},46,[1056,2182,1703],{"class":1077},[1056,2184,2185],{"class":1156},"options",[1056,2187,1289],{"class":1077},[1056,2189,1292],{"class":1077},[1056,2191,1295],{"class":1077},[1056,2193,2195,2198,2200,2204,2206,2208,2210,2213,2215,2218,2220,2223,2225,2227,2229,2232,2234],{"class":1058,"line":2194},47,[1056,2196,2197],{"class":1077},"          {",[1056,2199,1316],{"class":1077},[1056,2201,2203],{"class":2202},"su27w","label",[1056,2205,1289],{"class":1077},[1056,2207,1292],{"class":1077},[1056,2209,1316],{"class":1077},[1056,2211,2212],{"class":1225},"Switzerland",[1056,2214,1289],{"class":1077},[1056,2216,2217],{"class":1077},",",[1056,2219,1316],{"class":1077},[1056,2221,2222],{"class":2202},"value",[1056,2224,1289],{"class":1077},[1056,2226,1292],{"class":1077},[1056,2228,1316],{"class":1077},[1056,2230,2231],{"class":1225},"CH",[1056,2233,1289],{"class":1077},[1056,2235,2236],{"class":1077}," },\n",[1056,2238,2240,2242,2244,2246,2248,2250,2252,2255,2257,2259,2261,2263,2265,2267,2269,2272,2274],{"class":1058,"line":2239},48,[1056,2241,2197],{"class":1077},[1056,2243,1316],{"class":1077},[1056,2245,2203],{"class":2202},[1056,2247,1289],{"class":1077},[1056,2249,1292],{"class":1077},[1056,2251,1316],{"class":1077},[1056,2253,2254],{"class":1225},"Germany",[1056,2256,1289],{"class":1077},[1056,2258,2217],{"class":1077},[1056,2260,1316],{"class":1077},[1056,2262,2222],{"class":2202},[1056,2264,1289],{"class":1077},[1056,2266,1292],{"class":1077},[1056,2268,1316],{"class":1077},[1056,2270,2271],{"class":1225},"DE",[1056,2273,1289],{"class":1077},[1056,2275,2236],{"class":1077},[1056,2277,2279,2281,2283,2285,2287,2289,2291,2294,2296,2298,2300,2302,2304,2306,2308,2311,2313],{"class":1058,"line":2278},49,[1056,2280,2197],{"class":1077},[1056,2282,1316],{"class":1077},[1056,2284,2203],{"class":2202},[1056,2286,1289],{"class":1077},[1056,2288,1292],{"class":1077},[1056,2290,1316],{"class":1077},[1056,2292,2293],{"class":1225},"France",[1056,2295,1289],{"class":1077},[1056,2297,2217],{"class":1077},[1056,2299,1316],{"class":1077},[1056,2301,2222],{"class":2202},[1056,2303,1289],{"class":1077},[1056,2305,1292],{"class":1077},[1056,2307,1316],{"class":1077},[1056,2309,2310],{"class":1225},"FR",[1056,2312,1289],{"class":1077},[1056,2314,2315],{"class":1077}," }\n",[1056,2317,2319],{"class":1058,"line":2318},50,[1056,2320,2321],{"class":1077},"        ]\n",[1056,2323,2325],{"class":1058,"line":2324},51,[1056,2326,1722],{"class":1077},[1056,2328,2330],{"class":1058,"line":2329},52,[1056,2331,1414],{"class":1077},[1056,2333,2335],{"class":1058,"line":2334},53,[1056,2336,2337],{"class":1077},"  },\n",[1056,2339,2341,2343,2345,2347,2349,2352,2354,2356,2358,2360,2362,2364,2366,2368,2370,2372,2374,2376,2378,2380,2382,2384,2386,2388,2390,2392,2394,2396,2398],{"class":1058,"line":2340},54,[1056,2342,1283],{"class":1077},[1056,2344,1658],{"class":1069},[1056,2346,1289],{"class":1077},[1056,2348,1292],{"class":1077},[1056,2350,2351],{"class":1077}," [",[1056,2353,1289],{"class":1077},[1056,2355,1548],{"class":1225},[1056,2357,1289],{"class":1077},[1056,2359,2217],{"class":1077},[1056,2361,1316],{"class":1077},[1056,2363,1734],{"class":1225},[1056,2365,1289],{"class":1077},[1056,2367,2217],{"class":1077},[1056,2369,1316],{"class":1077},[1056,2371,1822],{"class":1225},[1056,2373,1289],{"class":1077},[1056,2375,2217],{"class":1077},[1056,2377,1316],{"class":1077},[1056,2379,1910],{"class":1225},[1056,2381,1289],{"class":1077},[1056,2383,2217],{"class":1077},[1056,2385,1316],{"class":1077},[1056,2387,1998],{"class":1225},[1056,2389,1289],{"class":1077},[1056,2391,2217],{"class":1077},[1056,2393,1316],{"class":1077},[1056,2395,2086],{"class":1225},[1056,2397,1289],{"class":1077},[1056,2399,2400],{"class":1077},"]\n",[1056,2402,2404],{"class":1058,"line":2403},55,[1056,2405,1264],{"class":1077},[990,2407,2408],{},"Validation happens at two levels. Formily enforces the simple rules from the schema itself — required fields, and patterns like a postcode matching its country's format. But coverage is something only the server knows, so an async check confirms you actually ship to the entered address before the buyer can continue:",[1027,2410,2412],{"className":1050,"code":2411,"language":1052,"meta":1036,"style":1036},"\u002F\u002F Server-side postcode validation\nexport default defineEventHandler(async (event) => {\n  const { postal_code, country } = await readBody(event)\n  \n  const shipsCoverage = await cockpit.shipping.checkCoverage(country, postal_code)\n  if (!shipsCoverage) {\n    throw new Error(`We don't ship to ${postal_code}, ${country}`)\n  }\n  \n  return { covered: true }\n})\n",[1034,2413,2414,2419,2449,2482,2487,2519,2535,2568,2572,2576,2594],{"__ignoreMap":1036},[1056,2415,2416],{"class":1058,"line":1059},[1056,2417,2418],{"class":1062},"\u002F\u002F Server-side postcode validation\n",[1056,2420,2421,2424,2427,2430,2432,2435,2437,2441,2444,2447],{"class":1058,"line":1066},[1056,2422,2423],{"class":1098},"export",[1056,2425,2426],{"class":1098}," default",[1056,2428,2429],{"class":1081}," defineEventHandler",[1056,2431,1209],{"class":1073},[1056,2433,2434],{"class":1069},"async",[1056,2436,1133],{"class":1077},[1056,2438,2440],{"class":2439},"sHdIc","event",[1056,2442,2443],{"class":1077},")",[1056,2445,2446],{"class":1069}," =>",[1056,2448,1540],{"class":1077},[1056,2450,2451,2454,2457,2460,2462,2465,2468,2471,2473,2476,2478,2480],{"class":1058,"line":1088},[1056,2452,2453],{"class":1069},"  const",[1056,2455,2456],{"class":1077}," {",[1056,2458,2459],{"class":1073}," postal_code",[1056,2461,2217],{"class":1077},[1056,2463,2464],{"class":1073}," country",[1056,2466,2467],{"class":1077}," }",[1056,2469,2470],{"class":1077}," =",[1056,2472,1099],{"class":1098},[1056,2474,2475],{"class":1081}," readBody",[1056,2477,1209],{"class":1156},[1056,2479,2440],{"class":1073},[1056,2481,1252],{"class":1156},[1056,2483,2484],{"class":1058,"line":1114},[1056,2485,2486],{"class":1156},"  \n",[1056,2488,2489,2491,2494,2496,2498,2500,2502,2504,2506,2509,2511,2513,2515,2517],{"class":1058,"line":1121},[1056,2490,2453],{"class":1069},[1056,2492,2493],{"class":1073}," shipsCoverage",[1056,2495,2470],{"class":1077},[1056,2497,1099],{"class":1098},[1056,2499,1102],{"class":1073},[1056,2501,1105],{"class":1077},[1056,2503,1461],{"class":1073},[1056,2505,1105],{"class":1077},[1056,2507,2508],{"class":1081},"checkCoverage",[1056,2510,1209],{"class":1156},[1056,2512,2086],{"class":1073},[1056,2514,2217],{"class":1077},[1056,2516,2459],{"class":1073},[1056,2518,1252],{"class":1156},[1056,2520,2521,2523,2525,2528,2531,2533],{"class":1058,"line":1127},[1056,2522,1153],{"class":1098},[1056,2524,1133],{"class":1156},[1056,2526,2527],{"class":1077},"!",[1056,2529,2530],{"class":1073},"shipsCoverage",[1056,2532,1192],{"class":1156},[1056,2534,1147],{"class":1077},[1056,2536,2537,2539,2541,2543,2545,2547,2550,2552,2554,2556,2559,2561,2563,2566],{"class":1058,"line":1150},[1056,2538,1200],{"class":1098},[1056,2540,1203],{"class":1077},[1056,2542,1206],{"class":1081},[1056,2544,1209],{"class":1156},[1056,2546,1249],{"class":1077},[1056,2548,2549],{"class":1225},"We don't ship to ",[1056,2551,1229],{"class":1077},[1056,2553,1998],{"class":1073},[1056,2555,1222],{"class":1077},[1056,2557,2558],{"class":1225},", ",[1056,2560,1229],{"class":1077},[1056,2562,2086],{"class":1073},[1056,2564,2565],{"class":1077},"}`",[1056,2567,1252],{"class":1156},[1056,2569,2570],{"class":1058,"line":1197},[1056,2571,1258],{"class":1077},[1056,2573,2574],{"class":1058,"line":1255},[1056,2575,2486],{"class":1156},[1056,2577,2578,2581,2583,2586,2588,2592],{"class":1058,"line":1261},[1056,2579,2580],{"class":1098},"  return",[1056,2582,2456],{"class":1077},[1056,2584,2585],{"class":1156}," covered",[1056,2587,1292],{"class":1077},[1056,2589,2591],{"class":2590},"sfNiH"," true",[1056,2593,2315],{"class":1077},[1056,2595,2596,2598],{"class":1058,"line":1417},[1056,2597,1222],{"class":1077},[1056,2599,1252],{"class":1073},[990,2601,2602],{},"Once the address is valid, the buyer picks a shipping method — typically a free standard option alongside faster paid ones — and choosing one feeds back into the totals from Step 1:",[1027,2604,2607],{"className":2605,"code":2606,"language":1032},[1030],"Standard (5-7 business days) — Free\nExpedited (2-3 business days) — €12.00\nExpress (Next day) — €25.00\n",[1034,2608,2606],{"__ignoreMap":1036},[1038,2610,2612],{"id":2611},"step-3-payment","Step 3: Payment",[990,2614,2615],{},"The third step collects payment and runs the transaction, and it's the step where getting the architecture right matters most. Buyers can pay by credit or debit card (via Stripe), PayPal, SEPA bank transfer, or — on mobile — Apple Pay and Google Pay. Whichever they choose, the same principle governs the design: card data must never touch your servers.",[990,2617,2618,2619,2623],{},"That shapes how the form is split. The Formily schema collects only the ",[2620,2621,2622],"em",{},"choice"," of payment method and the cardholder name; the actual card fields are rendered by a dedicated Stripe Elements component, iframe-isolated so the card data stays out of your page's JavaScript and form state entirely:",[1027,2625,2627],{"className":1270,"code":2626,"language":1272,"meta":1036,"style":1036},"{\n  \"type\": \"object\",\n  \"properties\": {\n    \"payment_method\": {\n      \"type\": \"string\",\n      \"enum\": [\"card\", \"paypal\", \"bank_transfer\"],\n      \"x-component\": \"RadioGroup\"\n    },\n    \"cardholder_name\": {\n      \"type\": \"string\",\n      \"title\": \"Cardholder Name\",\n      \"x-component\": \"Input\",\n      \"x-display\": \"hidden\",\n      \"x-reactions\": {\n        \"dependencies\": [\"payment_method\"],\n        \"fulfill\": {\n          \"state\": {\n            \"hidden\": \"{{$deps[0] !== 'card'}}\"\n          }\n        }\n      }\n    }\n  }\n}\n",[1034,2628,2629,2633,2651,2663,2676,2694,2735,2752,2756,2769,2787,2806,2824,2844,2857,2878,2891,2905,2923,2928,2933,2937,2941,2945],{"__ignoreMap":1036},[1056,2630,2631],{"class":1058,"line":1059},[1056,2632,1147],{"class":1077},[1056,2634,2635,2637,2639,2641,2643,2645,2647,2649],{"class":1058,"line":1066},[1056,2636,1283],{"class":1077},[1056,2638,1513],{"class":1069},[1056,2640,1289],{"class":1077},[1056,2642,1292],{"class":1077},[1056,2644,1316],{"class":1077},[1056,2646,1522],{"class":1225},[1056,2648,1289],{"class":1077},[1056,2650,1324],{"class":1077},[1056,2652,2653,2655,2657,2659,2661],{"class":1058,"line":1088},[1056,2654,1283],{"class":1077},[1056,2656,1533],{"class":1069},[1056,2658,1289],{"class":1077},[1056,2660,1292],{"class":1077},[1056,2662,1540],{"class":1077},[1056,2664,2665,2667,2670,2672,2674],{"class":1058,"line":1114},[1056,2666,1545],{"class":1077},[1056,2668,2669],{"class":1308},"payment_method",[1056,2671,1289],{"class":1077},[1056,2673,1292],{"class":1077},[1056,2675,1540],{"class":1077},[1056,2677,2678,2680,2682,2684,2686,2688,2690,2692],{"class":1058,"line":1121},[1056,2679,1305],{"class":1077},[1056,2681,1513],{"class":1356},[1056,2683,1289],{"class":1077},[1056,2685,1292],{"class":1077},[1056,2687,1316],{"class":1077},[1056,2689,1569],{"class":1225},[1056,2691,1289],{"class":1077},[1056,2693,1324],{"class":1077},[1056,2695,2696,2698,2701,2703,2705,2707,2709,2712,2714,2716,2718,2721,2723,2725,2727,2730,2732],{"class":1058,"line":1127},[1056,2697,1305],{"class":1077},[1056,2699,2700],{"class":1356},"enum",[1056,2702,1289],{"class":1077},[1056,2704,1292],{"class":1077},[1056,2706,2351],{"class":1077},[1056,2708,1289],{"class":1077},[1056,2710,2711],{"class":1225},"card",[1056,2713,1289],{"class":1077},[1056,2715,2217],{"class":1077},[1056,2717,1316],{"class":1077},[1056,2719,2720],{"class":1225},"paypal",[1056,2722,1289],{"class":1077},[1056,2724,2217],{"class":1077},[1056,2726,1316],{"class":1077},[1056,2728,2729],{"class":1225},"bank_transfer",[1056,2731,1289],{"class":1077},[1056,2733,2734],{"class":1077},"],\n",[1056,2736,2737,2739,2741,2743,2745,2747,2750],{"class":1058,"line":1150},[1056,2738,1305],{"class":1077},[1056,2740,1672],{"class":1356},[1056,2742,1289],{"class":1077},[1056,2744,1292],{"class":1077},[1056,2746,1316],{"class":1077},[1056,2748,2749],{"class":1225},"RadioGroup",[1056,2751,1409],{"class":1077},[1056,2753,2754],{"class":1058,"line":1197},[1056,2755,1727],{"class":1077},[1056,2757,2758,2760,2763,2765,2767],{"class":1058,"line":1255},[1056,2759,1545],{"class":1077},[1056,2761,2762],{"class":1308},"cardholder_name",[1056,2764,1289],{"class":1077},[1056,2766,1292],{"class":1077},[1056,2768,1540],{"class":1077},[1056,2770,2771,2773,2775,2777,2779,2781,2783,2785],{"class":1058,"line":1261},[1056,2772,1305],{"class":1077},[1056,2774,1513],{"class":1356},[1056,2776,1289],{"class":1077},[1056,2778,1292],{"class":1077},[1056,2780,1316],{"class":1077},[1056,2782,1569],{"class":1225},[1056,2784,1289],{"class":1077},[1056,2786,1324],{"class":1077},[1056,2788,2789,2791,2793,2795,2797,2799,2802,2804],{"class":1058,"line":1417},[1056,2790,1305],{"class":1077},[1056,2792,1580],{"class":1356},[1056,2794,1289],{"class":1077},[1056,2796,1292],{"class":1077},[1056,2798,1316],{"class":1077},[1056,2800,2801],{"class":1225},"Cardholder Name",[1056,2803,1289],{"class":1077},[1056,2805,1324],{"class":1077},[1056,2807,2808,2810,2812,2814,2816,2818,2820,2822],{"class":1058,"line":1423},[1056,2809,1305],{"class":1077},[1056,2811,1672],{"class":1356},[1056,2813,1289],{"class":1077},[1056,2815,1292],{"class":1077},[1056,2817,1316],{"class":1077},[1056,2819,1681],{"class":1225},[1056,2821,1289],{"class":1077},[1056,2823,1324],{"class":1077},[1056,2825,2826,2828,2831,2833,2835,2837,2840,2842],{"class":1058,"line":1439},[1056,2827,1305],{"class":1077},[1056,2829,2830],{"class":1356},"x-display",[1056,2832,1289],{"class":1077},[1056,2834,1292],{"class":1077},[1056,2836,1316],{"class":1077},[1056,2838,2839],{"class":1225},"hidden",[1056,2841,1289],{"class":1077},[1056,2843,1324],{"class":1077},[1056,2845,2846,2848,2851,2853,2855],{"class":1058,"line":1456},[1056,2847,1305],{"class":1077},[1056,2849,2850],{"class":1356},"x-reactions",[1056,2852,1289],{"class":1077},[1056,2854,1292],{"class":1077},[1056,2856,1540],{"class":1077},[1056,2858,2859,2861,2864,2866,2868,2870,2872,2874,2876],{"class":1058,"line":1473},[1056,2860,1703],{"class":1077},[1056,2862,2863],{"class":1156},"dependencies",[1056,2865,1289],{"class":1077},[1056,2867,1292],{"class":1077},[1056,2869,2351],{"class":1077},[1056,2871,1289],{"class":1077},[1056,2873,2669],{"class":1225},[1056,2875,1289],{"class":1077},[1056,2877,2734],{"class":1077},[1056,2879,2880,2882,2885,2887,2889],{"class":1058,"line":1488},[1056,2881,1703],{"class":1077},[1056,2883,2884],{"class":1156},"fulfill",[1056,2886,1289],{"class":1077},[1056,2888,1292],{"class":1077},[1056,2890,1540],{"class":1077},[1056,2892,2893,2896,2899,2901,2903],{"class":1058,"line":1743},[1056,2894,2895],{"class":1077},"          \"",[1056,2897,2898],{"class":2202},"state",[1056,2900,1289],{"class":1077},[1056,2902,1292],{"class":1077},[1056,2904,1540],{"class":1077},[1056,2906,2907,2910,2912,2914,2916,2918,2921],{"class":1058,"line":1762},[1056,2908,2909],{"class":1077},"            \"",[1056,2911,2839],{"class":1081},[1056,2913,1289],{"class":1077},[1056,2915,1292],{"class":1077},[1056,2917,1316],{"class":1077},[1056,2919,2920],{"class":1225},"{{$deps[0] !== 'card'}}",[1056,2922,1409],{"class":1077},[1056,2924,2925],{"class":1058,"line":1782},[1056,2926,2927],{"class":1077},"          }\n",[1056,2929,2930],{"class":1058,"line":1795},[1056,2931,2932],{"class":1077},"        }\n",[1056,2934,2935],{"class":1058,"line":1812},[1056,2936,1722],{"class":1077},[1056,2938,2939],{"class":1058,"line":1817},[1056,2940,1414],{"class":1077},[1056,2942,2943],{"class":1058,"line":1831},[1056,2944,1258],{"class":1077},[1056,2946,2947],{"class":1058,"line":1850},[1056,2948,1264],{"class":1077},[990,2950,2951],{},"The Stripe Elements component (card number, expiry, CVV inputs) is rendered separately in the Vue template — outside the Formily schema — so card data never enters your application's form state.",[990,2953,2954],{},[994,2955,2956],{},"Payment Processing:",[2958,2959,2960,2963,2964,2967,2968,2973,2974,2977,2978,1105],"warning",{},[994,2961,2962],{},"PCI-DSS Compliance",": Raw card data (number, CVV) must ",[994,2965,2966],{},"never"," be sent to or processed by your servers. Use ",[1006,2969,2972],{"href":2970,"rel":2971},"https:\u002F\u002Fstripe.com\u002Fdocs\u002Fpayments\u002Felements",[1010],"Stripe Elements"," (or equivalent) to collect card details directly in the customer's browser. The card data goes from the browser to Stripe — never through your backend. Your server only receives a ",[1034,2975,2976],{},"paymentMethodId"," or ",[1034,2979,2980],{},"paymentIntent",[990,2982,2983,2986,2987,1292],{},[994,2984,2985],{},"Client-side (browser):"," Stripe Elements creates a payment method from the card data and returns a ",[1034,2988,2976],{},[1027,2990,2992],{"className":1050,"code":2991,"language":1052,"meta":1036,"style":1036},"\u002F\u002F In your Vue component\nconst stripe = await loadStripe(STRIPE_PUBLIC_KEY)\nconst elements = stripe.elements()\nconst cardElement = elements.create('card')\ncardElement.mount('#card-element')\n\nconst handleSubmit = async () => {\n  const { paymentMethod, error } = await stripe.createPaymentMethod({\n    type: 'card',\n    card: cardElement,\n    billing_details: { name: cardholderName.value, email: email.value }\n  })\n\n  if (error) {\n    showError(error.message)\n    return\n  }\n\n  \u002F\u002F Send only the paymentMethod ID to your server — never raw card data\n  await $fetch('\u002Fapi\u002Fcheckout\u002Fpay', {\n    method: 'POST',\n    body: { paymentMethodId: paymentMethod.id }\n  })\n}\n",[1034,2993,2994,2999,3016,3036,3064,3085,3089,3108,3139,3155,3167,3203,3210,3214,3227,3243,3248,3252,3256,3261,3282,3298,3320,3326],{"__ignoreMap":1036},[1056,2995,2996],{"class":1058,"line":1059},[1056,2997,2998],{"class":1062},"\u002F\u002F In your Vue component\n",[1056,3000,3001,3003,3006,3008,3010,3013],{"class":1058,"line":1066},[1056,3002,1070],{"class":1069},[1056,3004,3005],{"class":1073}," stripe ",[1056,3007,1078],{"class":1077},[1056,3009,1099],{"class":1098},[1056,3011,3012],{"class":1081}," loadStripe",[1056,3014,3015],{"class":1073},"(STRIPE_PUBLIC_KEY)\n",[1056,3017,3018,3020,3023,3025,3028,3030,3033],{"class":1058,"line":1088},[1056,3019,1070],{"class":1069},[1056,3021,3022],{"class":1073}," elements ",[1056,3024,1078],{"class":1077},[1056,3026,3027],{"class":1073}," stripe",[1056,3029,1105],{"class":1077},[1056,3031,3032],{"class":1081},"elements",[1056,3034,3035],{"class":1073},"()\n",[1056,3037,3038,3040,3043,3045,3048,3050,3053,3055,3058,3060,3062],{"class":1058,"line":1114},[1056,3039,1070],{"class":1069},[1056,3041,3042],{"class":1073}," cardElement ",[1056,3044,1078],{"class":1077},[1056,3046,3047],{"class":1073}," elements",[1056,3049,1105],{"class":1077},[1056,3051,3052],{"class":1081},"create",[1056,3054,1209],{"class":1073},[1056,3056,3057],{"class":1077},"'",[1056,3059,2711],{"class":1225},[1056,3061,3057],{"class":1077},[1056,3063,1252],{"class":1073},[1056,3065,3066,3069,3071,3074,3076,3078,3081,3083],{"class":1058,"line":1121},[1056,3067,3068],{"class":1073},"cardElement",[1056,3070,1105],{"class":1077},[1056,3072,3073],{"class":1081},"mount",[1056,3075,1209],{"class":1073},[1056,3077,3057],{"class":1077},[1056,3079,3080],{"class":1225},"#card-element",[1056,3082,3057],{"class":1077},[1056,3084,1252],{"class":1073},[1056,3086,3087],{"class":1058,"line":1127},[1056,3088,1118],{"emptyLinePlaceholder":1117},[1056,3090,3091,3093,3096,3098,3101,3104,3106],{"class":1058,"line":1150},[1056,3092,1070],{"class":1069},[1056,3094,3095],{"class":1073}," handleSubmit ",[1056,3097,1078],{"class":1077},[1056,3099,3100],{"class":1069}," async",[1056,3102,3103],{"class":1077}," ()",[1056,3105,2446],{"class":1069},[1056,3107,1540],{"class":1077},[1056,3109,3110,3112,3114,3117,3119,3122,3124,3126,3128,3130,3132,3135,3137],{"class":1058,"line":1197},[1056,3111,2453],{"class":1069},[1056,3113,2456],{"class":1077},[1056,3115,3116],{"class":1073}," paymentMethod",[1056,3118,2217],{"class":1077},[1056,3120,3121],{"class":1073}," error",[1056,3123,2467],{"class":1077},[1056,3125,2470],{"class":1077},[1056,3127,1099],{"class":1098},[1056,3129,3027],{"class":1073},[1056,3131,1105],{"class":1077},[1056,3133,3134],{"class":1081},"createPaymentMethod",[1056,3136,1209],{"class":1156},[1056,3138,1147],{"class":1077},[1056,3140,3141,3144,3146,3149,3151,3153],{"class":1058,"line":1255},[1056,3142,3143],{"class":1156},"    type",[1056,3145,1292],{"class":1077},[1056,3147,3148],{"class":1077}," '",[1056,3150,2711],{"class":1225},[1056,3152,3057],{"class":1077},[1056,3154,1324],{"class":1077},[1056,3156,3157,3160,3162,3165],{"class":1058,"line":1261},[1056,3158,3159],{"class":1156},"    card",[1056,3161,1292],{"class":1077},[1056,3163,3164],{"class":1073}," cardElement",[1056,3166,1324],{"class":1077},[1056,3168,3169,3172,3174,3176,3179,3181,3184,3186,3188,3190,3193,3195,3197,3199,3201],{"class":1058,"line":1417},[1056,3170,3171],{"class":1156},"    billing_details",[1056,3173,1292],{"class":1077},[1056,3175,2456],{"class":1077},[1056,3177,3178],{"class":1156}," name",[1056,3180,1292],{"class":1077},[1056,3182,3183],{"class":1073}," cardholderName",[1056,3185,1105],{"class":1077},[1056,3187,2222],{"class":1073},[1056,3189,2217],{"class":1077},[1056,3191,3192],{"class":1156}," email",[1056,3194,1292],{"class":1077},[1056,3196,3192],{"class":1073},[1056,3198,1105],{"class":1077},[1056,3200,2222],{"class":1073},[1056,3202,2315],{"class":1077},[1056,3204,3205,3208],{"class":1058,"line":1423},[1056,3206,3207],{"class":1077},"  }",[1056,3209,1252],{"class":1156},[1056,3211,3212],{"class":1058,"line":1439},[1056,3213,1118],{"emptyLinePlaceholder":1117},[1056,3215,3216,3218,3220,3223,3225],{"class":1058,"line":1456},[1056,3217,1153],{"class":1098},[1056,3219,1133],{"class":1156},[1056,3221,3222],{"class":1073},"error",[1056,3224,1192],{"class":1156},[1056,3226,1147],{"class":1077},[1056,3228,3229,3232,3234,3236,3238,3241],{"class":1058,"line":1473},[1056,3230,3231],{"class":1081},"    showError",[1056,3233,1209],{"class":1156},[1056,3235,3222],{"class":1073},[1056,3237,1105],{"class":1077},[1056,3239,3240],{"class":1073},"message",[1056,3242,1252],{"class":1156},[1056,3244,3245],{"class":1058,"line":1488},[1056,3246,3247],{"class":1098},"    return\n",[1056,3249,3250],{"class":1058,"line":1743},[1056,3251,1258],{"class":1077},[1056,3253,3254],{"class":1058,"line":1762},[1056,3255,1118],{"emptyLinePlaceholder":1117},[1056,3257,3258],{"class":1058,"line":1782},[1056,3259,3260],{"class":1062},"  \u002F\u002F Send only the paymentMethod ID to your server — never raw card data\n",[1056,3262,3263,3266,3269,3271,3273,3276,3278,3280],{"class":1058,"line":1795},[1056,3264,3265],{"class":1098},"  await",[1056,3267,3268],{"class":1081}," $fetch",[1056,3270,1209],{"class":1156},[1056,3272,3057],{"class":1077},[1056,3274,3275],{"class":1225},"\u002Fapi\u002Fcheckout\u002Fpay",[1056,3277,3057],{"class":1077},[1056,3279,2217],{"class":1077},[1056,3281,1540],{"class":1077},[1056,3283,3284,3287,3289,3291,3294,3296],{"class":1058,"line":1812},[1056,3285,3286],{"class":1156},"    method",[1056,3288,1292],{"class":1077},[1056,3290,3148],{"class":1077},[1056,3292,3293],{"class":1225},"POST",[1056,3295,3057],{"class":1077},[1056,3297,1324],{"class":1077},[1056,3299,3300,3303,3305,3307,3310,3312,3314,3316,3318],{"class":1058,"line":1817},[1056,3301,3302],{"class":1156},"    body",[1056,3304,1292],{"class":1077},[1056,3306,2456],{"class":1077},[1056,3308,3309],{"class":1156}," paymentMethodId",[1056,3311,1292],{"class":1077},[1056,3313,3116],{"class":1073},[1056,3315,1105],{"class":1077},[1056,3317,1170],{"class":1073},[1056,3319,2315],{"class":1077},[1056,3321,3322,3324],{"class":1058,"line":1831},[1056,3323,3207],{"class":1077},[1056,3325,1252],{"class":1156},[1056,3327,3328],{"class":1058,"line":1850},[1056,3329,1264],{"class":1077},[990,3331,3332,3335,3336,3338],{},[994,3333,3334],{},"Server-side:"," Receives only the ",[1034,3337,2976],{},", never raw card data:",[1027,3340,3342],{"className":1050,"code":3341,"language":1052,"meta":1036,"style":1036},"export default defineEventHandler(async (event) => {\n  const { paymentMethodId } = await readBody(event)\n  const tenantId = event.context.user?.tenant_id\n  const cartTotal = getCartTotal(tenantId)\n\n  try {\n    \u002F\u002F Create and confirm payment intent with the tokenized payment method\n    const paymentIntent = await stripe.paymentIntents.create({\n      amount: Math.round(cartTotal * 100), \u002F\u002F in cents\n      currency: 'eur',\n      payment_method: paymentMethodId,\n      confirm: true,\n      automatic_payment_methods: { enabled: true, allow_redirects: 'never' }\n    })\n\n    if (paymentIntent.status === 'requires_action') {\n      \u002F\u002F 3D Secure required — client will handle it\n      return {\n        requires_action: true,\n        client_secret: paymentIntent.client_secret\n      }\n    }\n\n    if (paymentIntent.status !== 'succeeded') {\n      throw new Error(`Payment failed: ${paymentIntent.status}`)\n    }\n\n    return { success: true, paymentIntentId: paymentIntent.id }\n  } catch (error) {\n    return { success: false, error: error.message }\n  }\n})\n",[1034,3343,3344,3366,3388,3416,3435,3439,3446,3451,3478,3511,3527,3538,3549,3580,3587,3591,3619,3624,3631,3642,3656,3660,3664,3668,3694,3722,3726,3730,3759,3774,3801,3805],{"__ignoreMap":1036},[1056,3345,3346,3348,3350,3352,3354,3356,3358,3360,3362,3364],{"class":1058,"line":1059},[1056,3347,2423],{"class":1098},[1056,3349,2426],{"class":1098},[1056,3351,2429],{"class":1081},[1056,3353,1209],{"class":1073},[1056,3355,2434],{"class":1069},[1056,3357,1133],{"class":1077},[1056,3359,2440],{"class":2439},[1056,3361,2443],{"class":1077},[1056,3363,2446],{"class":1069},[1056,3365,1540],{"class":1077},[1056,3367,3368,3370,3372,3374,3376,3378,3380,3382,3384,3386],{"class":1058,"line":1066},[1056,3369,2453],{"class":1069},[1056,3371,2456],{"class":1077},[1056,3373,3309],{"class":1073},[1056,3375,2467],{"class":1077},[1056,3377,2470],{"class":1077},[1056,3379,1099],{"class":1098},[1056,3381,2475],{"class":1081},[1056,3383,1209],{"class":1156},[1056,3385,2440],{"class":1073},[1056,3387,1252],{"class":1156},[1056,3389,3390,3392,3395,3397,3400,3402,3405,3407,3410,3413],{"class":1058,"line":1088},[1056,3391,2453],{"class":1069},[1056,3393,3394],{"class":1073}," tenantId",[1056,3396,2470],{"class":1077},[1056,3398,3399],{"class":1073}," event",[1056,3401,1105],{"class":1077},[1056,3403,3404],{"class":1073},"context",[1056,3406,1105],{"class":1077},[1056,3408,3409],{"class":1073},"user",[1056,3411,3412],{"class":1077},"?.",[1056,3414,3415],{"class":1073},"tenant_id\n",[1056,3417,3418,3420,3423,3425,3428,3430,3433],{"class":1058,"line":1114},[1056,3419,2453],{"class":1069},[1056,3421,3422],{"class":1073}," cartTotal",[1056,3424,2470],{"class":1077},[1056,3426,3427],{"class":1081}," getCartTotal",[1056,3429,1209],{"class":1156},[1056,3431,3432],{"class":1073},"tenantId",[1056,3434,1252],{"class":1156},[1056,3436,3437],{"class":1058,"line":1121},[1056,3438,1118],{"emptyLinePlaceholder":1117},[1056,3440,3441,3444],{"class":1058,"line":1127},[1056,3442,3443],{"class":1098},"  try",[1056,3445,1540],{"class":1077},[1056,3447,3448],{"class":1058,"line":1150},[1056,3449,3450],{"class":1062},"    \u002F\u002F Create and confirm payment intent with the tokenized payment method\n",[1056,3452,3453,3456,3459,3461,3463,3465,3467,3470,3472,3474,3476],{"class":1058,"line":1197},[1056,3454,3455],{"class":1069},"    const",[1056,3457,3458],{"class":1073}," paymentIntent",[1056,3460,2470],{"class":1077},[1056,3462,1099],{"class":1098},[1056,3464,3027],{"class":1073},[1056,3466,1105],{"class":1077},[1056,3468,3469],{"class":1073},"paymentIntents",[1056,3471,1105],{"class":1077},[1056,3473,3052],{"class":1081},[1056,3475,1209],{"class":1156},[1056,3477,1147],{"class":1077},[1056,3479,3480,3483,3485,3488,3490,3493,3495,3498,3501,3504,3506,3508],{"class":1058,"line":1255},[1056,3481,3482],{"class":1156},"      amount",[1056,3484,1292],{"class":1077},[1056,3486,3487],{"class":1073}," Math",[1056,3489,1105],{"class":1077},[1056,3491,3492],{"class":1081},"round",[1056,3494,1209],{"class":1156},[1056,3496,3497],{"class":1073},"cartTotal",[1056,3499,3500],{"class":1077}," *",[1056,3502,3503],{"class":1356}," 100",[1056,3505,2443],{"class":1156},[1056,3507,2217],{"class":1077},[1056,3509,3510],{"class":1062}," \u002F\u002F in cents\n",[1056,3512,3513,3516,3518,3520,3523,3525],{"class":1058,"line":1261},[1056,3514,3515],{"class":1156},"      currency",[1056,3517,1292],{"class":1077},[1056,3519,3148],{"class":1077},[1056,3521,3522],{"class":1225},"eur",[1056,3524,3057],{"class":1077},[1056,3526,1324],{"class":1077},[1056,3528,3529,3532,3534,3536],{"class":1058,"line":1417},[1056,3530,3531],{"class":1156},"      payment_method",[1056,3533,1292],{"class":1077},[1056,3535,3309],{"class":1073},[1056,3537,1324],{"class":1077},[1056,3539,3540,3543,3545,3547],{"class":1058,"line":1423},[1056,3541,3542],{"class":1156},"      confirm",[1056,3544,1292],{"class":1077},[1056,3546,2591],{"class":2590},[1056,3548,1324],{"class":1077},[1056,3550,3551,3554,3556,3558,3561,3563,3565,3567,3570,3572,3574,3576,3578],{"class":1058,"line":1439},[1056,3552,3553],{"class":1156},"      automatic_payment_methods",[1056,3555,1292],{"class":1077},[1056,3557,2456],{"class":1077},[1056,3559,3560],{"class":1156}," enabled",[1056,3562,1292],{"class":1077},[1056,3564,2591],{"class":2590},[1056,3566,2217],{"class":1077},[1056,3568,3569],{"class":1156}," allow_redirects",[1056,3571,1292],{"class":1077},[1056,3573,3148],{"class":1077},[1056,3575,2966],{"class":1225},[1056,3577,3057],{"class":1077},[1056,3579,2315],{"class":1077},[1056,3581,3582,3585],{"class":1058,"line":1456},[1056,3583,3584],{"class":1077},"    }",[1056,3586,1252],{"class":1156},[1056,3588,3589],{"class":1058,"line":1473},[1056,3590,1118],{"emptyLinePlaceholder":1117},[1056,3592,3593,3596,3598,3600,3602,3605,3608,3610,3613,3615,3617],{"class":1058,"line":1488},[1056,3594,3595],{"class":1098},"    if",[1056,3597,1133],{"class":1156},[1056,3599,2980],{"class":1073},[1056,3601,1105],{"class":1077},[1056,3603,3604],{"class":1073},"status",[1056,3606,3607],{"class":1077}," ===",[1056,3609,3148],{"class":1077},[1056,3611,3612],{"class":1225},"requires_action",[1056,3614,3057],{"class":1077},[1056,3616,1192],{"class":1156},[1056,3618,1147],{"class":1077},[1056,3620,3621],{"class":1058,"line":1743},[1056,3622,3623],{"class":1062},"      \u002F\u002F 3D Secure required — client will handle it\n",[1056,3625,3626,3629],{"class":1058,"line":1762},[1056,3627,3628],{"class":1098},"      return",[1056,3630,1540],{"class":1077},[1056,3632,3633,3636,3638,3640],{"class":1058,"line":1782},[1056,3634,3635],{"class":1156},"        requires_action",[1056,3637,1292],{"class":1077},[1056,3639,2591],{"class":2590},[1056,3641,1324],{"class":1077},[1056,3643,3644,3647,3649,3651,3653],{"class":1058,"line":1795},[1056,3645,3646],{"class":1156},"        client_secret",[1056,3648,1292],{"class":1077},[1056,3650,3458],{"class":1073},[1056,3652,1105],{"class":1077},[1056,3654,3655],{"class":1073},"client_secret\n",[1056,3657,3658],{"class":1058,"line":1812},[1056,3659,1722],{"class":1077},[1056,3661,3662],{"class":1058,"line":1817},[1056,3663,1414],{"class":1077},[1056,3665,3666],{"class":1058,"line":1831},[1056,3667,1118],{"emptyLinePlaceholder":1117},[1056,3669,3670,3672,3674,3676,3678,3680,3683,3685,3688,3690,3692],{"class":1058,"line":1850},[1056,3671,3595],{"class":1098},[1056,3673,1133],{"class":1156},[1056,3675,2980],{"class":1073},[1056,3677,1105],{"class":1077},[1056,3679,3604],{"class":1073},[1056,3681,3682],{"class":1077}," !==",[1056,3684,3148],{"class":1077},[1056,3686,3687],{"class":1225},"succeeded",[1056,3689,3057],{"class":1077},[1056,3691,1192],{"class":1156},[1056,3693,1147],{"class":1077},[1056,3695,3696,3699,3701,3703,3705,3707,3710,3712,3714,3716,3718,3720],{"class":1058,"line":1870},[1056,3697,3698],{"class":1098},"      throw",[1056,3700,1203],{"class":1077},[1056,3702,1206],{"class":1081},[1056,3704,1209],{"class":1156},[1056,3706,1249],{"class":1077},[1056,3708,3709],{"class":1225},"Payment failed: ",[1056,3711,1229],{"class":1077},[1056,3713,2980],{"class":1073},[1056,3715,1105],{"class":1077},[1056,3717,3604],{"class":1073},[1056,3719,2565],{"class":1077},[1056,3721,1252],{"class":1156},[1056,3723,3724],{"class":1058,"line":1883},[1056,3725,1414],{"class":1077},[1056,3727,3728],{"class":1058,"line":1900},[1056,3729,1118],{"emptyLinePlaceholder":1117},[1056,3731,3732,3735,3737,3740,3742,3744,3746,3749,3751,3753,3755,3757],{"class":1058,"line":1905},[1056,3733,3734],{"class":1098},"    return",[1056,3736,2456],{"class":1077},[1056,3738,3739],{"class":1156}," success",[1056,3741,1292],{"class":1077},[1056,3743,2591],{"class":2590},[1056,3745,2217],{"class":1077},[1056,3747,3748],{"class":1156}," paymentIntentId",[1056,3750,1292],{"class":1077},[1056,3752,3458],{"class":1073},[1056,3754,1105],{"class":1077},[1056,3756,1170],{"class":1073},[1056,3758,2315],{"class":1077},[1056,3760,3761,3763,3766,3768,3770,3772],{"class":1058,"line":1919},[1056,3762,3207],{"class":1077},[1056,3764,3765],{"class":1098}," catch",[1056,3767,1133],{"class":1156},[1056,3769,3222],{"class":1073},[1056,3771,1192],{"class":1156},[1056,3773,1147],{"class":1077},[1056,3775,3776,3778,3780,3782,3784,3787,3789,3791,3793,3795,3797,3799],{"class":1058,"line":1938},[1056,3777,3734],{"class":1098},[1056,3779,2456],{"class":1077},[1056,3781,3739],{"class":1156},[1056,3783,1292],{"class":1077},[1056,3785,3786],{"class":2590}," false",[1056,3788,2217],{"class":1077},[1056,3790,3121],{"class":1156},[1056,3792,1292],{"class":1077},[1056,3794,3121],{"class":1073},[1056,3796,1105],{"class":1077},[1056,3798,3240],{"class":1073},[1056,3800,2315],{"class":1077},[1056,3802,3803],{"class":1058,"line":1958},[1056,3804,1258],{"class":1077},[1056,3806,3807,3809],{"class":1058,"line":1971},[1056,3808,1222],{"class":1077},[1056,3810,1252],{"class":1073},[990,3812,3813,3814,3816,3817,3820],{},"What makes this PCI-compliant is the path the card data takes and, more importantly, the path it doesn't. The card details go straight from the browser to Stripe and never pass through your servers; your backend only ever sees the tokenized ",[1034,3815,2976],{}," and ",[1034,3818,3819],{},"paymentIntentId",". Because Stripe Elements renders the fields in an isolated iframe, even your own page JavaScript can't read them. The practical reward for this discipline is that your PCI scope drops to SAQ A — the simplest compliance tier there is.",[1038,3822,3824],{"id":3823},"step-4-confirmation","Step 4: Confirmation",[990,3826,3827,3828,3831],{},"The final step closes the loop: it records the order and shows the buyer that everything went through. The confirmation page is a receipt — the order number (e.g. ",[1034,3829,3830],{},"ORD-2025-00123","), the date and time, the email the confirmation was sent to, the shipping address, the items ordered, the total charged, an estimated delivery date, and a tracking number once one exists.",[990,3833,3834],{},"Behind that page, the server does the real work of turning a successful payment into an order. It re-verifies the payment with Stripe (never trusting the client's word for it), creates the order in the Orders app, clears the cart, and publishes an event so the confirmation email goes out:",[1027,3836,3838],{"className":1050,"code":3837,"language":1052,"meta":1036,"style":1036},"export default defineEventHandler(async (event) => {\n  const { paymentIntentId } = await readBody(event)\n  const tenantId = event.context.user?.tenant_id\n  \n  \u002F\u002F Verify payment succeeded\n  const paymentIntent = await stripe.paymentIntents.retrieve(paymentIntentId)\n  if (paymentIntent.status !== 'succeeded') {\n    throw new Error('Payment was not processed successfully')\n  }\n  \n  \u002F\u002F Create order in Orders app\n  const order = await cockpit.orders.create({\n    tenant_id: tenantId,\n    customer_id: event.context.user?.id,\n    items: getCart(tenantId),\n    shipping_address: getCheckoutData(tenantId).address,\n    payment_id: paymentIntentId,\n    total: getCartTotal(tenantId),\n    status: 'confirmed'\n  })\n  \n  \u002F\u002F Clear cart\n  clearCart(tenantId)\n  \n  \u002F\u002F Send confirmation email\n  await cockpit.events.publish('order.confirmed', {\n    order_id: order.id,\n    customer_email: event.context.user?.email\n  })\n  \n  return { order_id: order.id, confirmation_sent: true }\n})\n",[1034,3839,3840,3862,3884,3906,3910,3915,3942,3966,3985,3989,3993,3998,4024,4035,4058,4075,4098,4109,4126,4141,4147,4151,4156,4167,4171,4176,4205,4220,4242,4248,4252,4280],{"__ignoreMap":1036},[1056,3841,3842,3844,3846,3848,3850,3852,3854,3856,3858,3860],{"class":1058,"line":1059},[1056,3843,2423],{"class":1098},[1056,3845,2426],{"class":1098},[1056,3847,2429],{"class":1081},[1056,3849,1209],{"class":1073},[1056,3851,2434],{"class":1069},[1056,3853,1133],{"class":1077},[1056,3855,2440],{"class":2439},[1056,3857,2443],{"class":1077},[1056,3859,2446],{"class":1069},[1056,3861,1540],{"class":1077},[1056,3863,3864,3866,3868,3870,3872,3874,3876,3878,3880,3882],{"class":1058,"line":1066},[1056,3865,2453],{"class":1069},[1056,3867,2456],{"class":1077},[1056,3869,3748],{"class":1073},[1056,3871,2467],{"class":1077},[1056,3873,2470],{"class":1077},[1056,3875,1099],{"class":1098},[1056,3877,2475],{"class":1081},[1056,3879,1209],{"class":1156},[1056,3881,2440],{"class":1073},[1056,3883,1252],{"class":1156},[1056,3885,3886,3888,3890,3892,3894,3896,3898,3900,3902,3904],{"class":1058,"line":1088},[1056,3887,2453],{"class":1069},[1056,3889,3394],{"class":1073},[1056,3891,2470],{"class":1077},[1056,3893,3399],{"class":1073},[1056,3895,1105],{"class":1077},[1056,3897,3404],{"class":1073},[1056,3899,1105],{"class":1077},[1056,3901,3409],{"class":1073},[1056,3903,3412],{"class":1077},[1056,3905,3415],{"class":1073},[1056,3907,3908],{"class":1058,"line":1114},[1056,3909,2486],{"class":1156},[1056,3911,3912],{"class":1058,"line":1121},[1056,3913,3914],{"class":1062},"  \u002F\u002F Verify payment succeeded\n",[1056,3916,3917,3919,3921,3923,3925,3927,3929,3931,3933,3936,3938,3940],{"class":1058,"line":1127},[1056,3918,2453],{"class":1069},[1056,3920,3458],{"class":1073},[1056,3922,2470],{"class":1077},[1056,3924,1099],{"class":1098},[1056,3926,3027],{"class":1073},[1056,3928,1105],{"class":1077},[1056,3930,3469],{"class":1073},[1056,3932,1105],{"class":1077},[1056,3934,3935],{"class":1081},"retrieve",[1056,3937,1209],{"class":1156},[1056,3939,3819],{"class":1073},[1056,3941,1252],{"class":1156},[1056,3943,3944,3946,3948,3950,3952,3954,3956,3958,3960,3962,3964],{"class":1058,"line":1150},[1056,3945,1153],{"class":1098},[1056,3947,1133],{"class":1156},[1056,3949,2980],{"class":1073},[1056,3951,1105],{"class":1077},[1056,3953,3604],{"class":1073},[1056,3955,3682],{"class":1077},[1056,3957,3148],{"class":1077},[1056,3959,3687],{"class":1225},[1056,3961,3057],{"class":1077},[1056,3963,1192],{"class":1156},[1056,3965,1147],{"class":1077},[1056,3967,3968,3970,3972,3974,3976,3978,3981,3983],{"class":1058,"line":1197},[1056,3969,1200],{"class":1098},[1056,3971,1203],{"class":1077},[1056,3973,1206],{"class":1081},[1056,3975,1209],{"class":1156},[1056,3977,3057],{"class":1077},[1056,3979,3980],{"class":1225},"Payment was not processed successfully",[1056,3982,3057],{"class":1077},[1056,3984,1252],{"class":1156},[1056,3986,3987],{"class":1058,"line":1255},[1056,3988,1258],{"class":1077},[1056,3990,3991],{"class":1058,"line":1261},[1056,3992,2486],{"class":1156},[1056,3994,3995],{"class":1058,"line":1417},[1056,3996,3997],{"class":1062},"  \u002F\u002F Create order in Orders app\n",[1056,3999,4000,4002,4005,4007,4009,4011,4013,4016,4018,4020,4022],{"class":1058,"line":1423},[1056,4001,2453],{"class":1069},[1056,4003,4004],{"class":1073}," order",[1056,4006,2470],{"class":1077},[1056,4008,1099],{"class":1098},[1056,4010,1102],{"class":1073},[1056,4012,1105],{"class":1077},[1056,4014,4015],{"class":1073},"orders",[1056,4017,1105],{"class":1077},[1056,4019,3052],{"class":1081},[1056,4021,1209],{"class":1156},[1056,4023,1147],{"class":1077},[1056,4025,4026,4029,4031,4033],{"class":1058,"line":1439},[1056,4027,4028],{"class":1156},"    tenant_id",[1056,4030,1292],{"class":1077},[1056,4032,3394],{"class":1073},[1056,4034,1324],{"class":1077},[1056,4036,4037,4040,4042,4044,4046,4048,4050,4052,4054,4056],{"class":1058,"line":1456},[1056,4038,4039],{"class":1156},"    customer_id",[1056,4041,1292],{"class":1077},[1056,4043,3399],{"class":1073},[1056,4045,1105],{"class":1077},[1056,4047,3404],{"class":1073},[1056,4049,1105],{"class":1077},[1056,4051,3409],{"class":1073},[1056,4053,3412],{"class":1077},[1056,4055,1170],{"class":1073},[1056,4057,1324],{"class":1077},[1056,4059,4060,4063,4065,4067,4069,4071,4073],{"class":1058,"line":1473},[1056,4061,4062],{"class":1156},"    items",[1056,4064,1292],{"class":1077},[1056,4066,1082],{"class":1081},[1056,4068,1209],{"class":1156},[1056,4070,3432],{"class":1073},[1056,4072,2443],{"class":1156},[1056,4074,1324],{"class":1077},[1056,4076,4077,4080,4082,4085,4087,4089,4091,4093,4096],{"class":1058,"line":1488},[1056,4078,4079],{"class":1156},"    shipping_address",[1056,4081,1292],{"class":1077},[1056,4083,4084],{"class":1081}," getCheckoutData",[1056,4086,1209],{"class":1156},[1056,4088,3432],{"class":1073},[1056,4090,2443],{"class":1156},[1056,4092,1105],{"class":1077},[1056,4094,4095],{"class":1073},"address",[1056,4097,1324],{"class":1077},[1056,4099,4100,4103,4105,4107],{"class":1058,"line":1743},[1056,4101,4102],{"class":1156},"    payment_id",[1056,4104,1292],{"class":1077},[1056,4106,3748],{"class":1073},[1056,4108,1324],{"class":1077},[1056,4110,4111,4114,4116,4118,4120,4122,4124],{"class":1058,"line":1762},[1056,4112,4113],{"class":1156},"    total",[1056,4115,1292],{"class":1077},[1056,4117,3427],{"class":1081},[1056,4119,1209],{"class":1156},[1056,4121,3432],{"class":1073},[1056,4123,2443],{"class":1156},[1056,4125,1324],{"class":1077},[1056,4127,4128,4131,4133,4135,4138],{"class":1058,"line":1782},[1056,4129,4130],{"class":1156},"    status",[1056,4132,1292],{"class":1077},[1056,4134,3148],{"class":1077},[1056,4136,4137],{"class":1225},"confirmed",[1056,4139,4140],{"class":1077},"'\n",[1056,4142,4143,4145],{"class":1058,"line":1795},[1056,4144,3207],{"class":1077},[1056,4146,1252],{"class":1156},[1056,4148,4149],{"class":1058,"line":1812},[1056,4150,2486],{"class":1156},[1056,4152,4153],{"class":1058,"line":1817},[1056,4154,4155],{"class":1062},"  \u002F\u002F Clear cart\n",[1056,4157,4158,4161,4163,4165],{"class":1058,"line":1831},[1056,4159,4160],{"class":1081},"  clearCart",[1056,4162,1209],{"class":1156},[1056,4164,3432],{"class":1073},[1056,4166,1252],{"class":1156},[1056,4168,4169],{"class":1058,"line":1850},[1056,4170,2486],{"class":1156},[1056,4172,4173],{"class":1058,"line":1870},[1056,4174,4175],{"class":1062},"  \u002F\u002F Send confirmation email\n",[1056,4177,4178,4180,4182,4184,4187,4189,4192,4194,4196,4199,4201,4203],{"class":1058,"line":1883},[1056,4179,3265],{"class":1098},[1056,4181,1102],{"class":1073},[1056,4183,1105],{"class":1077},[1056,4185,4186],{"class":1073},"events",[1056,4188,1105],{"class":1077},[1056,4190,4191],{"class":1081},"publish",[1056,4193,1209],{"class":1156},[1056,4195,3057],{"class":1077},[1056,4197,4198],{"class":1225},"order.confirmed",[1056,4200,3057],{"class":1077},[1056,4202,2217],{"class":1077},[1056,4204,1540],{"class":1077},[1056,4206,4207,4210,4212,4214,4216,4218],{"class":1058,"line":1900},[1056,4208,4209],{"class":1156},"    order_id",[1056,4211,1292],{"class":1077},[1056,4213,4004],{"class":1073},[1056,4215,1105],{"class":1077},[1056,4217,1170],{"class":1073},[1056,4219,1324],{"class":1077},[1056,4221,4222,4225,4227,4229,4231,4233,4235,4237,4239],{"class":1058,"line":1905},[1056,4223,4224],{"class":1156},"    customer_email",[1056,4226,1292],{"class":1077},[1056,4228,3399],{"class":1073},[1056,4230,1105],{"class":1077},[1056,4232,3404],{"class":1073},[1056,4234,1105],{"class":1077},[1056,4236,3409],{"class":1073},[1056,4238,3412],{"class":1077},[1056,4240,4241],{"class":1073},"email\n",[1056,4243,4244,4246],{"class":1058,"line":1919},[1056,4245,3207],{"class":1077},[1056,4247,1252],{"class":1156},[1056,4249,4250],{"class":1058,"line":1938},[1056,4251,2486],{"class":1156},[1056,4253,4254,4256,4258,4261,4263,4265,4267,4269,4271,4274,4276,4278],{"class":1058,"line":1958},[1056,4255,2580],{"class":1098},[1056,4257,2456],{"class":1077},[1056,4259,4260],{"class":1156}," order_id",[1056,4262,1292],{"class":1077},[1056,4264,4004],{"class":1073},[1056,4266,1105],{"class":1077},[1056,4268,1170],{"class":1073},[1056,4270,2217],{"class":1077},[1056,4272,4273],{"class":1156}," confirmation_sent",[1056,4275,1292],{"class":1077},[1056,4277,2591],{"class":2590},[1056,4279,2315],{"class":1077},[1056,4281,4282,4284],{"class":1058,"line":1971},[1056,4283,1222],{"class":1077},[1056,4285,1252],{"class":1073},[1022,4287,4289],{"id":4288},"form-validation","Form Validation",[990,4291,4292],{},"Formily handles field-level and form-level validation:",[990,4294,4295],{},[994,4296,4297],{},"Field-Level Validation:",[1027,4299,4301],{"className":1270,"code":4300,"language":1272,"meta":1036,"style":1036},"{\n  \"email\": {\n    \"type\": \"string\",\n    \"format\": \"email\",\n    \"required\": true,\n    \"x-validator\": [\n      {\n        \"required\": true,\n        \"message\": \"Email is required\"\n      },\n      {\n        \"format\": \"email\",\n        \"message\": \"Invalid email format\"\n      }\n    ]\n  }\n}\n",[1034,4302,4303,4307,4320,4338,4357,4369,4382,4387,4399,4416,4421,4425,4443,4460,4464,4469,4473],{"__ignoreMap":1036},[1056,4304,4305],{"class":1058,"line":1059},[1056,4306,1147],{"class":1077},[1056,4308,4309,4311,4314,4316,4318],{"class":1058,"line":1066},[1056,4310,1283],{"class":1077},[1056,4312,4313],{"class":1069},"email",[1056,4315,1289],{"class":1077},[1056,4317,1292],{"class":1077},[1056,4319,1540],{"class":1077},[1056,4321,4322,4324,4326,4328,4330,4332,4334,4336],{"class":1058,"line":1088},[1056,4323,1545],{"class":1077},[1056,4325,1513],{"class":1308},[1056,4327,1289],{"class":1077},[1056,4329,1292],{"class":1077},[1056,4331,1316],{"class":1077},[1056,4333,1569],{"class":1225},[1056,4335,1289],{"class":1077},[1056,4337,1324],{"class":1077},[1056,4339,4340,4342,4345,4347,4349,4351,4353,4355],{"class":1058,"line":1114},[1056,4341,1545],{"class":1077},[1056,4343,4344],{"class":1308},"format",[1056,4346,1289],{"class":1077},[1056,4348,1292],{"class":1077},[1056,4350,1316],{"class":1077},[1056,4352,4313],{"class":1225},[1056,4354,1289],{"class":1077},[1056,4356,1324],{"class":1077},[1056,4358,4359,4361,4363,4365,4367],{"class":1058,"line":1121},[1056,4360,1545],{"class":1077},[1056,4362,1658],{"class":1308},[1056,4364,1289],{"class":1077},[1056,4366,1292],{"class":1077},[1056,4368,1665],{"class":1077},[1056,4370,4371,4373,4376,4378,4380],{"class":1058,"line":1127},[1056,4372,1545],{"class":1077},[1056,4374,4375],{"class":1308},"x-validator",[1056,4377,1289],{"class":1077},[1056,4379,1292],{"class":1077},[1056,4381,1295],{"class":1077},[1056,4383,4384],{"class":1058,"line":1150},[1056,4385,4386],{"class":1077},"      {\n",[1056,4388,4389,4391,4393,4395,4397],{"class":1058,"line":1197},[1056,4390,1703],{"class":1077},[1056,4392,1658],{"class":1356},[1056,4394,1289],{"class":1077},[1056,4396,1292],{"class":1077},[1056,4398,1665],{"class":1077},[1056,4400,4401,4403,4405,4407,4409,4411,4414],{"class":1058,"line":1255},[1056,4402,1703],{"class":1077},[1056,4404,3240],{"class":1356},[1056,4406,1289],{"class":1077},[1056,4408,1292],{"class":1077},[1056,4410,1316],{"class":1077},[1056,4412,4413],{"class":1225},"Email is required",[1056,4415,1409],{"class":1077},[1056,4417,4418],{"class":1058,"line":1261},[1056,4419,4420],{"class":1077},"      },\n",[1056,4422,4423],{"class":1058,"line":1417},[1056,4424,4386],{"class":1077},[1056,4426,4427,4429,4431,4433,4435,4437,4439,4441],{"class":1058,"line":1423},[1056,4428,1703],{"class":1077},[1056,4430,4344],{"class":1356},[1056,4432,1289],{"class":1077},[1056,4434,1292],{"class":1077},[1056,4436,1316],{"class":1077},[1056,4438,4313],{"class":1225},[1056,4440,1289],{"class":1077},[1056,4442,1324],{"class":1077},[1056,4444,4445,4447,4449,4451,4453,4455,4458],{"class":1058,"line":1439},[1056,4446,1703],{"class":1077},[1056,4448,3240],{"class":1356},[1056,4450,1289],{"class":1077},[1056,4452,1292],{"class":1077},[1056,4454,1316],{"class":1077},[1056,4456,4457],{"class":1225},"Invalid email format",[1056,4459,1409],{"class":1077},[1056,4461,4462],{"class":1058,"line":1456},[1056,4463,1722],{"class":1077},[1056,4465,4466],{"class":1058,"line":1473},[1056,4467,4468],{"class":1077},"    ]\n",[1056,4470,4471],{"class":1058,"line":1488},[1056,4472,1258],{"class":1077},[1056,4474,4475],{"class":1058,"line":1743},[1056,4476,1264],{"class":1077},[990,4478,4479],{},[994,4480,4481],{},"Form-Level Validation:",[1027,4483,4485],{"className":1050,"code":4484,"language":1052,"meta":1036,"style":1036},"formily.setFormState(state => ({\n  ...state,\n  validating: true\n})\n\nconst errors = await formily.validate()\nif (errors.length > 0) {\n  \u002F\u002F Show error messages\n  return { success: false, errors }\n}\n",[1034,4486,4487,4507,4516,4526,4532,4536,4555,4578,4583,4604],{"__ignoreMap":1036},[1056,4488,4489,4492,4494,4497,4499,4501,4503,4505],{"class":1058,"line":1059},[1056,4490,4491],{"class":1073},"formily",[1056,4493,1105],{"class":1077},[1056,4495,4496],{"class":1081},"setFormState",[1056,4498,1209],{"class":1073},[1056,4500,2898],{"class":2439},[1056,4502,2446],{"class":1069},[1056,4504,1133],{"class":1073},[1056,4506,1147],{"class":1077},[1056,4508,4509,4512,4514],{"class":1058,"line":1066},[1056,4510,4511],{"class":1077},"  ...",[1056,4513,2898],{"class":1073},[1056,4515,1324],{"class":1077},[1056,4517,4518,4521,4523],{"class":1058,"line":1088},[1056,4519,4520],{"class":1156},"  validating",[1056,4522,1292],{"class":1077},[1056,4524,4525],{"class":2590}," true\n",[1056,4527,4528,4530],{"class":1058,"line":1114},[1056,4529,1222],{"class":1077},[1056,4531,1252],{"class":1073},[1056,4533,4534],{"class":1058,"line":1121},[1056,4535,1118],{"emptyLinePlaceholder":1117},[1056,4537,4538,4541,4543,4545,4548,4550,4553],{"class":1058,"line":1127},[1056,4539,4540],{"class":1073},"const errors ",[1056,4542,1078],{"class":1077},[1056,4544,1099],{"class":1098},[1056,4546,4547],{"class":1073}," formily",[1056,4549,1105],{"class":1077},[1056,4551,4552],{"class":1081},"validate",[1056,4554,3035],{"class":1073},[1056,4556,4557,4560,4563,4565,4568,4571,4574,4576],{"class":1058,"line":1150},[1056,4558,4559],{"class":1081},"if",[1056,4561,4562],{"class":1073}," (errors",[1056,4564,1105],{"class":1077},[1056,4566,4567],{"class":1073},"length ",[1056,4569,4570],{"class":1077},">",[1056,4572,4573],{"class":1356}," 0",[1056,4575,1192],{"class":1073},[1056,4577,1147],{"class":1077},[1056,4579,4580],{"class":1058,"line":1197},[1056,4581,4582],{"class":1062},"  \u002F\u002F Show error messages\n",[1056,4584,4585,4588,4591,4593,4595,4597,4599,4602],{"class":1058,"line":1255},[1056,4586,4587],{"class":1073},"  return ",[1056,4589,4590],{"class":1077},"{",[1056,4592,3739],{"class":1308},[1056,4594,1292],{"class":1077},[1056,4596,3786],{"class":2590},[1056,4598,2217],{"class":1077},[1056,4600,4601],{"class":1073}," errors",[1056,4603,2315],{"class":1077},[1056,4605,4606],{"class":1058,"line":1261},[1056,4607,1264],{"class":1077},[1022,4609,4611],{"id":4610},"error-handling","Error Handling",[990,4613,4614],{},"Each step has its own failure modes, and the rule throughout is the same: tell the buyer what went wrong in plain language, and never lose the data they've already entered. A few representative cases:",[4616,4617,4618,4631,4643,4655],"ol",{},[4619,4620,4621,4624,4625],"li",{},[994,4622,4623],{},"Inventory Issue"," (Step 1)",[1027,4626,4629],{"className":4627,"code":4628,"language":1032},[1030],"Error: \"Winter Jacket (SKU-001): only 2 left, but you have 3 in cart\"\n→ Show message, allow customer to adjust quantity\n",[1034,4630,4628],{"__ignoreMap":1036},[4619,4632,4633,4636,4637],{},[994,4634,4635],{},"Postcode Not Covered"," (Step 2)",[1027,4638,4641],{"className":4639,"code":4640,"language":1032},[1030],"Error: \"We don't currently ship to postcode 80000 in Italy\"\n→ Show message, allow customer to edit address\n",[1034,4642,4640],{"__ignoreMap":1036},[4619,4644,4645,4648,4649],{},[994,4646,4647],{},"Payment Declined"," (Step 3)",[1027,4650,4653],{"className":4651,"code":4652,"language":1032},[1030],"Error: \"Card was declined. Please try another payment method.\"\n→ Show message, return to payment form (data is preserved)\n",[1034,4654,4652],{"__ignoreMap":1036},[4619,4656,4657,4660,4661],{},[994,4658,4659],{},"Order Creation Failed"," (Step 4)",[1027,4662,4665],{"className":4663,"code":4664,"language":1032},[1030],"Error: \"Order creation failed. Refund initiated.\"\n→ Show message with customer service contact\n→ Payment refunded automatically\n",[1034,4666,4664],{"__ignoreMap":1036},[1022,4668,4670],{"id":4669},"progress-persistence","Progress Persistence",[990,4672,4673],{},"All checkout data is persisted in local state (localStorage) so customers can:",[4675,4676,4677,4680,4683],"ul",{},[4619,4678,4679],{},"Close the tab and resume later",[4619,4681,4682],{},"Refresh the page without losing progress",[4619,4684,4685],{},"Go back to previous steps",[1027,4687,4689],{"className":1050,"code":4688,"language":1052,"meta":1036,"style":1036},"\u002F\u002F Save progress after each step\nconst saveCheckoutProgress = (step, data) => {\n  localStorage.setItem('checkout_progress', JSON.stringify({\n    step,\n    data,\n    timestamp: Date.now()\n  }))\n}\n\n\u002F\u002F Resume on page load\nconst resumeCheckout = () => {\n  const saved = localStorage.getItem('checkout_progress')\n  if (saved && Date.now() - saved.timestamp \u003C 24 * 60 * 60 * 1000) {\n    \u002F\u002F Resume from saved step\n    return JSON.parse(saved)\n  }\n}\n",[1034,4690,4691,4696,4721,4754,4761,4768,4785,4792,4796,4800,4805,4820,4847,4901,4906,4923,4927],{"__ignoreMap":1036},[1056,4692,4693],{"class":1058,"line":1059},[1056,4694,4695],{"class":1062},"\u002F\u002F Save progress after each step\n",[1056,4697,4698,4700,4703,4705,4707,4710,4712,4715,4717,4719],{"class":1058,"line":1066},[1056,4699,1070],{"class":1069},[1056,4701,4702],{"class":1073}," saveCheckoutProgress ",[1056,4704,1078],{"class":1077},[1056,4706,1133],{"class":1077},[1056,4708,4709],{"class":2439},"step",[1056,4711,2217],{"class":1077},[1056,4713,4714],{"class":2439}," data",[1056,4716,2443],{"class":1077},[1056,4718,2446],{"class":1069},[1056,4720,1540],{"class":1077},[1056,4722,4723,4726,4728,4731,4733,4735,4738,4740,4742,4745,4747,4750,4752],{"class":1058,"line":1088},[1056,4724,4725],{"class":1073},"  localStorage",[1056,4727,1105],{"class":1077},[1056,4729,4730],{"class":1081},"setItem",[1056,4732,1209],{"class":1156},[1056,4734,3057],{"class":1077},[1056,4736,4737],{"class":1225},"checkout_progress",[1056,4739,3057],{"class":1077},[1056,4741,2217],{"class":1077},[1056,4743,4744],{"class":1073}," JSON",[1056,4746,1105],{"class":1077},[1056,4748,4749],{"class":1081},"stringify",[1056,4751,1209],{"class":1156},[1056,4753,1147],{"class":1077},[1056,4755,4756,4759],{"class":1058,"line":1114},[1056,4757,4758],{"class":1073},"    step",[1056,4760,1324],{"class":1077},[1056,4762,4763,4766],{"class":1058,"line":1121},[1056,4764,4765],{"class":1073},"    data",[1056,4767,1324],{"class":1077},[1056,4769,4770,4773,4775,4778,4780,4783],{"class":1058,"line":1127},[1056,4771,4772],{"class":1156},"    timestamp",[1056,4774,1292],{"class":1077},[1056,4776,4777],{"class":1073}," Date",[1056,4779,1105],{"class":1077},[1056,4781,4782],{"class":1081},"now",[1056,4784,3035],{"class":1156},[1056,4786,4787,4789],{"class":1058,"line":1150},[1056,4788,3207],{"class":1077},[1056,4790,4791],{"class":1156},"))\n",[1056,4793,4794],{"class":1058,"line":1197},[1056,4795,1264],{"class":1077},[1056,4797,4798],{"class":1058,"line":1255},[1056,4799,1118],{"emptyLinePlaceholder":1117},[1056,4801,4802],{"class":1058,"line":1261},[1056,4803,4804],{"class":1062},"\u002F\u002F Resume on page load\n",[1056,4806,4807,4809,4812,4814,4816,4818],{"class":1058,"line":1417},[1056,4808,1070],{"class":1069},[1056,4810,4811],{"class":1073}," resumeCheckout ",[1056,4813,1078],{"class":1077},[1056,4815,3103],{"class":1077},[1056,4817,2446],{"class":1069},[1056,4819,1540],{"class":1077},[1056,4821,4822,4824,4827,4829,4832,4834,4837,4839,4841,4843,4845],{"class":1058,"line":1423},[1056,4823,2453],{"class":1069},[1056,4825,4826],{"class":1073}," saved",[1056,4828,2470],{"class":1077},[1056,4830,4831],{"class":1073}," localStorage",[1056,4833,1105],{"class":1077},[1056,4835,4836],{"class":1081},"getItem",[1056,4838,1209],{"class":1156},[1056,4840,3057],{"class":1077},[1056,4842,4737],{"class":1225},[1056,4844,3057],{"class":1077},[1056,4846,1252],{"class":1156},[1056,4848,4849,4851,4853,4856,4859,4861,4863,4865,4868,4871,4873,4875,4878,4880,4883,4885,4888,4890,4892,4894,4897,4899],{"class":1058,"line":1439},[1056,4850,1153],{"class":1098},[1056,4852,1133],{"class":1156},[1056,4854,4855],{"class":1073},"saved",[1056,4857,4858],{"class":1077}," &&",[1056,4860,4777],{"class":1073},[1056,4862,1105],{"class":1077},[1056,4864,4782],{"class":1081},[1056,4866,4867],{"class":1156},"() ",[1056,4869,4870],{"class":1077},"-",[1056,4872,4826],{"class":1073},[1056,4874,1105],{"class":1077},[1056,4876,4877],{"class":1073},"timestamp",[1056,4879,1181],{"class":1077},[1056,4881,4882],{"class":1356}," 24",[1056,4884,3500],{"class":1077},[1056,4886,4887],{"class":1356}," 60",[1056,4889,3500],{"class":1077},[1056,4891,4887],{"class":1356},[1056,4893,3500],{"class":1077},[1056,4895,4896],{"class":1356}," 1000",[1056,4898,1192],{"class":1156},[1056,4900,1147],{"class":1077},[1056,4902,4903],{"class":1058,"line":1456},[1056,4904,4905],{"class":1062},"    \u002F\u002F Resume from saved step\n",[1056,4907,4908,4910,4912,4914,4917,4919,4921],{"class":1058,"line":1473},[1056,4909,3734],{"class":1098},[1056,4911,4744],{"class":1073},[1056,4913,1105],{"class":1077},[1056,4915,4916],{"class":1081},"parse",[1056,4918,1209],{"class":1156},[1056,4920,4855],{"class":1073},[1056,4922,1252],{"class":1156},[1056,4924,4925],{"class":1058,"line":1488},[1056,4926,1258],{"class":1077},[1056,4928,4929],{"class":1058,"line":1743},[1056,4930,1264],{"class":1077},[1022,4932,4934],{"id":4933},"mobile-optimization","Mobile Optimization",[990,4936,4937],{},"A large share of B2B buyers check out on a phone, so the default flow is built mobile-first: a single-column layout, touch targets big enough to hit comfortably, and the mobile-native payment options (Apple Pay, Google Pay) surfaced where they apply. Abandoned-cart SMS reminders round it out, nudging buyers who dropped off mid-checkout back to finish.",[1022,4939,4941],{"id":4940},"analytics-integration","Analytics Integration",[990,4943,4944],{},"Checkout is where revenue is won or lost, so it's worth instrumenting closely. The metrics that tell you the most are the step completion rate (how many reach payment), the abandonment rate (how many start but don't finish), the time spent per step, the fields that throw errors most often, and which payment methods buyers actually choose. Tracking each step entry is enough to compute most of them:",[1027,4946,4948],{"className":1050,"code":4947,"language":1052,"meta":1036,"style":1036},"\u002F\u002F Track step progress\nconst trackCheckoutStep = (step) => {\n  analytics.track('checkout_step_entered', {\n    step,\n    timestamp: Date.now()\n  })\n}\n",[1034,4949,4950,4955,4974,4997,5003,5017,5023],{"__ignoreMap":1036},[1056,4951,4952],{"class":1058,"line":1059},[1056,4953,4954],{"class":1062},"\u002F\u002F Track step progress\n",[1056,4956,4957,4959,4962,4964,4966,4968,4970,4972],{"class":1058,"line":1066},[1056,4958,1070],{"class":1069},[1056,4960,4961],{"class":1073}," trackCheckoutStep ",[1056,4963,1078],{"class":1077},[1056,4965,1133],{"class":1077},[1056,4967,4709],{"class":2439},[1056,4969,2443],{"class":1077},[1056,4971,2446],{"class":1069},[1056,4973,1540],{"class":1077},[1056,4975,4976,4979,4981,4984,4986,4988,4991,4993,4995],{"class":1058,"line":1088},[1056,4977,4978],{"class":1073},"  analytics",[1056,4980,1105],{"class":1077},[1056,4982,4983],{"class":1081},"track",[1056,4985,1209],{"class":1156},[1056,4987,3057],{"class":1077},[1056,4989,4990],{"class":1225},"checkout_step_entered",[1056,4992,3057],{"class":1077},[1056,4994,2217],{"class":1077},[1056,4996,1540],{"class":1077},[1056,4998,4999,5001],{"class":1058,"line":1114},[1056,5000,4758],{"class":1073},[1056,5002,1324],{"class":1077},[1056,5004,5005,5007,5009,5011,5013,5015],{"class":1058,"line":1121},[1056,5006,4772],{"class":1156},[1056,5008,1292],{"class":1077},[1056,5010,4777],{"class":1073},[1056,5012,1105],{"class":1077},[1056,5014,4782],{"class":1081},[1056,5016,3035],{"class":1156},[1056,5018,5019,5021],{"class":1058,"line":1127},[1056,5020,3207],{"class":1077},[1056,5022,1252],{"class":1156},[1056,5024,5025],{"class":1058,"line":1150},[1056,5026,1264],{"class":1077},[1022,5028,5030],{"id":5029},"next-steps","Next Steps",[4675,5032,5033,5041,5050],{},[4619,5034,5035,5040],{},[994,5036,5037],{},[1006,5038,171],{"href":5039},"\u002Fdocs\u002Fproducts\u002Fsites\u002Fauthentication\u002F"," — User login and registration",[4619,5042,5043,5049],{},[994,5044,5045],{},[1006,5046,5048],{"href":5047},"\u002Fdocs\u002Fproducts\u002Fsites\u002Farchitecture\u002F","Architecture"," — Storefront technical design",[4619,5051,5052,5057],{},[994,5053,5054],{},[1006,5055,512],{"href":5056},"\u002Fdocs\u002Fproducts\u002Fsites\u002Ftheming\u002F"," — Customizing checkout appearance",[5059,5060,5061],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .su27w, html code.shiki .su27w{--shiki-light:#916B53;--shiki-default:#916B53;--shiki-dark:#916B53}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":1036,"searchDepth":1066,"depth":1066,"links":5063},[5064,5070,5071,5072,5073,5074,5075],{"id":1024,"depth":1066,"text":1025,"children":5065},[5066,5067,5068,5069],{"id":1040,"depth":1088,"text":1041},{"id":1493,"depth":1088,"text":1494},{"id":2611,"depth":1088,"text":2612},{"id":3823,"depth":1088,"text":3824},{"id":4288,"depth":1066,"text":4289},{"id":4610,"depth":1066,"text":4611},{"id":4669,"depth":1066,"text":4670},{"id":4933,"depth":1066,"text":4934},{"id":4940,"depth":1066,"text":4941},{"id":5029,"depth":1066,"text":5030},"Multi-step checkout flow with Formily schema-driven forms","md",null,{"status":5080},"published",{"title":344,"description":5076},{"loc":345},"5h9pnHl5mTDcaBvxRSocRwsgax6Mi1pYVkhCaKTEmSw",1785229258237]