[{"data":1,"prerenderedAt":7418},["ShallowReactive",2],{"navigation_docs":3,"-docs-guides-apps-publish-a-business-event":2399},[4,82,446,500,736,2117],{"title":5,"path":6,"stem":7,"children":8},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002Fgetting-started\u002Findex",[9,10,17,23,30,37,44,51,57,63,69,75],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13,"children":14,"icon":16},"Apps and Sites","\u002Fdocs\u002Fgetting-started\u002Fapps-and-sites","docs\u002Fgetting-started\u002Fapps-and-sites\u002Findex",[15],{"title":11,"path":12,"stem":13,"icon":16},"i-lucide-columns-2",{"title":18,"path":19,"stem":20,"children":21},"Architecture Overview","\u002Fdocs\u002Fgetting-started\u002Farchitecture","docs\u002Fgetting-started\u002Farchitecture\u002Findex",[22],{"title":18,"path":19,"stem":20},{"title":24,"path":25,"stem":26,"children":27,"icon":29},"Bring an existing frontend","\u002Fdocs\u002Fgetting-started\u002Fbring-an-existing-frontend","docs\u002Fgetting-started\u002Fbring-an-existing-frontend\u002Findex",[28],{"title":24,"path":25,"stem":26,"icon":29},"i-lucide-arrow-right-left",{"title":31,"path":32,"stem":33,"children":34,"icon":36},"Concepts","\u002Fdocs\u002Fgetting-started\u002Fconcepts","docs\u002Fgetting-started\u002Fconcepts\u002Findex",[35],{"title":31,"path":32,"stem":33,"icon":36},"i-lucide-shapes",{"title":38,"path":39,"stem":40,"children":41,"icon":43},"Frontend stacks","\u002Fdocs\u002Fgetting-started\u002Ffrontend-stacks","docs\u002Fgetting-started\u002Ffrontend-stacks\u002Findex",[42],{"title":38,"path":39,"stem":40,"icon":43},"i-lucide-layers",{"title":45,"path":46,"stem":47,"children":48,"icon":50},"Get Help","\u002Fdocs\u002Fgetting-started\u002Fget-help","docs\u002Fgetting-started\u002Fget-help\u002Findex",[49],{"title":45,"path":46,"stem":47,"icon":50},"i-lucide-life-buoy",{"title":52,"path":53,"stem":54,"children":55},"Glossary","\u002Fdocs\u002Fgetting-started\u002Fglossary","docs\u002Fgetting-started\u002Fglossary\u002Findex",[56],{"title":52,"path":53,"stem":54},{"title":58,"path":59,"stem":60,"children":61},"Platform Overview","\u002Fdocs\u002Fgetting-started\u002Fplatform-overview","docs\u002Fgetting-started\u002Fplatform-overview\u002Findex",[62],{"title":58,"path":59,"stem":60},{"title":64,"path":65,"stem":66,"children":67},"Prerequisites","\u002Fdocs\u002Fgetting-started\u002Fprerequisites","docs\u002Fgetting-started\u002Fprerequisites\u002Findex",[68],{"title":64,"path":65,"stem":66},{"title":70,"path":71,"stem":72,"children":73},"Your First App in 15 Minutes","\u002Fdocs\u002Fgetting-started\u002Fquick-start","docs\u002Fgetting-started\u002Fquick-start\u002Findex",[74],{"title":70,"path":71,"stem":72},{"title":76,"path":77,"stem":78,"children":79,"icon":81},"Security and trust","\u002Fdocs\u002Fgetting-started\u002Fsecurity-and-trust","docs\u002Fgetting-started\u002Fsecurity-and-trust\u002Findex",[80],{"title":76,"path":77,"stem":78,"icon":81},"i-lucide-shield-check",{"title":83,"path":84,"stem":85,"children":86},"Guides","\u002Fdocs\u002Fguides","docs\u002Fguides\u002Findex",[87,88,151,249,256,310,364,391],{"title":83,"path":84,"stem":85},{"title":89,"path":90,"stem":91,"children":92,"icon":94},"Build an App","\u002Fdocs\u002Fguides\u002Fapps","docs\u002Fguides\u002Fapps\u002Findex",[93,95,102,109,116,123,130,137,144],{"title":89,"path":90,"stem":91,"icon":94},"i-lucide-layout-grid",{"title":96,"path":97,"stem":98,"children":99,"icon":101},"Give your App a Cockpit screen","\u002Fdocs\u002Fguides\u002Fapps\u002Fadd-a-cockpit-screen","docs\u002Fguides\u002Fapps\u002Fadd-a-cockpit-screen\u002Findex",[100],{"title":96,"path":97,"stem":98,"icon":101},"i-lucide-layout-dashboard",{"title":103,"path":104,"stem":105,"children":106,"icon":108},"Add a data model","\u002Fdocs\u002Fguides\u002Fapps\u002Fadd-a-data-model","docs\u002Fguides\u002Fapps\u002Fadd-a-data-model\u002Findex",[107],{"title":103,"path":104,"stem":105,"icon":108},"i-lucide-database",{"title":110,"path":111,"stem":112,"children":113,"icon":115},"Build your first App","\u002Fdocs\u002Fguides\u002Fapps\u002Fbuild-your-first-app","docs\u002Fguides\u002Fapps\u002Fbuild-your-first-app\u002Findex",[114],{"title":110,"path":111,"stem":112,"icon":115},"i-lucide-hammer",{"title":117,"path":118,"stem":119,"children":120,"icon":122},"Deploy and verify an App","\u002Fdocs\u002Fguides\u002Fapps\u002Fdeploy-with-the-cli","docs\u002Fguides\u002Fapps\u002Fdeploy-with-the-cli\u002Findex",[121],{"title":117,"path":118,"stem":119,"icon":122},"i-lucide-square-terminal",{"title":124,"path":125,"stem":126,"children":127,"icon":129},"Publish a business event from your App","\u002Fdocs\u002Fguides\u002Fapps\u002Fpublish-a-business-event","docs\u002Fguides\u002Fapps\u002Fpublish-a-business-event\u002Findex",[128],{"title":124,"path":125,"stem":126,"icon":129},"i-lucide-megaphone",{"title":131,"path":132,"stem":133,"children":134,"icon":136},"Publish on the Marketplace","\u002Fdocs\u002Fguides\u002Fapps\u002Fpublish-on-the-marketplace","docs\u002Fguides\u002Fapps\u002Fpublish-on-the-marketplace\u002Findex",[135],{"title":131,"path":132,"stem":133,"icon":136},"i-lucide-store",{"title":138,"path":139,"stem":140,"children":141,"icon":143},"React to events and run scheduled work in your App","\u002Fdocs\u002Fguides\u002Fapps\u002Freact-to-events-and-run-scheduled-work","docs\u002Fguides\u002Fapps\u002Freact-to-events-and-run-scheduled-work\u002Findex",[142],{"title":138,"path":139,"stem":140,"icon":143},"i-lucide-timer",{"title":145,"path":146,"stem":147,"children":148,"icon":150},"Ship a schema change","\u002Fdocs\u002Fguides\u002Fapps\u002Fship-a-schema-change","docs\u002Fguides\u002Fapps\u002Fship-a-schema-change\u002Findex",[149],{"title":145,"path":146,"stem":147,"icon":150},"i-lucide-git-branch",{"title":152,"path":153,"stem":154,"children":155,"icon":157},"Set up selling","\u002Fdocs\u002Fguides\u002Fcommerce","docs\u002Fguides\u002Fcommerce\u002Findex",[156,158,165,172,179,186,193,200,207,214,221,228,235,242],{"title":152,"path":153,"stem":154,"icon":157},"i-lucide-shopping-cart",{"title":159,"path":160,"stem":161,"children":162,"icon":164},"Set up B2B pricing","\u002Fdocs\u002Fguides\u002Fcommerce\u002Fb2b-pricing","docs\u002Fguides\u002Fcommerce\u002Fb2b-pricing\u002Findex",[163],{"title":159,"path":160,"stem":161,"icon":164},"i-lucide-circle-dollar-sign",{"title":166,"path":167,"stem":168,"children":169,"icon":171},"Give buyer staff the right permissions","\u002Fdocs\u002Fguides\u002Fcommerce\u002Fbuyer-permissions","docs\u002Fguides\u002Fcommerce\u002Fbuyer-permissions\u002Findex",[170],{"title":166,"path":167,"stem":168,"icon":171},"i-lucide-user-cog",{"title":173,"path":174,"stem":175,"children":176,"icon":178},"Confirm invoice payments","\u002Fdocs\u002Fguides\u002Fcommerce\u002Fconfirm-invoice-payments","docs\u002Fguides\u002Fcommerce\u002Fconfirm-invoice-payments\u002Findex",[177],{"title":173,"path":174,"stem":175,"icon":178},"i-lucide-receipt",{"title":180,"path":181,"stem":182,"children":183,"icon":185},"Model a catalog with attributes, families and variants","\u002Fdocs\u002Fguides\u002Fcommerce\u002Fmodel-a-catalog","docs\u002Fguides\u002Fcommerce\u002Fmodel-a-catalog\u002Findex",[184],{"title":180,"path":181,"stem":182,"icon":185},"i-lucide-boxes",{"title":187,"path":188,"stem":189,"children":190,"icon":192},"Order and quote numbers","\u002Fdocs\u002Fguides\u002Fcommerce\u002Fnumber-ranges","docs\u002Fguides\u002Fcommerce\u002Fnumber-ranges\u002Findex",[191],{"title":187,"path":188,"stem":189,"icon":192},"i-lucide-hash",{"title":194,"path":195,"stem":196,"children":197,"icon":199},"Manage product images and documents","\u002Fdocs\u002Fguides\u002Fcommerce\u002Fproduct-media","docs\u002Fguides\u002Fcommerce\u002Fproduct-media\u002Findex",[198],{"title":194,"path":195,"stem":196,"icon":199},"i-lucide-image",{"title":201,"path":202,"stem":203,"children":204,"icon":206},"Run promotions and voucher codes","\u002Fdocs\u002Fguides\u002Fcommerce\u002Fpromotions-and-vouchers","docs\u002Fguides\u002Fcommerce\u002Fpromotions-and-vouchers\u002Findex",[205],{"title":201,"path":202,"stem":203,"icon":206},"i-lucide-ticket-percent",{"title":208,"path":209,"stem":210,"children":211,"icon":213},"Set up purchase approvals","\u002Fdocs\u002Fguides\u002Fcommerce\u002Fpurchase-approvals","docs\u002Fguides\u002Fcommerce\u002Fpurchase-approvals\u002Findex",[212],{"title":208,"path":209,"stem":210,"icon":213},"i-lucide-stamp",{"title":215,"path":216,"stem":217,"children":218,"icon":220},"Turn an accepted quote into an order","\u002Fdocs\u002Fguides\u002Fcommerce\u002Fquotes-to-orders","docs\u002Fguides\u002Fcommerce\u002Fquotes-to-orders\u002Findex",[219],{"title":215,"path":216,"stem":217,"icon":220},"i-lucide-handshake",{"title":222,"path":223,"stem":224,"children":225,"icon":227},"Build categories from rules","\u002Fdocs\u002Fguides\u002Fcommerce\u002Frule-based-categories","docs\u002Fguides\u002Fcommerce\u002Frule-based-categories\u002Findex",[226],{"title":222,"path":223,"stem":224,"icon":227},"i-lucide-list-filter",{"title":229,"path":230,"stem":231,"children":232,"icon":234},"Ship, cancel and return an order","\u002Fdocs\u002Fguides\u002Fcommerce\u002Fship-cancel-and-return","docs\u002Fguides\u002Fcommerce\u002Fship-cancel-and-return\u002Findex",[233],{"title":229,"path":230,"stem":231,"icon":234},"i-lucide-package-check",{"title":236,"path":237,"stem":238,"children":239,"icon":241},"Set up shipping rates and tax","\u002Fdocs\u002Fguides\u002Fcommerce\u002Fshipping-rates","docs\u002Fguides\u002Fcommerce\u002Fshipping-rates\u002Findex",[240],{"title":236,"path":237,"stem":238,"icon":241},"i-lucide-truck",{"title":243,"path":244,"stem":245,"children":246,"icon":248},"Connect a payment provider and take a test payment","\u002Fdocs\u002Fguides\u002Fcommerce\u002Ftest-payments","docs\u002Fguides\u002Fcommerce\u002Ftest-payments\u002Findex",[247],{"title":243,"path":244,"stem":245,"icon":248},"i-lucide-credit-card",{"title":250,"path":251,"stem":252,"children":253,"icon":255},"Start from an example","\u002Fdocs\u002Fguides\u002Fexamples","docs\u002Fguides\u002Fexamples\u002Findex",[254],{"title":250,"path":251,"stem":252,"icon":255},"i-lucide-folder-code",{"title":257,"path":258,"stem":259,"children":260,"icon":262},"Connect a system","\u002Fdocs\u002Fguides\u002Fintegrations","docs\u002Fguides\u002Fintegrations\u002Findex",[261,263,269,276,283,289,296,303],{"title":257,"path":258,"stem":259,"icon":262},"i-lucide-plug",{"title":264,"path":265,"stem":266,"children":267,"icon":29},"Connect a procurement system by punchout","\u002Fdocs\u002Fguides\u002Fintegrations\u002Fconnect-by-punchout","docs\u002Fguides\u002Fintegrations\u002Fconnect-by-punchout\u002Findex",[268],{"title":264,"path":265,"stem":266,"icon":29},{"title":270,"path":271,"stem":272,"children":273,"icon":275},"Hand an order to the ERP","\u002Fdocs\u002Fguides\u002Fintegrations\u002Fhand-an-order-to-the-erp","docs\u002Fguides\u002Fintegrations\u002Fhand-an-order-to-the-erp\u002Findex",[274],{"title":270,"path":271,"stem":272,"icon":275},"i-lucide-arrow-left-right",{"title":277,"path":278,"stem":279,"children":280,"icon":282},"Import a BMECAT catalog","\u002Fdocs\u002Fguides\u002Fintegrations\u002Fimport-a-bmecat-catalog","docs\u002Fguides\u002Fintegrations\u002Fimport-a-bmecat-catalog\u002Findex",[281],{"title":277,"path":278,"stem":279,"icon":282},"i-lucide-package-plus",{"title":284,"path":285,"stem":286,"children":287,"icon":50},"Keep an Integration Studio workflow running","\u002Fdocs\u002Fguides\u002Fintegrations\u002Fkeep-a-workflow-running","docs\u002Fguides\u002Fintegrations\u002Fkeep-a-workflow-running\u002Findex",[288],{"title":284,"path":285,"stem":286,"icon":50},{"title":290,"path":291,"stem":292,"children":293,"icon":295},"Receive platform events at your own endpoint","\u002Fdocs\u002Fguides\u002Fintegrations\u002Freceive-platform-events","docs\u002Fguides\u002Fintegrations\u002Freceive-platform-events\u002Findex",[294],{"title":290,"path":291,"stem":292,"icon":295},"i-lucide-webhook",{"title":297,"path":298,"stem":299,"children":300,"icon":302},"Recover abandoned carts with a workflow","\u002Fdocs\u002Fguides\u002Fintegrations\u002Frecover-abandoned-carts","docs\u002Fguides\u002Fintegrations\u002Frecover-abandoned-carts\u002Findex",[301],{"title":297,"path":298,"stem":299,"icon":302},"i-lucide-mail-check",{"title":304,"path":305,"stem":306,"children":307,"icon":309},"Send low-stock alerts to the ERP","\u002Fdocs\u002Fguides\u002Fintegrations\u002Fsend-low-stock-alerts-to-the-erp","docs\u002Fguides\u002Fintegrations\u002Fsend-low-stock-alerts-to-the-erp\u002Findex",[308],{"title":304,"path":305,"stem":306,"icon":309},"i-lucide-bell-ring",{"title":311,"path":312,"stem":313,"children":314,"icon":316},"Operate & go live","\u002Fdocs\u002Fguides\u002Foperate","docs\u002Fguides\u002Foperate\u002Findex",[315,317,323,330,337,344,351,357],{"title":311,"path":312,"stem":313,"icon":316},"i-lucide-activity",{"title":318,"path":319,"stem":320,"children":321,"icon":81},"Answer a customer's security questionnaire","\u002Fdocs\u002Fguides\u002Foperate\u002Fanswer-a-security-questionnaire","docs\u002Fguides\u002Foperate\u002Fanswer-a-security-questionnaire\u002Findex",[322],{"title":318,"path":319,"stem":320,"icon":81},{"title":324,"path":325,"stem":326,"children":327,"icon":329},"Debug a failed request","\u002Fdocs\u002Fguides\u002Foperate\u002Fdebug-a-failed-request","docs\u002Fguides\u002Foperate\u002Fdebug-a-failed-request\u002Findex",[328],{"title":324,"path":325,"stem":326,"icon":329},"i-lucide-bug",{"title":331,"path":332,"stem":333,"children":334,"icon":336},"Go live with a project","\u002Fdocs\u002Fguides\u002Foperate\u002Fgo-live-checklist","docs\u002Fguides\u002Foperate\u002Fgo-live-checklist\u002Findex",[335],{"title":331,"path":332,"stem":333,"icon":336},"i-lucide-list-checks",{"title":338,"path":339,"stem":340,"children":341,"icon":343},"Migrate from an existing shop","\u002Fdocs\u002Fguides\u002Foperate\u002Fmigrate-from-an-existing-shop","docs\u002Fguides\u002Foperate\u002Fmigrate-from-an-existing-shop\u002Findex",[342],{"title":338,"path":339,"stem":340,"icon":343},"i-lucide-route",{"title":345,"path":346,"stem":347,"children":348,"icon":350},"Size a launch","\u002Fdocs\u002Fguides\u002Foperate\u002Fplan-for-limits","docs\u002Fguides\u002Foperate\u002Fplan-for-limits\u002Findex",[349],{"title":345,"path":346,"stem":347,"icon":350},"i-lucide-gauge",{"title":352,"path":353,"stem":354,"children":355,"icon":336},"Script a bulk change","\u002Fdocs\u002Fguides\u002Foperate\u002Fscript-a-bulk-change","docs\u002Fguides\u002Foperate\u002Fscript-a-bulk-change\u002Findex",[356],{"title":352,"path":353,"stem":354,"icon":336},{"title":358,"path":359,"stem":360,"children":361,"icon":363},"Stay current","\u002Fdocs\u002Fguides\u002Foperate\u002Fstay-current","docs\u002Fguides\u002Foperate\u002Fstay-current\u002Findex",[362],{"title":358,"path":359,"stem":360,"icon":363},"i-lucide-refresh-cw",{"title":365,"path":366,"stem":367,"children":368,"icon":370},"Plan before you build","\u002Fdocs\u002Fguides\u002Fplan","docs\u002Fguides\u002Fplan\u002Findex",[369,371,378,385],{"title":365,"path":366,"stem":367,"icon":370},"i-lucide-map",{"title":372,"path":373,"stem":374,"children":375,"icon":377},"Choose a system of record","\u002Fdocs\u002Fguides\u002Fplan\u002Fchoose-a-system-of-record","docs\u002Fguides\u002Fplan\u002Fchoose-a-system-of-record\u002Findex",[376],{"title":372,"path":373,"stem":374,"icon":377},"i-lucide-network",{"title":379,"path":380,"stem":381,"children":382,"icon":384},"Choose an event surface","\u002Fdocs\u002Fguides\u002Fplan\u002Fchoose-an-event-surface","docs\u002Fguides\u002Fplan\u002Fchoose-an-event-surface\u002Findex",[383],{"title":379,"path":380,"stem":381,"icon":384},"i-lucide-signpost",{"title":386,"path":387,"stem":388,"children":389,"icon":343},"Choose where the logic goes","\u002Fdocs\u002Fguides\u002Fplan\u002Fchoose-where-the-logic-goes","docs\u002Fguides\u002Fplan\u002Fchoose-where-the-logic-goes\u002Findex",[390],{"title":386,"path":387,"stem":388,"icon":343},{"title":392,"path":393,"stem":394,"children":395,"icon":397},"Build a storefront","\u002Fdocs\u002Fguides\u002Fstorefronts","docs\u002Fguides\u002Fstorefronts\u002Findex",[396,398,405,412,419,426,432,439],{"title":392,"path":393,"stem":394,"icon":397},"i-lucide-paintbrush",{"title":399,"path":400,"stem":401,"children":402,"icon":404},"Brand a Theme with design tokens","\u002Fdocs\u002Fguides\u002Fstorefronts\u002Fbrand-with-tokens","docs\u002Fguides\u002Fstorefronts\u002Fbrand-with-tokens\u002Findex",[403],{"title":399,"path":400,"stem":401,"icon":404},"i-lucide-palette",{"title":406,"path":407,"stem":408,"children":409,"icon":411},"Build a block","\u002Fdocs\u002Fguides\u002Fstorefronts\u002Fbuild-a-block","docs\u002Fguides\u002Fstorefronts\u002Fbuild-a-block\u002Findex",[410],{"title":406,"path":407,"stem":408,"icon":411},"i-lucide-blocks",{"title":413,"path":414,"stem":415,"children":416,"icon":418},"Build your first Theme","\u002Fdocs\u002Fguides\u002Fstorefronts\u002Fbuild-your-first-theme","docs\u002Fguides\u002Fstorefronts\u002Fbuild-your-first-theme\u002Findex",[417],{"title":413,"path":414,"stem":415,"icon":418},"i-lucide-layout-template",{"title":420,"path":421,"stem":422,"children":423,"icon":425},"Connect your own frontend","\u002Fdocs\u002Fguides\u002Fstorefronts\u002Fconnect-a-frontend","docs\u002Fguides\u002Fstorefronts\u002Fconnect-a-frontend\u002Findex",[424],{"title":420,"path":421,"stem":422,"icon":425},"i-lucide-plug-zap",{"title":427,"path":428,"stem":429,"children":430,"icon":363},"Refresh price caches when a price list changes","\u002Fdocs\u002Fguides\u002Fstorefronts\u002Frefresh-price-caches","docs\u002Fguides\u002Fstorefronts\u002Frefresh-price-caches\u002Findex",[431],{"title":427,"path":428,"stem":429,"icon":363},{"title":433,"path":434,"stem":435,"children":436,"icon":438},"Reorder and quick order","\u002Fdocs\u002Fguides\u002Fstorefronts\u002Freorder-and-quick-order","docs\u002Fguides\u002Fstorefronts\u002Freorder-and-quick-order\u002Findex",[437],{"title":433,"path":434,"stem":435,"icon":438},"i-lucide-repeat",{"title":440,"path":441,"stem":442,"children":443,"icon":445},"Sign a buyer in from your server","\u002Fdocs\u002Fguides\u002Fstorefronts\u002Fsign-a-buyer-in","docs\u002Fguides\u002Fstorefronts\u002Fsign-a-buyer-in\u002Findex",[444],{"title":440,"path":441,"stem":442,"icon":445},"i-lucide-log-in",{"title":447,"path":448,"stem":449,"children":450},"SDKs","\u002Fdocs\u002Fsdks","docs\u002Fsdks\u002Findex",[451,452,458,464,470,476,482,488,494],{"title":447,"path":448,"stem":449},{"title":453,"path":454,"stem":455,"children":456},"App SDK","\u002Fdocs\u002Fsdks\u002Fapp-sdk","docs\u002Fsdks\u002Fapp-sdk\u002Findex",[457],{"title":453,"path":454,"stem":455},{"title":459,"path":460,"stem":461,"children":462},"CLI","\u002Fdocs\u002Fsdks\u002Fcli","docs\u002Fsdks\u002Fcli\u002Findex",[463],{"title":459,"path":460,"stem":461},{"title":465,"path":466,"stem":467,"children":468},"Design systems","\u002Fdocs\u002Fsdks\u002Fdesign-systems","docs\u002Fsdks\u002Fdesign-systems\u002Findex",[469],{"title":465,"path":466,"stem":467},{"title":471,"path":472,"stem":473,"children":474},"Integration Node SDK","\u002Fdocs\u002Fsdks\u002Fintegration-nodes","docs\u002Fsdks\u002Fintegration-nodes\u002Findex",[475],{"title":471,"path":472,"stem":473},{"title":477,"path":478,"stem":479,"children":480},"Node SDK","\u002Fdocs\u002Fsdks\u002Fnode","docs\u002Fsdks\u002Fnode\u002Findex",[481],{"title":477,"path":478,"stem":479},{"title":483,"path":484,"stem":485,"children":486},"PHP SDK","\u002Fdocs\u002Fsdks\u002Fphp","docs\u002Fsdks\u002Fphp\u002Findex",[487],{"title":483,"path":484,"stem":485},{"title":489,"path":490,"stem":491,"children":492,"icon":150},"Versioning","\u002Fdocs\u002Fsdks\u002Fversioning","docs\u002Fsdks\u002Fversioning\u002Findex",[493],{"title":489,"path":490,"stem":491,"icon":150},{"title":495,"path":496,"stem":497,"children":498},"Web \u002F JavaScript SDK","\u002Fdocs\u002Fsdks\u002Fweb","docs\u002Fsdks\u002Fweb\u002Findex",[499],{"title":495,"path":496,"stem":497},{"title":501,"path":502,"stem":503,"children":504},"Services","\u002Fdocs\u002Fservices","docs\u002Fservices\u002Findex",[505,506,542,549,579,585,609,616,670,718],{"title":501,"path":502,"stem":503},{"title":507,"path":508,"stem":509,"children":510},"API usage","\u002Fdocs\u002Fservices\u002Fapi-usage","docs\u002Fservices\u002Fapi-usage\u002Findex",[511,512,518,524,530,536],{"title":507,"path":508,"stem":509},{"title":513,"path":514,"stem":515,"children":516},"Errors","\u002Fdocs\u002Fservices\u002Fapi-usage\u002Ferrors","docs\u002Fservices\u002Fapi-usage\u002Ferrors\u002Findex",[517],{"title":513,"path":514,"stem":515},{"title":519,"path":520,"stem":521,"children":522},"Retries & idempotency","\u002Fdocs\u002Fservices\u002Fapi-usage\u002Fidempotency","docs\u002Fservices\u002Fapi-usage\u002Fidempotency\u002Findex",[523],{"title":519,"path":520,"stem":521},{"title":525,"path":526,"stem":527,"children":528},"Pagination & filtering","\u002Fdocs\u002Fservices\u002Fapi-usage\u002Fpagination","docs\u002Fservices\u002Fapi-usage\u002Fpagination\u002Findex",[529],{"title":525,"path":526,"stem":527},{"title":531,"path":532,"stem":533,"children":534},"Rate limits","\u002Fdocs\u002Fservices\u002Fapi-usage\u002Frate-limits","docs\u002Fservices\u002Fapi-usage\u002Frate-limits\u002Findex",[535],{"title":531,"path":532,"stem":533},{"title":537,"path":538,"stem":539,"children":540},"Versioning & stability","\u002Fdocs\u002Fservices\u002Fapi-usage\u002Fversioning","docs\u002Fservices\u002Fapi-usage\u002Fversioning\u002Findex",[541],{"title":537,"path":538,"stem":539},{"title":543,"path":544,"stem":545,"children":546,"icon":548},"Record history","\u002Fdocs\u002Fservices\u002Faudit","docs\u002Fservices\u002Faudit\u002Findex",[547],{"title":543,"path":544,"stem":545,"icon":548},"i-lucide-history",{"title":550,"path":551,"stem":552,"children":553},"Authentication","\u002Fdocs\u002Fservices\u002Fauth","docs\u002Fservices\u002Fauth\u002Findex",[554,555,561,567,573],{"title":550,"path":551,"stem":552},{"title":556,"path":557,"stem":558,"children":559},"API keys","\u002Fdocs\u002Fservices\u002Fauth\u002Fapi-keys","docs\u002Fservices\u002Fauth\u002Fapi-keys\u002Findex",[560],{"title":556,"path":557,"stem":558},{"title":562,"path":563,"stem":564,"children":565},"Multi-factor authentication","\u002Fdocs\u002Fservices\u002Fauth\u002Fmfa","docs\u002Fservices\u002Fauth\u002Fmfa\u002Findex",[566],{"title":562,"path":563,"stem":564},{"title":568,"path":569,"stem":570,"children":571},"Social sign-in","\u002Fdocs\u002Fservices\u002Fauth\u002Foauth2","docs\u002Fservices\u002Fauth\u002Foauth2\u002Findex",[572],{"title":568,"path":569,"stem":570},{"title":574,"path":575,"stem":576,"children":577},"Sessions","\u002Fdocs\u002Fservices\u002Fauth\u002Fsessions","docs\u002Fservices\u002Fauth\u002Fsessions\u002Findex",[578],{"title":574,"path":575,"stem":576},{"title":580,"path":581,"stem":582,"children":583},"Avatars","\u002Fdocs\u002Fservices\u002Favatars","docs\u002Fservices\u002Favatars\u002Findex",[584],{"title":580,"path":581,"stem":582},{"title":586,"path":587,"stem":588,"children":589},"Events","\u002Fdocs\u002Fservices\u002Fevents","docs\u002Fservices\u002Fevents\u002Findex",[590,591,597,603],{"title":586,"path":587,"stem":588},{"title":592,"path":593,"stem":594,"children":595},"Consuming events","\u002Fdocs\u002Fservices\u002Fevents\u002Fconsuming-events","docs\u002Fservices\u002Fevents\u002Fconsuming-events\u002Findex",[596],{"title":592,"path":593,"stem":594},{"title":598,"path":599,"stem":600,"children":601},"Event catalog","\u002Fdocs\u002Fservices\u002Fevents\u002Fevent-catalog","docs\u002Fservices\u002Fevents\u002Fevent-catalog\u002Findex",[602],{"title":598,"path":599,"stem":600},{"title":604,"path":605,"stem":606,"children":607},"Event types","\u002Fdocs\u002Fservices\u002Fevents\u002Fevent-types","docs\u002Fservices\u002Fevents\u002Fevent-types\u002Findex",[608],{"title":604,"path":605,"stem":606},{"title":610,"path":611,"stem":612,"children":613,"icon":615},"Locale","\u002Fdocs\u002Fservices\u002Flocale","docs\u002Fservices\u002Flocale\u002Findex",[614],{"title":610,"path":611,"stem":612,"icon":615},"i-lucide-globe",{"title":617,"path":618,"stem":619,"children":620},"Network","\u002Fdocs\u002Fservices\u002Fnetwork","docs\u002Fservices\u002Fnetwork\u002Findex",[621,622,628,634,640,646,652,658,664],{"title":617,"path":618,"stem":619},{"title":623,"path":624,"stem":625,"children":626},"Caching","\u002Fdocs\u002Fservices\u002Fnetwork\u002Fcaching","docs\u002Fservices\u002Fnetwork\u002Fcaching\u002Findex",[627],{"title":623,"path":624,"stem":625},{"title":629,"path":630,"stem":631,"children":632},"Content delivery (CDN)","\u002Fdocs\u002Fservices\u002Fnetwork\u002Fcdn","docs\u002Fservices\u002Fnetwork\u002Fcdn\u002Findex",[633],{"title":629,"path":630,"stem":631},{"title":635,"path":636,"stem":637,"children":638},"Compression","\u002Fdocs\u002Fservices\u002Fnetwork\u002Fcompression","docs\u002Fservices\u002Fnetwork\u002Fcompression\u002Findex",[639],{"title":635,"path":636,"stem":637},{"title":641,"path":642,"stem":643,"children":644},"DDoS mitigation","\u002Fdocs\u002Fservices\u002Fnetwork\u002Fddos","docs\u002Fservices\u002Fnetwork\u002Fddos\u002Findex",[645],{"title":641,"path":642,"stem":643},{"title":647,"path":648,"stem":649,"children":650},"Edge network","\u002Fdocs\u002Fservices\u002Fnetwork\u002Fedges","docs\u002Fservices\u002Fnetwork\u002Fedges\u002Findex",[651],{"title":647,"path":648,"stem":649},{"title":653,"path":654,"stem":655,"children":656},"Endpoints","\u002Fdocs\u002Fservices\u002Fnetwork\u002Fendpoints","docs\u002Fservices\u002Fnetwork\u002Fendpoints\u002Findex",[657],{"title":653,"path":654,"stem":655},{"title":659,"path":660,"stem":661,"children":662},"Transport Layer Security (TLS)","\u002Fdocs\u002Fservices\u002Fnetwork\u002Ftls","docs\u002Fservices\u002Fnetwork\u002Ftls\u002Findex",[663],{"title":659,"path":660,"stem":661},{"title":665,"path":666,"stem":667,"children":668},"Web application firewall (WAF)","\u002Fdocs\u002Fservices\u002Fnetwork\u002Fwaf","docs\u002Fservices\u002Fnetwork\u002Fwaf\u002Findex",[669],{"title":665,"path":666,"stem":667},{"title":671,"path":672,"stem":673,"children":674},"Storage","\u002Fdocs\u002Fservices\u002Fstorage","docs\u002Fservices\u002Fstorage\u002Findex",[675,676,682,688,694,700,706,712],{"title":671,"path":672,"stem":673},{"title":677,"path":678,"stem":679,"children":680},"Folders","\u002Fdocs\u002Fservices\u002Fstorage\u002Fbuckets","docs\u002Fservices\u002Fstorage\u002Fbuckets\u002Findex",[681],{"title":677,"path":678,"stem":679},{"title":683,"path":684,"stem":685,"children":686},"Signed URLs and access","\u002Fdocs\u002Fservices\u002Fstorage\u002Ffile-tokens","docs\u002Fservices\u002Fstorage\u002Ffile-tokens\u002Findex",[687],{"title":683,"path":684,"stem":685},{"title":689,"path":690,"stem":691,"children":692},"Serve and transform images","\u002Fdocs\u002Fservices\u002Fstorage\u002Fimages","docs\u002Fservices\u002Fstorage\u002Fimages\u002Findex",[693],{"title":689,"path":690,"stem":691},{"title":695,"path":696,"stem":697,"children":698},"3D assets","\u002Fdocs\u002Fservices\u002Fstorage\u002Fmodel-viewer","docs\u002Fservices\u002Fstorage\u002Fmodel-viewer\u002Findex",[699],{"title":695,"path":696,"stem":697},{"title":701,"path":702,"stem":703,"children":704},"Access control and visibility","\u002Fdocs\u002Fservices\u002Fstorage\u002Fpermissions","docs\u002Fservices\u002Fstorage\u002Fpermissions\u002Findex",[705],{"title":701,"path":702,"stem":703},{"title":707,"path":708,"stem":709,"children":710},"Quick start","\u002Fdocs\u002Fservices\u002Fstorage\u002Fquick-start","docs\u002Fservices\u002Fstorage\u002Fquick-start\u002Findex",[711],{"title":707,"path":708,"stem":709},{"title":713,"path":714,"stem":715,"children":716},"Upload and manage files","\u002Fdocs\u002Fservices\u002Fstorage\u002Fupload-download","docs\u002Fservices\u002Fstorage\u002Fupload-download\u002Findex",[717],{"title":713,"path":714,"stem":715},{"title":719,"path":720,"stem":721,"children":722},"Webhooks","\u002Fdocs\u002Fservices\u002Fwebhooks","docs\u002Fservices\u002Fwebhooks\u002Findex",[723,724,730],{"title":719,"path":720,"stem":721},{"title":725,"path":726,"stem":727,"children":728},"Delivery","\u002Fdocs\u002Fservices\u002Fwebhooks\u002Fdelivery","docs\u002Fservices\u002Fwebhooks\u002Fdelivery\u002Findex",[729],{"title":725,"path":726,"stem":727},{"title":731,"path":732,"stem":733,"children":734},"Security","\u002Fdocs\u002Fservices\u002Fwebhooks\u002Fsecurity","docs\u002Fservices\u002Fwebhooks\u002Fsecurity\u002Findex",[735],{"title":731,"path":732,"stem":733},{"title":737,"path":738,"stem":739,"children":740},"Studios","\u002Fdocs\u002Fstudios","docs\u002Fstudios\u002Findex",[741,742,748,913,1264,1583,1765],{"title":737,"path":738,"stem":739},{"title":743,"path":744,"stem":745,"children":746},"AI Studio","\u002Fdocs\u002Fstudios\u002Fai","docs\u002Fstudios\u002Fai\u002Findex",[747],{"title":743,"path":744,"stem":745},{"title":749,"path":750,"stem":751,"children":752,"icon":754},"Analytics Studio","\u002Fdocs\u002Fstudios\u002Fanalytics","docs\u002Fstudios\u002Fanalytics\u002Findex",[753,755,798,835,841,859,889],{"title":749,"path":750,"stem":751,"icon":754},"i-lucide-chart-column",{"title":756,"path":757,"stem":758,"children":759,"icon":761},"Make your app's data analyzable","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fanalytics-json","docs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Findex",[760,762,768,774,780,786,792],{"title":756,"path":757,"stem":758,"icon":761},"i-lucide-table-2",{"title":763,"path":764,"stem":765,"children":766},"Column locators","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Fcolumn-locators","docs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Fcolumn-locators\u002Findex",[767],{"title":763,"path":764,"stem":765},{"title":769,"path":770,"stem":771,"children":772},"Declaring a view","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Fdeclaring-a-view","docs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Fdeclaring-a-view\u002Findex",[773],{"title":769,"path":770,"stem":771},{"title":775,"path":776,"stem":777,"children":778},"Example","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Fexample","docs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Fexample\u002Findex",[779],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783,"children":784},"Semantic roles","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Fsemantic-roles","docs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Fsemantic-roles\u002Findex",[785],{"title":781,"path":782,"stem":783},{"title":787,"path":788,"stem":789,"children":790},"Tenant isolation","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Ftenant-isolation","docs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Ftenant-isolation\u002Findex",[791],{"title":787,"path":788,"stem":789},{"title":793,"path":794,"stem":795,"children":796},"The contract","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Fthe-contract","docs\u002Fstudios\u002Fanalytics\u002Fanalytics-json\u002Fthe-contract\u002Findex",[797],{"title":793,"path":794,"stem":795},{"title":799,"path":800,"stem":801,"children":802,"icon":804},"Stream commerce activity","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fevents","docs\u002Fstudios\u002Fanalytics\u002Fevents\u002Findex",[803,805,811,817,823,829],{"title":799,"path":800,"stem":801,"icon":804},"i-lucide-radio",{"title":806,"path":807,"stem":808,"children":809},"Delivery guarantees","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fevents\u002Fdelivery-guarantees","docs\u002Fstudios\u002Fanalytics\u002Fevents\u002Fdelivery-guarantees\u002Findex",[810],{"title":806,"path":807,"stem":808},{"title":812,"path":813,"stem":814,"children":815},"Event types for reporting","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fevents\u002Fevent-types-for-reporting","docs\u002Fstudios\u002Fanalytics\u002Fevents\u002Fevent-types-for-reporting\u002Findex",[816],{"title":812,"path":813,"stem":814},{"title":818,"path":819,"stem":820,"children":821},"Register an endpoint","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fevents\u002Fregister-an-endpoint","docs\u002Fstudios\u002Fanalytics\u002Fevents\u002Fregister-an-endpoint\u002Findex",[822],{"title":818,"path":819,"stem":820},{"title":824,"path":825,"stem":826,"children":827},"The event stream","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fevents\u002Fthe-event-stream","docs\u002Fstudios\u002Fanalytics\u002Fevents\u002Fthe-event-stream\u002Findex",[828],{"title":824,"path":825,"stem":826},{"title":830,"path":831,"stem":832,"children":833},"Verify a delivery","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fevents\u002Fverify-a-delivery","docs\u002Fstudios\u002Fanalytics\u002Fevents\u002Fverify-a-delivery\u002Findex",[834],{"title":830,"path":831,"stem":832},{"title":836,"path":837,"stem":838,"children":839,"icon":29},"Getting data out","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fgetting-data-out","docs\u002Fstudios\u002Fanalytics\u002Fgetting-data-out\u002Findex",[840],{"title":836,"path":837,"stem":838,"icon":29},{"title":842,"path":843,"stem":844,"children":845,"icon":336},"Limits and what's next","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Flimits","docs\u002Fstudios\u002Fanalytics\u002Flimits\u002Findex",[846,847,853],{"title":842,"path":843,"stem":844,"icon":336},{"title":848,"path":849,"stem":850,"children":851},"Designing for what's coming","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Flimits\u002Fdesigning-for-whats-coming","docs\u002Fstudios\u002Fanalytics\u002Flimits\u002Fdesigning-for-whats-coming\u002Findex",[852],{"title":848,"path":849,"stem":850},{"title":854,"path":855,"stem":856,"children":857},"What does not exist yet","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Flimits\u002Fwhat-does-not-exist-yet","docs\u002Fstudios\u002Fanalytics\u002Flimits\u002Fwhat-does-not-exist-yet\u002Findex",[858],{"title":854,"path":855,"stem":856},{"title":860,"path":861,"stem":862,"children":863,"icon":108},"Build your own reporting store","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fown-store","docs\u002Fstudios\u002Fanalytics\u002Fown-store\u002Findex",[864,865,871,877,883],{"title":860,"path":861,"stem":862,"icon":108},{"title":866,"path":867,"stem":868,"children":869},"Backfill","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fown-store\u002Fbackfill","docs\u002Fstudios\u002Fanalytics\u002Fown-store\u002Fbackfill\u002Findex",[870],{"title":866,"path":867,"stem":868},{"title":872,"path":873,"stem":874,"children":875},"Incremental sync","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fown-store\u002Fincremental-sync","docs\u002Fstudios\u002Fanalytics\u002Fown-store\u002Fincremental-sync\u002Findex",[876],{"title":872,"path":873,"stem":874},{"title":878,"path":879,"stem":880,"children":881},"Modelling","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fown-store\u002Fmodelling","docs\u002Fstudios\u002Fanalytics\u002Fown-store\u002Fmodelling\u002Findex",[882],{"title":878,"path":879,"stem":880},{"title":884,"path":885,"stem":886,"children":887},"Pull versus push","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fown-store\u002Fpull-vs-push","docs\u002Fstudios\u002Fanalytics\u002Fown-store\u002Fpull-vs-push\u002Findex",[888],{"title":884,"path":885,"stem":886},{"title":890,"path":891,"stem":892,"children":893,"icon":754},"What the tenant sees","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fwhat-the-tenant-sees","docs\u002Fstudios\u002Fanalytics\u002Fwhat-the-tenant-sees\u002Findex",[894,895,901,907],{"title":890,"path":891,"stem":892,"icon":754},{"title":896,"path":897,"stem":898,"children":899},"Cohorts","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fwhat-the-tenant-sees\u002Fcohorts","docs\u002Fstudios\u002Fanalytics\u002Fwhat-the-tenant-sees\u002Fcohorts\u002Findex",[900],{"title":896,"path":897,"stem":898},{"title":902,"path":903,"stem":904,"children":905},"Datasets and charts","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fwhat-the-tenant-sees\u002Fdatasets-and-charts","docs\u002Fstudios\u002Fanalytics\u002Fwhat-the-tenant-sees\u002Fdatasets-and-charts\u002Findex",[906],{"title":902,"path":903,"stem":904},{"title":908,"path":909,"stem":910,"children":911},"Studio overview","\u002Fdocs\u002Fstudios\u002Fanalytics\u002Fwhat-the-tenant-sees\u002Fstudio-overview","docs\u002Fstudios\u002Fanalytics\u002Fwhat-the-tenant-sees\u002Fstudio-overview\u002Findex",[912],{"title":908,"path":909,"stem":910},{"title":914,"path":915,"stem":916,"children":917},"App Studio","\u002Fdocs\u002Fstudios\u002Fapps","docs\u002Fstudios\u002Fapps\u002Findex",[918,919,955,1025,1096,1114,1180],{"title":914,"path":915,"stem":916},{"title":920,"path":921,"stem":922,"children":923,"icon":101},"Admin UI","\u002Fdocs\u002Fstudios\u002Fapps\u002Fadmin-ui","docs\u002Fstudios\u002Fapps\u002Fadmin-ui\u002Findex",[924,925,931,937,943,949],{"title":920,"path":921,"stem":922,"icon":101},{"title":926,"path":927,"stem":928,"children":929},"How the Cockpit renders","\u002Fdocs\u002Fstudios\u002Fapps\u002Fadmin-ui\u002Fhow-cockpit-renders","docs\u002Fstudios\u002Fapps\u002Fadmin-ui\u002Fhow-cockpit-renders\u002Findex",[930],{"title":926,"path":927,"stem":928},{"title":932,"path":933,"stem":934,"children":935},"Preview locally","\u002Fdocs\u002Fstudios\u002Fapps\u002Fadmin-ui\u002Fpreview-locally","docs\u002Fstudios\u002Fapps\u002Fadmin-ui\u002Fpreview-locally\u002Findex",[936],{"title":932,"path":933,"stem":934},{"title":938,"path":939,"stem":940,"children":941},"Reading settings","\u002Fdocs\u002Fstudios\u002Fapps\u002Fadmin-ui\u002Freading-settings","docs\u002Fstudios\u002Fapps\u002Fadmin-ui\u002Freading-settings\u002Findex",[942],{"title":938,"path":939,"stem":940},{"title":944,"path":945,"stem":946,"children":947},"Settings","\u002Fdocs\u002Fstudios\u002Fapps\u002Fadmin-ui\u002Fsettings","docs\u002Fstudios\u002Fapps\u002Fadmin-ui\u002Fsettings\u002Findex",[948],{"title":944,"path":945,"stem":946},{"title":950,"path":951,"stem":952,"children":953},"Vocabularies","\u002Fdocs\u002Fstudios\u002Fapps\u002Fadmin-ui\u002Fvocabularies","docs\u002Fstudios\u002Fapps\u002Fadmin-ui\u002Fvocabularies\u002Findex",[954],{"title":950,"path":951,"stem":952},{"title":956,"path":957,"stem":958,"children":959,"icon":343},"Your app's API","\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi","docs\u002Fstudios\u002Fapps\u002Fapi\u002Findex",[960,961,966,972,978,984,990,995,1001,1007,1013,1019],{"title":956,"path":957,"stem":958,"icon":343},{"title":623,"path":962,"stem":963,"children":964},"\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi\u002Fcaching","docs\u002Fstudios\u002Fapps\u002Fapi\u002Fcaching\u002Findex",[965],{"title":623,"path":962,"stem":963},{"title":967,"path":968,"stem":969,"children":970},"Calling another app","\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi\u002Fcalling-another-app","docs\u002Fstudios\u002Fapps\u002Fapi\u002Fcalling-another-app\u002Findex",[971],{"title":967,"path":968,"stem":969},{"title":973,"path":974,"stem":975,"children":976},"Capabilities","\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi\u002Fcapabilities","docs\u002Fstudios\u002Fapps\u002Fapi\u002Fcapabilities\u002Findex",[977],{"title":973,"path":974,"stem":975},{"title":979,"path":980,"stem":981,"children":982},"Capability reference","\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi\u002Fcapability-reference","docs\u002Fstudios\u002Fapps\u002Fapi\u002Fcapability-reference\u002Findex",[983],{"title":979,"path":980,"stem":981},{"title":985,"path":986,"stem":987,"children":988},"CRUD","\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi\u002Fcrud","docs\u002Fstudios\u002Fapps\u002Fapi\u002Fcrud\u002Findex",[989],{"title":985,"path":986,"stem":987},{"title":513,"path":991,"stem":992,"children":993},"\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi\u002Ferrors","docs\u002Fstudios\u002Fapps\u002Fapi\u002Ferrors\u002Findex",[994],{"title":513,"path":991,"stem":992},{"title":996,"path":997,"stem":998,"children":999},"Overriding a capability","\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi\u002Foverriding-a-capability","docs\u002Fstudios\u002Fapps\u002Fapi\u002Foverriding-a-capability\u002Findex",[1000],{"title":996,"path":997,"stem":998},{"title":1002,"path":1003,"stem":1004,"children":1005},"Pagination and filtering","\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi\u002Fpagination-and-filtering","docs\u002Fstudios\u002Fapps\u002Fapi\u002Fpagination-and-filtering\u002Findex",[1006],{"title":1002,"path":1003,"stem":1004},{"title":1008,"path":1009,"stem":1010,"children":1011},"Published OpenAPI","\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi\u002Fpublished-openapi","docs\u002Fstudios\u002Fapps\u002Fapi\u002Fpublished-openapi\u002Findex",[1012],{"title":1008,"path":1009,"stem":1010},{"title":1014,"path":1015,"stem":1016,"children":1017},"The router","\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi\u002Frouter","docs\u002Fstudios\u002Fapps\u002Fapi\u002Frouter\u002Findex",[1018],{"title":1014,"path":1015,"stem":1016},{"title":1020,"path":1021,"stem":1022,"children":1023},"Tags","\u002Fdocs\u002Fstudios\u002Fapps\u002Fapi\u002Ftags","docs\u002Fstudios\u002Fapps\u002Fapi\u002Ftags\u002Findex",[1024],{"title":1020,"path":1021,"stem":1022},{"title":1026,"path":1027,"stem":1028,"children":1029,"icon":108},"Data model","\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Findex",[1030,1031,1037,1043,1049,1055,1061,1067,1073,1079,1085,1090],{"title":1026,"path":1027,"stem":1028,"icon":108},{"title":1032,"path":1033,"stem":1034,"children":1035},"Adapters","\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fadapters","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fadapters\u002Findex",[1036],{"title":1032,"path":1033,"stem":1034},{"title":1038,"path":1039,"stem":1040,"children":1041},"Column types","\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fcolumn-types","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fcolumn-types\u002Findex",[1042],{"title":1038,"path":1039,"stem":1040},{"title":1044,"path":1045,"stem":1046,"children":1047},"Cross-app lookups","\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fcross-app-lookups","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fcross-app-lookups\u002Findex",[1048],{"title":1044,"path":1045,"stem":1046},{"title":1050,"path":1051,"stem":1052,"children":1053},"Migrations","\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fmigrations","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fmigrations\u002Findex",[1054],{"title":1050,"path":1051,"stem":1052},{"title":1056,"path":1057,"stem":1058,"children":1059},"Projections","\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fprojections","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fprojections\u002Findex",[1060],{"title":1056,"path":1057,"stem":1058},{"title":1062,"path":1063,"stem":1064,"children":1065},"Relationships","\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model\u002Frelationships","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Frelationships\u002Findex",[1066],{"title":1062,"path":1063,"stem":1064},{"title":1068,"path":1069,"stem":1070,"children":1071},"Schema reference","\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fschema-reference","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fschema-reference\u002Findex",[1072],{"title":1068,"path":1069,"stem":1070},{"title":1074,"path":1075,"stem":1076,"children":1077},"Scoping","\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fscoping","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fscoping\u002Findex",[1078],{"title":1074,"path":1075,"stem":1076},{"title":1080,"path":1081,"stem":1082,"children":1083},"search.json reference","\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fsearch-json","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Fsearch-json\u002Findex",[1084],{"title":1080,"path":1081,"stem":1082},{"title":787,"path":1086,"stem":1087,"children":1088},"\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model\u002Ftenant-isolation","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Ftenant-isolation\u002Findex",[1089],{"title":787,"path":1086,"stem":1087},{"title":1091,"path":1092,"stem":1093,"children":1094},"The typed client","\u002Fdocs\u002Fstudios\u002Fapps\u002Fdata-model\u002Ftyped-client","docs\u002Fstudios\u002Fapps\u002Fdata-model\u002Ftyped-client\u002Findex",[1095],{"title":1091,"path":1092,"stem":1093},{"title":1097,"path":1098,"stem":1099,"children":1100},"Getting started","\u002Fdocs\u002Fstudios\u002Fapps\u002Fgetting-started","docs\u002Fstudios\u002Fapps\u002Fgetting-started\u002Findex",[1101,1102,1108],{"title":1097,"path":1098,"stem":1099},{"title":1103,"path":1104,"stem":1105,"children":1106},"App model","\u002Fdocs\u002Fstudios\u002Fapps\u002Fgetting-started\u002Fapp-model","docs\u002Fstudios\u002Fapps\u002Fgetting-started\u002Fapp-model\u002Findex",[1107],{"title":1103,"path":1104,"stem":1105},{"title":1109,"path":1110,"stem":1111,"children":1112},"App isolation","\u002Fdocs\u002Fstudios\u002Fapps\u002Fgetting-started\u002Fisolation","docs\u002Fstudios\u002Fapps\u002Fgetting-started\u002Fisolation\u002Findex",[1113],{"title":1109,"path":1110,"stem":1111},{"title":1115,"path":1116,"stem":1117,"children":1118,"icon":185},"Platform services","\u002Fdocs\u002Fstudios\u002Fapps\u002Fplatform-services","docs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Findex",[1119,1120,1126,1132,1138,1144,1150,1156,1162,1168,1174],{"title":1115,"path":1116,"stem":1117,"icon":185},{"title":1121,"path":1122,"stem":1123,"children":1124},"Entity access","\u002Fdocs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fentity-access","docs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fentity-access\u002Findex",[1125],{"title":1121,"path":1122,"stem":1123},{"title":1127,"path":1128,"stem":1129,"children":1130},"Events you emit","\u002Fdocs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fevents-you-emit","docs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fevents-you-emit\u002Findex",[1131],{"title":1127,"path":1128,"stem":1129},{"title":1133,"path":1134,"stem":1135,"children":1136},"Events you receive","\u002Fdocs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fevents-you-receive","docs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fevents-you-receive\u002Findex",[1137],{"title":1133,"path":1134,"stem":1135},{"title":1139,"path":1140,"stem":1141,"children":1142},"Not yet proven","\u002Fdocs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fnot-yet-proven","docs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fnot-yet-proven\u002Findex",[1143],{"title":1139,"path":1140,"stem":1141},{"title":1145,"path":1146,"stem":1147,"children":1148},"Outbound HTTP","\u002Fdocs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Foutbound-http","docs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Foutbound-http\u002Findex",[1149],{"title":1145,"path":1146,"stem":1147},{"title":1151,"path":1152,"stem":1153,"children":1154},"Permissions","\u002Fdocs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fpermissions","docs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fpermissions\u002Findex",[1155],{"title":1151,"path":1152,"stem":1153},{"title":1157,"path":1158,"stem":1159,"children":1160},"Person permissions","\u002Fdocs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fperson-permissions","docs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fperson-permissions\u002Findex",[1161],{"title":1157,"path":1158,"stem":1159},{"title":1163,"path":1164,"stem":1165,"children":1166},"Scheduled work","\u002Fdocs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fscheduled-work","docs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Fscheduled-work\u002Findex",[1167],{"title":1163,"path":1164,"stem":1165},{"title":1169,"path":1170,"stem":1171,"children":1172},"Tenant identity","\u002Fdocs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Ftenant-identity","docs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Ftenant-identity\u002Findex",[1173],{"title":1169,"path":1170,"stem":1171},{"title":1175,"path":1176,"stem":1177,"children":1178},"Tracing","\u002Fdocs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Ftracing","docs\u002Fstudios\u002Fapps\u002Fplatform-services\u002Ftracing\u002Findex",[1179],{"title":1175,"path":1176,"stem":1177},{"title":1181,"path":1182,"stem":1183,"children":1184,"icon":1186},"Ship and operate","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Findex",[1185,1187,1193,1199,1205,1211,1217,1223,1229,1235,1241,1247,1253,1259],{"title":1181,"path":1182,"stem":1183,"icon":1186},"i-lucide-rocket",{"title":1188,"path":1189,"stem":1190,"children":1191},"Billing","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fbilling","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fbilling\u002Findex",[1192],{"title":1188,"path":1189,"stem":1190},{"title":1194,"path":1195,"stem":1196,"children":1197},"Consent","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fconsent","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fconsent\u002Findex",[1198],{"title":1194,"path":1195,"stem":1196},{"title":1200,"path":1201,"stem":1202,"children":1203},"Dependencies","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fdependencies","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fdependencies\u002Findex",[1204],{"title":1200,"path":1201,"stem":1202},{"title":1206,"path":1207,"stem":1208,"children":1209},"Deploying","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fdeploying","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fdeploying\u002Findex",[1210],{"title":1206,"path":1207,"stem":1208},{"title":1212,"path":1213,"stem":1214,"children":1215},"Manifest reference","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fmanifest-reference","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fmanifest-reference\u002Findex",[1216],{"title":1212,"path":1213,"stem":1214},{"title":1218,"path":1219,"stem":1220,"children":1221},"Operating","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Foperating","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Foperating\u002Findex",[1222],{"title":1218,"path":1219,"stem":1220},{"title":1224,"path":1225,"stem":1226,"children":1227},"Pairing a frontend","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fpairing-a-frontend","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fpairing-a-frontend\u002Findex",[1228],{"title":1224,"path":1225,"stem":1226},{"title":1230,"path":1231,"stem":1232,"children":1233},"Private or Marketplace","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fprivate-vs-marketplace","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fprivate-vs-marketplace\u002Findex",[1234],{"title":1230,"path":1231,"stem":1232},{"title":1236,"path":1237,"stem":1238,"children":1239},"Publish and install","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fpublish-and-install","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fpublish-and-install\u002Findex",[1240],{"title":1236,"path":1237,"stem":1238},{"title":1242,"path":1243,"stem":1244,"children":1245},"Testing","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Ftesting","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Ftesting\u002Findex",[1246],{"title":1242,"path":1243,"stem":1244},{"title":1248,"path":1249,"stem":1250,"children":1251},"Validate","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fvalidate","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fvalidate\u002Findex",[1252],{"title":1248,"path":1249,"stem":1250},{"title":1254,"path":1255,"stem":1256,"children":1257},"Verifying live","\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fverifying-live","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fverifying-live\u002Findex",[1258],{"title":1254,"path":1255,"stem":1256},{"title":489,"path":1260,"stem":1261,"children":1262},"\u002Fdocs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fversioning","docs\u002Fstudios\u002Fapps\u002Fship-and-operate\u002Fversioning\u002Findex",[1263],{"title":489,"path":1260,"stem":1261},{"title":1265,"path":1266,"stem":1267,"children":1268,"icon":1270},"Commerce Studio","\u002Fdocs\u002Fstudios\u002Fcommerce","docs\u002Fstudios\u002Fcommerce\u002Findex",[1269,1271,1343,1403,1452,1457,1510,1564],{"title":1265,"path":1266,"stem":1267,"icon":1270},"i-lucide-shopping-bag",{"title":1272,"path":1273,"stem":1274,"children":1275,"icon":1277},"Build an app","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Findex",[1276,1278,1284,1290,1296,1302,1308,1314,1320,1326,1332,1337],{"title":1272,"path":1273,"stem":1274,"icon":1277},"i-lucide-puzzle",{"title":1279,"path":1280,"stem":1281,"children":1282},"Actions and writes","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Factions-and-writes","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Factions-and-writes\u002Findex",[1283],{"title":1279,"path":1280,"stem":1281},{"title":1285,"path":1286,"stem":1287,"children":1288},"cockpit.json reference","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fcockpit-json-reference","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fcockpit-json-reference\u002Findex",[1289],{"title":1285,"path":1286,"stem":1287},{"title":1291,"path":1292,"stem":1293,"children":1294},"Detail views","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fdetail-views","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fdetail-views\u002Findex",[1295],{"title":1291,"path":1292,"stem":1293},{"title":1297,"path":1298,"stem":1299,"children":1300},"Forms","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fforms","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fforms\u002Findex",[1301],{"title":1297,"path":1298,"stem":1299},{"title":1303,"path":1304,"stem":1305,"children":1306},"From manifest to installed","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Ffrom-manifest-to-installed","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Ffrom-manifest-to-installed\u002Findex",[1307],{"title":1303,"path":1304,"stem":1305},{"title":1309,"path":1310,"stem":1311,"children":1312},"How it renders","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fhow-it-renders","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fhow-it-renders\u002Findex",[1313],{"title":1309,"path":1310,"stem":1311},{"title":1315,"path":1316,"stem":1317,"children":1318},"List views","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Flist-views","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Flist-views\u002Findex",[1319],{"title":1315,"path":1316,"stem":1317},{"title":1321,"path":1322,"stem":1323,"children":1324},"Navigation","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fnavigation","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fnavigation\u002Findex",[1325],{"title":1321,"path":1322,"stem":1323},{"title":1327,"path":1328,"stem":1329,"children":1330},"Permissions and scope","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fpermissions-and-scope","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fpermissions-and-scope\u002Findex",[1331],{"title":1327,"path":1328,"stem":1329},{"title":932,"path":1333,"stem":1334,"children":1335},"\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fpreview-locally","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fpreview-locally\u002Findex",[1336],{"title":932,"path":1333,"stem":1334},{"title":1338,"path":1339,"stem":1340,"children":1341},"Widgets","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fwidgets","docs\u002Fstudios\u002Fcommerce\u002Fbuild-an-app\u002Fwidgets\u002Findex",[1342],{"title":1338,"path":1339,"stem":1340},{"title":1344,"path":1345,"stem":1346,"children":1347,"icon":1349},"Catalog","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog","docs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Findex",[1348,1350,1356,1362,1368,1374,1379,1385,1391,1397],{"title":1344,"path":1345,"stem":1346,"icon":1349},"i-lucide-package",{"title":1351,"path":1352,"stem":1353,"children":1354},"Assets","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fassets","docs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fassets\u002Findex",[1355],{"title":1351,"path":1352,"stem":1353},{"title":1357,"path":1358,"stem":1359,"children":1360},"Associations","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fassociations","docs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fassociations\u002Findex",[1361],{"title":1357,"path":1358,"stem":1359},{"title":1363,"path":1364,"stem":1365,"children":1366},"Categories","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fcategories","docs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fcategories\u002Findex",[1367],{"title":1363,"path":1364,"stem":1365},{"title":1369,"path":1370,"stem":1371,"children":1372},"Completeness","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fcompleteness","docs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fcompleteness\u002Findex",[1373],{"title":1369,"path":1370,"stem":1371},{"title":1026,"path":1375,"stem":1376,"children":1377},"\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fdata-model","docs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fdata-model\u002Findex",[1378],{"title":1026,"path":1375,"stem":1376},{"title":1380,"path":1381,"stem":1382,"children":1383},"Import and export","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fimport-and-export","docs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fimport-and-export\u002Findex",[1384],{"title":1380,"path":1381,"stem":1382},{"title":1386,"path":1387,"stem":1388,"children":1389},"Languages and locale codes","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Flanguages-and-locale-codes","docs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Flanguages-and-locale-codes\u002Findex",[1390],{"title":1386,"path":1387,"stem":1388},{"title":1392,"path":1393,"stem":1394,"children":1395},"Products","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fproducts","docs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Fproducts\u002Findex",[1396],{"title":1392,"path":1393,"stem":1394},{"title":1398,"path":1399,"stem":1400,"children":1401},"References","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Freferences","docs\u002Fstudios\u002Fcommerce\u002Fcatalog\u002Freferences\u002Findex",[1402],{"title":1398,"path":1399,"stem":1400},{"title":1404,"path":1405,"stem":1406,"children":1407,"icon":1409},"Customers","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcustomers","docs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Findex",[1408,1410,1416,1422,1428,1434,1440,1446],{"title":1404,"path":1405,"stem":1406,"icon":1409},"i-lucide-building-2",{"title":1411,"path":1412,"stem":1413,"children":1414},"Contacts","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Fcontacts","docs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Fcontacts\u002Findex",[1415],{"title":1411,"path":1412,"stem":1413},{"title":1417,"path":1418,"stem":1419,"children":1420},"Organizations","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Forganizations","docs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Forganizations\u002Findex",[1421],{"title":1417,"path":1418,"stem":1419},{"title":1423,"path":1424,"stem":1425,"children":1426},"Roles and permissions","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Froles-and-permissions","docs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Froles-and-permissions\u002Findex",[1427],{"title":1423,"path":1424,"stem":1425},{"title":1429,"path":1430,"stem":1431,"children":1432},"Sales reps","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Fsales-reps","docs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Fsales-reps\u002Findex",[1433],{"title":1429,"path":1430,"stem":1431},{"title":1435,"path":1436,"stem":1437,"children":1438},"Segments","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Fsegments","docs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Fsegments\u002Findex",[1439],{"title":1435,"path":1436,"stem":1437},{"title":1441,"path":1442,"stem":1443,"children":1444},"Storefront accounts","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Fstorefront-accounts","docs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Fstorefront-accounts\u002Findex",[1445],{"title":1441,"path":1442,"stem":1443},{"title":1447,"path":1448,"stem":1449,"children":1450},"Value lists","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Fvalue-lists","docs\u002Fstudios\u002Fcommerce\u002Fcustomers\u002Fvalue-lists\u002Findex",[1451],{"title":1447,"path":1448,"stem":1449},{"title":1097,"path":1453,"stem":1454,"children":1455,"icon":1186},"\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fgetting-started","docs\u002Fstudios\u002Fcommerce\u002Fgetting-started\u002Findex",[1456],{"title":1097,"path":1453,"stem":1454,"icon":1186},{"title":1458,"path":1459,"stem":1460,"children":1461,"icon":615},"Markets and pricing","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing","docs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Findex",[1462,1463,1469,1475,1481,1487,1493,1499,1504],{"title":1458,"path":1459,"stem":1460,"icon":615},{"title":1464,"path":1465,"stem":1466,"children":1467},"Carriers and tracking","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fcarriers-and-tracking","docs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fcarriers-and-tracking\u002Findex",[1468],{"title":1464,"path":1465,"stem":1466},{"title":1470,"path":1471,"stem":1472,"children":1473},"Channels","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fchannels","docs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fchannels\u002Findex",[1474],{"title":1470,"path":1471,"stem":1472},{"title":1476,"path":1477,"stem":1478,"children":1479},"Markets","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fmarkets","docs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fmarkets\u002Findex",[1480],{"title":1476,"path":1477,"stem":1478},{"title":1482,"path":1483,"stem":1484,"children":1485},"Payment lifecycle","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fpayment-lifecycle","docs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fpayment-lifecycle\u002Findex",[1486],{"title":1482,"path":1483,"stem":1484},{"title":1488,"path":1489,"stem":1490,"children":1491},"Payment methods","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fpayment-methods","docs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fpayment-methods\u002Findex",[1492],{"title":1488,"path":1489,"stem":1490},{"title":1494,"path":1495,"stem":1496,"children":1497},"Price lists","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fprice-lists","docs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fprice-lists\u002Findex",[1498],{"title":1494,"path":1495,"stem":1496},{"title":944,"path":1500,"stem":1501,"children":1502},"\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fsettings","docs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fsettings\u002Findex",[1503],{"title":944,"path":1500,"stem":1501},{"title":1505,"path":1506,"stem":1507,"children":1508},"Shipping rates","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fshipping-rates","docs\u002Fstudios\u002Fcommerce\u002Fmarkets-and-pricing\u002Fshipping-rates\u002Findex",[1509],{"title":1505,"path":1506,"stem":1507},{"title":1511,"path":1512,"stem":1513,"children":1514,"icon":1516},"Orders","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Forders","docs\u002Fstudios\u002Fcommerce\u002Forders\u002Findex",[1515,1517,1523,1529,1535,1541,1547,1552,1558],{"title":1511,"path":1512,"stem":1513,"icon":1516},"i-lucide-receipt-text",{"title":1518,"path":1519,"stem":1520,"children":1521},"Carts","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Forders\u002Fcarts","docs\u002Fstudios\u002Fcommerce\u002Forders\u002Fcarts\u002Findex",[1522],{"title":1518,"path":1519,"stem":1520},{"title":1524,"path":1525,"stem":1526,"children":1527},"Documents","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Forders\u002Fdocuments","docs\u002Fstudios\u002Fcommerce\u002Forders\u002Fdocuments\u002Findex",[1528],{"title":1524,"path":1525,"stem":1526},{"title":1530,"path":1531,"stem":1532,"children":1533},"Events and comments","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Forders\u002Fevents-and-comments","docs\u002Fstudios\u002Fcommerce\u002Forders\u002Fevents-and-comments\u002Findex",[1534],{"title":1530,"path":1531,"stem":1532},{"title":1536,"path":1537,"stem":1538,"children":1539},"Number ranges","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Forders\u002Fnumber-ranges","docs\u002Fstudios\u002Fcommerce\u002Forders\u002Fnumber-ranges\u002Findex",[1540],{"title":1536,"path":1537,"stem":1538},{"title":1542,"path":1543,"stem":1544,"children":1545},"Order lists","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Forders\u002Forder-lists","docs\u002Fstudios\u002Fcommerce\u002Forders\u002Forder-lists\u002Findex",[1546],{"title":1542,"path":1543,"stem":1544},{"title":1511,"path":1548,"stem":1549,"children":1550},"\u002Fdocs\u002Fstudios\u002Fcommerce\u002Forders\u002Forders","docs\u002Fstudios\u002Fcommerce\u002Forders\u002Forders\u002Findex",[1551],{"title":1511,"path":1548,"stem":1549},{"title":1553,"path":1554,"stem":1555,"children":1556},"Returns","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Forders\u002Freturns","docs\u002Fstudios\u002Fcommerce\u002Forders\u002Freturns\u002Findex",[1557],{"title":1553,"path":1554,"stem":1555},{"title":1559,"path":1560,"stem":1561,"children":1562},"Stock","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Forders\u002Fstock","docs\u002Fstudios\u002Fcommerce\u002Forders\u002Fstock\u002Findex",[1563],{"title":1559,"path":1560,"stem":1561},{"title":1565,"path":1566,"stem":1567,"children":1568,"icon":1570},"Procurement","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fprocurement","docs\u002Fstudios\u002Fcommerce\u002Fprocurement\u002Findex",[1569,1571,1577],{"title":1565,"path":1566,"stem":1567,"icon":1570},"i-lucide-clipboard-check",{"title":1572,"path":1573,"stem":1574,"children":1575},"Cost centers","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fprocurement\u002Fcost-centers","docs\u002Fstudios\u002Fcommerce\u002Fprocurement\u002Fcost-centers\u002Findex",[1576],{"title":1572,"path":1573,"stem":1574},{"title":1578,"path":1579,"stem":1580,"children":1581,"icon":29},"Punchout","\u002Fdocs\u002Fstudios\u002Fcommerce\u002Fprocurement\u002Fpunchout","docs\u002Fstudios\u002Fcommerce\u002Fprocurement\u002Fpunchout\u002Findex",[1582],{"title":1578,"path":1579,"stem":1580,"icon":29},{"title":1584,"path":1585,"stem":1586,"children":1587},"Integration Studio","\u002Fdocs\u002Fstudios\u002Fintegration-studio","docs\u002Fstudios\u002Fintegration-studio\u002Findex",[1588,1589,1626,1663,1693,1698,1728],{"title":1584,"path":1585,"stem":1586},{"title":1590,"path":1591,"stem":1592,"children":1593,"icon":1595},"Build the workflow","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fbuild","docs\u002Fstudios\u002Fintegration-studio\u002Fbuild\u002Findex",[1594,1596,1602,1608,1614,1620],{"title":1590,"path":1591,"stem":1592,"icon":1595},"i-lucide-workflow",{"title":1597,"path":1598,"stem":1599,"children":1600},"Expressions","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fbuild\u002Fexpressions","docs\u002Fstudios\u002Fintegration-studio\u002Fbuild\u002Fexpressions\u002Findex",[1601],{"title":1597,"path":1598,"stem":1599},{"title":1603,"path":1604,"stem":1605,"children":1606},"Node catalog","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fbuild\u002Fnode-catalog","docs\u002Fstudios\u002Fintegration-studio\u002Fbuild\u002Fnode-catalog\u002Findex",[1607],{"title":1603,"path":1604,"stem":1605},{"title":1609,"path":1610,"stem":1611,"children":1612},"Node configuration","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fbuild\u002Fnode-configuration","docs\u002Fstudios\u002Fintegration-studio\u002Fbuild\u002Fnode-configuration\u002Findex",[1613],{"title":1609,"path":1610,"stem":1611},{"title":1615,"path":1616,"stem":1617,"children":1618},"Templates","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fbuild\u002Ftemplates","docs\u002Fstudios\u002Fintegration-studio\u002Fbuild\u002Ftemplates\u002Findex",[1619],{"title":1615,"path":1616,"stem":1617},{"title":1621,"path":1622,"stem":1623,"children":1624},"The workflow document","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fbuild\u002Fworkflow-model","docs\u002Fstudios\u002Fintegration-studio\u002Fbuild\u002Fworkflow-model\u002Findex",[1625],{"title":1621,"path":1622,"stem":1623},{"title":1627,"path":1628,"stem":1629,"children":1630,"icon":1632},"Connect the systems","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fconnect","docs\u002Fstudios\u002Fintegration-studio\u002Fconnect\u002Findex",[1631,1633,1639,1645,1651,1657],{"title":1627,"path":1628,"stem":1629,"icon":1632},"i-lucide-key-round",{"title":1634,"path":1635,"stem":1636,"children":1637},"Credentials","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fconnect\u002Fcredentials","docs\u002Fstudios\u002Fintegration-studio\u002Fconnect\u002Fcredentials\u002Findex",[1638],{"title":1634,"path":1635,"stem":1636},{"title":1640,"path":1641,"stem":1642,"children":1643},"File transfer","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fconnect\u002Ffiles","docs\u002Fstudios\u002Fintegration-studio\u002Fconnect\u002Ffiles\u002Findex",[1644],{"title":1640,"path":1641,"stem":1642},{"title":1646,"path":1647,"stem":1648,"children":1649},"OAuth","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fconnect\u002Foauth","docs\u002Fstudios\u002Fintegration-studio\u002Fconnect\u002Foauth\u002Findex",[1650],{"title":1646,"path":1647,"stem":1648},{"title":1652,"path":1653,"stem":1654,"children":1655},"Reaching Revenue Cloud","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fconnect\u002Freaching-revenue-cloud","docs\u002Fstudios\u002Fintegration-studio\u002Fconnect\u002Freaching-revenue-cloud\u002Findex",[1656],{"title":1652,"path":1653,"stem":1654},{"title":1658,"path":1659,"stem":1660,"children":1661},"Secrets","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fconnect\u002Fsecrets","docs\u002Fstudios\u002Fintegration-studio\u002Fconnect\u002Fsecrets\u002Findex",[1662],{"title":1658,"path":1659,"stem":1660},{"title":1664,"path":1665,"stem":1666,"children":1667,"icon":1349},"Extend the Studio","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fextend","docs\u002Fstudios\u002Fintegration-studio\u002Fextend\u002Findex",[1668,1669,1675,1681,1687],{"title":1664,"path":1665,"stem":1666,"icon":1349},{"title":1670,"path":1671,"stem":1672,"children":1673},"Custom nodes","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fextend\u002Fcustom-nodes","docs\u002Fstudios\u002Fintegration-studio\u002Fextend\u002Fcustom-nodes\u002Findex",[1674],{"title":1670,"path":1671,"stem":1672},{"title":1676,"path":1677,"stem":1678,"children":1679},"Dynamic behaviour","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fextend\u002Fdynamic-behaviour","docs\u002Fstudios\u002Fintegration-studio\u002Fextend\u002Fdynamic-behaviour\u002Findex",[1680],{"title":1676,"path":1677,"stem":1678},{"title":1682,"path":1683,"stem":1684,"children":1685},"Package manifest","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fextend\u002Fpackage-manifest","docs\u002Fstudios\u002Fintegration-studio\u002Fextend\u002Fpackage-manifest\u002Findex",[1686],{"title":1682,"path":1683,"stem":1684},{"title":1688,"path":1689,"stem":1690,"children":1691},"Registration","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fextend\u002Fregistration","docs\u002Fstudios\u002Fintegration-studio\u002Fextend\u002Fregistration\u002Findex",[1692],{"title":1688,"path":1689,"stem":1690},{"title":1097,"path":1694,"stem":1695,"children":1696,"icon":1186},"\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fgetting-started","docs\u002Fstudios\u002Fintegration-studio\u002Fgetting-started\u002Findex",[1697],{"title":1097,"path":1694,"stem":1695,"icon":1186},{"title":1699,"path":1700,"stem":1701,"children":1702,"icon":316},"Run, watch, recover","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Foperate","docs\u002Fstudios\u002Fintegration-studio\u002Foperate\u002Findex",[1703,1704,1710,1716,1722],{"title":1699,"path":1700,"stem":1701,"icon":316},{"title":1705,"path":1706,"stem":1707,"children":1708},"Missed runs","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Foperate\u002Fdead-letters","docs\u002Fstudios\u002Fintegration-studio\u002Foperate\u002Fdead-letters\u002Findex",[1709],{"title":1705,"path":1706,"stem":1707},{"title":1711,"path":1712,"stem":1713,"children":1714},"Failure handling","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Foperate\u002Ffailure-handling","docs\u002Fstudios\u002Fintegration-studio\u002Foperate\u002Ffailure-handling\u002Findex",[1715],{"title":1711,"path":1712,"stem":1713},{"title":1717,"path":1718,"stem":1719,"children":1720},"Revisions and audit","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Foperate\u002Frevisions-and-audit","docs\u002Fstudios\u002Fintegration-studio\u002Foperate\u002Frevisions-and-audit\u002Findex",[1721],{"title":1717,"path":1718,"stem":1719},{"title":1723,"path":1724,"stem":1725,"children":1726},"Runs","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Foperate\u002Fruns","docs\u002Fstudios\u002Fintegration-studio\u002Foperate\u002Fruns\u002Findex",[1727],{"title":1723,"path":1724,"stem":1725},{"title":1729,"path":1730,"stem":1731,"children":1732,"icon":1734},"Start the workflow","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fstart","docs\u002Fstudios\u002Fintegration-studio\u002Fstart\u002Findex",[1733,1735,1741,1747,1753,1759],{"title":1729,"path":1730,"stem":1731,"icon":1734},"i-lucide-zap",{"title":1736,"path":1737,"stem":1738,"children":1739},"Event triggers","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fstart\u002Fevent-triggers","docs\u002Fstudios\u002Fintegration-studio\u002Fstart\u002Fevent-triggers\u002Findex",[1740],{"title":1736,"path":1737,"stem":1738},{"title":1742,"path":1743,"stem":1744,"children":1745},"Execution modes","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fstart\u002Fexecution-modes","docs\u002Fstudios\u002Fintegration-studio\u002Fstart\u002Fexecution-modes\u002Findex",[1746],{"title":1742,"path":1743,"stem":1744},{"title":1748,"path":1749,"stem":1750,"children":1751},"Schedule triggers","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fstart\u002Fschedule-triggers","docs\u002Fstudios\u002Fintegration-studio\u002Fstart\u002Fschedule-triggers\u002Findex",[1752],{"title":1748,"path":1749,"stem":1750},{"title":1754,"path":1755,"stem":1756,"children":1757},"Triggers","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fstart\u002Ftriggers","docs\u002Fstudios\u002Fintegration-studio\u002Fstart\u002Ftriggers\u002Findex",[1758],{"title":1754,"path":1755,"stem":1756},{"title":1760,"path":1761,"stem":1762,"children":1763},"Webhook triggers","\u002Fdocs\u002Fstudios\u002Fintegration-studio\u002Fstart\u002Fwebhook-triggers","docs\u002Fstudios\u002Fintegration-studio\u002Fstart\u002Fwebhook-triggers\u002Findex",[1764],{"title":1760,"path":1761,"stem":1762},{"title":1766,"path":1767,"stem":1768,"children":1769},"Experience Studio","\u002Fdocs\u002Fstudios\u002Fsites","docs\u002Fstudios\u002Fsites\u002Findex",[1770,1771,1819,1871,1997,2003,2045],{"title":1766,"path":1767,"stem":1768},{"title":1772,"path":1773,"stem":1774,"children":1775,"icon":418},"Compose pages","\u002Fdocs\u002Fstudios\u002Fsites\u002Fblocks","docs\u002Fstudios\u002Fsites\u002Fblocks\u002Findex",[1776,1777,1783,1789,1795,1801,1807,1813],{"title":1772,"path":1773,"stem":1774,"icon":418},{"title":1778,"path":1779,"stem":1780,"children":1781},"Block catalog","\u002Fdocs\u002Fstudios\u002Fsites\u002Fblocks\u002Fblock-catalog","docs\u002Fstudios\u002Fsites\u002Fblocks\u002Fblock-catalog\u002Findex",[1782],{"title":1778,"path":1779,"stem":1780},{"title":1784,"path":1785,"stem":1786,"children":1787},"Block options","\u002Fdocs\u002Fstudios\u002Fsites\u002Fblocks\u002Fblock-options","docs\u002Fstudios\u002Fsites\u002Fblocks\u002Fblock-options\u002Findex",[1788],{"title":1784,"path":1785,"stem":1786},{"title":1790,"path":1791,"stem":1792,"children":1793},"How a block works","\u002Fdocs\u002Fstudios\u002Fsites\u002Fblocks\u002Fhow-a-block-works","docs\u002Fstudios\u002Fsites\u002Fblocks\u002Fhow-a-block-works\u002Findex",[1794],{"title":1790,"path":1791,"stem":1792},{"title":1796,"path":1797,"stem":1798,"children":1799},"Inline editing","\u002Fdocs\u002Fstudios\u002Fsites\u002Fblocks\u002Finline-editing","docs\u002Fstudios\u002Fsites\u002Fblocks\u002Finline-editing\u002Findex",[1800],{"title":1796,"path":1797,"stem":1798},{"title":1802,"path":1803,"stem":1804,"children":1805},"Reading published pages","\u002Fdocs\u002Fstudios\u002Fsites\u002Fblocks\u002Freading-pages","docs\u002Fstudios\u002Fsites\u002Fblocks\u002Freading-pages\u002Findex",[1806],{"title":1802,"path":1803,"stem":1804},{"title":1808,"path":1809,"stem":1810,"children":1811},"Registering blocks","\u002Fdocs\u002Fstudios\u002Fsites\u002Fblocks\u002Fregistering","docs\u002Fstudios\u002Fsites\u002Fblocks\u002Fregistering\u002Findex",[1812],{"title":1808,"path":1809,"stem":1810},{"title":1814,"path":1815,"stem":1816,"children":1817},"Shells and fields","\u002Fdocs\u002Fstudios\u002Fsites\u002Fblocks\u002Fshells-and-fields","docs\u002Fstudios\u002Fsites\u002Fblocks\u002Fshells-and-fields\u002Findex",[1818],{"title":1814,"path":1815,"stem":1816},{"title":1820,"path":1821,"stem":1822,"children":1823,"icon":262},"Connect data","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdata","docs\u002Fstudios\u002Fsites\u002Fdata\u002Findex",[1824,1825,1830,1836,1842,1847,1853,1859,1865],{"title":1820,"path":1821,"stem":1822,"icon":262},{"title":550,"path":1826,"stem":1827,"children":1828},"\u002Fdocs\u002Fstudios\u002Fsites\u002Fdata\u002Fauthentication","docs\u002Fstudios\u002Fsites\u002Fdata\u002Fauthentication\u002Findex",[1829],{"title":550,"path":1826,"stem":1827},{"title":1831,"path":1832,"stem":1833,"children":1834},"The BFF pattern","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdata\u002Fbff-pattern","docs\u002Fstudios\u002Fsites\u002Fdata\u002Fbff-pattern\u002Findex",[1835],{"title":1831,"path":1832,"stem":1833},{"title":1837,"path":1838,"stem":1839,"children":1840},"Catalog, cart, checkout","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdata\u002Fcatalog-cart-checkout","docs\u002Fstudios\u002Fsites\u002Fdata\u002Fcatalog-cart-checkout\u002Findex",[1841],{"title":1837,"path":1838,"stem":1839},{"title":1297,"path":1843,"stem":1844,"children":1845},"\u002Fdocs\u002Fstudios\u002Fsites\u002Fdata\u002Fforms","docs\u002Fstudios\u002Fsites\u002Fdata\u002Fforms\u002Findex",[1846],{"title":1297,"path":1843,"stem":1844},{"title":1848,"path":1849,"stem":1850,"children":1851},"Media and assets","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdata\u002Fmedia","docs\u002Fstudios\u002Fsites\u002Fdata\u002Fmedia\u002Findex",[1852],{"title":1848,"path":1849,"stem":1850},{"title":1854,"path":1855,"stem":1856,"children":1857},"Multi-tenant themes","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdata\u002Fmulti-tenant-themes","docs\u002Fstudios\u002Fsites\u002Fdata\u002Fmulti-tenant-themes\u002Findex",[1858],{"title":1854,"path":1855,"stem":1856},{"title":1860,"path":1861,"stem":1862,"children":1863},"Search collections","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdata\u002Fsearch-collections","docs\u002Fstudios\u002Fsites\u002Fdata\u002Fsearch-collections\u002Findex",[1864],{"title":1860,"path":1861,"stem":1862},{"title":1866,"path":1867,"stem":1868,"children":1869},"Search","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdata\u002Fsearch","docs\u002Fstudios\u002Fsites\u002Fdata\u002Fsearch\u002Findex",[1870],{"title":1866,"path":1867,"stem":1868},{"title":1872,"path":1873,"stem":1874,"children":1875,"icon":1186},"Build and deploy","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Findex",[1876,1877,1883,1889,1895,1901,1907,1913,1991],{"title":1872,"path":1873,"stem":1874,"icon":1186},{"title":1878,"path":1879,"stem":1880,"children":1881},"Build configuration","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fbuild-configuration","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fbuild-configuration\u002Findex",[1882],{"title":1878,"path":1879,"stem":1880},{"title":1884,"path":1885,"stem":1886,"children":1887},"Compute specifications","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fcompute-specifications","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fcompute-specifications\u002Findex",[1888],{"title":1884,"path":1885,"stem":1886},{"title":1890,"path":1891,"stem":1892,"children":1893},"Environment variables","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fenvironment-variables","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fenvironment-variables\u002Findex",[1894],{"title":1890,"path":1891,"stem":1892},{"title":1896,"path":1897,"stem":1898,"children":1899},"From Git","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Ffrom-git","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Ffrom-git\u002Findex",[1900],{"title":1896,"path":1897,"stem":1898},{"title":1902,"path":1903,"stem":1904,"children":1905},"From the CLI","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Ffrom-the-cli","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Ffrom-the-cli\u002Findex",[1906],{"title":1902,"path":1903,"stem":1904},{"title":1908,"path":1909,"stem":1910,"children":1911},"Manually","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fmanually","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fmanually\u002Findex",[1912],{"title":1908,"path":1909,"stem":1910},{"title":1914,"path":1915,"stem":1916,"children":1917},"Quick-starts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Findex",[1918,1919,1925,1931,1937,1943,1949,1955,1961,1967,1973,1979,1985],{"title":1914,"path":1915,"stem":1916},{"title":1920,"path":1921,"stem":1922,"children":1923},"Deploy an Angular app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fangular","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fangular\u002Findex",[1924],{"title":1920,"path":1921,"stem":1922},{"title":1926,"path":1927,"stem":1928,"children":1929},"Deploy a Astro app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fastro","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fastro\u002Findex",[1930],{"title":1926,"path":1927,"stem":1928},{"title":1932,"path":1933,"stem":1934,"children":1935},"Deploy a Flutter Web app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fflutter","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fflutter\u002Findex",[1936],{"title":1932,"path":1933,"stem":1934},{"title":1938,"path":1939,"stem":1940,"children":1941},"Deploy a Next.js app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fnextjs","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fnextjs\u002Findex",[1942],{"title":1938,"path":1939,"stem":1940},{"title":1944,"path":1945,"stem":1946,"children":1947},"Deploy a Nuxt app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fnuxt","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fnuxt\u002Findex",[1948],{"title":1944,"path":1945,"stem":1946},{"title":1950,"path":1951,"stem":1952,"children":1953},"Deploy a React Native app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Freact-native","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Freact-native\u002Findex",[1954],{"title":1950,"path":1951,"stem":1952},{"title":1956,"path":1957,"stem":1958,"children":1959},"Deploy a React app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Freact","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Freact\u002Findex",[1960],{"title":1956,"path":1957,"stem":1958},{"title":1962,"path":1963,"stem":1964,"children":1965},"Deploy a Remix app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fremix","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fremix\u002Findex",[1966],{"title":1962,"path":1963,"stem":1964},{"title":1968,"path":1969,"stem":1970,"children":1971},"Deploy a SvelteKit app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fsveltekit","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fsveltekit\u002Findex",[1972],{"title":1968,"path":1969,"stem":1970},{"title":1974,"path":1975,"stem":1976,"children":1977},"Deploy a TanStack Start app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Ftanstack-start","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Ftanstack-start\u002Findex",[1978],{"title":1974,"path":1975,"stem":1976},{"title":1980,"path":1981,"stem":1982,"children":1983},"Deploy a Vanilla JS app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fvanilla","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fvanilla\u002Findex",[1984],{"title":1980,"path":1981,"stem":1982},{"title":1986,"path":1987,"stem":1988,"children":1989},"Deploy a Vue.js app to revenexx Storefronts","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fvue","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fquick-starts\u002Fvue\u002Findex",[1990],{"title":1986,"path":1987,"stem":1988},{"title":1992,"path":1993,"stem":1994,"children":1995},"Starting points","\u002Fdocs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fstarting-points","docs\u002Fstudios\u002Fsites\u002Fdeploy\u002Fstarting-points\u002Findex",[1996],{"title":1992,"path":1993,"stem":1994},{"title":1097,"path":1998,"stem":1999,"children":2000,"icon":2002},"\u002Fdocs\u002Fstudios\u002Fsites\u002Fgetting-started","docs\u002Fstudios\u002Fsites\u002Fgetting-started\u002Findex",[2001],{"title":1097,"path":1998,"stem":1999,"icon":2002},"i-lucide-terminal",{"title":2004,"path":2005,"stem":2006,"children":2007,"icon":615},"Production","\u002Fdocs\u002Fstudios\u002Fsites\u002Fproduction","docs\u002Fstudios\u002Fsites\u002Fproduction\u002Findex",[2008,2009,2015,2021,2027,2033,2039],{"title":2004,"path":2005,"stem":2006,"icon":615},{"title":2010,"path":2011,"stem":2012,"children":2013},"Deployments","\u002Fdocs\u002Fstudios\u002Fsites\u002Fproduction\u002Fdeployments","docs\u002Fstudios\u002Fsites\u002Fproduction\u002Fdeployments\u002Findex",[2014],{"title":2010,"path":2011,"stem":2012},{"title":2016,"path":2017,"stem":2018,"children":2019},"Domains","\u002Fdocs\u002Fstudios\u002Fsites\u002Fproduction\u002Fdomains","docs\u002Fstudios\u002Fsites\u002Fproduction\u002Fdomains\u002Findex",[2020],{"title":2016,"path":2017,"stem":2018},{"title":2022,"path":2023,"stem":2024,"children":2025},"Instant rollbacks","\u002Fdocs\u002Fstudios\u002Fsites\u002Fproduction\u002Finstant-rollbacks","docs\u002Fstudios\u002Fsites\u002Fproduction\u002Finstant-rollbacks\u002Findex",[2026],{"title":2022,"path":2023,"stem":2024},{"title":2028,"path":2029,"stem":2030,"children":2031},"Logs","\u002Fdocs\u002Fstudios\u002Fsites\u002Fproduction\u002Flogs","docs\u002Fstudios\u002Fsites\u002Fproduction\u002Flogs\u002Findex",[2032],{"title":2028,"path":2029,"stem":2030},{"title":2034,"path":2035,"stem":2036,"children":2037},"Previews","\u002Fdocs\u002Fstudios\u002Fsites\u002Fproduction\u002Fpreviews","docs\u002Fstudios\u002Fsites\u002Fproduction\u002Fpreviews\u002Findex",[2038],{"title":2034,"path":2035,"stem":2036},{"title":2040,"path":2041,"stem":2042,"children":2043},"Publishing a theme","\u002Fdocs\u002Fstudios\u002Fsites\u002Fproduction\u002Fpublishing-a-theme","docs\u002Fstudios\u002Fsites\u002Fproduction\u002Fpublishing-a-theme\u002Findex",[2044],{"title":2040,"path":2041,"stem":2042},{"title":2046,"path":2047,"stem":2048,"children":2049,"icon":404},"Build the theme","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Findex",[2050,2051,2057,2063,2069,2075,2081,2087,2093,2111],{"title":2046,"path":2047,"stem":2048,"icon":404},{"title":2052,"path":2053,"stem":2054,"children":2055},"Theme anatomy","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme\u002Fanatomy","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Fanatomy\u002Findex",[2056],{"title":2052,"path":2053,"stem":2054},{"title":2058,"path":2059,"stem":2060,"children":2061},"Design tokens","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme\u002Fdesign-tokens","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Fdesign-tokens\u002Findex",[2062],{"title":2058,"path":2059,"stem":2060},{"title":2064,"path":2065,"stem":2066,"children":2067},"Frameworks","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme\u002Fframeworks","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Fframeworks\u002Findex",[2068],{"title":2064,"path":2065,"stem":2066},{"title":2070,"path":2071,"stem":2072,"children":2073},"The layer chain","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme\u002Flayer-chain","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Flayer-chain\u002Findex",[2074],{"title":2070,"path":2071,"stem":2072},{"title":2076,"path":2077,"stem":2078,"children":2079},"Local development","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme\u002Flocal-development","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Flocal-development\u002Findex",[2080],{"title":2076,"path":2077,"stem":2078},{"title":2082,"path":2083,"stem":2084,"children":2085},"Modules and plugins","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme\u002Fmodules-and-plugins","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Fmodules-and-plugins\u002Findex",[2086],{"title":2082,"path":2083,"stem":2084},{"title":2088,"path":2089,"stem":2090,"children":2091},"Overriding","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme\u002Foverriding","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Foverriding\u002Findex",[2092],{"title":2088,"path":2089,"stem":2090},{"title":2094,"path":2095,"stem":2096,"children":2097},"Rendering","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme\u002Frendering","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Frendering\u002Findex",[2098,2099,2105],{"title":2094,"path":2095,"stem":2096},{"title":2100,"path":2101,"stem":2102,"children":2103},"SSR","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme\u002Frendering\u002Fssr","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Frendering\u002Fssr\u002Findex",[2104],{"title":2100,"path":2101,"stem":2102},{"title":2106,"path":2107,"stem":2108,"children":2109},"Static","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme\u002Frendering\u002Fstatic","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Frendering\u002Fstatic\u002Findex",[2110],{"title":2106,"path":2107,"stem":2108},{"title":2112,"path":2113,"stem":2114,"children":2115},"Service modes","\u002Fdocs\u002Fstudios\u002Fsites\u002Ftheme\u002Fservice-modes","docs\u002Fstudios\u002Fsites\u002Ftheme\u002Fservice-modes\u002Findex",[2116],{"title":2112,"path":2113,"stem":2114},{"title":2118,"path":2119,"stem":2120,"children":2121},"Tools","\u002Fdocs\u002Ftools","docs\u002Ftools\u002Findex",[2122,2123,2130,2345],{"title":2118,"path":2119,"stem":2120},{"title":2124,"path":2125,"stem":2126,"children":2127,"icon":2129},"AI agents","\u002Fdocs\u002Ftools\u002Fai-agents","docs\u002Ftools\u002Fai-agents\u002Findex",[2128],{"title":2124,"path":2125,"stem":2126,"icon":2129},"i-lucide-shield-alert",{"title":2131,"path":2132,"stem":2133,"children":2134},"Command line","\u002Fdocs\u002Ftools\u002Fcommand-line","docs\u002Ftools\u002Fcommand-line\u002Findex",[2135,2136,2142,2147,2153,2159,2165,2171,2177,2183,2303,2309,2315,2321,2327,2333,2339],{"title":2131,"path":2132,"stem":2133},{"title":2137,"path":2138,"stem":2139,"children":2140},"Aliases","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Faliases","docs\u002Ftools\u002Fcommand-line\u002Faliases\u002Findex",[2141],{"title":2137,"path":2138,"stem":2139},{"title":550,"path":2143,"stem":2144,"children":2145},"\u002Fdocs\u002Ftools\u002Fcommand-line\u002Fauthentication","docs\u002Ftools\u002Fcommand-line\u002Fauthentication\u002Findex",[2146],{"title":550,"path":2143,"stem":2144},{"title":2148,"path":2149,"stem":2150,"children":2151},"Commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Fcommands","docs\u002Ftools\u002Fcommand-line\u002Fcommands\u002Findex",[2152],{"title":2148,"path":2149,"stem":2150},{"title":2154,"path":2155,"stem":2156,"children":2157},"Global commands reference","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Fglobal-commands","docs\u002Ftools\u002Fcommand-line\u002Fglobal-commands\u002Findex",[2158],{"title":2154,"path":2155,"stem":2156},{"title":2160,"path":2161,"stem":2162,"children":2163},"Installation","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Finstallation","docs\u002Ftools\u002Fcommand-line\u002Finstallation\u002Findex",[2164],{"title":2160,"path":2161,"stem":2162},{"title":2166,"path":2167,"stem":2168,"children":2169},"Interactive use","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Finteractive","docs\u002Ftools\u002Fcommand-line\u002Finteractive\u002Findex",[2170],{"title":2166,"path":2167,"stem":2168},{"title":2172,"path":2173,"stem":2174,"children":2175},"Non-interactive use","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Fnon-interactive","docs\u002Ftools\u002Fcommand-line\u002Fnon-interactive\u002Findex",[2176],{"title":2172,"path":2173,"stem":2174},{"title":2178,"path":2179,"stem":2180,"children":2181},"Project configuration","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Fproject-configuration","docs\u002Ftools\u002Fcommand-line\u002Fproject-configuration\u002Findex",[2182],{"title":2178,"path":2179,"stem":2180},{"title":2184,"path":2185,"stem":2186,"children":2187},"Command reference","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Findex",[2188,2189,2195,2201,2207,2213,2219,2225,2231,2237,2243,2249,2255,2261,2267,2273,2279,2285,2291,2297],{"title":2184,"path":2185,"stem":2186},{"title":2190,"path":2191,"stem":2192,"children":2193},"About commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fabout","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fabout\u002Findex",[2194],{"title":2190,"path":2191,"stem":2192},{"title":2196,"path":2197,"stem":2198,"children":2199},"Apps commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fapps","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fapps\u002Findex",[2200],{"title":2196,"path":2197,"stem":2198},{"title":2202,"path":2203,"stem":2204,"children":2205},"Carts commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fcarts","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fcarts\u002Findex",[2206],{"title":2202,"path":2203,"stem":2204},{"title":2208,"path":2209,"stem":2210,"children":2211},"Channels commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fchannels","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fchannels\u002Findex",[2212],{"title":2208,"path":2209,"stem":2210},{"title":2214,"path":2215,"stem":2216,"children":2217},"Create commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fcreate","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fcreate\u002Findex",[2218],{"title":2214,"path":2215,"stem":2216},{"title":2220,"path":2221,"stem":2222,"children":2223},"Customers commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fcustomers","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fcustomers\u002Findex",[2224],{"title":2220,"path":2221,"stem":2222},{"title":2226,"path":2227,"stem":2228,"children":2229},"Deploy commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fdeploy","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fdeploy\u002Findex",[2230],{"title":2226,"path":2227,"stem":2228},{"title":2232,"path":2233,"stem":2234,"children":2235},"Forms commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fforms","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fforms\u002Findex",[2236],{"title":2232,"path":2233,"stem":2234},{"title":2238,"path":2239,"stem":2240,"children":2241},"Markets commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fmarkets","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fmarkets\u002Findex",[2242],{"title":2238,"path":2239,"stem":2240},{"title":2244,"path":2245,"stem":2246,"children":2247},"Order lists commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Forderlists","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Forderlists\u002Findex",[2248],{"title":2244,"path":2245,"stem":2246},{"title":2250,"path":2251,"stem":2252,"children":2253},"Orders commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Forders","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Forders\u002Findex",[2254],{"title":2250,"path":2251,"stem":2252},{"title":2256,"path":2257,"stem":2258,"children":2259},"Pages commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fpages","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fpages\u002Findex",[2260],{"title":2256,"path":2257,"stem":2258},{"title":2262,"path":2263,"stem":2264,"children":2265},"Prices commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fprices","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fprices\u002Findex",[2266],{"title":2262,"path":2263,"stem":2264},{"title":2268,"path":2269,"stem":2270,"children":2271},"Products commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fproducts","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fproducts\u002Findex",[2272],{"title":2268,"path":2269,"stem":2270},{"title":2274,"path":2275,"stem":2276,"children":2277},"Search commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fsearch","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fsearch\u002Findex",[2278],{"title":2274,"path":2275,"stem":2276},{"title":2280,"path":2281,"stem":2282,"children":2283},"Settings commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fsettings","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fsettings\u002Findex",[2284],{"title":2280,"path":2281,"stem":2282},{"title":2286,"path":2287,"stem":2288,"children":2289},"Sites commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fsites","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fsites\u002Findex",[2290],{"title":2286,"path":2287,"stem":2288},{"title":2292,"path":2293,"stem":2294,"children":2295},"Skills commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fskills","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fskills\u002Findex",[2296],{"title":2292,"path":2293,"stem":2294},{"title":2298,"path":2299,"stem":2300,"children":2301},"Storage commands","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Freference\u002Fstorage","docs\u002Ftools\u002Fcommand-line\u002Freference\u002Fstorage\u002Findex",[2302],{"title":2298,"path":2299,"stem":2300},{"title":2304,"path":2305,"stem":2306,"children":2307},"Interactive shell (REPL)","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Frepl","docs\u002Ftools\u002Fcommand-line\u002Frepl\u002Findex",[2308],{"title":2304,"path":2305,"stem":2306},{"title":2310,"path":2311,"stem":2312,"children":2313},"Scaffolding","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Fscaffolding","docs\u002Ftools\u002Fcommand-line\u002Fscaffolding\u002Findex",[2314],{"title":2310,"path":2311,"stem":2312},{"title":2316,"path":2317,"stem":2318,"children":2319},"Scripting & output","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Fscripting","docs\u002Ftools\u002Fcommand-line\u002Fscripting\u002Findex",[2320],{"title":2316,"path":2317,"stem":2318},{"title":2322,"path":2323,"stem":2324,"children":2325},"Skills","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Fskills","docs\u002Ftools\u002Fcommand-line\u002Fskills\u002Findex",[2326],{"title":2322,"path":2323,"stem":2324},{"title":2328,"path":2329,"stem":2330,"children":2331},"Full-screen app (TUI)","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Ftui","docs\u002Ftools\u002Fcommand-line\u002Ftui\u002Findex",[2332],{"title":2328,"path":2329,"stem":2330},{"title":2334,"path":2335,"stem":2336,"children":2337},"Type generation","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Ftype-generation","docs\u002Ftools\u002Fcommand-line\u002Ftype-generation\u002Findex",[2338],{"title":2334,"path":2335,"stem":2336},{"title":2340,"path":2341,"stem":2342,"children":2343},"Background watchers","\u002Fdocs\u002Ftools\u002Fcommand-line\u002Fwatch","docs\u002Ftools\u002Fcommand-line\u002Fwatch\u002Findex",[2344],{"title":2340,"path":2341,"stem":2342},{"title":2346,"path":2347,"stem":2348,"children":2349},"Model Context Protocol","\u002Fdocs\u002Ftools\u002Fmcp","docs\u002Ftools\u002Fmcp\u002Findex",[2350,2351,2357,2363,2369,2375,2381,2387,2393],{"title":2346,"path":2347,"stem":2348},{"title":2352,"path":2353,"stem":2354,"children":2355},"revenexx docs MCP in Google Antigravity","\u002Fdocs\u002Ftools\u002Fmcp\u002Fantigravity","docs\u002Ftools\u002Fmcp\u002Fantigravity\u002Findex",[2356],{"title":2352,"path":2353,"stem":2354},{"title":2358,"path":2359,"stem":2360,"children":2361},"revenexx docs MCP in Claude Code","\u002Fdocs\u002Ftools\u002Fmcp\u002Fclaude-code","docs\u002Ftools\u002Fmcp\u002Fclaude-code\u002Findex",[2362],{"title":2358,"path":2359,"stem":2360},{"title":2364,"path":2365,"stem":2366,"children":2367},"revenexx docs MCP in Claude Desktop","\u002Fdocs\u002Ftools\u002Fmcp\u002Fclaude-desktop","docs\u002Ftools\u002Fmcp\u002Fclaude-desktop\u002Findex",[2368],{"title":2364,"path":2365,"stem":2366},{"title":2370,"path":2371,"stem":2372,"children":2373},"revenexx docs MCP in Cursor","\u002Fdocs\u002Ftools\u002Fmcp\u002Fcursor","docs\u002Ftools\u002Fmcp\u002Fcursor\u002Findex",[2374],{"title":2370,"path":2371,"stem":2372},{"title":2376,"path":2377,"stem":2378,"children":2379},"revenexx docs MCP in OpenCode","\u002Fdocs\u002Ftools\u002Fmcp\u002Fopencode","docs\u002Ftools\u002Fmcp\u002Fopencode\u002Findex",[2380],{"title":2376,"path":2377,"stem":2378},{"title":2382,"path":2383,"stem":2384,"children":2385},"revenexx docs MCP in VS Code","\u002Fdocs\u002Ftools\u002Fmcp\u002Fvscode","docs\u002Ftools\u002Fmcp\u002Fvscode\u002Findex",[2386],{"title":2382,"path":2383,"stem":2384},{"title":2388,"path":2389,"stem":2390,"children":2391},"revenexx docs MCP in Windsurf","\u002Fdocs\u002Ftools\u002Fmcp\u002Fwindsurf","docs\u002Ftools\u002Fmcp\u002Fwindsurf\u002Findex",[2392],{"title":2388,"path":2389,"stem":2390},{"title":2394,"path":2395,"stem":2396,"children":2397},"revenexx docs MCP in Zenflow","\u002Fdocs\u002Ftools\u002Fmcp\u002Fzenflow","docs\u002Ftools\u002Fmcp\u002Fzenflow\u002Findex",[2398],{"title":2394,"path":2395,"stem":2396},{"id":2400,"title":124,"body":2401,"description":7410,"extension":7411,"landing":7412,"links":7412,"meta":7413,"navigation":7414,"path":125,"seo":7415,"sitemap":7416,"stem":126,"__hash__":7417},"docs\u002Fdocs\u002Fguides\u002Fapps\u002Fpublish-a-business-event\u002Findex.md",{"type":2402,"value":2403,"toc":7395},"minimark",[2404,2431,2489,2494,2497,2542,2548,2552,2585,3185,3400,3404,3426,3792,3840,3844,3861,3891,3897,3901,3907,4930,4944,4953,5022,5623,5630,5646,5650,5661,5670,5690,5705,5709,5720,6035,6041,6045,6058,6803,6816,6825,6829,6857,6929,6937,6952,6965,7145,7151,7155,7158,7202,7205,7209,7219,7223,7359,7363,7391],[2405,2406,2407,2408,2412,2413,2417,2418,2421,2422,2425,2426,2430],"p",{},"Most of what an App announces takes care of itself: a row changes, and a ",[2409,2410,2411],"strong",{},"row event"," goes out. This guide is for the other kind of fact, the one no single row says: a stock transfer was ",[2414,2415,2416],"em",{},"received",", an order was ",[2414,2419,2420],{},"placed",", a payment was ",[2414,2423,2424],{},"captured",". You declare that event in the manifest, publish it from your own code with ",[2427,2428,2429],"code",{},"db.events.emit()",", and end up with a topic that a webhook, a workflow or another App can subscribe to.",[2405,2432,2433,2434,2437,2438,2441,2442,2444,2445,2448,2449,2453,2454,2458,2459,2463,2464,2467,2468,2470,2471,2441,2474,2477,2478,2481,2482,2441,2485,2488],{},"The example adds a ",[2409,2435,2436],{},"transfer"," to the Locations app from ",[2439,2440,110],"a",{"href":111}," and ",[2439,2443,103],{"href":104},": stock moves from one location to another, and receiving it publishes ",[2427,2446,2447],{},"transfer.received",". This is for developers who already have an App they deploy with the CLI. You need your ",[2439,2450,2452],{"href":2451},"\u002Fdocs\u002Fgetting-started\u002Fprerequisites#find-your-tenant-slug","tenant slug",", an API key (",[2439,2455,2457],{"href":2456},"\u002Fdocs\u002Fgetting-started\u002Fprerequisites#create-an-api-key","create an API key",") with the right scope (",[2439,2460,2462],{"href":2461},"\u002Fdocs\u002Fgetting-started\u002Fprerequisites#which-scope-covers-which-app","which scope covers which app","), ",[2427,2465,2466],{},"@revenexx\u002Fapp-sdk"," 0.8.0 or later, and the typed data client from ",[2439,2469,103],{"href":104},". The code goes in the ",[2427,2472,2473],{},"src\u002Fmain.js",[2427,2475,2476],{},"scripts\u002Fcapabilities.js"," you already have, where ",[2427,2479,2480],{},"app",", ",[2427,2483,2484],{},"db",[2427,2486,2487],{},"buildApp"," are the router, the data client and the builder from those tutorials.",[2490,2491,2493],"h2",{"id":2492},"row-event-or-business-event","Row event or business event?",[2405,2495,2496],{},"A row event is a property of a table: it fires on every insert, update or delete of that entity, from whatever path writes the row, and you write no code. A business event is a call in your code, so you decide when it fires and what it says.",[2498,2499,2500,2513],"table",{},[2501,2502,2503],"thead",{},[2504,2505,2506,2510],"tr",{},[2507,2508,2509],"th",{},"Reach for",[2507,2511,2512],{},"When",[2514,2515,2516,2527],"tbody",{},[2504,2517,2518,2524],{},[2519,2520,2521,2522],"td",{},"A ",[2409,2523,2411],{},[2519,2525,2526],{},"\"A transfer row changed\" is all a consumer needs. You want every change, including ones you did not write.",[2504,2528,2529,2539],{},[2519,2530,2521,2531,2534,2535,2538],{},[2409,2532,2533],{},"business event"," (",[2427,2536,2537],{},"trigger: \"app\"",")",[2519,2540,2541],{},"The fact spans several rows, or depends on a decision (\"only when it really changed\"), or must fire once however many rows were written.",[2405,2543,2544,2545,2547],{},"Receiving a transfer moves stock in two locations and closes one transfer row. Three row changes, one fact. That is a business event. The full field reference is ",[2439,2546,1127],{"href":1128},". This page is the walk-through.",[2490,2549,2551],{"id":2550},"_1-add-the-transfer","1. Add the transfer",[2405,2553,2554,2555,2558,2559,2562,2563,2441,2566,2569,2570,2573,2574,2576,2577,2580,2581,2584],{},"Add a ",[2427,2556,2557],{},"transfers"," entity inside ",[2427,2560,2561],{},"entities",", next to ",[2427,2564,2565],{},"locations",[2427,2567,2568],{},"stock_levels",", in ",[2427,2571,2572],{},"schema.json",", and add the ",[2427,2575,2557],{}," line to the ",[2427,2578,2579],{},"permissions"," list in ",[2427,2582,2583],{},"manifest.json",":",[2586,2587,2592],"pre",{"className":2588,"code":2589,"filename":2572,"language":2590,"meta":2591,"style":2591},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"transfers\": {\n  \"columns\": {\n    \"id\":               { \"type\": \"uuid\", \"pk\": true, \"default\": \"gen_random_uuid()\" },\n    \"from_location_id\": { \"type\": \"uuid\", \"notNull\": true, \"references\": { \"entity\": \"locations\", \"column\": \"id\" } },\n    \"to_location_id\":   { \"type\": \"uuid\", \"notNull\": true, \"references\": { \"entity\": \"locations\", \"column\": \"id\" } },\n    \"sku\":              { \"type\": \"text\", \"notNull\": true },\n    \"quantity\":         { \"type\": \"numeric(14,3)\", \"notNull\": true, \"check\": \"quantity > 0\" },\n    \"status\":           { \"type\": \"text\", \"notNull\": true, \"default\": \"'requested'\", \"check\": \"status in ('requested', 'shipped', 'received')\" },\n    \"created_at\":       { \"type\": \"timestamptz\", \"notNull\": true, \"default\": \"now()\" },\n    \"updated_at\":       { \"type\": \"timestamptz\", \"notNull\": true, \"default\": \"now()\" }\n  }\n}\n","json","",[2427,2593,2594,2615,2632,2701,2792,2877,2922,2982,3057,3116,3173,3179],{"__ignoreMap":2591},[2595,2596,2599,2603,2606,2608,2612],"span",{"class":2597,"line":2598},"line",1,[2595,2600,2602],{"class":2601},"sMK4o","\"",[2595,2604,2557],{"class":2605},"sfazB",[2595,2607,2602],{"class":2601},[2595,2609,2611],{"class":2610},"sTEyZ",": ",[2595,2613,2614],{"class":2601},"{\n",[2595,2616,2618,2621,2625,2627,2629],{"class":2597,"line":2617},2,[2595,2619,2620],{"class":2601},"  \"",[2595,2622,2624],{"class":2623},"spNyl","columns",[2595,2626,2602],{"class":2601},[2595,2628,2584],{"class":2601},[2595,2630,2631],{"class":2601}," {\n",[2595,2633,2635,2638,2642,2644,2646,2649,2652,2656,2658,2660,2662,2665,2667,2670,2672,2675,2677,2679,2682,2684,2687,2689,2691,2693,2696,2698],{"class":2597,"line":2634},3,[2595,2636,2637],{"class":2601},"    \"",[2595,2639,2641],{"class":2640},"sBMFI","id",[2595,2643,2602],{"class":2601},[2595,2645,2584],{"class":2601},[2595,2647,2648],{"class":2601},"               {",[2595,2650,2651],{"class":2601}," \"",[2595,2653,2655],{"class":2654},"sbssI","type",[2595,2657,2602],{"class":2601},[2595,2659,2584],{"class":2601},[2595,2661,2651],{"class":2601},[2595,2663,2664],{"class":2605},"uuid",[2595,2666,2602],{"class":2601},[2595,2668,2669],{"class":2601},",",[2595,2671,2651],{"class":2601},[2595,2673,2674],{"class":2654},"pk",[2595,2676,2602],{"class":2601},[2595,2678,2584],{"class":2601},[2595,2680,2681],{"class":2601}," true,",[2595,2683,2651],{"class":2601},[2595,2685,2686],{"class":2654},"default",[2595,2688,2602],{"class":2601},[2595,2690,2584],{"class":2601},[2595,2692,2651],{"class":2601},[2595,2694,2695],{"class":2605},"gen_random_uuid()",[2595,2697,2602],{"class":2601},[2595,2699,2700],{"class":2601}," },\n",[2595,2702,2704,2706,2709,2711,2713,2716,2718,2720,2722,2724,2726,2728,2730,2732,2734,2737,2739,2741,2743,2745,2748,2750,2752,2754,2756,2760,2762,2764,2766,2768,2770,2772,2774,2777,2779,2781,2783,2785,2787,2790],{"class":2597,"line":2703},4,[2595,2705,2637],{"class":2601},[2595,2707,2708],{"class":2640},"from_location_id",[2595,2710,2602],{"class":2601},[2595,2712,2584],{"class":2601},[2595,2714,2715],{"class":2601}," {",[2595,2717,2651],{"class":2601},[2595,2719,2655],{"class":2654},[2595,2721,2602],{"class":2601},[2595,2723,2584],{"class":2601},[2595,2725,2651],{"class":2601},[2595,2727,2664],{"class":2605},[2595,2729,2602],{"class":2601},[2595,2731,2669],{"class":2601},[2595,2733,2651],{"class":2601},[2595,2735,2736],{"class":2654},"notNull",[2595,2738,2602],{"class":2601},[2595,2740,2584],{"class":2601},[2595,2742,2681],{"class":2601},[2595,2744,2651],{"class":2601},[2595,2746,2747],{"class":2654},"references",[2595,2749,2602],{"class":2601},[2595,2751,2584],{"class":2601},[2595,2753,2715],{"class":2601},[2595,2755,2651],{"class":2601},[2595,2757,2759],{"class":2758},"swJcz","entity",[2595,2761,2602],{"class":2601},[2595,2763,2584],{"class":2601},[2595,2765,2651],{"class":2601},[2595,2767,2565],{"class":2605},[2595,2769,2602],{"class":2601},[2595,2771,2669],{"class":2601},[2595,2773,2651],{"class":2601},[2595,2775,2776],{"class":2758},"column",[2595,2778,2602],{"class":2601},[2595,2780,2584],{"class":2601},[2595,2782,2651],{"class":2601},[2595,2784,2641],{"class":2605},[2595,2786,2602],{"class":2601},[2595,2788,2789],{"class":2601}," }",[2595,2791,2700],{"class":2601},[2595,2793,2795,2797,2800,2802,2804,2807,2809,2811,2813,2815,2817,2819,2821,2823,2825,2827,2829,2831,2833,2835,2837,2839,2841,2843,2845,2847,2849,2851,2853,2855,2857,2859,2861,2863,2865,2867,2869,2871,2873,2875],{"class":2597,"line":2794},5,[2595,2796,2637],{"class":2601},[2595,2798,2799],{"class":2640},"to_location_id",[2595,2801,2602],{"class":2601},[2595,2803,2584],{"class":2601},[2595,2805,2806],{"class":2601},"   {",[2595,2808,2651],{"class":2601},[2595,2810,2655],{"class":2654},[2595,2812,2602],{"class":2601},[2595,2814,2584],{"class":2601},[2595,2816,2651],{"class":2601},[2595,2818,2664],{"class":2605},[2595,2820,2602],{"class":2601},[2595,2822,2669],{"class":2601},[2595,2824,2651],{"class":2601},[2595,2826,2736],{"class":2654},[2595,2828,2602],{"class":2601},[2595,2830,2584],{"class":2601},[2595,2832,2681],{"class":2601},[2595,2834,2651],{"class":2601},[2595,2836,2747],{"class":2654},[2595,2838,2602],{"class":2601},[2595,2840,2584],{"class":2601},[2595,2842,2715],{"class":2601},[2595,2844,2651],{"class":2601},[2595,2846,2759],{"class":2758},[2595,2848,2602],{"class":2601},[2595,2850,2584],{"class":2601},[2595,2852,2651],{"class":2601},[2595,2854,2565],{"class":2605},[2595,2856,2602],{"class":2601},[2595,2858,2669],{"class":2601},[2595,2860,2651],{"class":2601},[2595,2862,2776],{"class":2758},[2595,2864,2602],{"class":2601},[2595,2866,2584],{"class":2601},[2595,2868,2651],{"class":2601},[2595,2870,2641],{"class":2605},[2595,2872,2602],{"class":2601},[2595,2874,2789],{"class":2601},[2595,2876,2700],{"class":2601},[2595,2878,2880,2882,2885,2887,2889,2892,2894,2896,2898,2900,2902,2905,2907,2909,2911,2913,2915,2917,2920],{"class":2597,"line":2879},6,[2595,2881,2637],{"class":2601},[2595,2883,2884],{"class":2640},"sku",[2595,2886,2602],{"class":2601},[2595,2888,2584],{"class":2601},[2595,2890,2891],{"class":2601},"              {",[2595,2893,2651],{"class":2601},[2595,2895,2655],{"class":2654},[2595,2897,2602],{"class":2601},[2595,2899,2584],{"class":2601},[2595,2901,2651],{"class":2601},[2595,2903,2904],{"class":2605},"text",[2595,2906,2602],{"class":2601},[2595,2908,2669],{"class":2601},[2595,2910,2651],{"class":2601},[2595,2912,2736],{"class":2654},[2595,2914,2602],{"class":2601},[2595,2916,2584],{"class":2601},[2595,2918,2919],{"class":2601}," true",[2595,2921,2700],{"class":2601},[2595,2923,2925,2927,2930,2932,2934,2937,2939,2941,2943,2945,2947,2950,2952,2954,2956,2958,2960,2962,2964,2966,2969,2971,2973,2975,2978,2980],{"class":2597,"line":2924},7,[2595,2926,2637],{"class":2601},[2595,2928,2929],{"class":2640},"quantity",[2595,2931,2602],{"class":2601},[2595,2933,2584],{"class":2601},[2595,2935,2936],{"class":2601},"         {",[2595,2938,2651],{"class":2601},[2595,2940,2655],{"class":2654},[2595,2942,2602],{"class":2601},[2595,2944,2584],{"class":2601},[2595,2946,2651],{"class":2601},[2595,2948,2949],{"class":2605},"numeric(14,3)",[2595,2951,2602],{"class":2601},[2595,2953,2669],{"class":2601},[2595,2955,2651],{"class":2601},[2595,2957,2736],{"class":2654},[2595,2959,2602],{"class":2601},[2595,2961,2584],{"class":2601},[2595,2963,2681],{"class":2601},[2595,2965,2651],{"class":2601},[2595,2967,2968],{"class":2654},"check",[2595,2970,2602],{"class":2601},[2595,2972,2584],{"class":2601},[2595,2974,2651],{"class":2601},[2595,2976,2977],{"class":2605},"quantity > 0",[2595,2979,2602],{"class":2601},[2595,2981,2700],{"class":2601},[2595,2983,2985,2987,2990,2992,2994,2997,2999,3001,3003,3005,3007,3009,3011,3013,3015,3017,3019,3021,3023,3025,3027,3029,3031,3033,3036,3038,3040,3042,3044,3046,3048,3050,3053,3055],{"class":2597,"line":2984},8,[2595,2986,2637],{"class":2601},[2595,2988,2989],{"class":2640},"status",[2595,2991,2602],{"class":2601},[2595,2993,2584],{"class":2601},[2595,2995,2996],{"class":2601},"           {",[2595,2998,2651],{"class":2601},[2595,3000,2655],{"class":2654},[2595,3002,2602],{"class":2601},[2595,3004,2584],{"class":2601},[2595,3006,2651],{"class":2601},[2595,3008,2904],{"class":2605},[2595,3010,2602],{"class":2601},[2595,3012,2669],{"class":2601},[2595,3014,2651],{"class":2601},[2595,3016,2736],{"class":2654},[2595,3018,2602],{"class":2601},[2595,3020,2584],{"class":2601},[2595,3022,2681],{"class":2601},[2595,3024,2651],{"class":2601},[2595,3026,2686],{"class":2654},[2595,3028,2602],{"class":2601},[2595,3030,2584],{"class":2601},[2595,3032,2651],{"class":2601},[2595,3034,3035],{"class":2605},"'requested'",[2595,3037,2602],{"class":2601},[2595,3039,2669],{"class":2601},[2595,3041,2651],{"class":2601},[2595,3043,2968],{"class":2654},[2595,3045,2602],{"class":2601},[2595,3047,2584],{"class":2601},[2595,3049,2651],{"class":2601},[2595,3051,3052],{"class":2605},"status in ('requested', 'shipped', 'received')",[2595,3054,2602],{"class":2601},[2595,3056,2700],{"class":2601},[2595,3058,3060,3062,3065,3067,3069,3072,3074,3076,3078,3080,3082,3085,3087,3089,3091,3093,3095,3097,3099,3101,3103,3105,3107,3109,3112,3114],{"class":2597,"line":3059},9,[2595,3061,2637],{"class":2601},[2595,3063,3064],{"class":2640},"created_at",[2595,3066,2602],{"class":2601},[2595,3068,2584],{"class":2601},[2595,3070,3071],{"class":2601},"       {",[2595,3073,2651],{"class":2601},[2595,3075,2655],{"class":2654},[2595,3077,2602],{"class":2601},[2595,3079,2584],{"class":2601},[2595,3081,2651],{"class":2601},[2595,3083,3084],{"class":2605},"timestamptz",[2595,3086,2602],{"class":2601},[2595,3088,2669],{"class":2601},[2595,3090,2651],{"class":2601},[2595,3092,2736],{"class":2654},[2595,3094,2602],{"class":2601},[2595,3096,2584],{"class":2601},[2595,3098,2681],{"class":2601},[2595,3100,2651],{"class":2601},[2595,3102,2686],{"class":2654},[2595,3104,2602],{"class":2601},[2595,3106,2584],{"class":2601},[2595,3108,2651],{"class":2601},[2595,3110,3111],{"class":2605},"now()",[2595,3113,2602],{"class":2601},[2595,3115,2700],{"class":2601},[2595,3117,3119,3121,3124,3126,3128,3130,3132,3134,3136,3138,3140,3142,3144,3146,3148,3150,3152,3154,3156,3158,3160,3162,3164,3166,3168,3170],{"class":2597,"line":3118},10,[2595,3120,2637],{"class":2601},[2595,3122,3123],{"class":2640},"updated_at",[2595,3125,2602],{"class":2601},[2595,3127,2584],{"class":2601},[2595,3129,3071],{"class":2601},[2595,3131,2651],{"class":2601},[2595,3133,2655],{"class":2654},[2595,3135,2602],{"class":2601},[2595,3137,2584],{"class":2601},[2595,3139,2651],{"class":2601},[2595,3141,3084],{"class":2605},[2595,3143,2602],{"class":2601},[2595,3145,2669],{"class":2601},[2595,3147,2651],{"class":2601},[2595,3149,2736],{"class":2654},[2595,3151,2602],{"class":2601},[2595,3153,2584],{"class":2601},[2595,3155,2681],{"class":2601},[2595,3157,2651],{"class":2601},[2595,3159,2686],{"class":2654},[2595,3161,2602],{"class":2601},[2595,3163,2584],{"class":2601},[2595,3165,2651],{"class":2601},[2595,3167,3111],{"class":2605},[2595,3169,2602],{"class":2601},[2595,3171,3172],{"class":2601}," }\n",[2595,3174,3176],{"class":2597,"line":3175},11,[2595,3177,3178],{"class":2601},"  }\n",[2595,3180,3182],{"class":2597,"line":3181},12,[2595,3183,3184],{"class":2601},"}\n",[2586,3186,3188],{"className":2588,"code":3187,"filename":2583,"language":2590,"meta":2591,"style":2591},"\"permissions\": [\n  { \"entity\": \"locations\", \"access\": [\"read\", \"create\", \"update\", \"delete\"] },\n  { \"entity\": \"stock_levels\", \"access\": [\"read\", \"create\", \"update\", \"delete\"] },\n  { \"entity\": \"transfers\", \"access\": [\"read\", \"create\", \"update\"] }\n]\n",[2427,3189,3190,3203,3275,3339,3395],{"__ignoreMap":2591},[2595,3191,3192,3194,3196,3198,3200],{"class":2597,"line":2598},[2595,3193,2602],{"class":2601},[2595,3195,2579],{"class":2605},[2595,3197,2602],{"class":2601},[2595,3199,2611],{"class":2610},[2595,3201,3202],{"class":2601},"[\n",[2595,3204,3205,3208,3210,3212,3214,3216,3218,3220,3222,3224,3226,3229,3231,3233,3236,3238,3241,3243,3245,3247,3250,3252,3254,3256,3259,3261,3263,3265,3268,3270,3273],{"class":2597,"line":2617},[2595,3206,3207],{"class":2601},"  {",[2595,3209,2651],{"class":2601},[2595,3211,2759],{"class":2623},[2595,3213,2602],{"class":2601},[2595,3215,2584],{"class":2601},[2595,3217,2651],{"class":2601},[2595,3219,2565],{"class":2605},[2595,3221,2602],{"class":2601},[2595,3223,2669],{"class":2601},[2595,3225,2651],{"class":2601},[2595,3227,3228],{"class":2623},"access",[2595,3230,2602],{"class":2601},[2595,3232,2584],{"class":2601},[2595,3234,3235],{"class":2601}," [",[2595,3237,2602],{"class":2601},[2595,3239,3240],{"class":2605},"read",[2595,3242,2602],{"class":2601},[2595,3244,2669],{"class":2601},[2595,3246,2651],{"class":2601},[2595,3248,3249],{"class":2605},"create",[2595,3251,2602],{"class":2601},[2595,3253,2669],{"class":2601},[2595,3255,2651],{"class":2601},[2595,3257,3258],{"class":2605},"update",[2595,3260,2602],{"class":2601},[2595,3262,2669],{"class":2601},[2595,3264,2651],{"class":2601},[2595,3266,3267],{"class":2605},"delete",[2595,3269,2602],{"class":2601},[2595,3271,3272],{"class":2601},"]",[2595,3274,2700],{"class":2601},[2595,3276,3277,3279,3281,3283,3285,3287,3289,3291,3293,3295,3297,3299,3301,3303,3305,3307,3309,3311,3313,3315,3317,3319,3321,3323,3325,3327,3329,3331,3333,3335,3337],{"class":2597,"line":2634},[2595,3278,3207],{"class":2601},[2595,3280,2651],{"class":2601},[2595,3282,2759],{"class":2623},[2595,3284,2602],{"class":2601},[2595,3286,2584],{"class":2601},[2595,3288,2651],{"class":2601},[2595,3290,2568],{"class":2605},[2595,3292,2602],{"class":2601},[2595,3294,2669],{"class":2601},[2595,3296,2651],{"class":2601},[2595,3298,3228],{"class":2623},[2595,3300,2602],{"class":2601},[2595,3302,2584],{"class":2601},[2595,3304,3235],{"class":2601},[2595,3306,2602],{"class":2601},[2595,3308,3240],{"class":2605},[2595,3310,2602],{"class":2601},[2595,3312,2669],{"class":2601},[2595,3314,2651],{"class":2601},[2595,3316,3249],{"class":2605},[2595,3318,2602],{"class":2601},[2595,3320,2669],{"class":2601},[2595,3322,2651],{"class":2601},[2595,3324,3258],{"class":2605},[2595,3326,2602],{"class":2601},[2595,3328,2669],{"class":2601},[2595,3330,2651],{"class":2601},[2595,3332,3267],{"class":2605},[2595,3334,2602],{"class":2601},[2595,3336,3272],{"class":2601},[2595,3338,2700],{"class":2601},[2595,3340,3341,3343,3345,3347,3349,3351,3353,3355,3357,3359,3361,3363,3365,3367,3369,3371,3373,3375,3377,3379,3381,3383,3385,3387,3389,3391,3393],{"class":2597,"line":2703},[2595,3342,3207],{"class":2601},[2595,3344,2651],{"class":2601},[2595,3346,2759],{"class":2623},[2595,3348,2602],{"class":2601},[2595,3350,2584],{"class":2601},[2595,3352,2651],{"class":2601},[2595,3354,2557],{"class":2605},[2595,3356,2602],{"class":2601},[2595,3358,2669],{"class":2601},[2595,3360,2651],{"class":2601},[2595,3362,3228],{"class":2623},[2595,3364,2602],{"class":2601},[2595,3366,2584],{"class":2601},[2595,3368,3235],{"class":2601},[2595,3370,2602],{"class":2601},[2595,3372,3240],{"class":2605},[2595,3374,2602],{"class":2601},[2595,3376,2669],{"class":2601},[2595,3378,2651],{"class":2601},[2595,3380,3249],{"class":2605},[2595,3382,2602],{"class":2601},[2595,3384,2669],{"class":2601},[2595,3386,2651],{"class":2601},[2595,3388,3258],{"class":2605},[2595,3390,2602],{"class":2601},[2595,3392,3272],{"class":2601},[2595,3394,3172],{"class":2601},[2595,3396,3397],{"class":2597,"line":2794},[2595,3398,3399],{"class":2601},"]\n",[2490,3401,3403],{"id":3402},"_2-declare-the-event","2. Declare the event",[2405,3405,3406,3407,3410,3411,3414,3415,3417,3418,3421,3422,3425],{},"Every event your App emits is declared in the manifest first. Add this object to the ",[2427,3408,3409],{},"emits"," array under ",[2427,3412,3413],{},"events"," in ",[2427,3416,2583],{},". If the array is not there yet, create it next to ",[2427,3419,3420],{},"listens",", and keep any entries it already has (the scaffold declares ",[2427,3423,3424],{},"location.created",", a row event):",[2586,3427,3429],{"className":2588,"code":3428,"filename":2583,"language":2590,"meta":2591,"style":2591},"{\n  \"name\": \"transfer.received\",\n  \"trigger\": \"app\",\n  \"data_schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"transfer_id\": { \"type\": \"string\" },\n      \"from_location_id\": { \"type\": \"string\" },\n      \"to_location_id\": { \"type\": \"string\" },\n      \"sku\": { \"type\": \"string\" },\n      \"quantity\": { \"type\": \"number\" }\n    }\n  },\n  \"sample\": {\n    \"transfer_id\": \"7f3a9c1e-0000-4000-8000-000000000001\",\n    \"from_location_id\": \"7f3a9c1e-0000-4000-8000-0000000000a1\",\n    \"to_location_id\": \"7f3a9c1e-0000-4000-8000-0000000000b2\",\n    \"sku\": \"WIDGET-1\",\n    \"quantity\": 12\n  }\n}\n",[2427,3430,3431,3435,3455,3474,3487,3506,3519,3550,3578,3606,3634,3663,3668,3674,3688,3708,3728,3748,3768,3782,3787],{"__ignoreMap":2591},[2595,3432,3433],{"class":2597,"line":2598},[2595,3434,2614],{"class":2601},[2595,3436,3437,3439,3442,3444,3446,3448,3450,3452],{"class":2597,"line":2617},[2595,3438,2620],{"class":2601},[2595,3440,3441],{"class":2623},"name",[2595,3443,2602],{"class":2601},[2595,3445,2584],{"class":2601},[2595,3447,2651],{"class":2601},[2595,3449,2447],{"class":2605},[2595,3451,2602],{"class":2601},[2595,3453,3454],{"class":2601},",\n",[2595,3456,3457,3459,3462,3464,3466,3468,3470,3472],{"class":2597,"line":2634},[2595,3458,2620],{"class":2601},[2595,3460,3461],{"class":2623},"trigger",[2595,3463,2602],{"class":2601},[2595,3465,2584],{"class":2601},[2595,3467,2651],{"class":2601},[2595,3469,2480],{"class":2605},[2595,3471,2602],{"class":2601},[2595,3473,3454],{"class":2601},[2595,3475,3476,3478,3481,3483,3485],{"class":2597,"line":2703},[2595,3477,2620],{"class":2601},[2595,3479,3480],{"class":2623},"data_schema",[2595,3482,2602],{"class":2601},[2595,3484,2584],{"class":2601},[2595,3486,2631],{"class":2601},[2595,3488,3489,3491,3493,3495,3497,3499,3502,3504],{"class":2597,"line":2794},[2595,3490,2637],{"class":2601},[2595,3492,2655],{"class":2640},[2595,3494,2602],{"class":2601},[2595,3496,2584],{"class":2601},[2595,3498,2651],{"class":2601},[2595,3500,3501],{"class":2605},"object",[2595,3503,2602],{"class":2601},[2595,3505,3454],{"class":2601},[2595,3507,3508,3510,3513,3515,3517],{"class":2597,"line":2879},[2595,3509,2637],{"class":2601},[2595,3511,3512],{"class":2640},"properties",[2595,3514,2602],{"class":2601},[2595,3516,2584],{"class":2601},[2595,3518,2631],{"class":2601},[2595,3520,3521,3524,3527,3529,3531,3533,3535,3537,3539,3541,3543,3546,3548],{"class":2597,"line":2924},[2595,3522,3523],{"class":2601},"      \"",[2595,3525,3526],{"class":2654},"transfer_id",[2595,3528,2602],{"class":2601},[2595,3530,2584],{"class":2601},[2595,3532,2715],{"class":2601},[2595,3534,2651],{"class":2601},[2595,3536,2655],{"class":2758},[2595,3538,2602],{"class":2601},[2595,3540,2584],{"class":2601},[2595,3542,2651],{"class":2601},[2595,3544,3545],{"class":2605},"string",[2595,3547,2602],{"class":2601},[2595,3549,2700],{"class":2601},[2595,3551,3552,3554,3556,3558,3560,3562,3564,3566,3568,3570,3572,3574,3576],{"class":2597,"line":2984},[2595,3553,3523],{"class":2601},[2595,3555,2708],{"class":2654},[2595,3557,2602],{"class":2601},[2595,3559,2584],{"class":2601},[2595,3561,2715],{"class":2601},[2595,3563,2651],{"class":2601},[2595,3565,2655],{"class":2758},[2595,3567,2602],{"class":2601},[2595,3569,2584],{"class":2601},[2595,3571,2651],{"class":2601},[2595,3573,3545],{"class":2605},[2595,3575,2602],{"class":2601},[2595,3577,2700],{"class":2601},[2595,3579,3580,3582,3584,3586,3588,3590,3592,3594,3596,3598,3600,3602,3604],{"class":2597,"line":3059},[2595,3581,3523],{"class":2601},[2595,3583,2799],{"class":2654},[2595,3585,2602],{"class":2601},[2595,3587,2584],{"class":2601},[2595,3589,2715],{"class":2601},[2595,3591,2651],{"class":2601},[2595,3593,2655],{"class":2758},[2595,3595,2602],{"class":2601},[2595,3597,2584],{"class":2601},[2595,3599,2651],{"class":2601},[2595,3601,3545],{"class":2605},[2595,3603,2602],{"class":2601},[2595,3605,2700],{"class":2601},[2595,3607,3608,3610,3612,3614,3616,3618,3620,3622,3624,3626,3628,3630,3632],{"class":2597,"line":3118},[2595,3609,3523],{"class":2601},[2595,3611,2884],{"class":2654},[2595,3613,2602],{"class":2601},[2595,3615,2584],{"class":2601},[2595,3617,2715],{"class":2601},[2595,3619,2651],{"class":2601},[2595,3621,2655],{"class":2758},[2595,3623,2602],{"class":2601},[2595,3625,2584],{"class":2601},[2595,3627,2651],{"class":2601},[2595,3629,3545],{"class":2605},[2595,3631,2602],{"class":2601},[2595,3633,2700],{"class":2601},[2595,3635,3636,3638,3640,3642,3644,3646,3648,3650,3652,3654,3656,3659,3661],{"class":2597,"line":3175},[2595,3637,3523],{"class":2601},[2595,3639,2929],{"class":2654},[2595,3641,2602],{"class":2601},[2595,3643,2584],{"class":2601},[2595,3645,2715],{"class":2601},[2595,3647,2651],{"class":2601},[2595,3649,2655],{"class":2758},[2595,3651,2602],{"class":2601},[2595,3653,2584],{"class":2601},[2595,3655,2651],{"class":2601},[2595,3657,3658],{"class":2605},"number",[2595,3660,2602],{"class":2601},[2595,3662,3172],{"class":2601},[2595,3664,3665],{"class":2597,"line":3181},[2595,3666,3667],{"class":2601},"    }\n",[2595,3669,3671],{"class":2597,"line":3670},13,[2595,3672,3673],{"class":2601},"  },\n",[2595,3675,3677,3679,3682,3684,3686],{"class":2597,"line":3676},14,[2595,3678,2620],{"class":2601},[2595,3680,3681],{"class":2623},"sample",[2595,3683,2602],{"class":2601},[2595,3685,2584],{"class":2601},[2595,3687,2631],{"class":2601},[2595,3689,3691,3693,3695,3697,3699,3701,3704,3706],{"class":2597,"line":3690},15,[2595,3692,2637],{"class":2601},[2595,3694,3526],{"class":2640},[2595,3696,2602],{"class":2601},[2595,3698,2584],{"class":2601},[2595,3700,2651],{"class":2601},[2595,3702,3703],{"class":2605},"7f3a9c1e-0000-4000-8000-000000000001",[2595,3705,2602],{"class":2601},[2595,3707,3454],{"class":2601},[2595,3709,3711,3713,3715,3717,3719,3721,3724,3726],{"class":2597,"line":3710},16,[2595,3712,2637],{"class":2601},[2595,3714,2708],{"class":2640},[2595,3716,2602],{"class":2601},[2595,3718,2584],{"class":2601},[2595,3720,2651],{"class":2601},[2595,3722,3723],{"class":2605},"7f3a9c1e-0000-4000-8000-0000000000a1",[2595,3725,2602],{"class":2601},[2595,3727,3454],{"class":2601},[2595,3729,3731,3733,3735,3737,3739,3741,3744,3746],{"class":2597,"line":3730},17,[2595,3732,2637],{"class":2601},[2595,3734,2799],{"class":2640},[2595,3736,2602],{"class":2601},[2595,3738,2584],{"class":2601},[2595,3740,2651],{"class":2601},[2595,3742,3743],{"class":2605},"7f3a9c1e-0000-4000-8000-0000000000b2",[2595,3745,2602],{"class":2601},[2595,3747,3454],{"class":2601},[2595,3749,3751,3753,3755,3757,3759,3761,3764,3766],{"class":2597,"line":3750},18,[2595,3752,2637],{"class":2601},[2595,3754,2884],{"class":2640},[2595,3756,2602],{"class":2601},[2595,3758,2584],{"class":2601},[2595,3760,2651],{"class":2601},[2595,3762,3763],{"class":2605},"WIDGET-1",[2595,3765,2602],{"class":2601},[2595,3767,3454],{"class":2601},[2595,3769,3771,3773,3775,3777,3779],{"class":2597,"line":3770},19,[2595,3772,2637],{"class":2601},[2595,3774,2929],{"class":2640},[2595,3776,2602],{"class":2601},[2595,3778,2584],{"class":2601},[2595,3780,3781],{"class":2654}," 12\n",[2595,3783,3785],{"class":2597,"line":3784},20,[2595,3786,3178],{"class":2601},[2595,3788,3790],{"class":2597,"line":3789},21,[2595,3791,3184],{"class":2601},[3793,3794,3795,3815,3832],"ul",{},[3796,3797,3798,2481,3801,3804,3805,3807,3808,3811,3812,3814],"li",{},[2409,3799,3800],{},"The name is exactly two segments",[2427,3802,3803],{},"\u003Centity>.\u003Caction>",", lowercase. ",[2427,3806,2447],{}," is valid. ",[2427,3809,3810],{},"stock.transfer.received"," (three segments) and ",[2427,3813,2416],{}," (one) are refused.",[3796,3816,3817,3822,3823,2481,3825,2441,3828,3831],{},[2409,3818,3819,3821],{},[2427,3820,3681],{}," is required"," on an app-fired event, and ",[2427,3824,2759],{},[2427,3826,3827],{},"on",[2427,3829,3830],{},"payload"," are refused on one. There is no row to derive a payload from, so the sample is what catalogs show and test runs prefill.",[3796,3833,3834,3839],{},[2409,3835,3836,3838],{},[2427,3837,3480],{}," is optional and worth writing."," It is what a consumer builds against, so describe the payload you actually send, and keep personal or bulky data out of it.",[2490,3841,3843],{"id":3842},"_3-regenerate-the-client","3. Regenerate the client",[2405,3845,3846,3849,3850,3853,3854,3857,3858,3860],{},[2427,3847,3848],{},"db.events"," exists only for events you declared. A project from an older tutorial, or one scaffolded by ",[2427,3851,3852],{},"revenexx create app",", may still pin ",[2427,3855,3856],{},"^0.4",", and ",[2427,3859,3848],{}," arrives in 0.8.0, so make sure you are on it. Then regenerate the typed client:",[2586,3862,3867],{"className":3863,"code":3864,"filename":3865,"language":3866,"meta":2591,"style":2591},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npm install @revenexx\u002Fapp-sdk@^0.8.0\nrevenexx apps generate\n","Upgrade and regenerate","bash",[2427,3868,3869,3880],{"__ignoreMap":2591},[2595,3870,3871,3874,3877],{"class":2597,"line":2598},[2595,3872,3873],{"class":2640},"npm",[2595,3875,3876],{"class":2605}," install",[2595,3878,3879],{"class":2605}," @revenexx\u002Fapp-sdk@^0.8.0\n",[2595,3881,3882,3885,3888],{"class":2597,"line":2617},[2595,3883,3884],{"class":2640},"revenexx",[2595,3886,3887],{"class":2605}," apps",[2595,3889,3890],{"class":2605}," generate\n",[2405,3892,3893,3894,3896],{},"Without this step ",[2427,3895,3848],{}," is undefined. It is also undefined when the SDK is older than 0.8.0, and when no app-fired event is declared at all.",[2490,3898,3900],{"id":3899},"_4-publish-after-the-write","4. Publish after the write",[2405,3902,3903,3904],{},"Add the route. The rule it follows: ",[2409,3905,3906],{},"the event is a claim that something happened, so make it after the change it describes is stored.",[2586,3908,3912],{"className":3909,"code":3910,"filename":2473,"language":3911,"meta":2591,"style":2591},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Extend the router require you already have with notFound and conflict:\nconst { createApp, mountCrud, badRequest, notFound, conflict } = require('@revenexx\u002Fapp-sdk\u002Frouter');\n\nasync function receiveTransfer(db, transferId) {\n  const transfer = await db.transfers.get(transferId);\n  if (!transfer) throw notFound('transfer not found');\n  if (transfer.status === 'requested') throw conflict('the transfer has not shipped yet');\n\n  if (transfer.status === 'shipped') {\n    \u002F\u002F Move the stock between the two locations' stock_levels rows here\n    \u002F\u002F (your own logic, not shown), then close the transfer.\n    await db.transfers.update(transfer.id, { status: 'received' });\n  }\n\n  await db.events.emit('transfer.received', {\n    transfer_id: transfer.id,\n    from_location_id: transfer.from_location_id,\n    to_location_id: transfer.to_location_id,\n    sku: transfer.sku,\n    quantity: Number(transfer.quantity),\n  }, {\n    topicId: transfer.id,\n    id: `evt_transfer_received_${transfer.id}`,\n  });\n\n  return { ...transfer, status: 'received' };\n}\n\n\u002F\u002F Inside buildApp(db), after the existing mountCrud calls:\napp.post('\u002Flocations\u002Ftransfers', async (c) => {\n  const b = c.body ?? {};\n  for (const key of ['from_location_id', 'to_location_id', 'sku']) {\n    if (!b[key]) throw badRequest(`'${key}' is required`);\n  }\n  const quantity = Number(b.quantity);\n  if (!(quantity > 0)) throw badRequest(\"'quantity' must be greater than 0\");\n  const transfer = await db.transfers.create({\n    from_location_id: b.from_location_id, to_location_id: b.to_location_id, sku: b.sku, quantity, status: 'shipped',\n  });\n  return c.json(transfer, 201);\n});\n\napp.post('\u002Flocations\u002Ftransfers\u002Freceive', async (c) => {\n  const transferId = c.body?.transfer_id;\n  if (!transferId) throw badRequest(\"'transfer_id' is required\");\n  return c.json(await receiveTransfer(db, transferId));\n});\n\n\u002F\u002F At the bottom, below the existing `module.exports.buildApp = buildApp;`:\nmodule.exports.receiveTransfer = receiveTransfer;\n","js",[2427,3913,3914,3920,3976,3982,4007,4043,4076,4119,4123,4148,4153,4158,4202,4206,4210,4238,4253,4268,4283,4298,4320,4327,4343,4371,4381,4386,4414,4419,4424,4430,4466,4490,4535,4582,4587,4611,4650,4675,4732,4741,4765,4774,4779,4811,4833,4863,4894,4903,4908,4914],{"__ignoreMap":2591},[2595,3915,3916],{"class":2597,"line":2598},[2595,3917,3919],{"class":3918},"sHwdD","\u002F\u002F Extend the router require you already have with notFound and conflict:\n",[2595,3921,3922,3925,3927,3930,3932,3935,3937,3940,3942,3945,3947,3950,3953,3956,3960,3963,3966,3969,3971,3973],{"class":2597,"line":2617},[2595,3923,3924],{"class":2623},"const",[2595,3926,2715],{"class":2601},[2595,3928,3929],{"class":2610}," createApp",[2595,3931,2669],{"class":2601},[2595,3933,3934],{"class":2610}," mountCrud",[2595,3936,2669],{"class":2601},[2595,3938,3939],{"class":2610}," badRequest",[2595,3941,2669],{"class":2601},[2595,3943,3944],{"class":2610}," notFound",[2595,3946,2669],{"class":2601},[2595,3948,3949],{"class":2610}," conflict ",[2595,3951,3952],{"class":2601},"}",[2595,3954,3955],{"class":2601}," =",[2595,3957,3959],{"class":3958},"s2Zo4"," require",[2595,3961,3962],{"class":2610},"(",[2595,3964,3965],{"class":2601},"'",[2595,3967,3968],{"class":2605},"@revenexx\u002Fapp-sdk\u002Frouter",[2595,3970,3965],{"class":2601},[2595,3972,2538],{"class":2610},[2595,3974,3975],{"class":2601},";\n",[2595,3977,3978],{"class":2597,"line":2634},[2595,3979,3981],{"emptyLinePlaceholder":3980},true,"\n",[2595,3983,3984,3987,3990,3993,3995,3998,4000,4003,4005],{"class":2597,"line":2703},[2595,3985,3986],{"class":2623},"async",[2595,3988,3989],{"class":2623}," function",[2595,3991,3992],{"class":3958}," receiveTransfer",[2595,3994,3962],{"class":2601},[2595,3996,2484],{"class":3997},"sHdIc",[2595,3999,2669],{"class":2601},[2595,4001,4002],{"class":3997}," transferId",[2595,4004,2538],{"class":2601},[2595,4006,2631],{"class":2601},[2595,4008,4009,4012,4015,4017,4021,4024,4027,4029,4031,4034,4036,4039,4041],{"class":2597,"line":2794},[2595,4010,4011],{"class":2623},"  const",[2595,4013,4014],{"class":2610}," transfer",[2595,4016,3955],{"class":2601},[2595,4018,4020],{"class":4019},"s7zQu"," await",[2595,4022,4023],{"class":2610}," db",[2595,4025,4026],{"class":2601},".",[2595,4028,2557],{"class":2610},[2595,4030,4026],{"class":2601},[2595,4032,4033],{"class":3958},"get",[2595,4035,3962],{"class":2758},[2595,4037,4038],{"class":2610},"transferId",[2595,4040,2538],{"class":2758},[2595,4042,3975],{"class":2601},[2595,4044,4045,4048,4050,4053,4055,4058,4061,4063,4065,4067,4070,4072,4074],{"class":2597,"line":2879},[2595,4046,4047],{"class":4019},"  if",[2595,4049,2534],{"class":2758},[2595,4051,4052],{"class":2601},"!",[2595,4054,2436],{"class":2610},[2595,4056,4057],{"class":2758},") ",[2595,4059,4060],{"class":4019},"throw",[2595,4062,3944],{"class":3958},[2595,4064,3962],{"class":2758},[2595,4066,3965],{"class":2601},[2595,4068,4069],{"class":2605},"transfer not found",[2595,4071,3965],{"class":2601},[2595,4073,2538],{"class":2758},[2595,4075,3975],{"class":2601},[2595,4077,4078,4080,4082,4084,4086,4088,4091,4094,4097,4099,4101,4103,4106,4108,4110,4113,4115,4117],{"class":2597,"line":2924},[2595,4079,4047],{"class":4019},[2595,4081,2534],{"class":2758},[2595,4083,2436],{"class":2610},[2595,4085,4026],{"class":2601},[2595,4087,2989],{"class":2610},[2595,4089,4090],{"class":2601}," ===",[2595,4092,4093],{"class":2601}," '",[2595,4095,4096],{"class":2605},"requested",[2595,4098,3965],{"class":2601},[2595,4100,4057],{"class":2758},[2595,4102,4060],{"class":4019},[2595,4104,4105],{"class":3958}," conflict",[2595,4107,3962],{"class":2758},[2595,4109,3965],{"class":2601},[2595,4111,4112],{"class":2605},"the transfer has not shipped yet",[2595,4114,3965],{"class":2601},[2595,4116,2538],{"class":2758},[2595,4118,3975],{"class":2601},[2595,4120,4121],{"class":2597,"line":2984},[2595,4122,3981],{"emptyLinePlaceholder":3980},[2595,4124,4125,4127,4129,4131,4133,4135,4137,4139,4142,4144,4146],{"class":2597,"line":3059},[2595,4126,4047],{"class":4019},[2595,4128,2534],{"class":2758},[2595,4130,2436],{"class":2610},[2595,4132,4026],{"class":2601},[2595,4134,2989],{"class":2610},[2595,4136,4090],{"class":2601},[2595,4138,4093],{"class":2601},[2595,4140,4141],{"class":2605},"shipped",[2595,4143,3965],{"class":2601},[2595,4145,4057],{"class":2758},[2595,4147,2614],{"class":2601},[2595,4149,4150],{"class":2597,"line":3118},[2595,4151,4152],{"class":3918},"    \u002F\u002F Move the stock between the two locations' stock_levels rows here\n",[2595,4154,4155],{"class":2597,"line":3175},[2595,4156,4157],{"class":3918},"    \u002F\u002F (your own logic, not shown), then close the transfer.\n",[2595,4159,4160,4163,4165,4167,4169,4171,4173,4175,4177,4179,4181,4183,4185,4188,4190,4192,4194,4196,4198,4200],{"class":2597,"line":3181},[2595,4161,4162],{"class":4019},"    await",[2595,4164,4023],{"class":2610},[2595,4166,4026],{"class":2601},[2595,4168,2557],{"class":2610},[2595,4170,4026],{"class":2601},[2595,4172,3258],{"class":3958},[2595,4174,3962],{"class":2758},[2595,4176,2436],{"class":2610},[2595,4178,4026],{"class":2601},[2595,4180,2641],{"class":2610},[2595,4182,2669],{"class":2601},[2595,4184,2715],{"class":2601},[2595,4186,4187],{"class":2758}," status",[2595,4189,2584],{"class":2601},[2595,4191,4093],{"class":2601},[2595,4193,2416],{"class":2605},[2595,4195,3965],{"class":2601},[2595,4197,2789],{"class":2601},[2595,4199,2538],{"class":2758},[2595,4201,3975],{"class":2601},[2595,4203,4204],{"class":2597,"line":3670},[2595,4205,3178],{"class":2601},[2595,4207,4208],{"class":2597,"line":3676},[2595,4209,3981],{"emptyLinePlaceholder":3980},[2595,4211,4212,4215,4217,4219,4221,4223,4226,4228,4230,4232,4234,4236],{"class":2597,"line":3690},[2595,4213,4214],{"class":4019},"  await",[2595,4216,4023],{"class":2610},[2595,4218,4026],{"class":2601},[2595,4220,3413],{"class":2610},[2595,4222,4026],{"class":2601},[2595,4224,4225],{"class":3958},"emit",[2595,4227,3962],{"class":2758},[2595,4229,3965],{"class":2601},[2595,4231,2447],{"class":2605},[2595,4233,3965],{"class":2601},[2595,4235,2669],{"class":2601},[2595,4237,2631],{"class":2601},[2595,4239,4240,4243,4245,4247,4249,4251],{"class":2597,"line":3710},[2595,4241,4242],{"class":2758},"    transfer_id",[2595,4244,2584],{"class":2601},[2595,4246,4014],{"class":2610},[2595,4248,4026],{"class":2601},[2595,4250,2641],{"class":2610},[2595,4252,3454],{"class":2601},[2595,4254,4255,4258,4260,4262,4264,4266],{"class":2597,"line":3730},[2595,4256,4257],{"class":2758},"    from_location_id",[2595,4259,2584],{"class":2601},[2595,4261,4014],{"class":2610},[2595,4263,4026],{"class":2601},[2595,4265,2708],{"class":2610},[2595,4267,3454],{"class":2601},[2595,4269,4270,4273,4275,4277,4279,4281],{"class":2597,"line":3750},[2595,4271,4272],{"class":2758},"    to_location_id",[2595,4274,2584],{"class":2601},[2595,4276,4014],{"class":2610},[2595,4278,4026],{"class":2601},[2595,4280,2799],{"class":2610},[2595,4282,3454],{"class":2601},[2595,4284,4285,4288,4290,4292,4294,4296],{"class":2597,"line":3770},[2595,4286,4287],{"class":2758},"    sku",[2595,4289,2584],{"class":2601},[2595,4291,4014],{"class":2610},[2595,4293,4026],{"class":2601},[2595,4295,2884],{"class":2610},[2595,4297,3454],{"class":2601},[2595,4299,4300,4303,4305,4308,4310,4312,4314,4316,4318],{"class":2597,"line":3784},[2595,4301,4302],{"class":2758},"    quantity",[2595,4304,2584],{"class":2601},[2595,4306,4307],{"class":3958}," Number",[2595,4309,3962],{"class":2758},[2595,4311,2436],{"class":2610},[2595,4313,4026],{"class":2601},[2595,4315,2929],{"class":2610},[2595,4317,2538],{"class":2758},[2595,4319,3454],{"class":2601},[2595,4321,4322,4325],{"class":2597,"line":3789},[2595,4323,4324],{"class":2601},"  },",[2595,4326,2631],{"class":2601},[2595,4328,4330,4333,4335,4337,4339,4341],{"class":2597,"line":4329},22,[2595,4331,4332],{"class":2758},"    topicId",[2595,4334,2584],{"class":2601},[2595,4336,4014],{"class":2610},[2595,4338,4026],{"class":2601},[2595,4340,2641],{"class":2610},[2595,4342,3454],{"class":2601},[2595,4344,4346,4349,4351,4354,4357,4360,4362,4364,4366,4369],{"class":2597,"line":4345},23,[2595,4347,4348],{"class":2758},"    id",[2595,4350,2584],{"class":2601},[2595,4352,4353],{"class":2601}," `",[2595,4355,4356],{"class":2605},"evt_transfer_received_",[2595,4358,4359],{"class":2601},"${",[2595,4361,2436],{"class":2610},[2595,4363,4026],{"class":2601},[2595,4365,2641],{"class":2610},[2595,4367,4368],{"class":2601},"}`",[2595,4370,3454],{"class":2601},[2595,4372,4374,4377,4379],{"class":2597,"line":4373},24,[2595,4375,4376],{"class":2601},"  }",[2595,4378,2538],{"class":2758},[2595,4380,3975],{"class":2601},[2595,4382,4384],{"class":2597,"line":4383},25,[2595,4385,3981],{"emptyLinePlaceholder":3980},[2595,4387,4389,4392,4394,4397,4399,4401,4403,4405,4407,4409,4411],{"class":2597,"line":4388},26,[2595,4390,4391],{"class":4019},"  return",[2595,4393,2715],{"class":2601},[2595,4395,4396],{"class":2601}," ...",[2595,4398,2436],{"class":2610},[2595,4400,2669],{"class":2601},[2595,4402,4187],{"class":2758},[2595,4404,2584],{"class":2601},[2595,4406,4093],{"class":2601},[2595,4408,2416],{"class":2605},[2595,4410,3965],{"class":2601},[2595,4412,4413],{"class":2601}," };\n",[2595,4415,4417],{"class":2597,"line":4416},27,[2595,4418,3184],{"class":2601},[2595,4420,4422],{"class":2597,"line":4421},28,[2595,4423,3981],{"emptyLinePlaceholder":3980},[2595,4425,4427],{"class":2597,"line":4426},29,[2595,4428,4429],{"class":3918},"\u002F\u002F Inside buildApp(db), after the existing mountCrud calls:\n",[2595,4431,4433,4435,4437,4440,4442,4444,4447,4449,4451,4454,4456,4459,4461,4464],{"class":2597,"line":4432},30,[2595,4434,2480],{"class":2610},[2595,4436,4026],{"class":2601},[2595,4438,4439],{"class":3958},"post",[2595,4441,3962],{"class":2610},[2595,4443,3965],{"class":2601},[2595,4445,4446],{"class":2605},"\u002Flocations\u002Ftransfers",[2595,4448,3965],{"class":2601},[2595,4450,2669],{"class":2601},[2595,4452,4453],{"class":2623}," async",[2595,4455,2534],{"class":2601},[2595,4457,4458],{"class":3997},"c",[2595,4460,2538],{"class":2601},[2595,4462,4463],{"class":2623}," =>",[2595,4465,2631],{"class":2601},[2595,4467,4469,4471,4474,4476,4479,4481,4484,4487],{"class":2597,"line":4468},31,[2595,4470,4011],{"class":2623},[2595,4472,4473],{"class":2610}," b",[2595,4475,3955],{"class":2601},[2595,4477,4478],{"class":2610}," c",[2595,4480,4026],{"class":2601},[2595,4482,4483],{"class":2610},"body",[2595,4485,4486],{"class":2601}," ??",[2595,4488,4489],{"class":2601}," {};\n",[2595,4491,4493,4496,4498,4500,4503,4506,4508,4510,4512,4514,4516,4518,4520,4522,4524,4526,4528,4530,4533],{"class":2597,"line":4492},32,[2595,4494,4495],{"class":4019},"  for",[2595,4497,2534],{"class":2758},[2595,4499,3924],{"class":2623},[2595,4501,4502],{"class":2610}," key",[2595,4504,4505],{"class":2601}," of",[2595,4507,3235],{"class":2758},[2595,4509,3965],{"class":2601},[2595,4511,2708],{"class":2605},[2595,4513,3965],{"class":2601},[2595,4515,2669],{"class":2601},[2595,4517,4093],{"class":2601},[2595,4519,2799],{"class":2605},[2595,4521,3965],{"class":2601},[2595,4523,2669],{"class":2601},[2595,4525,4093],{"class":2601},[2595,4527,2884],{"class":2605},[2595,4529,3965],{"class":2601},[2595,4531,4532],{"class":2758},"]) ",[2595,4534,2614],{"class":2601},[2595,4536,4538,4541,4543,4545,4548,4551,4554,4556,4558,4560,4562,4565,4567,4569,4571,4573,4576,4578,4580],{"class":2597,"line":4537},33,[2595,4539,4540],{"class":4019},"    if",[2595,4542,2534],{"class":2758},[2595,4544,4052],{"class":2601},[2595,4546,4547],{"class":2610},"b",[2595,4549,4550],{"class":2758},"[",[2595,4552,4553],{"class":2610},"key",[2595,4555,4532],{"class":2758},[2595,4557,4060],{"class":4019},[2595,4559,3939],{"class":3958},[2595,4561,3962],{"class":2758},[2595,4563,4564],{"class":2601},"`",[2595,4566,3965],{"class":2605},[2595,4568,4359],{"class":2601},[2595,4570,4553],{"class":2610},[2595,4572,3952],{"class":2601},[2595,4574,4575],{"class":2605},"' is required",[2595,4577,4564],{"class":2601},[2595,4579,2538],{"class":2758},[2595,4581,3975],{"class":2601},[2595,4583,4585],{"class":2597,"line":4584},34,[2595,4586,3178],{"class":2601},[2595,4588,4590,4592,4595,4597,4599,4601,4603,4605,4607,4609],{"class":2597,"line":4589},35,[2595,4591,4011],{"class":2623},[2595,4593,4594],{"class":2610}," quantity",[2595,4596,3955],{"class":2601},[2595,4598,4307],{"class":3958},[2595,4600,3962],{"class":2758},[2595,4602,4547],{"class":2610},[2595,4604,4026],{"class":2601},[2595,4606,2929],{"class":2610},[2595,4608,2538],{"class":2758},[2595,4610,3975],{"class":2601},[2595,4612,4614,4616,4618,4620,4622,4624,4627,4630,4633,4635,4637,4639,4641,4644,4646,4648],{"class":2597,"line":4613},36,[2595,4615,4047],{"class":4019},[2595,4617,2534],{"class":2758},[2595,4619,4052],{"class":2601},[2595,4621,3962],{"class":2758},[2595,4623,2929],{"class":2610},[2595,4625,4626],{"class":2601}," >",[2595,4628,4629],{"class":2654}," 0",[2595,4631,4632],{"class":2758},")) ",[2595,4634,4060],{"class":4019},[2595,4636,3939],{"class":3958},[2595,4638,3962],{"class":2758},[2595,4640,2602],{"class":2601},[2595,4642,4643],{"class":2605},"'quantity' must be greater than 0",[2595,4645,2602],{"class":2601},[2595,4647,2538],{"class":2758},[2595,4649,3975],{"class":2601},[2595,4651,4653,4655,4657,4659,4661,4663,4665,4667,4669,4671,4673],{"class":2597,"line":4652},37,[2595,4654,4011],{"class":2623},[2595,4656,4014],{"class":2610},[2595,4658,3955],{"class":2601},[2595,4660,4020],{"class":4019},[2595,4662,4023],{"class":2610},[2595,4664,4026],{"class":2601},[2595,4666,2557],{"class":2610},[2595,4668,4026],{"class":2601},[2595,4670,3249],{"class":3958},[2595,4672,3962],{"class":2758},[2595,4674,2614],{"class":2601},[2595,4676,4678,4680,4682,4684,4686,4688,4690,4693,4695,4697,4699,4701,4703,4706,4708,4710,4712,4714,4716,4718,4720,4722,4724,4726,4728,4730],{"class":2597,"line":4677},38,[2595,4679,4257],{"class":2758},[2595,4681,2584],{"class":2601},[2595,4683,4473],{"class":2610},[2595,4685,4026],{"class":2601},[2595,4687,2708],{"class":2610},[2595,4689,2669],{"class":2601},[2595,4691,4692],{"class":2758}," to_location_id",[2595,4694,2584],{"class":2601},[2595,4696,4473],{"class":2610},[2595,4698,4026],{"class":2601},[2595,4700,2799],{"class":2610},[2595,4702,2669],{"class":2601},[2595,4704,4705],{"class":2758}," sku",[2595,4707,2584],{"class":2601},[2595,4709,4473],{"class":2610},[2595,4711,4026],{"class":2601},[2595,4713,2884],{"class":2610},[2595,4715,2669],{"class":2601},[2595,4717,4594],{"class":2610},[2595,4719,2669],{"class":2601},[2595,4721,4187],{"class":2758},[2595,4723,2584],{"class":2601},[2595,4725,4093],{"class":2601},[2595,4727,4141],{"class":2605},[2595,4729,3965],{"class":2601},[2595,4731,3454],{"class":2601},[2595,4733,4735,4737,4739],{"class":2597,"line":4734},39,[2595,4736,4376],{"class":2601},[2595,4738,2538],{"class":2758},[2595,4740,3975],{"class":2601},[2595,4742,4744,4746,4748,4750,4752,4754,4756,4758,4761,4763],{"class":2597,"line":4743},40,[2595,4745,4391],{"class":4019},[2595,4747,4478],{"class":2610},[2595,4749,4026],{"class":2601},[2595,4751,2590],{"class":3958},[2595,4753,3962],{"class":2758},[2595,4755,2436],{"class":2610},[2595,4757,2669],{"class":2601},[2595,4759,4760],{"class":2654}," 201",[2595,4762,2538],{"class":2758},[2595,4764,3975],{"class":2601},[2595,4766,4768,4770,4772],{"class":2597,"line":4767},41,[2595,4769,3952],{"class":2601},[2595,4771,2538],{"class":2610},[2595,4773,3975],{"class":2601},[2595,4775,4777],{"class":2597,"line":4776},42,[2595,4778,3981],{"emptyLinePlaceholder":3980},[2595,4780,4782,4784,4786,4788,4790,4792,4795,4797,4799,4801,4803,4805,4807,4809],{"class":2597,"line":4781},43,[2595,4783,2480],{"class":2610},[2595,4785,4026],{"class":2601},[2595,4787,4439],{"class":3958},[2595,4789,3962],{"class":2610},[2595,4791,3965],{"class":2601},[2595,4793,4794],{"class":2605},"\u002Flocations\u002Ftransfers\u002Freceive",[2595,4796,3965],{"class":2601},[2595,4798,2669],{"class":2601},[2595,4800,4453],{"class":2623},[2595,4802,2534],{"class":2601},[2595,4804,4458],{"class":3997},[2595,4806,2538],{"class":2601},[2595,4808,4463],{"class":2623},[2595,4810,2631],{"class":2601},[2595,4812,4814,4816,4818,4820,4822,4824,4826,4829,4831],{"class":2597,"line":4813},44,[2595,4815,4011],{"class":2623},[2595,4817,4002],{"class":2610},[2595,4819,3955],{"class":2601},[2595,4821,4478],{"class":2610},[2595,4823,4026],{"class":2601},[2595,4825,4483],{"class":2610},[2595,4827,4828],{"class":2601},"?.",[2595,4830,3526],{"class":2610},[2595,4832,3975],{"class":2601},[2595,4834,4836,4838,4840,4842,4844,4846,4848,4850,4852,4854,4857,4859,4861],{"class":2597,"line":4835},45,[2595,4837,4047],{"class":4019},[2595,4839,2534],{"class":2758},[2595,4841,4052],{"class":2601},[2595,4843,4038],{"class":2610},[2595,4845,4057],{"class":2758},[2595,4847,4060],{"class":4019},[2595,4849,3939],{"class":3958},[2595,4851,3962],{"class":2758},[2595,4853,2602],{"class":2601},[2595,4855,4856],{"class":2605},"'transfer_id' is required",[2595,4858,2602],{"class":2601},[2595,4860,2538],{"class":2758},[2595,4862,3975],{"class":2601},[2595,4864,4866,4868,4870,4872,4874,4876,4879,4881,4883,4885,4887,4889,4892],{"class":2597,"line":4865},46,[2595,4867,4391],{"class":4019},[2595,4869,4478],{"class":2610},[2595,4871,4026],{"class":2601},[2595,4873,2590],{"class":3958},[2595,4875,3962],{"class":2758},[2595,4877,4878],{"class":4019},"await",[2595,4880,3992],{"class":3958},[2595,4882,3962],{"class":2758},[2595,4884,2484],{"class":2610},[2595,4886,2669],{"class":2601},[2595,4888,4002],{"class":2610},[2595,4890,4891],{"class":2758},"))",[2595,4893,3975],{"class":2601},[2595,4895,4897,4899,4901],{"class":2597,"line":4896},47,[2595,4898,3952],{"class":2601},[2595,4900,2538],{"class":2610},[2595,4902,3975],{"class":2601},[2595,4904,4906],{"class":2597,"line":4905},48,[2595,4907,3981],{"emptyLinePlaceholder":3980},[2595,4909,4911],{"class":2597,"line":4910},49,[2595,4912,4913],{"class":3918},"\u002F\u002F At the bottom, below the existing `module.exports.buildApp = buildApp;`:\n",[2595,4915,4917,4920,4923,4926,4928],{"class":2597,"line":4916},50,[2595,4918,4919],{"class":2601},"module.exports.",[2595,4921,4922],{"class":2610},"receiveTransfer ",[2595,4924,4925],{"class":2601},"=",[2595,4927,3992],{"class":2610},[2595,4929,3975],{"class":2601},[2405,4931,4932,4935,4936,4939,4940,4943],{},[2427,4933,4934],{},"db.events.emit(name, data, options)"," answers ",[2427,4937,4938],{},"{ id, topic }",", where ",[2427,4941,4942],{},"topic"," is the full name a consumer subscribes to. It only accepts names the manifest declares: an undeclared one fails at the call.",[2405,4945,4946,4947,2441,4949,4952],{},"A route has no transaction around its write and its emit, so the process can die between the two, and the caller retries. Step 5 explains the ",[2427,4948,2641],{},[2427,4950,4951],{},"topicId"," options used above, and what makes that retry safe. Keep the stock move safe to repeat too, or a retry after a crash moves the stock twice: change it and close the transfer in one guarded step, or record each move as a ledger row.",[2405,4954,4955,4956,2441,4959,4962,4963,4966,4967,4969,4970,4972,4973,4975,4976,4979,4980,4982,4983,4985,4986,4988,4989,4991,4992,4995,4996,4998,4999,4969,5002,5005,5006,5009,5010,2573,5013,2441,5015,5017,5018,5021],{},"The transfer is written by two routes only, ",[2427,4957,4958],{},"ship",[2427,4960,4961],{},"receive",", and there is deliberately no CRUD mount for it: a ",[2427,4964,4965],{},"PUT"," that set ",[2427,4968,2989],{}," to ",[2427,4971,2416],{}," would close a transfer without the event. Declare both routes as capabilities so the gateway exposes them, the same way as the custom route in ",[2439,4974,103],{"href":104},". The snippet below is written for the hand-written ",[2427,4977,4978],{},"def(...)"," script from those tutorials. If your ",[2427,4981,2476],{}," is instead the one ",[2427,4984,3852],{}," generated, it builds CRUD capabilities for every entity in ",[2427,4987,2579],{},", including a ",[2427,4990,4965],{}," and a ",[2427,4993,4994],{},"POST \u002Flocations\u002Ftransfers"," that would collide with ",[2427,4997,4958],{}," and close a transfer without the event. Change its line ",[2427,5000,5001],{},"const generated = permitted.flatMap(crud);",[2427,5003,5004],{},"permitted.filter((entity) => entity !== 'transfers').flatMap(crud)",", delete any ",[2427,5007,5008],{},"locations.transfers.*"," entries a previous run already wrote to ",[2427,5011,5012],{},"manifest.capabilities.json",[2427,5014,4958],{},[2427,5016,4961],{}," entries there by hand as ",[2427,5019,5020],{},"{ \"type\": \"define\", \"capability\": ..., \"route\": { ... }, \"request\": ..., \"response\": ... }"," objects. The merge keeps hand-written entries.",[2586,5023,5025],{"className":3909,"code":5024,"filename":2476,"language":3911,"meta":2591,"style":2591},"const SHIP_REQUEST = {\n  title: 'ShipTransferRequest',\n  type: 'object',\n  required: ['from_location_id', 'to_location_id', 'sku', 'quantity'],\n  properties: {\n    from_location_id: { type: 'string', format: 'uuid' },\n    to_location_id: { type: 'string', format: 'uuid' },\n    sku: { type: 'string' },\n    quantity: { type: 'number', exclusiveMinimum: 0 },\n  },\n};\n\nconst RECEIVE_REQUEST = {\n  title: 'ReceiveTransferRequest',\n  type: 'object',\n  required: ['transfer_id'],\n  properties: { transfer_id: { type: 'string', format: 'uuid' } },\n};\n\nconst TRANSFER = {\n  title: 'Transfer',\n  type: 'object',\n  properties: {\n    id: { type: 'string', format: 'uuid' },\n    from_location_id: { type: 'string', format: 'uuid' },\n    to_location_id: { type: 'string', format: 'uuid' },\n    sku: { type: 'string' },\n    quantity: { type: 'number' },\n    status: { type: 'string', enum: ['requested', 'shipped', 'received'] },\n  },\n};\n\n\u002F\u002F Add to the capabilities array:\n\u002F\u002F   def('locations.transfers.ship', 'Ship a stock transfer', { method: 'POST', path: '\u002Flocations\u002Ftransfers' }, { request: SHIP_REQUEST, response: TRANSFER }),\n\u002F\u002F   def('locations.transfers.receive', 'Receive a stock transfer', { method: 'POST', path: '\u002Flocations\u002Ftransfers\u002Freceive' }, { request: RECEIVE_REQUEST, response: TRANSFER }),\n",[2427,5026,5027,5038,5054,5069,5112,5121,5155,5187,5207,5236,5240,5245,5249,5260,5275,5289,5307,5348,5352,5356,5367,5382,5396,5404,5436,5468,5500,5520,5540,5596,5600,5604,5608,5613,5618],{"__ignoreMap":2591},[2595,5028,5029,5031,5034,5036],{"class":2597,"line":2598},[2595,5030,3924],{"class":2623},[2595,5032,5033],{"class":2610}," SHIP_REQUEST ",[2595,5035,4925],{"class":2601},[2595,5037,2631],{"class":2601},[2595,5039,5040,5043,5045,5047,5050,5052],{"class":2597,"line":2617},[2595,5041,5042],{"class":2758},"  title",[2595,5044,2584],{"class":2601},[2595,5046,4093],{"class":2601},[2595,5048,5049],{"class":2605},"ShipTransferRequest",[2595,5051,3965],{"class":2601},[2595,5053,3454],{"class":2601},[2595,5055,5056,5059,5061,5063,5065,5067],{"class":2597,"line":2634},[2595,5057,5058],{"class":2758},"  type",[2595,5060,2584],{"class":2601},[2595,5062,4093],{"class":2601},[2595,5064,3501],{"class":2605},[2595,5066,3965],{"class":2601},[2595,5068,3454],{"class":2601},[2595,5070,5071,5074,5076,5078,5080,5082,5084,5086,5088,5090,5092,5094,5096,5098,5100,5102,5104,5106,5108,5110],{"class":2597,"line":2703},[2595,5072,5073],{"class":2758},"  required",[2595,5075,2584],{"class":2601},[2595,5077,3235],{"class":2610},[2595,5079,3965],{"class":2601},[2595,5081,2708],{"class":2605},[2595,5083,3965],{"class":2601},[2595,5085,2669],{"class":2601},[2595,5087,4093],{"class":2601},[2595,5089,2799],{"class":2605},[2595,5091,3965],{"class":2601},[2595,5093,2669],{"class":2601},[2595,5095,4093],{"class":2601},[2595,5097,2884],{"class":2605},[2595,5099,3965],{"class":2601},[2595,5101,2669],{"class":2601},[2595,5103,4093],{"class":2601},[2595,5105,2929],{"class":2605},[2595,5107,3965],{"class":2601},[2595,5109,3272],{"class":2610},[2595,5111,3454],{"class":2601},[2595,5113,5114,5117,5119],{"class":2597,"line":2794},[2595,5115,5116],{"class":2758},"  properties",[2595,5118,2584],{"class":2601},[2595,5120,2631],{"class":2601},[2595,5122,5123,5125,5127,5129,5132,5134,5136,5138,5140,5142,5145,5147,5149,5151,5153],{"class":2597,"line":2879},[2595,5124,4257],{"class":2758},[2595,5126,2584],{"class":2601},[2595,5128,2715],{"class":2601},[2595,5130,5131],{"class":2758}," type",[2595,5133,2584],{"class":2601},[2595,5135,4093],{"class":2601},[2595,5137,3545],{"class":2605},[2595,5139,3965],{"class":2601},[2595,5141,2669],{"class":2601},[2595,5143,5144],{"class":2758}," format",[2595,5146,2584],{"class":2601},[2595,5148,4093],{"class":2601},[2595,5150,2664],{"class":2605},[2595,5152,3965],{"class":2601},[2595,5154,2700],{"class":2601},[2595,5156,5157,5159,5161,5163,5165,5167,5169,5171,5173,5175,5177,5179,5181,5183,5185],{"class":2597,"line":2924},[2595,5158,4272],{"class":2758},[2595,5160,2584],{"class":2601},[2595,5162,2715],{"class":2601},[2595,5164,5131],{"class":2758},[2595,5166,2584],{"class":2601},[2595,5168,4093],{"class":2601},[2595,5170,3545],{"class":2605},[2595,5172,3965],{"class":2601},[2595,5174,2669],{"class":2601},[2595,5176,5144],{"class":2758},[2595,5178,2584],{"class":2601},[2595,5180,4093],{"class":2601},[2595,5182,2664],{"class":2605},[2595,5184,3965],{"class":2601},[2595,5186,2700],{"class":2601},[2595,5188,5189,5191,5193,5195,5197,5199,5201,5203,5205],{"class":2597,"line":2984},[2595,5190,4287],{"class":2758},[2595,5192,2584],{"class":2601},[2595,5194,2715],{"class":2601},[2595,5196,5131],{"class":2758},[2595,5198,2584],{"class":2601},[2595,5200,4093],{"class":2601},[2595,5202,3545],{"class":2605},[2595,5204,3965],{"class":2601},[2595,5206,2700],{"class":2601},[2595,5208,5209,5211,5213,5215,5217,5219,5221,5223,5225,5227,5230,5232,5234],{"class":2597,"line":3059},[2595,5210,4302],{"class":2758},[2595,5212,2584],{"class":2601},[2595,5214,2715],{"class":2601},[2595,5216,5131],{"class":2758},[2595,5218,2584],{"class":2601},[2595,5220,4093],{"class":2601},[2595,5222,3658],{"class":2605},[2595,5224,3965],{"class":2601},[2595,5226,2669],{"class":2601},[2595,5228,5229],{"class":2758}," exclusiveMinimum",[2595,5231,2584],{"class":2601},[2595,5233,4629],{"class":2654},[2595,5235,2700],{"class":2601},[2595,5237,5238],{"class":2597,"line":3118},[2595,5239,3673],{"class":2601},[2595,5241,5242],{"class":2597,"line":3175},[2595,5243,5244],{"class":2601},"};\n",[2595,5246,5247],{"class":2597,"line":3181},[2595,5248,3981],{"emptyLinePlaceholder":3980},[2595,5250,5251,5253,5256,5258],{"class":2597,"line":3670},[2595,5252,3924],{"class":2623},[2595,5254,5255],{"class":2610}," RECEIVE_REQUEST ",[2595,5257,4925],{"class":2601},[2595,5259,2631],{"class":2601},[2595,5261,5262,5264,5266,5268,5271,5273],{"class":2597,"line":3676},[2595,5263,5042],{"class":2758},[2595,5265,2584],{"class":2601},[2595,5267,4093],{"class":2601},[2595,5269,5270],{"class":2605},"ReceiveTransferRequest",[2595,5272,3965],{"class":2601},[2595,5274,3454],{"class":2601},[2595,5276,5277,5279,5281,5283,5285,5287],{"class":2597,"line":3690},[2595,5278,5058],{"class":2758},[2595,5280,2584],{"class":2601},[2595,5282,4093],{"class":2601},[2595,5284,3501],{"class":2605},[2595,5286,3965],{"class":2601},[2595,5288,3454],{"class":2601},[2595,5290,5291,5293,5295,5297,5299,5301,5303,5305],{"class":2597,"line":3710},[2595,5292,5073],{"class":2758},[2595,5294,2584],{"class":2601},[2595,5296,3235],{"class":2610},[2595,5298,3965],{"class":2601},[2595,5300,3526],{"class":2605},[2595,5302,3965],{"class":2601},[2595,5304,3272],{"class":2610},[2595,5306,3454],{"class":2601},[2595,5308,5309,5311,5313,5315,5318,5320,5322,5324,5326,5328,5330,5332,5334,5336,5338,5340,5342,5344,5346],{"class":2597,"line":3730},[2595,5310,5116],{"class":2758},[2595,5312,2584],{"class":2601},[2595,5314,2715],{"class":2601},[2595,5316,5317],{"class":2758}," transfer_id",[2595,5319,2584],{"class":2601},[2595,5321,2715],{"class":2601},[2595,5323,5131],{"class":2758},[2595,5325,2584],{"class":2601},[2595,5327,4093],{"class":2601},[2595,5329,3545],{"class":2605},[2595,5331,3965],{"class":2601},[2595,5333,2669],{"class":2601},[2595,5335,5144],{"class":2758},[2595,5337,2584],{"class":2601},[2595,5339,4093],{"class":2601},[2595,5341,2664],{"class":2605},[2595,5343,3965],{"class":2601},[2595,5345,2789],{"class":2601},[2595,5347,2700],{"class":2601},[2595,5349,5350],{"class":2597,"line":3750},[2595,5351,5244],{"class":2601},[2595,5353,5354],{"class":2597,"line":3770},[2595,5355,3981],{"emptyLinePlaceholder":3980},[2595,5357,5358,5360,5363,5365],{"class":2597,"line":3784},[2595,5359,3924],{"class":2623},[2595,5361,5362],{"class":2610}," TRANSFER ",[2595,5364,4925],{"class":2601},[2595,5366,2631],{"class":2601},[2595,5368,5369,5371,5373,5375,5378,5380],{"class":2597,"line":3789},[2595,5370,5042],{"class":2758},[2595,5372,2584],{"class":2601},[2595,5374,4093],{"class":2601},[2595,5376,5377],{"class":2605},"Transfer",[2595,5379,3965],{"class":2601},[2595,5381,3454],{"class":2601},[2595,5383,5384,5386,5388,5390,5392,5394],{"class":2597,"line":4329},[2595,5385,5058],{"class":2758},[2595,5387,2584],{"class":2601},[2595,5389,4093],{"class":2601},[2595,5391,3501],{"class":2605},[2595,5393,3965],{"class":2601},[2595,5395,3454],{"class":2601},[2595,5397,5398,5400,5402],{"class":2597,"line":4345},[2595,5399,5116],{"class":2758},[2595,5401,2584],{"class":2601},[2595,5403,2631],{"class":2601},[2595,5405,5406,5408,5410,5412,5414,5416,5418,5420,5422,5424,5426,5428,5430,5432,5434],{"class":2597,"line":4373},[2595,5407,4348],{"class":2758},[2595,5409,2584],{"class":2601},[2595,5411,2715],{"class":2601},[2595,5413,5131],{"class":2758},[2595,5415,2584],{"class":2601},[2595,5417,4093],{"class":2601},[2595,5419,3545],{"class":2605},[2595,5421,3965],{"class":2601},[2595,5423,2669],{"class":2601},[2595,5425,5144],{"class":2758},[2595,5427,2584],{"class":2601},[2595,5429,4093],{"class":2601},[2595,5431,2664],{"class":2605},[2595,5433,3965],{"class":2601},[2595,5435,2700],{"class":2601},[2595,5437,5438,5440,5442,5444,5446,5448,5450,5452,5454,5456,5458,5460,5462,5464,5466],{"class":2597,"line":4383},[2595,5439,4257],{"class":2758},[2595,5441,2584],{"class":2601},[2595,5443,2715],{"class":2601},[2595,5445,5131],{"class":2758},[2595,5447,2584],{"class":2601},[2595,5449,4093],{"class":2601},[2595,5451,3545],{"class":2605},[2595,5453,3965],{"class":2601},[2595,5455,2669],{"class":2601},[2595,5457,5144],{"class":2758},[2595,5459,2584],{"class":2601},[2595,5461,4093],{"class":2601},[2595,5463,2664],{"class":2605},[2595,5465,3965],{"class":2601},[2595,5467,2700],{"class":2601},[2595,5469,5470,5472,5474,5476,5478,5480,5482,5484,5486,5488,5490,5492,5494,5496,5498],{"class":2597,"line":4388},[2595,5471,4272],{"class":2758},[2595,5473,2584],{"class":2601},[2595,5475,2715],{"class":2601},[2595,5477,5131],{"class":2758},[2595,5479,2584],{"class":2601},[2595,5481,4093],{"class":2601},[2595,5483,3545],{"class":2605},[2595,5485,3965],{"class":2601},[2595,5487,2669],{"class":2601},[2595,5489,5144],{"class":2758},[2595,5491,2584],{"class":2601},[2595,5493,4093],{"class":2601},[2595,5495,2664],{"class":2605},[2595,5497,3965],{"class":2601},[2595,5499,2700],{"class":2601},[2595,5501,5502,5504,5506,5508,5510,5512,5514,5516,5518],{"class":2597,"line":4416},[2595,5503,4287],{"class":2758},[2595,5505,2584],{"class":2601},[2595,5507,2715],{"class":2601},[2595,5509,5131],{"class":2758},[2595,5511,2584],{"class":2601},[2595,5513,4093],{"class":2601},[2595,5515,3545],{"class":2605},[2595,5517,3965],{"class":2601},[2595,5519,2700],{"class":2601},[2595,5521,5522,5524,5526,5528,5530,5532,5534,5536,5538],{"class":2597,"line":4421},[2595,5523,4302],{"class":2758},[2595,5525,2584],{"class":2601},[2595,5527,2715],{"class":2601},[2595,5529,5131],{"class":2758},[2595,5531,2584],{"class":2601},[2595,5533,4093],{"class":2601},[2595,5535,3658],{"class":2605},[2595,5537,3965],{"class":2601},[2595,5539,2700],{"class":2601},[2595,5541,5542,5545,5547,5549,5551,5553,5555,5557,5559,5561,5564,5566,5568,5570,5572,5574,5576,5578,5580,5582,5584,5586,5588,5590,5593],{"class":2597,"line":4426},[2595,5543,5544],{"class":2758},"    status",[2595,5546,2584],{"class":2601},[2595,5548,2715],{"class":2601},[2595,5550,5131],{"class":2758},[2595,5552,2584],{"class":2601},[2595,5554,4093],{"class":2601},[2595,5556,3545],{"class":2605},[2595,5558,3965],{"class":2601},[2595,5560,2669],{"class":2601},[2595,5562,5563],{"class":2758}," enum",[2595,5565,2584],{"class":2601},[2595,5567,3235],{"class":2610},[2595,5569,3965],{"class":2601},[2595,5571,4096],{"class":2605},[2595,5573,3965],{"class":2601},[2595,5575,2669],{"class":2601},[2595,5577,4093],{"class":2601},[2595,5579,4141],{"class":2605},[2595,5581,3965],{"class":2601},[2595,5583,2669],{"class":2601},[2595,5585,4093],{"class":2601},[2595,5587,2416],{"class":2605},[2595,5589,3965],{"class":2601},[2595,5591,5592],{"class":2610},"] ",[2595,5594,5595],{"class":2601},"},\n",[2595,5597,5598],{"class":2597,"line":4432},[2595,5599,3673],{"class":2601},[2595,5601,5602],{"class":2597,"line":4468},[2595,5603,5244],{"class":2601},[2595,5605,5606],{"class":2597,"line":4492},[2595,5607,3981],{"emptyLinePlaceholder":3980},[2595,5609,5610],{"class":2597,"line":4537},[2595,5611,5612],{"class":3918},"\u002F\u002F Add to the capabilities array:\n",[2595,5614,5615],{"class":2597,"line":4584},[2595,5616,5617],{"class":3918},"\u002F\u002F   def('locations.transfers.ship', 'Ship a stock transfer', { method: 'POST', path: '\u002Flocations\u002Ftransfers' }, { request: SHIP_REQUEST, response: TRANSFER }),\n",[2595,5619,5620],{"class":2597,"line":4589},[2595,5621,5622],{"class":3918},"\u002F\u002F   def('locations.transfers.receive', 'Receive a stock transfer', { method: 'POST', path: '\u002Flocations\u002Ftransfers\u002Freceive' }, { request: RECEIVE_REQUEST, response: TRANSFER }),\n",[2405,5624,5625,5626,5629],{},"Then regenerate the capability list. The gateway exposes only what the manifest lists, so skipping this gives you a ",[2427,5627,5628],{},"404"," on every call in step 8:",[2586,5631,5634],{"className":3863,"code":5632,"filename":5633,"language":3866,"meta":2591,"style":2591},"npm run capabilities\n","Regenerate capabilities",[2427,5635,5636],{"__ignoreMap":2591},[2595,5637,5638,5640,5643],{"class":2597,"line":2598},[2595,5639,3873],{"class":2640},[2595,5641,5642],{"class":2605}," run",[2595,5644,5645],{"class":2605}," capabilities\n",[2490,5647,5649],{"id":5648},"_5-choose-the-id-and-the-topicid","5. Choose the id and the topicId",[2405,5651,5652,5657,5658,5660],{},[2409,5653,5654,5656],{},[2427,5655,2641],{}," is the idempotency key."," A second emit with an id the platform has already seen is a no-op, so a deterministic id turns a retry into nothing instead of a second event. Without an ",[2427,5659,2641],{},", every emit is a new event.",[2405,5662,5663,5664,5666,5667,5669],{},"That is why the handler above emits even when the transfer was already ",[2427,5665,2416],{},": a retry after a crash finds the row closed and skips the write, but still emits, and if the first attempt did publish, the repeat changes nothing. This is how this guide makes a retry safe, not something the platform does for you: a route that returns early when the work is already done never reaches its emit, and a crash between write and emit loses the event. How long the platform remembers an ",[2427,5668,2641],{}," is not documented (as of 2026-09), so do not lean on a repeat arriving months later being dropped. What goes into the id depends on how often the fact can happen:",[3793,5671,5672,5678,5684],{},[3796,5673,5674,5677],{},[2409,5675,5676],{},"It can happen once per entity"," (a transfer is received once): the entity id, as above.",[3796,5679,5680,5683],{},[2409,5681,5682],{},"It can happen again"," (an order put on hold, released, put on hold again): the id must also name the occurrence. Write a row for each occurrence, an audit entry, say, and put its id in the event id. An id built from the entity alone would swallow the second real hold.",[3796,5685,5686,5689],{},[2409,5687,5688],{},"It is one of many from one call"," (a cancellation per line): entity id plus the row that marks this one.",[2405,5691,5692,5697,5698,5701,5702,5704],{},[2409,5693,5694,5696],{},[2427,5695,4951],{}," is not the topic."," It is the id of the resource the event is about, matching ",[2427,5699,5700],{},"[A-Za-z0-9][A-Za-z0-9_-]{0,63}",", and the platform refuses anything else instead of reshaping it. A realtime channel is built from the event name's first segment plus the ",[2427,5703,4951],{},", so keep it the same for everything about one entity. If every event about a transfer carries the transfer id, one subscription hears its whole life. Put a child row's id there and the event lands on a channel nobody is watching. Leave it out for an event about a collection.",[2490,5706,5708],{"id":5707},"_6-publish-per-change-not-per-call","6. Publish per change, not per call",[2405,5710,5711,5712,5715,5716,5719],{},"A route that recomputes many rows, such as a nightly job, runs far more often than anything moves. An event per ",[2414,5713,5714],{},"call"," puts every run on the tenant's bus, and an event per ",[2414,5717,5718],{},"change"," puts on it exactly what happened.",[2586,5721,5723],{"className":3909,"code":5722,"filename":2473,"language":3911,"meta":2591,"style":2591},"app.post('\u002Fcategories\u002Frecompute', async (c) => {\n  const category = await db.categories.get(c.body?.category_id);\n  if (!category) throw notFound('category not found');\n\n  const changed = await recomputeCategory(db, category);   \u002F\u002F your own routine: { added, removed }\n  if (changed.added + changed.removed === 0) return c.json({ changed: false });  \u002F\u002F nothing moved, nothing to announce\n\n  \u002F\u002F `category.recomputed` is declared in the manifest like step 2 declares `transfer.received`.\n  await db.events.emit('category.recomputed', { category_id: category.id, ...changed }, { topicId: category.id });\n  return c.json({ changed: true, ...changed });\n});\n",[2427,5724,5725,5756,5795,5825,5829,5859,5920,5924,5929,5995,6027],{"__ignoreMap":2591},[2595,5726,5727,5729,5731,5733,5735,5737,5740,5742,5744,5746,5748,5750,5752,5754],{"class":2597,"line":2598},[2595,5728,2480],{"class":2610},[2595,5730,4026],{"class":2601},[2595,5732,4439],{"class":3958},[2595,5734,3962],{"class":2610},[2595,5736,3965],{"class":2601},[2595,5738,5739],{"class":2605},"\u002Fcategories\u002Frecompute",[2595,5741,3965],{"class":2601},[2595,5743,2669],{"class":2601},[2595,5745,4453],{"class":2623},[2595,5747,2534],{"class":2601},[2595,5749,4458],{"class":3997},[2595,5751,2538],{"class":2601},[2595,5753,4463],{"class":2623},[2595,5755,2631],{"class":2601},[2595,5757,5758,5760,5763,5765,5767,5769,5771,5774,5776,5778,5780,5782,5784,5786,5788,5791,5793],{"class":2597,"line":2617},[2595,5759,4011],{"class":2623},[2595,5761,5762],{"class":2610}," category",[2595,5764,3955],{"class":2601},[2595,5766,4020],{"class":4019},[2595,5768,4023],{"class":2610},[2595,5770,4026],{"class":2601},[2595,5772,5773],{"class":2610},"categories",[2595,5775,4026],{"class":2601},[2595,5777,4033],{"class":3958},[2595,5779,3962],{"class":2758},[2595,5781,4458],{"class":2610},[2595,5783,4026],{"class":2601},[2595,5785,4483],{"class":2610},[2595,5787,4828],{"class":2601},[2595,5789,5790],{"class":2610},"category_id",[2595,5792,2538],{"class":2758},[2595,5794,3975],{"class":2601},[2595,5796,5797,5799,5801,5803,5806,5808,5810,5812,5814,5816,5819,5821,5823],{"class":2597,"line":2634},[2595,5798,4047],{"class":4019},[2595,5800,2534],{"class":2758},[2595,5802,4052],{"class":2601},[2595,5804,5805],{"class":2610},"category",[2595,5807,4057],{"class":2758},[2595,5809,4060],{"class":4019},[2595,5811,3944],{"class":3958},[2595,5813,3962],{"class":2758},[2595,5815,3965],{"class":2601},[2595,5817,5818],{"class":2605},"category not found",[2595,5820,3965],{"class":2601},[2595,5822,2538],{"class":2758},[2595,5824,3975],{"class":2601},[2595,5826,5827],{"class":2597,"line":2703},[2595,5828,3981],{"emptyLinePlaceholder":3980},[2595,5830,5831,5833,5836,5838,5840,5843,5845,5847,5849,5851,5853,5856],{"class":2597,"line":2794},[2595,5832,4011],{"class":2623},[2595,5834,5835],{"class":2610}," changed",[2595,5837,3955],{"class":2601},[2595,5839,4020],{"class":4019},[2595,5841,5842],{"class":3958}," recomputeCategory",[2595,5844,3962],{"class":2758},[2595,5846,2484],{"class":2610},[2595,5848,2669],{"class":2601},[2595,5850,5762],{"class":2610},[2595,5852,2538],{"class":2758},[2595,5854,5855],{"class":2601},";",[2595,5857,5858],{"class":3918},"   \u002F\u002F your own routine: { added, removed }\n",[2595,5860,5861,5863,5865,5868,5870,5873,5876,5878,5880,5883,5885,5887,5889,5892,5894,5896,5898,5900,5903,5905,5907,5911,5913,5915,5917],{"class":2597,"line":2879},[2595,5862,4047],{"class":4019},[2595,5864,2534],{"class":2758},[2595,5866,5867],{"class":2610},"changed",[2595,5869,4026],{"class":2601},[2595,5871,5872],{"class":2610},"added",[2595,5874,5875],{"class":2601}," +",[2595,5877,5835],{"class":2610},[2595,5879,4026],{"class":2601},[2595,5881,5882],{"class":2610},"removed",[2595,5884,4090],{"class":2601},[2595,5886,4629],{"class":2654},[2595,5888,4057],{"class":2758},[2595,5890,5891],{"class":4019},"return",[2595,5893,4478],{"class":2610},[2595,5895,4026],{"class":2601},[2595,5897,2590],{"class":3958},[2595,5899,3962],{"class":2758},[2595,5901,5902],{"class":2601},"{",[2595,5904,5835],{"class":2758},[2595,5906,2584],{"class":2601},[2595,5908,5910],{"class":5909},"sfNiH"," false",[2595,5912,2789],{"class":2601},[2595,5914,2538],{"class":2758},[2595,5916,5855],{"class":2601},[2595,5918,5919],{"class":3918},"  \u002F\u002F nothing moved, nothing to announce\n",[2595,5921,5922],{"class":2597,"line":2924},[2595,5923,3981],{"emptyLinePlaceholder":3980},[2595,5925,5926],{"class":2597,"line":2984},[2595,5927,5928],{"class":3918},"  \u002F\u002F `category.recomputed` is declared in the manifest like step 2 declares `transfer.received`.\n",[2595,5930,5931,5933,5935,5937,5939,5941,5943,5945,5947,5950,5952,5954,5956,5959,5961,5963,5965,5967,5969,5971,5973,5976,5978,5981,5983,5985,5987,5989,5991,5993],{"class":2597,"line":3059},[2595,5932,4214],{"class":4019},[2595,5934,4023],{"class":2610},[2595,5936,4026],{"class":2601},[2595,5938,3413],{"class":2610},[2595,5940,4026],{"class":2601},[2595,5942,4225],{"class":3958},[2595,5944,3962],{"class":2758},[2595,5946,3965],{"class":2601},[2595,5948,5949],{"class":2605},"category.recomputed",[2595,5951,3965],{"class":2601},[2595,5953,2669],{"class":2601},[2595,5955,2715],{"class":2601},[2595,5957,5958],{"class":2758}," category_id",[2595,5960,2584],{"class":2601},[2595,5962,5762],{"class":2610},[2595,5964,4026],{"class":2601},[2595,5966,2641],{"class":2610},[2595,5968,2669],{"class":2601},[2595,5970,4396],{"class":2601},[2595,5972,5867],{"class":2610},[2595,5974,5975],{"class":2601}," },",[2595,5977,2715],{"class":2601},[2595,5979,5980],{"class":2758}," topicId",[2595,5982,2584],{"class":2601},[2595,5984,5762],{"class":2610},[2595,5986,4026],{"class":2601},[2595,5988,2641],{"class":2610},[2595,5990,2789],{"class":2601},[2595,5992,2538],{"class":2758},[2595,5994,3975],{"class":2601},[2595,5996,5997,5999,6001,6003,6005,6007,6009,6011,6013,6015,6017,6019,6021,6023,6025],{"class":2597,"line":3118},[2595,5998,4391],{"class":4019},[2595,6000,4478],{"class":2610},[2595,6002,4026],{"class":2601},[2595,6004,2590],{"class":3958},[2595,6006,3962],{"class":2758},[2595,6008,5902],{"class":2601},[2595,6010,5835],{"class":2758},[2595,6012,2584],{"class":2601},[2595,6014,2919],{"class":5909},[2595,6016,2669],{"class":2601},[2595,6018,4396],{"class":2601},[2595,6020,5867],{"class":2610},[2595,6022,2789],{"class":2601},[2595,6024,2538],{"class":2758},[2595,6026,3975],{"class":2601},[2595,6028,6029,6031,6033],{"class":2597,"line":3175},[2595,6030,3952],{"class":2601},[2595,6032,2538],{"class":2610},[2595,6034,3975],{"class":2601},[2405,6036,6037,6038,6040],{},"Guard on the change itself, then emit. A repeated call finds nothing left to move, so it publishes no duplicate. The guard cannot tell a retry from a repeat, though: a call that died after writing but before emitting announces nothing when it is retried, so the event is lost. Where a lost event matters, use a deterministic ",[2427,6039,2641],{}," and emit on the retry path as in step 4. If a consumer will treat the event as the trigger for work, a flood of no-op events is a flood of no-op work.",[2490,6042,6044],{"id":6043},"_7-test-it-with-the-mock-adapter","7. Test it with the mock adapter",[2405,6046,6047,6048,6051,6052,6054,6055,2584],{},"The ",[2427,6049,6050],{},"mock"," adapter records every emit instead of publishing it, and it drops a repeated ",[2427,6053,2641],{}," just like the real call. A test asserts what the route fired with ",[2427,6056,6057],{},"db.events.emitted()",[2586,6059,6062],{"className":3909,"code":6060,"filename":6061,"language":3911,"meta":2591,"style":2591},"const { test } = require('node:test');\nconst assert = require('node:assert\u002Fstrict');\nconst { createDb } = require('..\u002Fsrc\u002Fdb.generated');\nconst { receiveTransfer } = require('..\u002Fsrc\u002Fmain');\n\ntest('receiving a transfer publishes one event, even when repeated', async () => {\n  const db = createDb({ adapter: 'mock', seed: { transfers: [], stock_levels: [], locations: [] } });\n  const transfer = await db.transfers.create({\n    from_location_id: 'a1', to_location_id: 'b2', sku: 'WIDGET-1', quantity: 12, status: 'shipped',\n  });\n\n  await receiveTransfer(db, transfer.id);\n  await receiveTransfer(db, transfer.id); \u002F\u002F the caller retried\n\n  const sent = db.events.emitted();\n  assert.equal(sent.length, 1);\n  assert.equal(sent[0].event, 'transfer.received');\n  assert.equal(sent[0].options.topicId, transfer.id);\n  assert.equal(sent[0].data.quantity, 12);\n});\n\ntest('a transfer that has not shipped announces nothing', async () => {\n  const db = createDb({ adapter: 'mock', seed: { transfers: [] } });\n  const transfer = await db.transfers.create({ sku: 'WIDGET-1', quantity: 1, status: 'requested' });\n\n  await assert.rejects(receiveTransfer(db, transfer.id));\n  assert.equal(db.events.emitted().length, 0);\n});\n","test\u002Ftransfers.test.js",[2427,6063,6064,6092,6116,6144,6172,6176,6201,6271,6295,6356,6364,6368,6390,6415,6419,6444,6473,6509,6548,6583,6591,6595,6618,6664,6724,6728,6761,6795],{"__ignoreMap":2591},[2595,6065,6066,6068,6070,6073,6075,6077,6079,6081,6083,6086,6088,6090],{"class":2597,"line":2598},[2595,6067,3924],{"class":2623},[2595,6069,2715],{"class":2601},[2595,6071,6072],{"class":2610}," test ",[2595,6074,3952],{"class":2601},[2595,6076,3955],{"class":2601},[2595,6078,3959],{"class":3958},[2595,6080,3962],{"class":2610},[2595,6082,3965],{"class":2601},[2595,6084,6085],{"class":2605},"node:test",[2595,6087,3965],{"class":2601},[2595,6089,2538],{"class":2610},[2595,6091,3975],{"class":2601},[2595,6093,6094,6096,6099,6101,6103,6105,6107,6110,6112,6114],{"class":2597,"line":2617},[2595,6095,3924],{"class":2623},[2595,6097,6098],{"class":2610}," assert ",[2595,6100,4925],{"class":2601},[2595,6102,3959],{"class":3958},[2595,6104,3962],{"class":2610},[2595,6106,3965],{"class":2601},[2595,6108,6109],{"class":2605},"node:assert\u002Fstrict",[2595,6111,3965],{"class":2601},[2595,6113,2538],{"class":2610},[2595,6115,3975],{"class":2601},[2595,6117,6118,6120,6122,6125,6127,6129,6131,6133,6135,6138,6140,6142],{"class":2597,"line":2634},[2595,6119,3924],{"class":2623},[2595,6121,2715],{"class":2601},[2595,6123,6124],{"class":2610}," createDb ",[2595,6126,3952],{"class":2601},[2595,6128,3955],{"class":2601},[2595,6130,3959],{"class":3958},[2595,6132,3962],{"class":2610},[2595,6134,3965],{"class":2601},[2595,6136,6137],{"class":2605},"..\u002Fsrc\u002Fdb.generated",[2595,6139,3965],{"class":2601},[2595,6141,2538],{"class":2610},[2595,6143,3975],{"class":2601},[2595,6145,6146,6148,6150,6153,6155,6157,6159,6161,6163,6166,6168,6170],{"class":2597,"line":2703},[2595,6147,3924],{"class":2623},[2595,6149,2715],{"class":2601},[2595,6151,6152],{"class":2610}," receiveTransfer ",[2595,6154,3952],{"class":2601},[2595,6156,3955],{"class":2601},[2595,6158,3959],{"class":3958},[2595,6160,3962],{"class":2610},[2595,6162,3965],{"class":2601},[2595,6164,6165],{"class":2605},"..\u002Fsrc\u002Fmain",[2595,6167,3965],{"class":2601},[2595,6169,2538],{"class":2610},[2595,6171,3975],{"class":2601},[2595,6173,6174],{"class":2597,"line":2794},[2595,6175,3981],{"emptyLinePlaceholder":3980},[2595,6177,6178,6181,6183,6185,6188,6190,6192,6194,6197,6199],{"class":2597,"line":2879},[2595,6179,6180],{"class":3958},"test",[2595,6182,3962],{"class":2610},[2595,6184,3965],{"class":2601},[2595,6186,6187],{"class":2605},"receiving a transfer publishes one event, even when repeated",[2595,6189,3965],{"class":2601},[2595,6191,2669],{"class":2601},[2595,6193,4453],{"class":2623},[2595,6195,6196],{"class":2601}," ()",[2595,6198,4463],{"class":2623},[2595,6200,2631],{"class":2601},[2595,6202,6203,6205,6207,6209,6212,6214,6216,6219,6221,6223,6225,6227,6229,6232,6234,6236,6239,6241,6244,6246,6249,6251,6253,6255,6258,6260,6263,6265,6267,6269],{"class":2597,"line":2924},[2595,6204,4011],{"class":2623},[2595,6206,4023],{"class":2610},[2595,6208,3955],{"class":2601},[2595,6210,6211],{"class":3958}," createDb",[2595,6213,3962],{"class":2758},[2595,6215,5902],{"class":2601},[2595,6217,6218],{"class":2758}," adapter",[2595,6220,2584],{"class":2601},[2595,6222,4093],{"class":2601},[2595,6224,6050],{"class":2605},[2595,6226,3965],{"class":2601},[2595,6228,2669],{"class":2601},[2595,6230,6231],{"class":2758}," seed",[2595,6233,2584],{"class":2601},[2595,6235,2715],{"class":2601},[2595,6237,6238],{"class":2758}," transfers",[2595,6240,2584],{"class":2601},[2595,6242,6243],{"class":2758}," []",[2595,6245,2669],{"class":2601},[2595,6247,6248],{"class":2758}," stock_levels",[2595,6250,2584],{"class":2601},[2595,6252,6243],{"class":2758},[2595,6254,2669],{"class":2601},[2595,6256,6257],{"class":2758}," locations",[2595,6259,2584],{"class":2601},[2595,6261,6262],{"class":2758}," [] ",[2595,6264,3952],{"class":2601},[2595,6266,2789],{"class":2601},[2595,6268,2538],{"class":2758},[2595,6270,3975],{"class":2601},[2595,6272,6273,6275,6277,6279,6281,6283,6285,6287,6289,6291,6293],{"class":2597,"line":2984},[2595,6274,4011],{"class":2623},[2595,6276,4014],{"class":2610},[2595,6278,3955],{"class":2601},[2595,6280,4020],{"class":4019},[2595,6282,4023],{"class":2610},[2595,6284,4026],{"class":2601},[2595,6286,2557],{"class":2610},[2595,6288,4026],{"class":2601},[2595,6290,3249],{"class":3958},[2595,6292,3962],{"class":2758},[2595,6294,2614],{"class":2601},[2595,6296,6297,6299,6301,6303,6306,6308,6310,6312,6314,6316,6319,6321,6323,6325,6327,6329,6331,6333,6335,6337,6339,6342,6344,6346,6348,6350,6352,6354],{"class":2597,"line":3059},[2595,6298,4257],{"class":2758},[2595,6300,2584],{"class":2601},[2595,6302,4093],{"class":2601},[2595,6304,6305],{"class":2605},"a1",[2595,6307,3965],{"class":2601},[2595,6309,2669],{"class":2601},[2595,6311,4692],{"class":2758},[2595,6313,2584],{"class":2601},[2595,6315,4093],{"class":2601},[2595,6317,6318],{"class":2605},"b2",[2595,6320,3965],{"class":2601},[2595,6322,2669],{"class":2601},[2595,6324,4705],{"class":2758},[2595,6326,2584],{"class":2601},[2595,6328,4093],{"class":2601},[2595,6330,3763],{"class":2605},[2595,6332,3965],{"class":2601},[2595,6334,2669],{"class":2601},[2595,6336,4594],{"class":2758},[2595,6338,2584],{"class":2601},[2595,6340,6341],{"class":2654}," 12",[2595,6343,2669],{"class":2601},[2595,6345,4187],{"class":2758},[2595,6347,2584],{"class":2601},[2595,6349,4093],{"class":2601},[2595,6351,4141],{"class":2605},[2595,6353,3965],{"class":2601},[2595,6355,3454],{"class":2601},[2595,6357,6358,6360,6362],{"class":2597,"line":3118},[2595,6359,4376],{"class":2601},[2595,6361,2538],{"class":2758},[2595,6363,3975],{"class":2601},[2595,6365,6366],{"class":2597,"line":3175},[2595,6367,3981],{"emptyLinePlaceholder":3980},[2595,6369,6370,6372,6374,6376,6378,6380,6382,6384,6386,6388],{"class":2597,"line":3181},[2595,6371,4214],{"class":4019},[2595,6373,3992],{"class":3958},[2595,6375,3962],{"class":2758},[2595,6377,2484],{"class":2610},[2595,6379,2669],{"class":2601},[2595,6381,4014],{"class":2610},[2595,6383,4026],{"class":2601},[2595,6385,2641],{"class":2610},[2595,6387,2538],{"class":2758},[2595,6389,3975],{"class":2601},[2595,6391,6392,6394,6396,6398,6400,6402,6404,6406,6408,6410,6412],{"class":2597,"line":3670},[2595,6393,4214],{"class":4019},[2595,6395,3992],{"class":3958},[2595,6397,3962],{"class":2758},[2595,6399,2484],{"class":2610},[2595,6401,2669],{"class":2601},[2595,6403,4014],{"class":2610},[2595,6405,4026],{"class":2601},[2595,6407,2641],{"class":2610},[2595,6409,2538],{"class":2758},[2595,6411,5855],{"class":2601},[2595,6413,6414],{"class":3918}," \u002F\u002F the caller retried\n",[2595,6416,6417],{"class":2597,"line":3676},[2595,6418,3981],{"emptyLinePlaceholder":3980},[2595,6420,6421,6423,6426,6428,6430,6432,6434,6436,6439,6442],{"class":2597,"line":3690},[2595,6422,4011],{"class":2623},[2595,6424,6425],{"class":2610}," sent",[2595,6427,3955],{"class":2601},[2595,6429,4023],{"class":2610},[2595,6431,4026],{"class":2601},[2595,6433,3413],{"class":2610},[2595,6435,4026],{"class":2601},[2595,6437,6438],{"class":3958},"emitted",[2595,6440,6441],{"class":2758},"()",[2595,6443,3975],{"class":2601},[2595,6445,6446,6449,6451,6454,6456,6459,6461,6464,6466,6469,6471],{"class":2597,"line":3710},[2595,6447,6448],{"class":2610},"  assert",[2595,6450,4026],{"class":2601},[2595,6452,6453],{"class":3958},"equal",[2595,6455,3962],{"class":2758},[2595,6457,6458],{"class":2610},"sent",[2595,6460,4026],{"class":2601},[2595,6462,6463],{"class":2610},"length",[2595,6465,2669],{"class":2601},[2595,6467,6468],{"class":2654}," 1",[2595,6470,2538],{"class":2758},[2595,6472,3975],{"class":2601},[2595,6474,6475,6477,6479,6481,6483,6485,6487,6490,6492,6494,6497,6499,6501,6503,6505,6507],{"class":2597,"line":3730},[2595,6476,6448],{"class":2610},[2595,6478,4026],{"class":2601},[2595,6480,6453],{"class":3958},[2595,6482,3962],{"class":2758},[2595,6484,6458],{"class":2610},[2595,6486,4550],{"class":2758},[2595,6488,6489],{"class":2654},"0",[2595,6491,3272],{"class":2758},[2595,6493,4026],{"class":2601},[2595,6495,6496],{"class":2610},"event",[2595,6498,2669],{"class":2601},[2595,6500,4093],{"class":2601},[2595,6502,2447],{"class":2605},[2595,6504,3965],{"class":2601},[2595,6506,2538],{"class":2758},[2595,6508,3975],{"class":2601},[2595,6510,6511,6513,6515,6517,6519,6521,6523,6525,6527,6529,6532,6534,6536,6538,6540,6542,6544,6546],{"class":2597,"line":3750},[2595,6512,6448],{"class":2610},[2595,6514,4026],{"class":2601},[2595,6516,6453],{"class":3958},[2595,6518,3962],{"class":2758},[2595,6520,6458],{"class":2610},[2595,6522,4550],{"class":2758},[2595,6524,6489],{"class":2654},[2595,6526,3272],{"class":2758},[2595,6528,4026],{"class":2601},[2595,6530,6531],{"class":2610},"options",[2595,6533,4026],{"class":2601},[2595,6535,4951],{"class":2610},[2595,6537,2669],{"class":2601},[2595,6539,4014],{"class":2610},[2595,6541,4026],{"class":2601},[2595,6543,2641],{"class":2610},[2595,6545,2538],{"class":2758},[2595,6547,3975],{"class":2601},[2595,6549,6550,6552,6554,6556,6558,6560,6562,6564,6566,6568,6571,6573,6575,6577,6579,6581],{"class":2597,"line":3770},[2595,6551,6448],{"class":2610},[2595,6553,4026],{"class":2601},[2595,6555,6453],{"class":3958},[2595,6557,3962],{"class":2758},[2595,6559,6458],{"class":2610},[2595,6561,4550],{"class":2758},[2595,6563,6489],{"class":2654},[2595,6565,3272],{"class":2758},[2595,6567,4026],{"class":2601},[2595,6569,6570],{"class":2610},"data",[2595,6572,4026],{"class":2601},[2595,6574,2929],{"class":2610},[2595,6576,2669],{"class":2601},[2595,6578,6341],{"class":2654},[2595,6580,2538],{"class":2758},[2595,6582,3975],{"class":2601},[2595,6584,6585,6587,6589],{"class":2597,"line":3784},[2595,6586,3952],{"class":2601},[2595,6588,2538],{"class":2610},[2595,6590,3975],{"class":2601},[2595,6592,6593],{"class":2597,"line":3789},[2595,6594,3981],{"emptyLinePlaceholder":3980},[2595,6596,6597,6599,6601,6603,6606,6608,6610,6612,6614,6616],{"class":2597,"line":4329},[2595,6598,6180],{"class":3958},[2595,6600,3962],{"class":2610},[2595,6602,3965],{"class":2601},[2595,6604,6605],{"class":2605},"a transfer that has not shipped announces nothing",[2595,6607,3965],{"class":2601},[2595,6609,2669],{"class":2601},[2595,6611,4453],{"class":2623},[2595,6613,6196],{"class":2601},[2595,6615,4463],{"class":2623},[2595,6617,2631],{"class":2601},[2595,6619,6620,6622,6624,6626,6628,6630,6632,6634,6636,6638,6640,6642,6644,6646,6648,6650,6652,6654,6656,6658,6660,6662],{"class":2597,"line":4345},[2595,6621,4011],{"class":2623},[2595,6623,4023],{"class":2610},[2595,6625,3955],{"class":2601},[2595,6627,6211],{"class":3958},[2595,6629,3962],{"class":2758},[2595,6631,5902],{"class":2601},[2595,6633,6218],{"class":2758},[2595,6635,2584],{"class":2601},[2595,6637,4093],{"class":2601},[2595,6639,6050],{"class":2605},[2595,6641,3965],{"class":2601},[2595,6643,2669],{"class":2601},[2595,6645,6231],{"class":2758},[2595,6647,2584],{"class":2601},[2595,6649,2715],{"class":2601},[2595,6651,6238],{"class":2758},[2595,6653,2584],{"class":2601},[2595,6655,6262],{"class":2758},[2595,6657,3952],{"class":2601},[2595,6659,2789],{"class":2601},[2595,6661,2538],{"class":2758},[2595,6663,3975],{"class":2601},[2595,6665,6666,6668,6670,6672,6674,6676,6678,6680,6682,6684,6686,6688,6690,6692,6694,6696,6698,6700,6702,6704,6706,6708,6710,6712,6714,6716,6718,6720,6722],{"class":2597,"line":4373},[2595,6667,4011],{"class":2623},[2595,6669,4014],{"class":2610},[2595,6671,3955],{"class":2601},[2595,6673,4020],{"class":4019},[2595,6675,4023],{"class":2610},[2595,6677,4026],{"class":2601},[2595,6679,2557],{"class":2610},[2595,6681,4026],{"class":2601},[2595,6683,3249],{"class":3958},[2595,6685,3962],{"class":2758},[2595,6687,5902],{"class":2601},[2595,6689,4705],{"class":2758},[2595,6691,2584],{"class":2601},[2595,6693,4093],{"class":2601},[2595,6695,3763],{"class":2605},[2595,6697,3965],{"class":2601},[2595,6699,2669],{"class":2601},[2595,6701,4594],{"class":2758},[2595,6703,2584],{"class":2601},[2595,6705,6468],{"class":2654},[2595,6707,2669],{"class":2601},[2595,6709,4187],{"class":2758},[2595,6711,2584],{"class":2601},[2595,6713,4093],{"class":2601},[2595,6715,4096],{"class":2605},[2595,6717,3965],{"class":2601},[2595,6719,2789],{"class":2601},[2595,6721,2538],{"class":2758},[2595,6723,3975],{"class":2601},[2595,6725,6726],{"class":2597,"line":4383},[2595,6727,3981],{"emptyLinePlaceholder":3980},[2595,6729,6730,6732,6735,6737,6740,6742,6745,6747,6749,6751,6753,6755,6757,6759],{"class":2597,"line":4388},[2595,6731,4214],{"class":4019},[2595,6733,6734],{"class":2610}," assert",[2595,6736,4026],{"class":2601},[2595,6738,6739],{"class":3958},"rejects",[2595,6741,3962],{"class":2758},[2595,6743,6744],{"class":3958},"receiveTransfer",[2595,6746,3962],{"class":2758},[2595,6748,2484],{"class":2610},[2595,6750,2669],{"class":2601},[2595,6752,4014],{"class":2610},[2595,6754,4026],{"class":2601},[2595,6756,2641],{"class":2610},[2595,6758,4891],{"class":2758},[2595,6760,3975],{"class":2601},[2595,6762,6763,6765,6767,6769,6771,6773,6775,6777,6779,6781,6783,6785,6787,6789,6791,6793],{"class":2597,"line":4416},[2595,6764,6448],{"class":2610},[2595,6766,4026],{"class":2601},[2595,6768,6453],{"class":3958},[2595,6770,3962],{"class":2758},[2595,6772,2484],{"class":2610},[2595,6774,4026],{"class":2601},[2595,6776,3413],{"class":2610},[2595,6778,4026],{"class":2601},[2595,6780,6438],{"class":3958},[2595,6782,6441],{"class":2758},[2595,6784,4026],{"class":2601},[2595,6786,6463],{"class":2610},[2595,6788,2669],{"class":2601},[2595,6790,4629],{"class":2654},[2595,6792,2538],{"class":2758},[2595,6794,3975],{"class":2601},[2595,6796,6797,6799,6801],{"class":2597,"line":4421},[2595,6798,3952],{"class":2601},[2595,6800,2538],{"class":2610},[2595,6802,3975],{"class":2601},[2586,6804,6807],{"className":3863,"code":6805,"filename":6806,"language":3866,"meta":2591,"style":2591},"npm test\n","Test",[2427,6808,6809],{"__ignoreMap":2591},[2595,6810,6811,6813],{"class":2597,"line":2598},[2595,6812,3873],{"class":2640},[2595,6814,6815],{"class":2605}," test\n",[2405,6817,6818,6819,6821,6822,6824],{},"A mock proves your route fires the right event with the right id. It does not prove the platform delivered it, and ",[2427,6820,6057],{}," throws on any other adapter. See ",[2439,6823,1032],{"href":1033}," for what a mock does not enforce.",[2490,6826,6828],{"id":6827},"_8-deploy-find-the-topic-see-it-arrive","8. Deploy, find the topic, see it arrive",[2405,6830,6831,6834,6835,6837,6838,2534,6841,6843,6844,6847,6848,2441,6850,6853,6854,2584],{},[2439,6832,6833],{"href":118},"Deploy the App",", then read the ",[2409,6836,4942],{}," your consumers subscribe to from your tenant's event catalog. The catalog has no documented scope yet (as of 2026-10), so use a development key with ",[2427,6839,6840],{},"*",[2439,6842,2462],{"href":2461},"). ",[2427,6845,6846],{},"REVENEXX_TENANT"," is your ",[2439,6849,2452],{"href":2451},[2427,6851,6852],{},"REVENEXX_API_KEY"," is a key you ",[2439,6855,6856],{"href":2456},"create in Cockpit",[2586,6858,6861],{"className":3863,"code":6859,"filename":6860,"language":3866,"meta":2591,"style":2591},"curl -s https:\u002F\u002Fapi.revenexx.com\u002Fv1\u002Fevents\u002Fcatalog \\\n  -H \"X-Revenexx-Tenant: $REVENEXX_TENANT\" \\\n  -H \"X-Revenexx-Api-Key: $REVENEXX_API_KEY\" \\\n  | jq -r '.emits[] | select(.app == \"locations\" and .name == \"transfer.received\") | .topic'\n","Request",[2427,6862,6863,6877,6894,6910],{"__ignoreMap":2591},[2595,6864,6865,6868,6871,6874],{"class":2597,"line":2598},[2595,6866,6867],{"class":2640},"curl",[2595,6869,6870],{"class":2605}," -s",[2595,6872,6873],{"class":2605}," https:\u002F\u002Fapi.revenexx.com\u002Fv1\u002Fevents\u002Fcatalog",[2595,6875,6876],{"class":2610}," \\\n",[2595,6878,6879,6882,6884,6887,6890,6892],{"class":2597,"line":2617},[2595,6880,6881],{"class":2605},"  -H",[2595,6883,2651],{"class":2601},[2595,6885,6886],{"class":2605},"X-Revenexx-Tenant: ",[2595,6888,6889],{"class":2610},"$REVENEXX_TENANT",[2595,6891,2602],{"class":2601},[2595,6893,6876],{"class":2610},[2595,6895,6896,6898,6900,6903,6906,6908],{"class":2597,"line":2634},[2595,6897,6881],{"class":2605},[2595,6899,2651],{"class":2601},[2595,6901,6902],{"class":2605},"X-Revenexx-Api-Key: ",[2595,6904,6905],{"class":2610},"$REVENEXX_API_KEY",[2595,6907,2602],{"class":2601},[2595,6909,6876],{"class":2610},[2595,6911,6912,6915,6918,6921,6923,6926],{"class":2597,"line":2703},[2595,6913,6914],{"class":2601},"  |",[2595,6916,6917],{"class":2640}," jq",[2595,6919,6920],{"class":2605}," -r",[2595,6922,4093],{"class":2601},[2595,6924,6925],{"class":2605},".emits[] | select(.app == \"locations\" and .name == \"transfer.received\") | .topic",[2595,6927,6928],{"class":2601},"'\n",[2586,6930,6935],{"className":6931,"code":6933,"filename":6934,"language":2904,"meta":2591},[6932],"language-text","acme.locations.transfer.received\n","Response",[2427,6936,6933],{"__ignoreMap":2591},[2405,6938,6939,6941,6942,6944,6945,6948,6949,6951],{},[2427,6940,2447],{}," is the event's ",[2409,6943,3441],{},". The topic puts your vendor and your app in front of it, ",[2427,6946,6947],{},"\u003Cvendor>.\u003Capp>.\u003Cname>",", and that is what a subscriber matches. Subscribe with the exact string the catalog lists, not the bare two-segment name (see ",[2439,6950,604],{"href":605},").",[2405,6953,6954,6955,6958,6959,6961,6962,2584],{},"To see one arrive, register a webhook endpoint in Cockpit under ",[2409,6956,6957],{},"Integration Studio → Webhooks → Outbound",", subscribed to that topic (see ",[2439,6960,719],{"href":720},"). Then ship a transfer, receive it through the gateway, and read the endpoint's delivery attempts in Cockpit. The two location ids are any two of your locations, from ",[2427,6963,6964],{},"GET \u002Fv1\u002Flocations",[2586,6966,6969],{"className":3863,"code":6967,"filename":6968,"language":3866,"meta":2591,"style":2591},"TRANSFER_ID=$(curl -s -X POST https:\u002F\u002Fapi.revenexx.com\u002Fv1\u002Flocations\u002Ftransfers \\\n  -H \"X-Revenexx-Tenant: $REVENEXX_TENANT\" \\\n  -H \"X-Revenexx-Api-Key: $REVENEXX_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"from_location_id\": \"\u003CFROM_LOCATION_ID>\", \"to_location_id\": \"\u003CTO_LOCATION_ID>\", \"sku\": \"WIDGET-1\", \"quantity\": 12 }' | jq -r .id)\n\ncurl -s -X POST https:\u002F\u002Fapi.revenexx.com\u002Fv1\u002Flocations\u002Ftransfers\u002Freceive \\\n  -H \"X-Revenexx-Tenant: $REVENEXX_TENANT\" \\\n  -H \"X-Revenexx-Api-Key: $REVENEXX_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d \"{ \\\"transfer_id\\\": \\\"$TRANSFER_ID\\\" }\"\n","Receive a transfer",[2427,6970,6971,6994,7008,7022,7035,7060,7064,7079,7093,7107,7119],{"__ignoreMap":2591},[2595,6972,6973,6976,6979,6981,6983,6986,6989,6992],{"class":2597,"line":2598},[2595,6974,6975],{"class":2610},"TRANSFER_ID",[2595,6977,6978],{"class":2601},"=$(",[2595,6980,6867],{"class":2640},[2595,6982,6870],{"class":2605},[2595,6984,6985],{"class":2605}," -X",[2595,6987,6988],{"class":2605}," POST",[2595,6990,6991],{"class":2605}," https:\u002F\u002Fapi.revenexx.com\u002Fv1\u002Flocations\u002Ftransfers",[2595,6993,6876],{"class":2610},[2595,6995,6996,6998,7000,7002,7004,7006],{"class":2597,"line":2617},[2595,6997,6881],{"class":2605},[2595,6999,2651],{"class":2601},[2595,7001,6886],{"class":2605},[2595,7003,6889],{"class":2610},[2595,7005,2602],{"class":2601},[2595,7007,6876],{"class":2610},[2595,7009,7010,7012,7014,7016,7018,7020],{"class":2597,"line":2634},[2595,7011,6881],{"class":2605},[2595,7013,2651],{"class":2601},[2595,7015,6902],{"class":2605},[2595,7017,6905],{"class":2610},[2595,7019,2602],{"class":2601},[2595,7021,6876],{"class":2610},[2595,7023,7024,7026,7028,7031,7033],{"class":2597,"line":2703},[2595,7025,6881],{"class":2605},[2595,7027,2651],{"class":2601},[2595,7029,7030],{"class":2605},"Content-Type: application\u002Fjson",[2595,7032,2602],{"class":2601},[2595,7034,6876],{"class":2610},[2595,7036,7037,7040,7042,7045,7047,7050,7052,7054,7057],{"class":2597,"line":2794},[2595,7038,7039],{"class":2605},"  -d",[2595,7041,4093],{"class":2601},[2595,7043,7044],{"class":2605},"{ \"from_location_id\": \"\u003CFROM_LOCATION_ID>\", \"to_location_id\": \"\u003CTO_LOCATION_ID>\", \"sku\": \"WIDGET-1\", \"quantity\": 12 }",[2595,7046,3965],{"class":2601},[2595,7048,7049],{"class":2601}," |",[2595,7051,6917],{"class":2640},[2595,7053,6920],{"class":2605},[2595,7055,7056],{"class":2605}," .id",[2595,7058,7059],{"class":2601},")\n",[2595,7061,7062],{"class":2597,"line":2879},[2595,7063,3981],{"emptyLinePlaceholder":3980},[2595,7065,7066,7068,7070,7072,7074,7077],{"class":2597,"line":2924},[2595,7067,6867],{"class":2640},[2595,7069,6870],{"class":2605},[2595,7071,6985],{"class":2605},[2595,7073,6988],{"class":2605},[2595,7075,7076],{"class":2605}," https:\u002F\u002Fapi.revenexx.com\u002Fv1\u002Flocations\u002Ftransfers\u002Freceive",[2595,7078,6876],{"class":2610},[2595,7080,7081,7083,7085,7087,7089,7091],{"class":2597,"line":2984},[2595,7082,6881],{"class":2605},[2595,7084,2651],{"class":2601},[2595,7086,6886],{"class":2605},[2595,7088,6889],{"class":2610},[2595,7090,2602],{"class":2601},[2595,7092,6876],{"class":2610},[2595,7094,7095,7097,7099,7101,7103,7105],{"class":2597,"line":3059},[2595,7096,6881],{"class":2605},[2595,7098,2651],{"class":2601},[2595,7100,6902],{"class":2605},[2595,7102,6905],{"class":2610},[2595,7104,2602],{"class":2601},[2595,7106,6876],{"class":2610},[2595,7108,7109,7111,7113,7115,7117],{"class":2597,"line":3118},[2595,7110,6881],{"class":2605},[2595,7112,2651],{"class":2601},[2595,7114,7030],{"class":2605},[2595,7116,2602],{"class":2601},[2595,7118,6876],{"class":2610},[2595,7120,7121,7123,7125,7128,7131,7133,7135,7137,7140,7142],{"class":2597,"line":3175},[2595,7122,7039],{"class":2605},[2595,7124,2651],{"class":2601},[2595,7126,7127],{"class":2605},"{ ",[2595,7129,7130],{"class":2610},"\\\"",[2595,7132,3526],{"class":2605},[2595,7134,7130],{"class":2610},[2595,7136,2611],{"class":2605},[2595,7138,7139],{"class":2610},"\\\"$TRANSFER_ID\\\"",[2595,7141,2789],{"class":2605},[2595,7143,7144],{"class":2601},"\"\n",[2405,7146,7147,7148,7150],{},"The delivery carries your ",[2427,7149,6570],{}," object as the body, with the event id and the topic as headers. Call the route a second time and no second delivery appears, which is the idempotent id at work.",[2490,7152,7154],{"id":7153},"who-can-listen","Who can listen",[2405,7156,7157],{},"Who reacts to the event:",[3793,7159,7160,7174,7184],{},[3796,7161,7162,7165,7166,7169,7170,7173],{},[2409,7163,7164],{},"A system you run",": a ",[2439,7167,7168],{"href":720},"Webhook"," endpoint. Delivery is at least once, so dedupe on the ",[2427,7171,7172],{},"X-Revenexx-Event-Id"," header.",[3796,7175,7176,7179,7180,7183],{},[2409,7177,7178],{},"A durable workflow against an external system",": an Integration Studio event trigger. See ",[2439,7181,7182],{"href":271},"Hand an order to your ERP"," for one.",[3796,7185,7186,7189,7190,7192,7193,2441,7196,7199,7200,4026],{},[2409,7187,7188],{},"Another App",": an App can declare a ",[2427,7191,3420],{}," entry, but only the two lifecycle events, ",[2427,7194,7195],{},"app.installed",[2427,7197,7198],{},"app.uninstalled",", are verified for App handlers today (as of 2026-09). For a business event, declare the listen on a staging tenant, cause the event, and read the handler's execution log before you rely on it. See ",[2439,7201,1133],{"href":1134},[2405,7203,7204],{},"Delivery guarantees and ordering for App handlers are not settled enough to document (as of 2026-09), so build consumers that tolerate a repeat and a missing event, and re-read the entity through the API when you need the truth.",[2490,7206,7208],{"id":7207},"a-row-event-and-a-business-event-for-the-same-moment","A row event and a business event for the same moment",[2405,7210,7211,7212,7214,7215,7218],{},"A transfer row insert and ",[2427,7213,2447],{}," can both describe part of the same story. ",[2409,7216,7217],{},"Tell consumers which one to subscribe to, and to take one, never both."," A consumer that takes both handles the moment twice. When a business event exists, it is usually the one to recommend: it fires when the fact is complete, where the row event fires on the first write and can arrive before the rest of the rows exist.",[2490,7220,7222],{"id":7221},"troubleshooting","Troubleshooting",[3793,7224,7225,7240,7257,7276,7287,7296,7302,7311,7320,7337],{},[3796,7226,7227,7232,7233,7236,7237,7239],{},[2409,7228,7229,7231],{},[2427,7230,3848],{}," is undefined."," You have not declared an app-fired event, the client was not regenerated after you did (",[2427,7234,7235],{},"revenexx apps generate","), or ",[2427,7238,2466],{}," is older than 0.8.0.",[3796,7241,7242,7245,7246,7248,7249,7252,7253,7256],{},[2409,7243,7244],{},"The call throws \"not declared by this app\"."," The name in ",[2427,7247,2429],{}," does not match an ",[2427,7250,7251],{},"events.emits"," entry with ",[2427,7254,7255],{},"\"trigger\": \"app\"",". A typo fails the same way in a mock and on the platform.",[3796,7258,7259,7262,7263,7265,7266,2481,7268,7270,7271,7273,7274,4026],{},[2409,7260,7261],{},"Validation refuses the manifest."," An app-fired event without a ",[2427,7264,3681],{},", with ",[2427,7267,2759],{},[2427,7269,3827],{}," or ",[2427,7272,3830],{}," on it, or with a name that is not two lowercase segments. See ",[2439,7275,1248],{"href":1249},[3796,7277,7278,7283,7284,7286],{},[2409,7279,7280,7282],{},[2427,7281,4951],{}," is refused."," It must match ",[2427,7285,5700],{},", and the platform does not clean it up. Pass the resource's id, not a path or an email address.",[3796,7288,7289,7292,7293,7295],{},[2409,7290,7291],{},"A consumer never receives it."," Check the subscription is the four-segment topic from the catalog, not ",[2427,7294,2447],{},". Then check the endpoint in Cockpit is switched on.",[3796,7297,7298,7301],{},[2409,7299,7300],{},"A consumer receives it twice."," Either it subscribed to both the row event and the business event, or the platform retried and the consumer does not dedupe on the event id.",[3796,7303,7304,7307,7308,7310],{},[2409,7305,7306],{},"A retry published a second event."," No ",[2427,7309,2641],{}," was set, or the id changes between attempts (a timestamp, a random value). Build it from what happened.",[3796,7312,7313,7316,7317,7319],{},[2409,7314,7315],{},"The event is missing after a crash."," The route died before it emitted, and the retry took a path that skips the emit. Emit on the retry path too, as step 4 does, and rely on the ",[2427,7318,2641],{}," to absorb the repeat.",[3796,7321,7322,7327,7328,7330,7331,7333,7334,7336],{},[2409,7323,7324,7231],{},[2427,7325,7326],{},"db.transfers"," The client was not regenerated after ",[2427,7329,2557],{}," was added to ",[2427,7332,2572],{},". Run ",[2427,7335,7235],{}," (step 3).",[3796,7338,7339,7342,7343,7345,7346,7348,7349,2481,7351,7270,7353,7355,7356,7358],{},[2409,7340,7341],{},"A call throws \"transfers.get() is not permitted — add the matching access to manifest.permissions\"."," ",[2427,7344,2557],{}," is missing from ",[2427,7347,2579],{},", or lacks ",[2427,7350,3240],{},[2427,7352,3249],{},[2427,7354,3258],{}," (step 1). Fix the list, then run ",[2427,7357,7235],{}," again, because the allowed operations are baked into the generated client.",[2490,7360,7362],{"id":7361},"where-to-go-next","Where to go next",[3793,7364,7365,7370,7375,7380,7386],{},[3796,7366,7367,7369],{},[2439,7368,1127],{"href":1128}," — every field of the declaration, payload locators and realtime channels.",[3796,7371,7372,7374],{},[2439,7373,1133],{"href":1134}," — the other direction, and what is verified.",[3796,7376,7377,7379],{},[2439,7378,379],{"href":380}," — webhooks, events or analytics, and when each fits.",[3796,7381,7382,7385],{},[2439,7383,7384],{"href":1219},"Operating an App"," — what to watch once it is live.",[3796,7387,7388,7390],{},[2439,7389,145],{"href":146}," — the idempotent backfill pattern, for a route you may run twice.",[7392,7393,7394],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":2591,"searchDepth":2617,"depth":2617,"links":7396},[7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407,7408,7409],{"id":2492,"depth":2617,"text":2493},{"id":2550,"depth":2617,"text":2551},{"id":3402,"depth":2617,"text":3403},{"id":3842,"depth":2617,"text":3843},{"id":3899,"depth":2617,"text":3900},{"id":5648,"depth":2617,"text":5649},{"id":5707,"depth":2617,"text":5708},{"id":6043,"depth":2617,"text":6044},{"id":6827,"depth":2617,"text":6828},{"id":7153,"depth":2617,"text":7154},{"id":7207,"depth":2617,"text":7208},{"id":7221,"depth":2617,"text":7222},{"id":7361,"depth":2617,"text":7362},"Have your App announce a fact that is not a row change — declare the event with a sample, publish it from a route after the write, pick an id that makes a retry harmless and a topicId that keeps one entity on one channel, test it with the mock adapter, and look up the topic your consumers subscribe to.","md",null,{},{"icon":129},{"title":124,"description":7410},{"loc":125},"oj6AZsi1w4r9Iy0iu7-mGXuXBq5zwaHoyu6UM1nRekw",1792158126657]