<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>oContis Studio Blog</title>
  <subtitle>London-based creative consultancy studio specialized in Shopify theme and app development for brands and businesses</subtitle>
  <link href="https://ocontis.studio/feed.xml" rel="self" />
  <link href="https://ocontis.studio/" />
  <updated>2026-10-05T10:00:00Z</updated>
  <id>https://ocontis.studio/</id>
  <author>
    <name>Octavian Contis</name>
    <email>hello@ocontis.studio</email>
  </author>
  <entry>
    <title>Shopify Canvas: How to Review Sidekick Theme Changes Before They Go Live</title>
    <link href="https://ocontis.studio/blog/post/shopify-canvas-how-to-review-sidekick-theme-changes-before-they-go-live/" />
    <updated>2026-10-05T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/shopify-canvas-how-to-review-sidekick-theme-changes-before-they-go-live/</id>
    <content type="html">&lt;h1&gt;Shopify Canvas: How to Review Sidekick Theme Changes Before They Go Live&lt;/h1&gt;&lt;p&gt;Marketing opens &lt;strong&gt;Shopify Canvas&lt;/strong&gt;, asks Sidekick to restack the homepage for a drop, and the unpublished preview looks tidy on a laptop. The live theme still carries review stars, a Markets hero for the EU catalogue, and a GitHub branch that last synced a snippet, not the asset Sidekick just wrote.&lt;/p&gt;&lt;p&gt;That session is the job: walk the edit through &lt;strong&gt;editor choice&lt;/strong&gt;, the launch gaps Shopify named on 1 October 2026, an unpublished-theme preview, and a person who can revert before anyone presses publish.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;This article teaches you to walk a Shopify Canvas or Sidekick storefront edit through editor choice, missing app-block and Markets checks, unpublished-theme preview, and a named rollback owner before it ships live. How Sidekick learns from admin GraphQL traffic belongs in &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-sidekicks-continual-learning-flywheel-what-merchants-should-know/&quot;&gt;&lt;em&gt;Shopify Sidekick&#39;s Continual Learning Flywheel: What Merchants Should Know&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Whether the current theme has already left the supportable Online Store 2.0 path belongs in &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-theme-customisation-limits-when-your-store-leaves-the-supportable-path/&quot;&gt;&lt;em&gt;Shopify Theme Customisation Limits: When Your Store Leaves the Supportable Path&lt;/em&gt;&lt;/a&gt;. This piece stays on the 1 October launch: Canvas is a new workspace next to the editor, and the review has to happen before Sidekick writes production section JSON.&lt;/p&gt;&lt;p&gt;Merchant and developer threads this week keep returning to the same launch facts Shopify staff posted: Canvas can describe a page and build it, and theme app extensions, Markets, translations, and Rollouts are still missing. The community signal is a missing review owner, not a missing design prompt.&lt;/p&gt;&lt;h2&gt;What changed&lt;/h2&gt;&lt;p&gt;On 1 October 2026 Shopify introduced &lt;strong&gt;Canvas&lt;/strong&gt;, a visual workspace that lays out every page of a store in one place. A merchant can click into a section and edit it, or describe the layout and have &lt;strong&gt;Sidekick&lt;/strong&gt; assemble the page. Shopify said Canvas launches alongside the online store editor and would roll out over the following days.&lt;/p&gt;&lt;p&gt;The same staff posts listed what Canvas cannot do at launch. Theme app extensions are unsupported. A theme created or duplicated in Canvas will not show app blocks or embeds. Themes edited in Canvas do not appear when an app lists the store&#39;s themes. Rollouts, Markets, and translations are also out of scope for now. Shopify framed those gaps as early-product limits, and said it expects theme app extension support within a few weeks, before Canvas becomes the default editor.&lt;/p&gt;&lt;p&gt;The Theme Store post added a second boundary: Canvas does not yet have full backwards compatibility with third-party themes. Shopify said the Theme Store still matters for merchants who want a polished starting theme, and that theme developers will have a role in the later state. Until that compatibility lands, a premium theme your agency already forked is still an editor-and-code surface, even if Canvas is visible in admin.&lt;/p&gt;&lt;p&gt;Canvas sits on top of the same Online Store 2.0 idea &lt;a href=&quot;https://ocontis.studio/blog/post/online-store-2-0-what-changed-and-why-it-matters/&quot;&gt;&lt;em&gt;Online Store 2.0: What Changed and Why It Matters&lt;/em&gt;&lt;/a&gt; already covered: JSON templates, sections, and merchant-editable settings. The new risk is speed. A prompt can restack a homepage faster than a developer can map which section file now owns the hero, and faster than an app can find the theme in the Admin API.&lt;/p&gt;&lt;figure class=&quot;blog-diagram epmb-figure&quot; role=&quot;figure&quot; aria-labelledby=&quot;epmb-23-caption&quot; data-diagram-id=&quot;epmb-23&quot;&gt;
  &lt;p class=&quot;epmb-figure__summary visually-hidden&quot; id=&quot;epmb-23-summary&quot;&gt;Review a Canvas change before it goes live&lt;/p&gt;
  &lt;div class=&quot;epmb-figure__brand epmb-figure__brand--top-right&quot;&gt;
  &lt;img class=&quot;epmb-figure__logo&quot; src=&quot;/assets/favicons/safari-pinned-tab.svg&quot; alt=&quot;oContis Studio&quot; width=&quot;32&quot; height=&quot;32&quot; decoding=&quot;async&quot; /&gt;
&lt;/div&gt;
  &lt;div class=&quot;epmb-figure__content&quot;&gt;
    
    &lt;svg id=&quot;epmb-23&quot; width=&quot;100%&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; class=&quot;flowchart&quot; style=&quot;max-width: 333.26953125px;&quot; viewBox=&quot;-8 -50.1015625 333.26953125 426.55781249999995&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot;&gt;&lt;style&gt;#epmb-23{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;fill:#fafae6;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#epmb-23 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#epmb-23 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#epmb-23 .error-icon{fill:#141414;}#epmb-23 .error-text{fill:#ebebeb;stroke:#ebebeb;}#epmb-23 .edge-thickness-normal{stroke-width:1px;}#epmb-23 .edge-thickness-thick{stroke-width:3.5px;}#epmb-23 .edge-pattern-solid{stroke-dasharray:0;}#epmb-23 .edge-thickness-invisible{stroke-width:0;fill:none;}#epmb-23 .edge-pattern-dashed{stroke-dasharray:3;}#epmb-23 .edge-pattern-dotted{stroke-dasharray:2;}#epmb-23 .marker{fill:#8a8a7a;stroke:#8a8a7a;}#epmb-23 .marker.cross{stroke:#8a8a7a;}#epmb-23 svg{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;}#epmb-23 p{margin:0;}#epmb-23 .label{font-family:&#39;Syne&#39;,system-ui,sans-serif;color:#fafae6;}#epmb-23 .cluster-label text{fill:#fafae6;}#epmb-23 .cluster-label span{color:#fafae6;}#epmb-23 .cluster-label span p{background-color:transparent;}#epmb-23 .label text,#epmb-23 span{fill:#fafae6;color:#fafae6;}#epmb-23 .node rect,#epmb-23 .node circle,#epmb-23 .node ellipse,#epmb-23 .node polygon,#epmb-23 .node path{fill:#141414;stroke:#db5461;stroke-width:1px;}#epmb-23 .rough-node .label text,#epmb-23 .node .label text,#epmb-23 .image-shape .label,#epmb-23 .icon-shape .label{text-anchor:middle;}#epmb-23 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#epmb-23 .rough-node .label,#epmb-23 .node .label,#epmb-23 .image-shape .label,#epmb-23 .icon-shape .label{text-align:center;}#epmb-23 .node.clickable{cursor:pointer;}#epmb-23 .root .anchor path{fill:#8a8a7a!important;stroke-width:0;stroke:#8a8a7a;}#epmb-23 .arrowheadPath{fill:#f1eff0;}#epmb-23 .edgePath .path{stroke:#8a8a7a;stroke-width:1px;}#epmb-23 .flowchart-link{stroke:#8a8a7a;fill:none;}#epmb-23 .edgeLabel{background-color:#141414;text-align:center;}#epmb-23 .edgeLabel p{background-color:#141414;}#epmb-23 .edgeLabel rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-23 .labelBkg{background-color:rgba(20, 20, 20, 0.5);}#epmb-23 .cluster rect{fill:#141414;stroke:hsl(0, 0%, 17.8431372549%);stroke-width:1px;}#epmb-23 .cluster text{fill:#fafae6;}#epmb-23 .cluster span{color:#fafae6;}#epmb-23 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:12px;background:#141414;border:1px solid hsl(0, 0%, 17.8431372549%);border-radius:2px;pointer-events:none;z-index:100;}#epmb-23 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fafae6;}#epmb-23 rect.text{fill:none;stroke-width:0;}#epmb-23 .icon-shape,#epmb-23 .image-shape{background-color:#141414;text-align:center;}#epmb-23 .icon-shape p,#epmb-23 .image-shape p{background-color:#141414;padding:2px;}#epmb-23 .icon-shape .label rect,#epmb-23 .image-shape .label rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-23 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#epmb-23 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#epmb-23 .node .neo-node{stroke:#db5461;}#epmb-23 [data-look=&quot;neo&quot;].node rect,#epmb-23 [data-look=&quot;neo&quot;].cluster rect,#epmb-23 [data-look=&quot;neo&quot;].node polygon{stroke:url(#epmb-23-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-23 [data-look=&quot;neo&quot;].swimlane.cluster rect{filter:none;}#epmb-23 [data-look=&quot;neo&quot;].node path{stroke:url(#epmb-23-gradient);stroke-width:1px;}#epmb-23 [data-look=&quot;neo&quot;].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-23 [data-look=&quot;neo&quot;].node .neo-line path{stroke:#db5461;filter:none;}#epmb-23 [data-look=&quot;neo&quot;].node circle{stroke:url(#epmb-23-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-23 [data-look=&quot;neo&quot;].node circle .state-start{fill:#000000;}#epmb-23 [data-look=&quot;neo&quot;].icon-shape .icon{fill:url(#epmb-23-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-23 [data-look=&quot;neo&quot;].icon-shape .icon-neo path{stroke:url(#epmb-23-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-23 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;epmb-23_flowchart-v2-pointEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 10 5 L 0 10 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-23_flowchart-v2-pointStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;4.5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 5 L 10 10 L 10 0 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-23_flowchart-v2-pointEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;11.5&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;10.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 11.5 7 L 0 14 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-23_flowchart-v2-pointStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;1&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;polygon points=&quot;0,7 11.5,14 11.5,0&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-23_flowchart-v2-circleEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;11&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-23_flowchart-v2-circleStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-1&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-23_flowchart-v2-circleEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refY=&quot;5&quot; refX=&quot;12.25&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-23_flowchart-v2-circleStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-2&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-23_flowchart-v2-crossEnd&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;12&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-23_flowchart-v2-crossStart&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;-1&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-23_flowchart-v2-crossEnd-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;17.7&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-23_flowchart-v2-crossStart-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;-3.5&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;g class=&quot;root&quot;&gt;&lt;g class=&quot;clusters&quot;/&gt;&lt;g class=&quot;edgePaths&quot;&gt;&lt;path d=&quot;M131.09,60.889L131.09,65.056C131.09,69.222,131.09,77.556,131.09,85.222C131.09,92.889,131.09,99.889,131.09,103.389L131.09,106.889&quot; id=&quot;epmb-23-L_E_G_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_E_G_0&quot; data-points=&quot;W3sieCI6MTMxLjA4OTg0Mzc1LCJ5Ijo2MC44ODkwNjI0OTk5OTk5OTR9LHsieCI6MTMxLjA4OTg0Mzc1LCJ5Ijo4NS44ODkwNjI1fSx7IngiOjEzMS4wODk4NDM3NSwieSI6MTEwLjg4OTA2MjUwMDAwMDAxfV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-23_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M131.09,163.778L131.09,167.945C131.09,172.111,131.09,180.445,131.09,188.111C131.09,195.778,131.09,202.778,131.09,206.278L131.09,209.778&quot; id=&quot;epmb-23-L_G_P_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_G_P_0&quot; data-points=&quot;W3sieCI6MTMxLjA4OTg0Mzc1LCJ5IjoxNjMuNzc4MTI1MDAwMDAwMDJ9LHsieCI6MTMxLjA4OTg0Mzc1LCJ5IjoxODguNzc4MTI1fSx7IngiOjEzMS4wODk4NDM3NSwieSI6MjEzLjc3ODEyNX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-23_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M131.09,266.667L131.09,270.834C131.09,275.001,131.09,283.334,131.09,291.001C131.09,298.667,131.09,305.667,131.09,309.167L131.09,312.667&quot; id=&quot;epmb-23-L_P_R_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_P_R_0&quot; data-points=&quot;W3sieCI6MTMxLjA4OTg0Mzc1LCJ5IjoyNjYuNjY3MTg3NX0seyJ4IjoxMzEuMDg5ODQzNzUsInkiOjI5MS42NjcxODc0OTk5OTk5NX0seyJ4IjoxMzEuMDg5ODQzNzUsInkiOjMxNi42NjcxODc0OTk5OTk5NX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-23_flowchart-v2-pointEnd)&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabels&quot;&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_E_G_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_G_P_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_P_R_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;nodes&quot;&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-23-flowchart-E-0&quot; data-look=&quot;classic&quot; transform=&quot;translate(131.08984375, 34.44453125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-123.08984375&quot; y=&quot;-26.44453125&quot; width=&quot;246.1796875&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Choose&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Canvas&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; or&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; theme&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;editor&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-23-flowchart-G-1&quot; data-look=&quot;classic&quot; transform=&quot;translate(131.08984375, 137.33359375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-104.9453125&quot; y=&quot;-26.44453125&quot; width=&quot;209.890625&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Check&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; apps&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Markets&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;translations&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-23-flowchart-P-3&quot; data-look=&quot;classic&quot; transform=&quot;translate(131.08984375, 240.22265625)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-108.08984375&quot; y=&quot;-26.44453125&quot; width=&quot;216.1796875&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Preview&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; unpublished&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;theme&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-23-flowchart-R-5&quot; data-look=&quot;classic&quot; transform=&quot;translate(131.08984375, 342.56171874999995)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-109.7890625&quot; y=&quot;-25.89453125&quot; width=&quot;219.578125&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Name&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; rollback&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; owner&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-23-drop-shadow&quot; height=&quot;130%&quot; width=&quot;130%&quot;&gt;&lt;fedropshadow dx=&quot;4&quot; dy=&quot;4&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-23-drop-shadow-small&quot; height=&quot;150%&quot; width=&quot;150%&quot;&gt;&lt;fedropshadow dx=&quot;2&quot; dy=&quot;2&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;linearGradient id=&quot;epmb-23-gradient&quot; gradientUnits=&quot;objectBoundingBox&quot; x1=&quot;0%&quot; y1=&quot;0%&quot; x2=&quot;100%&quot; y2=&quot;0%&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#db5461&quot; stop-opacity=&quot;1&quot;/&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;hsl(0, 0%, 20.1960784314%)&quot; stop-opacity=&quot;1&quot;/&gt;&lt;/linearGradient&gt;&lt;text text-anchor=&quot;middle&quot; x=&quot;158.634765625&quot; y=&quot;-25&quot; class=&quot;flowchartTitleText&quot;&gt;Review a Canvas change before it goes live&lt;/text&gt;&lt;/svg&gt;
  &lt;/div&gt;
  
  &lt;figcaption class=&quot;epmb-figure__caption&quot; id=&quot;epmb-23-caption&quot;&gt;Review a Canvas change before it goes live&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h2&gt;Who is affected&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Storefront shape&lt;/th&gt;&lt;th&gt;What Canvas can do this week&lt;/th&gt;&lt;th&gt;What to keep on the theme editor&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Existing live theme with app blocks (reviews, wishlists, subscriptions)&lt;/td&gt;&lt;td&gt;Experiment on a duplicate if you accept missing blocks&lt;/td&gt;&lt;td&gt;Any change that must keep those blocks visible&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Theme created or duplicated inside Canvas&lt;/td&gt;&lt;td&gt;Prompt-led layout on Shopify-native sections&lt;/td&gt;&lt;td&gt;App embeds, Markets, translations, Rollouts&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GitHub-connected or CLI-owned theme&lt;/td&gt;&lt;td&gt;Visual sketch you then port as a reviewed pull request&lt;/td&gt;&lt;td&gt;The commit that production will actually ship&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Third-party or heavily forked premium theme&lt;/td&gt;&lt;td&gt;Limited, until Shopify documents backwards compatibility&lt;/td&gt;&lt;td&gt;Section groups, custom Liquid, and Support-facing files&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Hydrogen or headless storefront&lt;/td&gt;&lt;td&gt;Nothing on the headless surface&lt;/td&gt;&lt;td&gt;Your existing storefront pipeline&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Established DTC brands feel this first when marketing already uses Sidekick in admin and now sees a storefront workspace that can write pages. App-heavy catalogues (reviews, loyalty, subscriptions, scripts) stay on the editor until Shopify ships theme app extension support. Multi-market brands keep Markets and translation checks outside Canvas. Agency-owned GitHub themes need a human commit after any prompt, because Canvas-edited themes may never appear in the app listing your partner uses to inspect files.&lt;/p&gt;&lt;p&gt;Shopify also told developers that existing themes keep working in the online store editor, and that apps can stay on their current code for day one. The merchant still has two editors and one published theme, so the review below assumes you will keep selling on the current theme while Canvas is early.&lt;/p&gt;&lt;h2&gt;Choose Canvas or the theme editor for this edit&lt;/h2&gt;&lt;p&gt;Write the change in one sentence before anyone opens Sidekick: new homepage stack, collection banner, product-page trust row, or a whole theme duplicate. Then pick the surface that can still see the apps and markets that change depends on.&lt;/p&gt;&lt;p&gt;Use the &lt;strong&gt;online store editor&lt;/strong&gt; when the page already mounts theme app extensions, when the copy must follow a Markets catalogue, or when the file lives on a GitHub branch your team deploys. Use &lt;strong&gt;Canvas&lt;/strong&gt; when you want a visual map of every page, or when you want Sidekick to propose a layout you will later rebuild as named sections. Do not run the same change in both surfaces on the live theme in the same hour, because you will lose the trail of which tool wrote the JSON.&lt;/p&gt;&lt;p&gt;Sidekick is louder in admin than it was a year ago, and some teams are already hunting for a way to shrink the Sidekick chrome so the rest of admin fits on a small laptop. Treat that chrome as an admin preference, and keep the storefront decision on the page you are about to publish.&lt;/p&gt;&lt;p&gt;If the sentence you wrote is &amp;quot;make the homepage feel more premium&amp;quot; with no section list, stay in the editor or write the section list first. Canvas will happily invent modules. &lt;a href=&quot;https://ocontis.studio/blog/post/the-anatomy-of-a-high-performance-shopify-theme/&quot;&gt;&lt;em&gt;The Anatomy of a High-Performance Shopify Theme&lt;/em&gt;&lt;/a&gt; is the map of sections, assets, and settings you should be able to point at after the prompt finishes.&lt;/p&gt;&lt;h2&gt;Check app blocks, Markets, translations, and Rollouts&lt;/h2&gt;&lt;p&gt;Before you preview, open the unpublished theme and list every storefront app the live page currently shows: reviews, loyalty, subscriptions, size guides, scripts, and any block a merchant added from the theme editor. Then walk the same page in Canvas or on the Canvas-created duplicate and mark each block present, missing, or unknown.&lt;/p&gt;&lt;p&gt;Shopify&#39;s launch note is blunt on this point. Theme app extensions are unsupported. A Canvas-created or Canvas-duplicated theme will not offer those blocks. Apps that list themes for install or audit will not see Canvas-edited themes. Reviews, analytics tags, and other embeds that look &amp;quot;part of the theme&amp;quot; to a merchandiser are still app-owned, and they drop off the page without a Liquid error.&lt;/p&gt;&lt;p&gt;Do the same pass for &lt;strong&gt;Markets&lt;/strong&gt;, &lt;strong&gt;translations&lt;/strong&gt;, and &lt;strong&gt;Rollouts&lt;/strong&gt;. Canvas does not support them at launch. A UK default homepage can look finished while the German market still serves the previous hero, the wrong currency presentation, or a missing language string. &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-markets-black-friday-traps-duties-currency-and-catalog-gaps/&quot;&gt;&lt;em&gt;Shopify Markets Black Friday Traps: Duties, Currency, and Catalog Gaps&lt;/em&gt;&lt;/a&gt; is the market-by-market record you already keep for peak traffic; reuse that sheet and add a Canvas column that says supported or not for this edit.&lt;/p&gt;&lt;p&gt;Write the gaps in the same note as the editor choice. &amp;quot;Homepage restack, Canvas, reviews missing, EU market not previewed&amp;quot; is enough for a second pair of eyes. &amp;quot;Looks good&amp;quot; is not a check.&lt;/p&gt;&lt;h2&gt;Preview on an unpublished theme&lt;/h2&gt;&lt;p&gt;Duplicate the live theme, or create the Canvas experiment as an unpublished copy, before Sidekick writes anything you cannot discard. Shopify&#39;s own theme-customisation guidance still starts with a backup copy. Canvas makes that step easier to skip because the workspace feels like a sketch, and the publish control is still one click.&lt;/p&gt;&lt;p&gt;Preview on a phone and a desktop. Confirm price, variant picker, and add-to-cart still sit where the live PDP puts them. Confirm the header and footer still come from the section groups your theme already uses. If Canvas added a second announcement bar or a new header row, you are already close to the duplicate-chrome problem the customisation-limits article walks through.&lt;/p&gt;&lt;p&gt;If the store connects the theme to GitHub, fetch the branch after the save and confirm the files you expected actually landed. Theme-editor uploads of assets have recently failed to commit while new snippets succeeded, and Shopify staff treated that as a defect. A Canvas save that never appears in &lt;code&gt;git log&lt;/code&gt; is the same class of problem: the admin looks updated, and the rollback copy your developers trust is stale. Keep the unpublished theme itself as the revert target until the commit exists.&lt;/p&gt;&lt;p&gt;Do not publish from Canvas because the laptop preview looks closer to the campaign Figma. Publish when the unpublished theme has passed the app-block list, the Markets list, and a second person who was not in the Sidekick chat.&lt;/p&gt;&lt;h2&gt;Name a rollback owner&lt;/h2&gt;&lt;p&gt;Write one name next to the unpublished theme: who can publish the previous copy, who can revert the GitHub commit, and who tells paid media to pause if the live page loses reviews or a market hero. Canvas and Sidekick do not create that owner. The workspace can generate a page in a minute and leave three teams assuming someone else can undo it.&lt;/p&gt;&lt;p&gt;The owner needs access to Online Store, Themes, and the GitHub repo if you use one. They need the theme name of the last known-good unpublished copy, not a Slack memory of &amp;quot;the version from Tuesday.&amp;quot; If your apps cannot see Canvas-edited themes, the owner also needs a browser session on the theme editor, because the partner dashboard may not list the file they have to restore.&lt;/p&gt;&lt;p&gt;Put a time box on the first live week. Shopify said Canvas would evolve daily and that app support would follow in weeks, not as a same-day toggle. A homepage experiment you publish on 6 October may need a different review on 20 October once theme app extensions land. Keep the rollback name in the same note you update when Shopify documents those surfaces.&lt;/p&gt;&lt;p&gt;If nobody on staff can read section JSON or restore a theme, stop at unpublished preview and hire the theme work. Prompt-led layout is still theme architecture. The hire path for this job is &lt;a href=&quot;https://ocontis.studio/services/shopify-theme-development/&quot;&gt;Shopify theme development&lt;/a&gt;, because the artifact is a storefront your marketing team can keep editing after Sidekick leaves the chat.&lt;/p&gt;&lt;h2&gt;What this does not change&lt;/h2&gt;&lt;p&gt;Canvas does not retire the online store editor this week. Shopify launched the two surfaces together and told developers that existing themes and app installs keep working in the editor. A store that never opens Canvas still sells.&lt;/p&gt;&lt;p&gt;Canvas does not replace a supportable section model. If the live theme already mixes leftover static header tags, Custom CSS dumps, and undocumented Liquid, Sidekick will write into that mess. Recover the section groups first, then let Canvas propose layouts on a clean duplicate.&lt;/p&gt;&lt;p&gt;Canvas does not replace the Sidekick admin flywheel work, the Claude connector permission model, or checkout Functions. Those are different jobs. This review is only for storefront files Sidekick can now reach through a visual workspace.&lt;/p&gt;&lt;p&gt;Canvas also does not make the Theme Store obsolete on day one. Shopify said the store remains a destination for a polished starting theme, even while it rethinks that role. Buying a new premium theme to &amp;quot;be ready for Canvas&amp;quot; is a later architecture project, not a launch-week task.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;You can now walk a Shopify Canvas or Sidekick storefront edit through a written editor choice, a list of missing app blocks and Markets surfaces, an unpublished-theme preview, and a named person who can revert the live theme. That is the whole launch-week job. The prompt is the easy part.&lt;/p&gt;&lt;p&gt;When the unpublished copy already drifts from the section groups your team can name, or when Canvas hides the apps your product pages depend on, &lt;a href=&quot;https://ocontis.studio/services/shopify-theme-development/&quot;&gt;Shopify theme development&lt;/a&gt; is the path that puts an owner back on the files. Book a &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;discovery call&lt;/a&gt; if you want that review before marketing treats Canvas as the default editor.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Shopify New Customer Accounts vs Classic: A Decision Framework</title>
    <link href="https://ocontis.studio/blog/post/shopify-new-customer-accounts-vs-classic-a-decision-framework/" />
    <updated>2026-10-01T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/shopify-new-customer-accounts-vs-classic-a-decision-framework/</id>
    <content type="html">&lt;h1&gt;Shopify New Customer Accounts vs Classic: A Decision Framework&lt;/h1&gt;&lt;p&gt;You open Settings, Customer accounts and start a login inventory: the header sign-in link, the cart chip, the third-party social buttons on the old register page, the membership popup, and the checkout email field. Two of those still write a customer profile on your domain. The rest now send the shopper to Shopify&#39;s hosted passwordless screen, and the loyalty tag that used to fire on register never writes.&lt;/p&gt;&lt;p&gt;That inventory is the job: map each live Shopify login path against &lt;strong&gt;New Customer Accounts&lt;/strong&gt;, choose native Google or Facebook, Shop, a Plus identity provider, or stay on classic, and list the theme or app surfaces you must rebuild before sunset.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;This article teaches you to map each live Shopify login path against New Customer Accounts, choose native Google or Facebook, Shop, a Plus identity provider, or stay on classic, and list theme or app surfaces to rebuild before sunset. Whether Plus is the right plan for checkout, B2B, and fees belongs in &lt;a href=&quot;https://ocontis.studio/blog/post/choosing-the-right-shopify-plan-a-practical-decision-framework/&quot;&gt;&lt;em&gt;Choosing the Right Shopify Plan&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Hosted account pages you cannot theme sit next to hosted checkout in &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-accessibility-bugs-that-block-wcag-aa/&quot;&gt;&lt;em&gt;How to Fix Shopify Accessibility Bugs That Block WCAG AA&lt;/em&gt;&lt;/a&gt;. Another 2026 platform sunset, the Additional Scripts cutoff, is covered in &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-additional-scripts-cutoff-on-26-august-2026-what-happened-and-what-to-do-now/&quot;&gt;&lt;em&gt;Shopify Additional Scripts Cutoff on 26 August 2026&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Merchant and developer threads keep returning to the same fork. A store switches to New Customer Accounts, a social-login app that depended on classic Liquid or custom OIDC goes quiet, and registrations fall in the same week. The useful move is a path-by-path map, not a blanket revert or a Plus upgrade bought for two buttons.&lt;/p&gt;&lt;h2&gt;Map each live login path&lt;/h2&gt;&lt;p&gt;Walk the store as a first-time buyer and as a returning customer. Record every place a shopper can create or resume an account, including paths marketing still promotes in email and ads.&lt;/p&gt;&lt;p&gt;Use this list as the worksheet:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Header or drawer &lt;strong&gt;Sign in&lt;/strong&gt; / &lt;strong&gt;Account&lt;/strong&gt; link&lt;/li&gt;&lt;li&gt;Cart or checkout &lt;strong&gt;Sign in&lt;/strong&gt; chip&lt;/li&gt;&lt;li&gt;Theme pages that still point at &lt;code&gt;/account/login&lt;/code&gt; or &lt;code&gt;/account/register&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Third-party social buttons (Google, Facebook, Apple, SMS) injected by an app&lt;/li&gt;&lt;li&gt;Membership, loyalty, or wholesale portals that host their own login&lt;/li&gt;&lt;li&gt;Mobile app deep links that used Multipass or a shared token&lt;/li&gt;&lt;li&gt;Popups and landing pages that promised &amp;quot;create an account&amp;quot; and wrote tags or metafields&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For each row, write four facts: the URL or app, whether it still works after a New Customer Accounts switch, which customer profile fields it writes, and what enrolment side effect it owned (newsletter, loyalty, B2B company). Shopify&#39;s help centre treats a customer profile in admin as an account already: anyone with that email can request a one-time code. A broken button can still leave an order, so measure &lt;strong&gt;new member registrations&lt;/strong&gt; and &lt;strong&gt;first-time checkout completion&lt;/strong&gt; separately from paid-order count.&lt;/p&gt;&lt;p&gt;This reflects patterns we see regularly across the Shopify merchant and developer community: the drop shows up in membership and CRM reports first, then someone blames traffic mix.&lt;/p&gt;&lt;h2&gt;The decision merchants face&lt;/h2&gt;&lt;p&gt;Shopify now ships two account products with the same admin label.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Classic customer accounts&lt;/strong&gt; (legacy) render login, register, and account pages from theme Liquid. Shoppers use email and password on your domain. Apps and custom CSS can attach to those templates. Multipass on Plus can mint a session from an external system.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;New Customer Accounts&lt;/strong&gt; host sign-in and the account area on Shopify&#39;s domain. The default method is a six-digit email code. Sessions can last up to 365 days. Optional methods are Sign in with Shop (when Shop Pay is on) and native Google or Facebook social sign-in. Shopify Plus can replace that whole experience with your own identity provider.&lt;/p&gt;&lt;p&gt;From February 2026, Shopify deprecated classic accounts for new stores and for stores that were not already using them, and feature updates plus technical support for the legacy version have stopped. A sunset date is due later in 2026, after which the legacy Liquid files will be locked and then removed, and a brand-new store has no classic toggle.&lt;/p&gt;&lt;p&gt;The decision is therefore one of four paths:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Stay on classic&lt;/strong&gt; if the store still has that option, and put a rebuild date on the calendar before sunset.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Switch to New Customer Accounts&lt;/strong&gt; and turn on native Google or Facebook plus email codes (and Shop if you already run Shop Pay).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Switch and accept email codes or Shop only&lt;/strong&gt;, then rebuild enrolment that used to live on the register page.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Connect a Plus identity provider&lt;/strong&gt; when you need Apple, SMS from an app, Multipass-style mobile SSO, or any OIDC source Shopify does not list.&lt;/li&gt;&lt;/ol&gt;&lt;figure class=&quot;blog-diagram epmb-figure&quot; role=&quot;figure&quot; aria-labelledby=&quot;epmb-22-caption&quot; data-diagram-id=&quot;epmb-22&quot;&gt;
  &lt;p class=&quot;epmb-figure__summary visually-hidden&quot; id=&quot;epmb-22-summary&quot;&gt;Customer accounts decision&lt;/p&gt;
  &lt;div class=&quot;epmb-figure__brand epmb-figure__brand--top-right&quot;&gt;
  &lt;img class=&quot;epmb-figure__logo&quot; src=&quot;/assets/favicons/safari-pinned-tab.svg&quot; alt=&quot;oContis Studio&quot; width=&quot;32&quot; height=&quot;32&quot; decoding=&quot;async&quot; /&gt;
&lt;/div&gt;
  &lt;div class=&quot;epmb-figure__content&quot;&gt;
    
    &lt;svg id=&quot;epmb-22&quot; width=&quot;100%&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; class=&quot;flowchart&quot; style=&quot;max-width: 803.346484375px;&quot; viewBox=&quot;-8 -50.1015625 803.346484375 1036.4703125&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot;&gt;&lt;style&gt;#epmb-22{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;fill:#fafae6;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#epmb-22 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#epmb-22 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#epmb-22 .error-icon{fill:#141414;}#epmb-22 .error-text{fill:#ebebeb;stroke:#ebebeb;}#epmb-22 .edge-thickness-normal{stroke-width:1px;}#epmb-22 .edge-thickness-thick{stroke-width:3.5px;}#epmb-22 .edge-pattern-solid{stroke-dasharray:0;}#epmb-22 .edge-thickness-invisible{stroke-width:0;fill:none;}#epmb-22 .edge-pattern-dashed{stroke-dasharray:3;}#epmb-22 .edge-pattern-dotted{stroke-dasharray:2;}#epmb-22 .marker{fill:#8a8a7a;stroke:#8a8a7a;}#epmb-22 .marker.cross{stroke:#8a8a7a;}#epmb-22 svg{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;}#epmb-22 p{margin:0;}#epmb-22 .label{font-family:&#39;Syne&#39;,system-ui,sans-serif;color:#fafae6;}#epmb-22 .cluster-label text{fill:#fafae6;}#epmb-22 .cluster-label span{color:#fafae6;}#epmb-22 .cluster-label span p{background-color:transparent;}#epmb-22 .label text,#epmb-22 span{fill:#fafae6;color:#fafae6;}#epmb-22 .node rect,#epmb-22 .node circle,#epmb-22 .node ellipse,#epmb-22 .node polygon,#epmb-22 .node path{fill:#141414;stroke:#db5461;stroke-width:1px;}#epmb-22 .rough-node .label text,#epmb-22 .node .label text,#epmb-22 .image-shape .label,#epmb-22 .icon-shape .label{text-anchor:middle;}#epmb-22 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#epmb-22 .rough-node .label,#epmb-22 .node .label,#epmb-22 .image-shape .label,#epmb-22 .icon-shape .label{text-align:center;}#epmb-22 .node.clickable{cursor:pointer;}#epmb-22 .root .anchor path{fill:#8a8a7a!important;stroke-width:0;stroke:#8a8a7a;}#epmb-22 .arrowheadPath{fill:#f1eff0;}#epmb-22 .edgePath .path{stroke:#8a8a7a;stroke-width:1px;}#epmb-22 .flowchart-link{stroke:#8a8a7a;fill:none;}#epmb-22 .edgeLabel{background-color:#141414;text-align:center;}#epmb-22 .edgeLabel p{background-color:#141414;}#epmb-22 .edgeLabel rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-22 .labelBkg{background-color:rgba(20, 20, 20, 0.5);}#epmb-22 .cluster rect{fill:#141414;stroke:hsl(0, 0%, 17.8431372549%);stroke-width:1px;}#epmb-22 .cluster text{fill:#fafae6;}#epmb-22 .cluster span{color:#fafae6;}#epmb-22 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:12px;background:#141414;border:1px solid hsl(0, 0%, 17.8431372549%);border-radius:2px;pointer-events:none;z-index:100;}#epmb-22 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fafae6;}#epmb-22 rect.text{fill:none;stroke-width:0;}#epmb-22 .icon-shape,#epmb-22 .image-shape{background-color:#141414;text-align:center;}#epmb-22 .icon-shape p,#epmb-22 .image-shape p{background-color:#141414;padding:2px;}#epmb-22 .icon-shape .label rect,#epmb-22 .image-shape .label rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-22 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#epmb-22 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#epmb-22 .node .neo-node{stroke:#db5461;}#epmb-22 [data-look=&quot;neo&quot;].node rect,#epmb-22 [data-look=&quot;neo&quot;].cluster rect,#epmb-22 [data-look=&quot;neo&quot;].node polygon{stroke:url(#epmb-22-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-22 [data-look=&quot;neo&quot;].swimlane.cluster rect{filter:none;}#epmb-22 [data-look=&quot;neo&quot;].node path{stroke:url(#epmb-22-gradient);stroke-width:1px;}#epmb-22 [data-look=&quot;neo&quot;].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-22 [data-look=&quot;neo&quot;].node .neo-line path{stroke:#db5461;filter:none;}#epmb-22 [data-look=&quot;neo&quot;].node circle{stroke:url(#epmb-22-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-22 [data-look=&quot;neo&quot;].node circle .state-start{fill:#000000;}#epmb-22 [data-look=&quot;neo&quot;].icon-shape .icon{fill:url(#epmb-22-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-22 [data-look=&quot;neo&quot;].icon-shape .icon-neo path{stroke:url(#epmb-22-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-22 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;epmb-22_flowchart-v2-pointEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 10 5 L 0 10 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-22_flowchart-v2-pointStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;4.5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 5 L 10 10 L 10 0 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-22_flowchart-v2-pointEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;11.5&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;10.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 11.5 7 L 0 14 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-22_flowchart-v2-pointStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;1&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;polygon points=&quot;0,7 11.5,14 11.5,0&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-22_flowchart-v2-circleEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;11&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-22_flowchart-v2-circleStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-1&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-22_flowchart-v2-circleEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refY=&quot;5&quot; refX=&quot;12.25&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-22_flowchart-v2-circleStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-2&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-22_flowchart-v2-crossEnd&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;12&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-22_flowchart-v2-crossStart&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;-1&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-22_flowchart-v2-crossEnd-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;17.7&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-22_flowchart-v2-crossStart-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;-3.5&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;g class=&quot;root&quot;&gt;&lt;g class=&quot;clusters&quot;/&gt;&lt;g class=&quot;edgePaths&quot;&gt;&lt;path d=&quot;M228.673,59.789L228.673,63.956C228.673,68.122,228.673,76.456,228.673,84.122C228.673,91.789,228.673,98.789,228.673,102.289L228.673,105.789&quot; id=&quot;epmb-22-L_INV_Q1_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_INV_Q1_0&quot; data-points=&quot;W3sieCI6MjI4LjY3MzQzNzQ5OTk5OTk4LCJ5Ijo1OS43ODkwNjI1fSx7IngiOjIyOC42NzM0Mzc0OTk5OTk5OCwieSI6ODQuNzg5MDYyNX0seyJ4IjoyMjguNjczNDM3NDk5OTk5OTgsInkiOjEwOS43ODkwNjI1MDAwMDAwNH1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-22_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M181.509,265.873L169.231,280.049C156.954,294.226,132.399,322.579,120.121,353.3C107.844,384.021,107.844,417.109,107.844,433.653L107.844,450.198&quot; id=&quot;epmb-22-L_Q1_STAY_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_Q1_STAY_0&quot; data-points=&quot;W3sieCI6MTgxLjUwODg2NTYyMTIzMDIsInkiOjI2NS44NzI5MjgxMjEyMzAyNX0seyJ4IjoxMDcuODQzNzUsInkiOjM1MC45MzIwMzEyNX0seyJ4IjoxMDcuODQzNzUsInkiOjQ1NC4xOTc2NTYyNX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-22_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M275.838,265.873L288.116,280.049C300.393,294.226,324.948,322.579,337.226,342.405C349.503,362.23,349.503,373.528,349.503,379.177L349.503,384.827&quot; id=&quot;epmb-22-L_Q1_Q2_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_Q1_Q2_0&quot; data-points=&quot;W3sieCI6Mjc1LjgzODAwOTM3ODc2OTY0LCJ5IjoyNjUuODcyOTI4MTIxMjMwM30seyJ4IjozNDkuNTAzMTI0OTk5OTk5OTUsInkiOjM1MC45MzIwMzEyNX0seyJ4IjozNDkuNTAzMTI0OTk5OTk5OTUsInkiOjM4OC44MjY1NjI1MDAwMDAxfV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-22_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M303.53,526.485L289.512,540.463C275.494,554.441,247.459,582.396,233.441,614.495C219.423,646.593,219.423,682.834,219.423,700.954L219.423,719.074&quot; id=&quot;epmb-22-L_Q2_PLUS_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_Q2_PLUS_0&quot; data-points=&quot;W3sieCI6MzAzLjUzMDAxMjEzNjA4NjUsInkiOjUyNi40ODQ2OTk2MzYwODY3fSx7IngiOjIxOS40MjM0Mzc0OTk5OTk5OCwieSI6NjEwLjM1MjM0Mzc1fSx7IngiOjIxOS40MjM0Mzc0OTk5OTk5OCwieSI6NzIzLjA3NDIxODc1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-22_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M395.476,526.485L409.494,540.463C423.512,554.441,451.547,582.396,465.565,602.023C479.583,621.651,479.583,632.949,479.583,638.598L479.583,644.247&quot; id=&quot;epmb-22-L_Q2_Q3_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_Q2_Q3_0&quot; data-points=&quot;W3sieCI6Mzk1LjQ3NjIzNzg2MzkxMzQ3LCJ5Ijo1MjYuNDg0Njk5NjM2MDg2NX0seyJ4Ijo0NzkuNTgyODEyNSwieSI6NjEwLjM1MjM0Mzc1fSx7IngiOjQ3OS41ODI4MTI1MDAwMDAzLCJ5Ijo2NDguMjQ2ODc1MDAwMDAwM31d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-22_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M429.564,799.671L415.109,814.324C400.654,828.976,371.744,858.281,357.29,878.582C342.835,898.883,342.835,910.182,342.835,915.831L342.835,921.48&quot; id=&quot;epmb-22-L_Q3_NATIVE_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_Q3_NATIVE_0&quot; data-points=&quot;W3sieCI6NDI5LjU2MzU3NjA3NTIyNjMsInkiOjc5OS42NzEzODg1NzUyMjY0fSx7IngiOjM0Mi44MzQ3NjU2MjUsInkiOjg4Ny41ODUxNTYyNTAwMDAxfSx7IngiOjM0Mi44MzQ3NjU2MjUsInkiOjkyNS40Nzk2ODc1MDAwMDAxfV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-22_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M529.602,799.671L544.057,814.324C558.512,828.976,587.421,858.281,601.876,878.582C616.331,898.883,616.331,910.182,616.331,915.831L616.331,921.48&quot; id=&quot;epmb-22-L_Q3_REBUILD_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_Q3_REBUILD_0&quot; data-points=&quot;W3sieCI6NTI5LjYwMjA0ODkyNDc3MzYsInkiOjc5OS42NzEzODg1NzUyMjU5fSx7IngiOjYxNi4zMzA4NTkzNzUsInkiOjg4Ny41ODUxNTYyNTAwMDAxfSx7IngiOjYxNi4zMzA4NTkzNzUsInkiOjkyNS40Nzk2ODc1MDAwMDAxfV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-22_flowchart-v2-pointEnd)&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabels&quot;&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_INV_Q1_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(107.84375, 350.93203125)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q1_STAY_0&quot; transform=&quot;translate(-43.78125, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-16.74609375&quot; y=&quot;-18.1015625&quot; width=&quot;121.0546875&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Yes,&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; sunset&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; later&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(349.50312499999995, 350.93203125)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q1_Q2_0&quot; transform=&quot;translate(-34.107421875, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-12.86328125&quot; y=&quot;-18.1015625&quot; width=&quot;93.94140625&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;No&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; or&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; switching&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(219.42343749999998, 610.35234375)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q2_PLUS_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-14.78515625&quot; y=&quot;-18.1015625&quot; width=&quot;29.5703125&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Yes&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(479.5828125, 610.35234375)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q2_Q3_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-12.86328125&quot; y=&quot;-18.1015625&quot; width=&quot;25.7265625&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;No&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(342.834765625, 887.5851562500001)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q3_NATIVE_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-14.78515625&quot; y=&quot;-18.1015625&quot; width=&quot;29.5703125&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Yes&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(616.330859375, 887.5851562500001)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q3_REBUILD_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-12.86328125&quot; y=&quot;-18.1015625&quot; width=&quot;25.7265625&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;No&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;nodes&quot;&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-22-flowchart-INV-0&quot; data-look=&quot;classic&quot; transform=&quot;translate(228.67343749999998, 33.89453125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-127.2734375&quot; y=&quot;-25.89453125&quot; width=&quot;254.546875&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Inventory&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; every&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; login&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; path&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-22-flowchart-Q1-1&quot; data-look=&quot;classic&quot; transform=&quot;translate(228.67343749999998, 211.41328125)&quot;&gt;&lt;polygon points=&quot;101.62421875,0 203.2484375,-101.62421875 101.62421875,-203.2484375 0,-101.62421875&quot; class=&quot;label-container&quot; transform=&quot;translate(-101.12421875, 101.62421875)&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Classic&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; still&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; on&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;and&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; toggle&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; remains?&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-22-flowchart-STAY-3&quot; data-look=&quot;classic&quot; transform=&quot;translate(107.84375, 480.64218750000003)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-99.84375&quot; y=&quot;-26.44453125&quot; width=&quot;199.6875&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Stay&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; on&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; classic&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;with&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; a&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; rebuild&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; date&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-22-flowchart-Q2-5&quot; data-look=&quot;classic&quot; transform=&quot;translate(349.50312499999995, 480.64218750000003)&quot;&gt;&lt;polygon points=&quot;91.815625,0 183.63125,-91.815625 91.815625,-183.63125 0,-91.815625&quot; class=&quot;label-container&quot; transform=&quot;translate(-91.315625, 91.815625)&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Need&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Apple,&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; SMS,&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;or&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; custom&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; OIDC?&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-22-flowchart-PLUS-7&quot; data-look=&quot;classic&quot; transform=&quot;translate(219.42343749999998, 748.96875)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-109.4375&quot; y=&quot;-25.89453125&quot; width=&quot;218.875&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Plus&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; identity&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; provider&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-22-flowchart-Q3-9&quot; data-look=&quot;classic&quot; transform=&quot;translate(479.5828125, 748.96875)&quot;&gt;&lt;polygon points=&quot;100.721875,0 201.44375,-100.721875 100.721875,-201.44375 0,-100.721875&quot; class=&quot;label-container&quot; transform=&quot;translate(-100.221875, 100.721875)&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Google&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; or&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Facebook&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;cover&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; the&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; traffic?&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-22-flowchart-NATIVE-11&quot; data-look=&quot;classic&quot; transform=&quot;translate(342.834765625, 951.92421875)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-107.98828125&quot; y=&quot;-26.44453125&quot; width=&quot;215.9765625&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Native&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; social&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; plus&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;email&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; code&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; and&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Shop&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-22-flowchart-REBUILD-13&quot; data-look=&quot;classic&quot; transform=&quot;translate(616.330859375, 951.92421875)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-115.5078125&quot; y=&quot;-26.44453125&quot; width=&quot;231.015625&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Email&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; or&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Shop&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; sign-in&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;plus&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; enrolment&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; rebuild&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-22-drop-shadow&quot; height=&quot;130%&quot; width=&quot;130%&quot;&gt;&lt;fedropshadow dx=&quot;4&quot; dy=&quot;4&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-22-drop-shadow-small&quot; height=&quot;150%&quot; width=&quot;150%&quot;&gt;&lt;fedropshadow dx=&quot;2&quot; dy=&quot;2&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;linearGradient id=&quot;epmb-22-gradient&quot; gradientUnits=&quot;objectBoundingBox&quot; x1=&quot;0%&quot; y1=&quot;0%&quot; x2=&quot;100%&quot; y2=&quot;0%&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#db5461&quot; stop-opacity=&quot;1&quot;/&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;hsl(0, 0%, 20.1960784314%)&quot; stop-opacity=&quot;1&quot;/&gt;&lt;/linearGradient&gt;&lt;text text-anchor=&quot;middle&quot; x=&quot;393.6732421875&quot; y=&quot;-25&quot; class=&quot;flowchartTitleText&quot;&gt;Customer accounts decision&lt;/text&gt;&lt;/svg&gt;
  &lt;/div&gt;
  
  &lt;figcaption class=&quot;epmb-figure__caption&quot; id=&quot;epmb-22-caption&quot;&gt;Customer accounts decision&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h2&gt;Criteria that actually matter&lt;/h2&gt;&lt;p&gt;Five facts decide the row, and none of them is &amp;quot;we like the old password box.&amp;quot;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. Which identity methods your buyers already use.&lt;/strong&gt; Native social on New Customer Accounts is Google and Facebook only. Apple, SMS OTP from a login app, and a corporate IdP sit behind Plus. Shop sign-in is available when Shop Pay is active, and it can prefill checkout.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. What the old register page wrote besides a password.&lt;/strong&gt; Native social syncs the email onto the customer profile. It does not replay an app hook that tagged VIP, opted the shopper into a list, or created a loyalty wallet. If that hook paid for itself, budget a replacement before you switch.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. Whether you still own the HTML.&lt;/strong&gt; New account pages are hosted. You can change branding in Settings and add Customer Account UI extensions. You cannot restyle &lt;code&gt;customers/login.liquid&lt;/code&gt; once you leave classic. Brands that treated the login page as a campaign landing page lose that canvas.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. Headless, Hydrogen, and Storefront API tokens.&lt;/strong&gt; Shopify is moving customer-scoped data and authenticated actions to the Customer Account API. Storefront API customer mutations are on a deprecation path. A Hydrogen password form that called &lt;code&gt;customerAccessTokenCreate&lt;/code&gt; needs a new OAuth plan, not a theme tweak.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5. Plan economics versus identity scope.&lt;/strong&gt; Plus for a custom IdP is the same gate Multipass always had. If you already need Plus for checkout UI extensions or B2B, fold identity into that contract. If the only gap is Google and Facebook, native social on a lower plan closes it. The fee and checkout half of that call lives in the plan framework, not here.&lt;/p&gt;&lt;p&gt;Checkout that stalls before payment is a different map: start with &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-checkout-abandonment-when-your-funnel-looks-healthy/&quot;&gt;&lt;em&gt;How to Fix Shopify Checkout Abandonment When Your Funnel Looks Healthy&lt;/em&gt;&lt;/a&gt;. Plus checkout display versus logic is covered in &lt;a href=&quot;https://ocontis.studio/blog/post/when-to-use-checkout-ui-extensions-vs-shopify-functions/&quot;&gt;&lt;em&gt;When to Use Checkout UI Extensions vs Shopify Functions&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Framework&lt;/h2&gt;&lt;p&gt;Score each inventoried path against the four options. A path that fails more than one &amp;quot;must have&amp;quot; on native social is a rebuild or a Plus row, not a hope that the app vendor will catch up.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Need&lt;/th&gt;&lt;th&gt;Stay on classic&lt;/th&gt;&lt;th&gt;New accounts: native social + email + Shop&lt;/th&gt;&lt;th&gt;New accounts: email or Shop only&lt;/th&gt;&lt;th&gt;Plus identity provider&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Available on a brand-new store (from Feb 2026)&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes, on Plus&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Email and password on your domain&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;No (email one-time code)&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Only if your IdP offers it&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Google or Facebook one-click&lt;/td&gt;&lt;td&gt;Via a third-party app&lt;/td&gt;&lt;td&gt;Native, all plans&lt;/td&gt;&lt;td&gt;Off unless you connect them&lt;/td&gt;&lt;td&gt;Your IdP, or native plus IdP&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Apple, SMS, or custom OIDC&lt;/td&gt;&lt;td&gt;App-dependent&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Theme Liquid login and register files&lt;/td&gt;&lt;td&gt;Yes, until sunset&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Loyalty or list enrolment at signup&lt;/td&gt;&lt;td&gt;Often via app on register&lt;/td&gt;&lt;td&gt;Email only unless you rebuild&lt;/td&gt;&lt;td&gt;Must rebuild&lt;/td&gt;&lt;td&gt;Depends on IdP claims and extensions&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mobile app shared login (old Multipass)&lt;/td&gt;&lt;td&gt;Plus Multipass&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Plus IdP&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Shopify support and feature updates&lt;/td&gt;&lt;td&gt;Stopped Feb 2026&lt;/td&gt;&lt;td&gt;Current product&lt;/td&gt;&lt;td&gt;Current product&lt;/td&gt;&lt;td&gt;Current product&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;To turn native social on, open &lt;strong&gt;Settings &amp;gt; Customer accounts &amp;gt; Authentication&lt;/strong&gt;, connect Google or Facebook with credentials from Google Cloud Console or Meta for Developers, and complete a sign-up on a phone from the old button&#39;s URL. Old &lt;code&gt;/account/register&lt;/code&gt; links often land on a plain sign-in screen because New Customer Accounts have no separate register page: the first successful code creates the profile.&lt;/p&gt;&lt;h2&gt;List theme and app surfaces to rebuild&lt;/h2&gt;&lt;p&gt;Write the rebuild list before you flip the toggle, because the admin switch takes minutes while recovering enrolment and SSO after a quiet week takes a rebuild sprint.&lt;/p&gt;&lt;p&gt;On the theme, replace hardcoded &lt;code&gt;/account/login&lt;/code&gt; and &lt;code&gt;/account/register&lt;/code&gt; copy with the &lt;code&gt;shopify-account&lt;/code&gt; web component, or the current theme account link that already uses it, and remove CSS and scripts that targeted classic customer templates. Theme Store submissions are moving to that component as a requirement, so a Dawn or custom theme that still ships the old files will force an upgrade when you change themes.&lt;/p&gt;&lt;p&gt;On apps, list every integration that injects a login button, a register form, or a customer Access Token. Third-party social login that needed custom OIDC on classic will stay broken on New Customer Accounts unless you are on Plus and the vendor rebuilt against the Customer Account API. Loyalty and form apps that only listened on &lt;code&gt;customers/register.liquid&lt;/code&gt; need a Customer Account UI extension or an owned form. App subscriptions that no longer fire are cost without a job: treat them like the unused seats in &lt;a href=&quot;https://ocontis.studio/blog/post/the-hidden-cost-of-running-a-shopify-store-when-12-apps-quietly-eat-your-margins/&quot;&gt;&lt;em&gt;The Hidden Cost of Running a Shopify Store When 12 Apps Quietly Eat Your Margins&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;On headless and custom storefronts, plan the Customer Account API OAuth flow before you promise a date. Embedded apps that used Storefront API &lt;code&gt;@inContext&lt;/code&gt; with a classic &lt;code&gt;customerAccessToken&lt;/code&gt; need a documented client for the new API, and you should confirm the current Partner path for your app type rather than assuming the Headless or Hydrogen channel is the only way to get credentials.&lt;/p&gt;&lt;p&gt;On analytics, annotate the switch date and compare 14 days before and after on new customer registrations, first-time checkout completion, and loyalty enrolments. Paid-order volume can stay flat while membership acquisition falls, which is the pattern that makes teams revert classic too early or stay on classic until the files lock.&lt;/p&gt;&lt;p&gt;On staff comms, password reset emails and &amp;quot;create your account&amp;quot; flows in your ESP still describe the old page, so update those templates the same week you switch or support tickets will recreate the old URL for you.&lt;/p&gt;&lt;h2&gt;Recommendation by scenario&lt;/h2&gt;&lt;h3&gt;Scenario A: non-Plus store, Google and Facebook cover the audience&lt;/h3&gt;&lt;p&gt;Stay on the current plan. Connect native Google and Facebook, keep email codes, and turn on Shop sign-in if Shop Pay is already live. Rebuild any register-page enrolment as a Customer Account UI extension or a post-login form. Classic is a delay tactic here, not a destination, because sunset will still arrive.&lt;/p&gt;&lt;h3&gt;Scenario B: non-Plus store, the social app also enrolled loyalty or SMS login&lt;/h3&gt;&lt;p&gt;Do not buy Plus on the first meeting. Measure whether native Google and Facebook recover registrations over two weeks. If the missing piece is Apple, SMS, or a wallet created at the old button, either rebuild that wallet on a page you own or put Plus IdP on the same roadmap as other Plus work. Revert to classic only when the admin still offers the toggle and you need weeks to rebuild, with a written sunset date on the ticket.&lt;/p&gt;&lt;h3&gt;Scenario C: Plus store, mobile app or enterprise IdP&lt;/h3&gt;&lt;p&gt;Treat New Customer Accounts as the default and book the identity-provider project as the Multipass replacement. Shared login between iOS, Android, and the storefront is an IdP job, not a Liquid job. Customer Account UI extensions cover order history, profile blocks, and branded account pages that classic Liquid used to fake. Checkout branding still does not automatically paint the account header: budget account branding separately from checkout UI extensions.&lt;/p&gt;&lt;h3&gt;Scenario D: new store, or a store that never used classic&lt;/h3&gt;&lt;p&gt;You have no classic path. Inventory the same way, then choose native social plus Shop or a Plus IdP. Spending a sprint hunting for a hidden legacy toggle wastes the week you should spend on the rebuild list.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;You can now map each live Shopify login path against New Customer Accounts, choose native Google or Facebook, Shop, a Plus identity provider, or stay on classic, and list the theme or app surfaces to rebuild before sunset. Classic remains a holding pattern for stores that still have the toggle. New Customer Accounts are the product Shopify will keep, and the work is the inventory plus the enrolment rebuild, not a debate about passwords.&lt;/p&gt;&lt;p&gt;If the map shows a social-login app, a Hydrogen token, and a Plus IdP question in the same stack, book a &lt;a href=&quot;https://ocontis.studio/services/shopify-stack-audit/&quot;&gt;Shopify stack assessment&lt;/a&gt; and we will turn the worksheet into a sequenced rebuild. For a discovery call that starts from the login inventory, use &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;contact&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>How to Fix Shopify Checkout Consent When Marketing Pixels Stay Denied</title>
    <link href="https://ocontis.studio/blog/post/how-to-fix-shopify-checkout-consent-when-marketing-pixels-stay-denied/" />
    <updated>2026-09-28T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/how-to-fix-shopify-checkout-consent-when-marketing-pixels-stay-denied/</id>
    <content type="html">&lt;h1&gt;How to Fix Shopify Checkout Consent When Marketing Pixels Stay Denied&lt;/h1&gt;&lt;p&gt;You match this morning&#39;s paid iDEAL orders against the cookie banner register. The shopper accepted marketing on the catalogue. The checkout custom pixel still sent &lt;code&gt;checkout_completed&lt;/code&gt; with marketing denied, so the Conversion API tag stayed dark.&lt;/p&gt;&lt;p&gt;That mismatch is the job: confirm the storefront banner wrote the grant into &lt;strong&gt;Shopify Customer Privacy&lt;/strong&gt;, then verify the checkout custom pixel read that record after the payment redirect and repair the handoff.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;This article teaches you to confirm the storefront cookie banner writes marketing consent into Shopify Customer Privacy, then verify checkout custom pixels read that record after a payment redirect and repair the handoff. Pasted Thank you scripts that went silent on 26 August 2026 are a separate failure, covered in &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-additional-scripts-cutoff-on-26-august-2026-what-happened-and-what-to-do-now/&quot;&gt;&lt;em&gt;Shopify Additional Scripts Cutoff on 26 August 2026&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Soft navigation that never delivers &lt;code&gt;page_viewed&lt;/code&gt; into pixel sandboxes belongs in &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-soft-navigation-and-the-web-pixel-gap/&quot;&gt;&lt;em&gt;Shopify Soft Navigation and the Web Pixel Gap&lt;/em&gt;&lt;/a&gt;. Checkout steps that stall before payment belong in &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-checkout-abandonment-when-your-funnel-looks-healthy/&quot;&gt;&lt;em&gt;How to Fix Shopify Checkout Abandonment When Your Funnel Looks Healthy&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Merchant and developer threads this week keep returning to the same leak. A third-party CMP and server-side GTM look coherent on the storefront, then checkout pixels fire without a marketing grant, while Shopify order counts stay intact and Meta or Google Ads look like a quiet week.&lt;/p&gt;&lt;h2&gt;What merchants are running into&lt;/h2&gt;&lt;p&gt;The storefront path can be coherent, with Consent Mode combinations validating and server GTM logs showing Meta only receiving events when &lt;code&gt;ad_storage&lt;/code&gt; is granted. The break appears once the shopper is inside checkout, especially after a redirect payment such as iDEAL.&lt;/p&gt;&lt;p&gt;Three symptoms show up together:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The CMP register records an accept, while the purchase hit that reached server GTM carries Google Consent Mode &lt;code&gt;gcs=G100&lt;/code&gt; (marketing denied).&lt;/li&gt;&lt;li&gt;The same order appears twice in pixel logs: denied at &lt;code&gt;checkout_completed&lt;/code&gt;, then granted 10 to 30 seconds later when &lt;code&gt;visitorConsentCollected&lt;/code&gt; finally arrives.&lt;/li&gt;&lt;li&gt;Android and in-app bank browsers account for most of the empty-consent purchases, because thank you opened somewhere other than the browser that saw the banner.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Shopify&#39;s native Google and Meta channel apps that subscribe to &lt;code&gt;checkout_completed&lt;/code&gt; through Customer events still fire. The custom pixel you added for server-side GTM, a CMP, or a CAPI bridge is the one that reads an empty or denied state and correctly refuses to send marketing.&lt;/p&gt;&lt;p&gt;This reflects patterns we see regularly across the Shopify merchant and developer community: brands that rebuilt tracking after Additional Scripts, then discovered the replacement pixel could not see the banner&#39;s grant.&lt;/p&gt;&lt;h2&gt;Why this happens&lt;/h2&gt;&lt;p&gt;Checkout custom pixels run in a &lt;strong&gt;lax sandbox on Shopify&#39;s domain&lt;/strong&gt;. They do not share the first-party cookies your CMP wrote on &lt;code&gt;yourdomain.com&lt;/code&gt;. Reading the banner&#39;s storage cookie from inside the pixel is expected to return nothing. Shopify&#39;s Pixel Privacy docs point pixels at &lt;code&gt;init.customerPrivacy&lt;/code&gt; and at &lt;code&gt;customerPrivacy.subscribe(&#39;visitorConsentCollected&#39;)&lt;/code&gt;, which is the only subscribe string that API accepts today.&lt;/p&gt;&lt;p&gt;The storefront Customer Privacy API is a different object. Themes and CMP scripts call &lt;code&gt;window.Shopify.customerPrivacy.setTrackingConsent()&lt;/code&gt; after &lt;code&gt;consent-tracking-api&lt;/code&gt; loads, and Shopify stores that decision in &lt;code&gt;_tracking_consent&lt;/code&gt;. Docs tell you never to read or patch that cookie yourself, because the format changes. A CDN or edge worker that strips cookies on the apex, or a CMP that only talks to Google Consent Mode, can leave checkout with an empty Shopify record.&lt;/p&gt;&lt;p&gt;Timing is a second, independent leak. The CMP&#39;s own checkout pixel often updates Shopify consent asynchronously. Your tracking pixel may already have handled &lt;code&gt;checkout_completed&lt;/code&gt; with the init snapshot (&lt;code&gt;marketingAllowed: false&lt;/code&gt; in a collect-after-consent region). A late &lt;code&gt;visitorConsentCollected&lt;/code&gt; then flips the grant. Without a replay that reuses the same &lt;code&gt;event_id&lt;/code&gt;, Meta treats the late hit as optional or drops it, and Google Ads never sees the conversion.&lt;/p&gt;&lt;p&gt;The third leak is the &lt;strong&gt;payment-provider redirect&lt;/strong&gt;. iDEAL, and similar bank flows, send the shopper out of Shopify and back through &lt;code&gt;/payment_providers/.../redirect/processing&lt;/code&gt;. On Android that return frequently opens Samsung Internet or the bank&#39;s in-app browser. No CMP cookie exists there. No third-party banner can render inside checkout. Shopify Payments test mode for iDEAL skips that redirect, so a test order can pass while live orders do not.&lt;/p&gt;&lt;figure class=&quot;blog-diagram epmb-figure&quot; role=&quot;figure&quot; aria-labelledby=&quot;epmb-21-caption&quot; data-diagram-id=&quot;epmb-21&quot;&gt;
  &lt;p class=&quot;epmb-figure__summary visually-hidden&quot; id=&quot;epmb-21-summary&quot;&gt;Checkout consent diagnostic&lt;/p&gt;
  &lt;div class=&quot;epmb-figure__brand epmb-figure__brand--top-right&quot;&gt;
  &lt;img class=&quot;epmb-figure__logo&quot; src=&quot;/assets/favicons/safari-pinned-tab.svg&quot; alt=&quot;oContis Studio&quot; width=&quot;32&quot; height=&quot;32&quot; decoding=&quot;async&quot; /&gt;
&lt;/div&gt;
  &lt;div class=&quot;epmb-figure__content&quot;&gt;
    
    &lt;svg id=&quot;epmb-21&quot; width=&quot;100%&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; class=&quot;flowchart&quot; style=&quot;max-width: 733.91328125px;&quot; viewBox=&quot;-8 -50.1015625 733.91328125 796.0406250000001&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot;&gt;&lt;style&gt;#epmb-21{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;fill:#fafae6;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#epmb-21 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#epmb-21 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#epmb-21 .error-icon{fill:#141414;}#epmb-21 .error-text{fill:#ebebeb;stroke:#ebebeb;}#epmb-21 .edge-thickness-normal{stroke-width:1px;}#epmb-21 .edge-thickness-thick{stroke-width:3.5px;}#epmb-21 .edge-pattern-solid{stroke-dasharray:0;}#epmb-21 .edge-thickness-invisible{stroke-width:0;fill:none;}#epmb-21 .edge-pattern-dashed{stroke-dasharray:3;}#epmb-21 .edge-pattern-dotted{stroke-dasharray:2;}#epmb-21 .marker{fill:#8a8a7a;stroke:#8a8a7a;}#epmb-21 .marker.cross{stroke:#8a8a7a;}#epmb-21 svg{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;}#epmb-21 p{margin:0;}#epmb-21 .label{font-family:&#39;Syne&#39;,system-ui,sans-serif;color:#fafae6;}#epmb-21 .cluster-label text{fill:#fafae6;}#epmb-21 .cluster-label span{color:#fafae6;}#epmb-21 .cluster-label span p{background-color:transparent;}#epmb-21 .label text,#epmb-21 span{fill:#fafae6;color:#fafae6;}#epmb-21 .node rect,#epmb-21 .node circle,#epmb-21 .node ellipse,#epmb-21 .node polygon,#epmb-21 .node path{fill:#141414;stroke:#db5461;stroke-width:1px;}#epmb-21 .rough-node .label text,#epmb-21 .node .label text,#epmb-21 .image-shape .label,#epmb-21 .icon-shape .label{text-anchor:middle;}#epmb-21 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#epmb-21 .rough-node .label,#epmb-21 .node .label,#epmb-21 .image-shape .label,#epmb-21 .icon-shape .label{text-align:center;}#epmb-21 .node.clickable{cursor:pointer;}#epmb-21 .root .anchor path{fill:#8a8a7a!important;stroke-width:0;stroke:#8a8a7a;}#epmb-21 .arrowheadPath{fill:#f1eff0;}#epmb-21 .edgePath .path{stroke:#8a8a7a;stroke-width:1px;}#epmb-21 .flowchart-link{stroke:#8a8a7a;fill:none;}#epmb-21 .edgeLabel{background-color:#141414;text-align:center;}#epmb-21 .edgeLabel p{background-color:#141414;}#epmb-21 .edgeLabel rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-21 .labelBkg{background-color:rgba(20, 20, 20, 0.5);}#epmb-21 .cluster rect{fill:#141414;stroke:hsl(0, 0%, 17.8431372549%);stroke-width:1px;}#epmb-21 .cluster text{fill:#fafae6;}#epmb-21 .cluster span{color:#fafae6;}#epmb-21 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:12px;background:#141414;border:1px solid hsl(0, 0%, 17.8431372549%);border-radius:2px;pointer-events:none;z-index:100;}#epmb-21 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fafae6;}#epmb-21 rect.text{fill:none;stroke-width:0;}#epmb-21 .icon-shape,#epmb-21 .image-shape{background-color:#141414;text-align:center;}#epmb-21 .icon-shape p,#epmb-21 .image-shape p{background-color:#141414;padding:2px;}#epmb-21 .icon-shape .label rect,#epmb-21 .image-shape .label rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-21 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#epmb-21 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#epmb-21 .node .neo-node{stroke:#db5461;}#epmb-21 [data-look=&quot;neo&quot;].node rect,#epmb-21 [data-look=&quot;neo&quot;].cluster rect,#epmb-21 [data-look=&quot;neo&quot;].node polygon{stroke:url(#epmb-21-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-21 [data-look=&quot;neo&quot;].swimlane.cluster rect{filter:none;}#epmb-21 [data-look=&quot;neo&quot;].node path{stroke:url(#epmb-21-gradient);stroke-width:1px;}#epmb-21 [data-look=&quot;neo&quot;].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-21 [data-look=&quot;neo&quot;].node .neo-line path{stroke:#db5461;filter:none;}#epmb-21 [data-look=&quot;neo&quot;].node circle{stroke:url(#epmb-21-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-21 [data-look=&quot;neo&quot;].node circle .state-start{fill:#000000;}#epmb-21 [data-look=&quot;neo&quot;].icon-shape .icon{fill:url(#epmb-21-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-21 [data-look=&quot;neo&quot;].icon-shape .icon-neo path{stroke:url(#epmb-21-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-21 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;epmb-21_flowchart-v2-pointEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 10 5 L 0 10 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-21_flowchart-v2-pointStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;4.5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 5 L 10 10 L 10 0 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-21_flowchart-v2-pointEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;11.5&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;10.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 11.5 7 L 0 14 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-21_flowchart-v2-pointStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;1&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;polygon points=&quot;0,7 11.5,14 11.5,0&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-21_flowchart-v2-circleEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;11&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-21_flowchart-v2-circleStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-1&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-21_flowchart-v2-circleEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refY=&quot;5&quot; refX=&quot;12.25&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-21_flowchart-v2-circleStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-2&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-21_flowchart-v2-crossEnd&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;12&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-21_flowchart-v2-crossStart&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;-1&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-21_flowchart-v2-crossEnd-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;17.7&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-21_flowchart-v2-crossStart-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;-3.5&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;g class=&quot;root&quot;&gt;&lt;g class=&quot;clusters&quot;/&gt;&lt;g class=&quot;edgePaths&quot;&gt;&lt;path d=&quot;M264.246,59.789L264.246,63.956C264.246,68.122,264.246,76.456,264.246,84.122C264.246,91.789,264.246,98.789,264.246,102.289L264.246,105.789&quot; id=&quot;epmb-21-L_S_W_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_S_W_0&quot; data-points=&quot;W3sieCI6MjY0LjI0NTcwMzEyNSwieSI6NTkuNzg5MDYyNX0seyJ4IjoyNjQuMjQ1NzAzMTI1LCJ5Ijo4NC43ODkwNjI1fSx7IngiOjI2NC4yNDU3MDMxMjUsInkiOjEwOS43ODkwNjI1MDAwMDAwM31d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-21_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M215.371,250.881L200.041,265.343C184.712,279.804,154.053,308.728,138.724,343.907C123.395,379.087,123.395,420.523,123.395,441.241L123.395,461.959&quot; id=&quot;epmb-21-L_W_A_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_W_A_0&quot; data-points=&quot;W3sieCI6MjE1LjM3MDU4OTQ5NTE0MzIsInkiOjI1MC44ODExMzYzNzAxNDMyOH0seyJ4IjoxMjMuMzk0NTMxMjUsInkiOjMzNy42NTA3ODEyNX0seyJ4IjoxMjMuMzk0NTMxMjUsInkiOjQ2NS45NTg1OTM3NTAwMDAwM31d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-21_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M313.121,250.881L328.45,265.343C343.78,279.804,374.438,308.728,389.768,328.838C405.097,348.949,405.097,360.247,405.097,365.896L405.097,371.545&quot; id=&quot;epmb-21-L_W_C_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_W_C_0&quot; data-points=&quot;W3sieCI6MzEzLjEyMDgxNjc1NDg1NjgsInkiOjI1MC44ODExMzYzNzAxNDMyfSx7IngiOjQwNS4wOTY4NzUsInkiOjMzNy42NTA3ODEyNX0seyJ4Ijo0MDUuMDk2ODc1LCJ5IjozNzUuNTQ1MzEyNX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-21_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M350.442,553.506L336.768,568.931C323.094,584.356,295.746,615.206,282.072,636.371C268.398,657.537,268.398,669.018,268.398,674.759L268.398,680.5&quot; id=&quot;epmb-21-L_C_P_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_C_P_0&quot; data-points=&quot;W3sieCI6MzUwLjQ0MjAwNDkyNDI0NTQ1LCJ5Ijo1NTMuNTA2MDY3NDI0MjQ1NX0seyJ4IjoyNjguMzk3NjU2MjUsInkiOjY0Ni4wNTU0Njg3NX0seyJ4IjoyNjguMzk3NjU2MjUsInkiOjY4NC41MDAwMDAwMDAwMDAxfV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-21_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M459.752,553.506L473.426,568.931C487.1,584.356,514.448,615.206,528.122,636.28C541.796,657.354,541.796,668.652,541.796,674.301L541.796,679.95&quot; id=&quot;epmb-21-L_C_F_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_C_F_0&quot; data-points=&quot;W3sieCI6NDU5Ljc1MTc0NTA3NTc1NDcsInkiOjU1My41MDYwNjc0MjQyNDU3fSx7IngiOjU0MS43OTYwOTM3NSwieSI6NjQ2LjA1NTQ2ODc1fSx7IngiOjU0MS43OTYwOTM3NSwieSI6NjgzLjk1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-21_flowchart-v2-pointEnd)&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabels&quot;&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_S_W_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(123.39453125, 337.65078125)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_W_A_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-12.86328125&quot; y=&quot;-18.1015625&quot; width=&quot;25.7265625&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;No&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(405.096875, 337.65078125)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_W_C_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-14.78515625&quot; y=&quot;-18.1015625&quot; width=&quot;29.5703125&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Yes&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(268.39765625, 646.05546875)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_C_P_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-14.78515625&quot; y=&quot;-18.1015625&quot; width=&quot;29.5703125&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Yes&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(541.79609375, 646.05546875)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_C_F_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-12.86328125&quot; y=&quot;-18.1015625&quot; width=&quot;25.7265625&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;No&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;nodes&quot;&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-21-flowchart-S-0&quot; data-look=&quot;classic&quot; transform=&quot;translate(264.245703125, 33.89453125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-125.11328125&quot; y=&quot;-25.89453125&quot; width=&quot;250.2265625&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;CMP&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; accept&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; on&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; storefront&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-21-flowchart-W-1&quot; data-look=&quot;classic&quot; transform=&quot;translate(264.245703125, 204.77265625)&quot;&gt;&lt;polygon points=&quot;94.98359375,0 189.9671875,-94.98359375 94.98359375,-189.9671875 0,-94.98359375&quot; class=&quot;label-container&quot; transform=&quot;translate(-94.48359375, 94.98359375)&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Written&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; to&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Customer&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Privacy?&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-21-flowchart-A-3&quot; data-look=&quot;classic&quot; transform=&quot;translate(123.39453125, 491.85312500000003)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-115.39453125&quot; y=&quot;-25.89453125&quot; width=&quot;230.7890625&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Fix&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; the&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; storefront&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; write&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-21-flowchart-C-5&quot; data-look=&quot;classic&quot; transform=&quot;translate(405.096875, 491.85312500000003)&quot;&gt;&lt;polygon points=&quot;116.3078125,0 232.615625,-116.3078125 116.3078125,-232.615625 0,-116.3078125&quot; class=&quot;label-container&quot; transform=&quot;translate(-115.8078125, 116.3078125)&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Pixel&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; sees&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; grant&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;at&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; checkout_completed?&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-21-flowchart-P-7&quot; data-look=&quot;classic&quot; transform=&quot;translate(268.39765625, 710.9445312500001)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-105.33984375&quot; y=&quot;-26.44453125&quot; width=&quot;210.6796875&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Send&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; CAPI&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; from&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; that&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;payload&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-21-flowchart-F-9&quot; data-look=&quot;classic&quot; transform=&quot;translate(541.79609375, 710.9445312500001)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-118.05859375&quot; y=&quot;-26.99453125&quot; width=&quot;236.1171875&quot; height=&quot;53.9890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.99453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Replay&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; on&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;visitorConsentCollected&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;2.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;or&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; stop&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; the&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; send&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-21-drop-shadow&quot; height=&quot;130%&quot; width=&quot;130%&quot;&gt;&lt;fedropshadow dx=&quot;4&quot; dy=&quot;4&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-21-drop-shadow-small&quot; height=&quot;150%&quot; width=&quot;150%&quot;&gt;&lt;fedropshadow dx=&quot;2&quot; dy=&quot;2&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;linearGradient id=&quot;epmb-21-gradient&quot; gradientUnits=&quot;objectBoundingBox&quot; x1=&quot;0%&quot; y1=&quot;0%&quot; x2=&quot;100%&quot; y2=&quot;0%&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#db5461&quot; stop-opacity=&quot;1&quot;/&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;hsl(0, 0%, 20.1960784314%)&quot; stop-opacity=&quot;1&quot;/&gt;&lt;/linearGradient&gt;&lt;text text-anchor=&quot;middle&quot; x=&quot;358.956640625&quot; y=&quot;-25&quot; class=&quot;flowchartTitleText&quot;&gt;Checkout consent diagnostic&lt;/text&gt;&lt;/svg&gt;
  &lt;/div&gt;
  
  &lt;figcaption class=&quot;epmb-figure__caption&quot; id=&quot;epmb-21-caption&quot;&gt;Checkout consent diagnostic&lt;/figcaption&gt;
&lt;/figure&gt;&lt;p&gt;Cart attributes and &lt;code&gt;orders/paid&lt;/code&gt; webhooks sit outside this diagram on purpose. They can carry a copy of the grant if you wrote it before checkout started, and they can also freeze an old decision or invent a send the shopper never confirmed in the checkout browser.&lt;/p&gt;&lt;h2&gt;How to diagnose it&lt;/h2&gt;&lt;p&gt;Start from Shopify&#39;s Customer Privacy record rather than from a GTM debug view, then work outward through the pixel and the order.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Confirm Customer privacy settings in admin under Settings, then Customer privacy. For the Netherlands, Belgium, and other collect-after-consent regions, non-essential purposes stay denied until a grant exists. If Shopify&#39;s own cookie banner is off, a third-party CMP must perform the write, and channel apps still honour that setting when they load.&lt;/li&gt;&lt;li&gt;Prove the storefront write on a product page after the banner accept by calling &lt;code&gt;window.Shopify.customerPrivacy.currentVisitorConsent()&lt;/code&gt; and &lt;code&gt;marketingAllowed()&lt;/code&gt;. You want &lt;code&gt;marketing: &#39;yes&#39;&lt;/code&gt; (or &lt;code&gt;true&lt;/code&gt; from the Allowed helper), not an empty string. If the CMP register shows accept and this API still returns empty, the banner never integrated with Shopify, so fix that write before touching checkout pixels.&lt;/li&gt;&lt;li&gt;Log the pixel snapshot rather than the CMP cookie. In the custom pixel, at init, push &lt;code&gt;init.customerPrivacy&lt;/code&gt; to your server endpoint, subscribe to &lt;code&gt;visitorConsentCollected&lt;/code&gt;, and push the update. Compare those two payloads with &lt;code&gt;checkout_completed&lt;/code&gt; for the same checkout token. If init is denied, &lt;code&gt;checkout_completed&lt;/code&gt; is denied, and the subscribe event grants 15 seconds later, you have the timing leak. If all three stay empty, the write never reached Shopify.&lt;/li&gt;&lt;li&gt;Split same-browser orders from redirect orders. Pick ten live paid orders that used a redirect method, then note device, referrer, and whether thank you stayed in the original browser. Shopify&#39;s iDEAL test mode skips the bank webview, so you need a real bank return, or a device farm that opens the return URL in a second browser, to see the empty-consent slice.&lt;/li&gt;&lt;li&gt;Check the order, not only the pixel. If you already write a consent flag to a cart attribute, open the order and see whether &lt;code&gt;note_attributes&lt;/code&gt; still hold it after iDEAL. Community reports say the redirect is where that copy disappears, so treat a missing attribute as a failed persist rather than as a pixel bug.&lt;/li&gt;&lt;li&gt;Confirm who owns marketing sends. If the Facebook and Instagram app still has customer data sharing on, you may have a native purchase event plus a custom CAPI hit. Deduping with one &lt;code&gt;event_id&lt;/code&gt; only works when both layers see the same consent decision. Turn native sharing off while you prove the custom path, or accept that Shopify&#39;s pixel layer and your GTM layer can disagree.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Admin tasks that still hop across five tools belong in &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-operational-friction-when-simple-tasks-still-take-too-long/&quot;&gt;&lt;em&gt;How to Fix Shopify Operational Friction When Simple Tasks Still Take Too Long&lt;/em&gt;&lt;/a&gt;. This diagnosis stays on one record: Customer Privacy in the pixel.&lt;/p&gt;&lt;h2&gt;How to fix it&lt;/h2&gt;&lt;p&gt;Repair the Shopify write first. Then make the checkout pixel wait. Only then consider a server-side copy that travelled with the order.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Failure&lt;/th&gt;&lt;th&gt;What you see&lt;/th&gt;&lt;th&gt;Repair&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;CMP never wrote Customer Privacy&lt;/td&gt;&lt;td&gt;Storefront API empty after accept; checkout init denied&lt;/td&gt;&lt;td&gt;Call &lt;code&gt;setTrackingConsent&lt;/code&gt; from the banner on the storefront. Keep Shopify&#39;s native banner if the CMP cannot do that write.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pixel reads CMP cookies&lt;/td&gt;&lt;td&gt;Sandbox storage empty; GTM defaults to denied&lt;/td&gt;&lt;td&gt;Stop reading banner cookies in the custom pixel. Gate tags on &lt;code&gt;init.customerPrivacy&lt;/code&gt; and &lt;code&gt;visitorConsentCollected&lt;/code&gt;. Pass that boolean as an event parameter into sGTM, not as a first-party cookie the sandbox cannot set.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Grant arrives after &lt;code&gt;checkout_completed&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Denied hit, then granted 10 to 30 seconds later&lt;/td&gt;&lt;td&gt;Subscribe to &lt;code&gt;visitorConsentCollected&lt;/code&gt;, update the snapshot, replay purchase once with the same &lt;code&gt;event_id&lt;/code&gt;. Pixel Privacy documents this wait.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Payment redirect opens a new browser&lt;/td&gt;&lt;td&gt;Android or bank webview; no CMP cookie; no banner&lt;/td&gt;&lt;td&gt;Do not invent a grant from a missing cookie. If a cart attribute written on the storefront is present on the order, a webhook may send CAPI for that order only. If the attribute is missing, leave the conversion unsent.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CDN strips &lt;code&gt;_tracking_consent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Apex proxy or edge worker; API empty on return to storefront&lt;/td&gt;&lt;td&gt;Allow Shopify&#39;s consent cookie through to the origin. Still use the API rather than parsing the cookie in your own code.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;A working custom pixel looks like this in outline. Keep the snapshot in the pixel, subscribe once, and only send marketing when the Allowed flag is true.&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;let customerPrivacyStatus = init.customerPrivacy;

api.customerPrivacy.subscribe(&#39;visitorConsentCollected&#39;, (event) =&amp;gt; {
  customerPrivacyStatus = event.customerPrivacy;
  if (customerPrivacyStatus.marketingAllowed &amp;amp;&amp;amp; pendingPurchase) {
    sendPurchase(pendingPurchase, { replay: true });
  }
});

analytics.subscribe(&#39;checkout_completed&#39;, (event) =&amp;gt; {
  pendingPurchase = event;
  if (customerPrivacyStatus.marketingAllowed) {
    sendPurchase(event, { replay: false });
  }
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Use one &lt;code&gt;event_id&lt;/code&gt; derived from the order or checkout token for both the first send and the replay so Meta and Google Ads dedupe.&lt;/p&gt;&lt;p&gt;Cart attributes are a backup copy, not a second source of truth. Write them on catalogue pages or at add to cart, while the shopper is still in the storefront browser. Pixel event payloads can include checkout attributes. Confirm on a live iDEAL order that the value still exists on the order before you wire &lt;code&gt;orders/paid&lt;/code&gt; to CAPI. A webhook that always fires Purchase will bypass the denied check that correctly stopped the pixel.&lt;/p&gt;&lt;p&gt;Plus checkout UI extensions can collect extra fields at checkout. They do not replace Customer Privacy for pixels. If you are scoping display versus logic at checkout, use &lt;a href=&quot;https://ocontis.studio/blog/post/when-to-use-checkout-ui-extensions-vs-shopify-functions/&quot;&gt;&lt;em&gt;When to Use Checkout UI Extensions vs Shopify Functions&lt;/em&gt;&lt;/a&gt; and keep consent on the privacy API.&lt;/p&gt;&lt;p&gt;Headless or Hydrogen storefronts must pass &lt;code&gt;checkoutRootDomain&lt;/code&gt;, &lt;code&gt;storefrontRootDomain&lt;/code&gt;, and a Storefront access token into &lt;code&gt;setTrackingConsent&lt;/code&gt;. Liquid storefronts load &lt;code&gt;consent-tracking-api&lt;/code&gt; through &lt;code&gt;Shopify.loadFeatures&lt;/code&gt; and do not need those extra fields.&lt;/p&gt;&lt;h2&gt;When to get help&lt;/h2&gt;&lt;p&gt;Bring in a partner when the CMP, the custom pixel, server-side GTM, and a redirect payment all have to agree on one grant. That wiring is integration work: who writes Customer Privacy, which pixel is allowed to send marketing, and which orders are allowed to replay.&lt;/p&gt;&lt;p&gt;Thank you no longer runs pasted tracking on non-Plus stores after 26 August 2026, and Plus lost Additional Scripts a year earlier, so a checkout UI extension that renders a third-party cookie banner still leaves marketing hits to the pixel sandbox.&lt;/p&gt;&lt;p&gt;If the catalogue already loses shoppers before payment, finish that path first with the abandonment guide. If route-level &lt;code&gt;page_viewed&lt;/code&gt; is missing on a partials theme, finish the soft-navigation pixel gap before you trust browse attribution.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;You can now confirm whether the storefront banner wrote marketing consent into Shopify Customer Privacy, verify that checkout custom pixels read that record after a payment redirect, and repair the handoff without Thank you scripts. The storefront accept is only useful when Shopify stored it. The checkout pixel is only useful when it waits for that store, then stays silent when the grant never arrived.&lt;/p&gt;&lt;p&gt;If the CMP, custom pixels, and redirect payments need one owner, book a &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;discovery call&lt;/a&gt; and we will map the write, the subscribe, and the replay against live orders. For the broader tracking and CMP wiring, start with &lt;a href=&quot;https://ocontis.studio/services/integrations-and-system-optimisation/&quot;&gt;integrations and system optimisation&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Shopify Flow Automations for Black Friday: What to Freeze</title>
    <link href="https://ocontis.studio/blog/post/shopify-flow-automations-for-black-friday-what-to-freeze/" />
    <updated>2026-09-25T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/shopify-flow-automations-for-black-friday-what-to-freeze/</id>
    <content type="html">&lt;h1&gt;Shopify Flow Automations for Black Friday: What to Freeze&lt;/h1&gt;&lt;p&gt;The ops lead opens Shopify Flow on a Thursday in late September and searches the trigger list for cancellation requested. Return requested is there, and Order canceled is there after the order is already gone, yet the customer-account cancellation request Shopify started accepting on 19 June 2026 has no native trigger.&lt;/p&gt;&lt;p&gt;That search is the job: &lt;strong&gt;Shopify Flow&lt;/strong&gt; only starts a workflow when the event exists on the trigger reference, and Black Friday week adds the events that fire in admin every few minutes, including paid orders, returns, inventory drops, fulfilment holds, and customer requests that never become a Flow run.&lt;/p&gt;&lt;p&gt;List those events now, mark each one native, staff queue, or external tool, and freeze the list before peak week so nobody invents a workflow on the Friday afternoon.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;This article teaches you to list each Black Friday operational event that Shopify now fires in admin, mark whether Flow can trigger on it, and assign a native workflow, a staff queue, or an external tool before the freeze. The dated walk of checkout, inventory, fulfilment, and support gates belongs in &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-black-friday-readiness-checklist-for-scaling-brands/&quot;&gt;&lt;em&gt;A Shopify Black Friday Readiness Checklist for Brands That Already Scale&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Choosing the discount engine for the offers you already decided to run belongs in &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-automatic-discounts-vs-functions-for-black-friday-promos/&quot;&gt;&lt;em&gt;Shopify Automatic Discounts vs Functions for Black Friday Promos&lt;/em&gt;&lt;/a&gt;. Year-round admin tasks that still hop across five systems belong in &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-operational-friction-when-simple-tasks-still-take-too-long/&quot;&gt;&lt;em&gt;How to Fix Shopify Operational Friction When Simple Tasks Still Take Too Long&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Merchant and developer threads this year keep returning to the same gap: Flow is the native ops layer Shopify teaches in Academy, and several 2026 admin events still have no trigger. The community signal is a missing start condition, not a missing campaign idea.&lt;/p&gt;&lt;h2&gt;What changed&lt;/h2&gt;&lt;p&gt;Shopify Flow is a free app on Basic, Grow, Advanced, and Plus, and a workflow is a trigger, optional conditions, and actions. Most of that surface is available once the app is installed, and two gates still matter for peak week: &lt;strong&gt;Send HTTP request&lt;/strong&gt; needs Grow, Advanced, or Plus, while &lt;strong&gt;tasks from custom partner apps&lt;/strong&gt; stay Plus-only. Usage limits follow the Admin API limits on the plan, so a scheduled Get product variant data loop that is quiet in September can throttle when every SKU moves on Friday.&lt;/p&gt;&lt;p&gt;The larger 2026 change sits next to Flow, not inside it. From 19 June 2026 Shopify accepted self-serve order cancellation requests from the customer account, so brands selling into the EU can meet withdrawal timing without a phone call. Staff see those requests on the Orders page under Customer request, and Return requested already has a Flow trigger, while Cancellation requested still has none.&lt;/p&gt;&lt;p&gt;Flow&#39;s published trigger list still covers the events most peak-week rooms already watch: Order created, Order paid, Order canceled, Return requested, Product variant out of stock, Product variant inventory quantity changed, Fulfillment order placed on hold, Order risk analyzed, Customer abandons checkout, and Workflow error occurred. The events that stay invisible to Flow are the ones that now appear in admin as a filter, a timeline badge, or a metafield edit.&lt;/p&gt;&lt;figure class=&quot;blog-diagram epmb-figure&quot; role=&quot;figure&quot; aria-labelledby=&quot;epmb-20-caption&quot; data-diagram-id=&quot;epmb-20&quot;&gt;
  &lt;p class=&quot;epmb-figure__summary visually-hidden&quot; id=&quot;epmb-20-summary&quot;&gt;Assign each Black Friday event&lt;/p&gt;
  &lt;div class=&quot;epmb-figure__brand epmb-figure__brand--top-right&quot;&gt;
  &lt;img class=&quot;epmb-figure__logo&quot; src=&quot;/assets/favicons/safari-pinned-tab.svg&quot; alt=&quot;oContis Studio&quot; width=&quot;32&quot; height=&quot;32&quot; decoding=&quot;async&quot; /&gt;
&lt;/div&gt;
  &lt;div class=&quot;epmb-figure__content&quot;&gt;
    
    &lt;svg id=&quot;epmb-20&quot; width=&quot;100%&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; class=&quot;flowchart&quot; style=&quot;max-width: 596.087109375px;&quot; viewBox=&quot;-8 -50.1015625 596.087109375 693.8843749999999&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot;&gt;&lt;style&gt;#epmb-20{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;fill:#fafae6;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#epmb-20 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#epmb-20 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#epmb-20 .error-icon{fill:#141414;}#epmb-20 .error-text{fill:#ebebeb;stroke:#ebebeb;}#epmb-20 .edge-thickness-normal{stroke-width:1px;}#epmb-20 .edge-thickness-thick{stroke-width:3.5px;}#epmb-20 .edge-pattern-solid{stroke-dasharray:0;}#epmb-20 .edge-thickness-invisible{stroke-width:0;fill:none;}#epmb-20 .edge-pattern-dashed{stroke-dasharray:3;}#epmb-20 .edge-pattern-dotted{stroke-dasharray:2;}#epmb-20 .marker{fill:#8a8a7a;stroke:#8a8a7a;}#epmb-20 .marker.cross{stroke:#8a8a7a;}#epmb-20 svg{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;}#epmb-20 p{margin:0;}#epmb-20 .label{font-family:&#39;Syne&#39;,system-ui,sans-serif;color:#fafae6;}#epmb-20 .cluster-label text{fill:#fafae6;}#epmb-20 .cluster-label span{color:#fafae6;}#epmb-20 .cluster-label span p{background-color:transparent;}#epmb-20 .label text,#epmb-20 span{fill:#fafae6;color:#fafae6;}#epmb-20 .node rect,#epmb-20 .node circle,#epmb-20 .node ellipse,#epmb-20 .node polygon,#epmb-20 .node path{fill:#141414;stroke:#db5461;stroke-width:1px;}#epmb-20 .rough-node .label text,#epmb-20 .node .label text,#epmb-20 .image-shape .label,#epmb-20 .icon-shape .label{text-anchor:middle;}#epmb-20 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#epmb-20 .rough-node .label,#epmb-20 .node .label,#epmb-20 .image-shape .label,#epmb-20 .icon-shape .label{text-align:center;}#epmb-20 .node.clickable{cursor:pointer;}#epmb-20 .root .anchor path{fill:#8a8a7a!important;stroke-width:0;stroke:#8a8a7a;}#epmb-20 .arrowheadPath{fill:#f1eff0;}#epmb-20 .edgePath .path{stroke:#8a8a7a;stroke-width:1px;}#epmb-20 .flowchart-link{stroke:#8a8a7a;fill:none;}#epmb-20 .edgeLabel{background-color:#141414;text-align:center;}#epmb-20 .edgeLabel p{background-color:#141414;}#epmb-20 .edgeLabel rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-20 .labelBkg{background-color:rgba(20, 20, 20, 0.5);}#epmb-20 .cluster rect{fill:#141414;stroke:hsl(0, 0%, 17.8431372549%);stroke-width:1px;}#epmb-20 .cluster text{fill:#fafae6;}#epmb-20 .cluster span{color:#fafae6;}#epmb-20 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:12px;background:#141414;border:1px solid hsl(0, 0%, 17.8431372549%);border-radius:2px;pointer-events:none;z-index:100;}#epmb-20 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fafae6;}#epmb-20 rect.text{fill:none;stroke-width:0;}#epmb-20 .icon-shape,#epmb-20 .image-shape{background-color:#141414;text-align:center;}#epmb-20 .icon-shape p,#epmb-20 .image-shape p{background-color:#141414;padding:2px;}#epmb-20 .icon-shape .label rect,#epmb-20 .image-shape .label rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-20 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#epmb-20 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#epmb-20 .node .neo-node{stroke:#db5461;}#epmb-20 [data-look=&quot;neo&quot;].node rect,#epmb-20 [data-look=&quot;neo&quot;].cluster rect,#epmb-20 [data-look=&quot;neo&quot;].node polygon{stroke:url(#epmb-20-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-20 [data-look=&quot;neo&quot;].swimlane.cluster rect{filter:none;}#epmb-20 [data-look=&quot;neo&quot;].node path{stroke:url(#epmb-20-gradient);stroke-width:1px;}#epmb-20 [data-look=&quot;neo&quot;].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-20 [data-look=&quot;neo&quot;].node .neo-line path{stroke:#db5461;filter:none;}#epmb-20 [data-look=&quot;neo&quot;].node circle{stroke:url(#epmb-20-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-20 [data-look=&quot;neo&quot;].node circle .state-start{fill:#000000;}#epmb-20 [data-look=&quot;neo&quot;].icon-shape .icon{fill:url(#epmb-20-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-20 [data-look=&quot;neo&quot;].icon-shape .icon-neo path{stroke:url(#epmb-20-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-20 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;epmb-20_flowchart-v2-pointEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 10 5 L 0 10 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-20_flowchart-v2-pointStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;4.5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 5 L 10 10 L 10 0 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-20_flowchart-v2-pointEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;11.5&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;10.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 11.5 7 L 0 14 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-20_flowchart-v2-pointStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;1&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;polygon points=&quot;0,7 11.5,14 11.5,0&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-20_flowchart-v2-circleEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;11&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-20_flowchart-v2-circleStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-1&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-20_flowchart-v2-circleEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refY=&quot;5&quot; refX=&quot;12.25&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-20_flowchart-v2-circleStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-2&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-20_flowchart-v2-crossEnd&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;12&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-20_flowchart-v2-crossStart&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;-1&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-20_flowchart-v2-crossEnd-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;17.7&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-20_flowchart-v2-crossStart-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;-3.5&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;g class=&quot;root&quot;&gt;&lt;g class=&quot;clusters&quot;/&gt;&lt;g class=&quot;edgePaths&quot;&gt;&lt;path d=&quot;M232.289,60.889L232.289,65.056C232.289,69.222,232.289,77.556,232.289,85.222C232.289,92.889,232.289,99.889,232.289,103.389L232.289,106.889&quot; id=&quot;epmb-20-L_E_T_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_E_T_0&quot; data-points=&quot;W3sieCI6MjMyLjI4ODY3MTg3NSwieSI6NjAuODg5MDYyNDk5OTk5OTk0fSx7IngiOjIzMi4yODg2NzE4NzUsInkiOjg1Ljg4OTA2MjV9LHsieCI6MjMyLjI4ODY3MTg3NSwieSI6MTEwLjg4OTA2MjUwMDAwMDA3fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-20_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M192.871,226.97L179.621,239.856C166.371,252.741,139.871,278.511,126.621,306.382C113.371,334.253,113.371,364.225,113.371,379.21L113.371,394.196&quot; id=&quot;epmb-20-L_T_N_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_T_N_0&quot; data-points=&quot;W3sieCI6MTkyLjg3MTQ4MDM1MDg1NTQyLCJ5IjoyMjYuOTcwMzA4NDc1ODU1NDZ9LHsieCI6MTEzLjM3MTA5Mzc1LCJ5IjozMDQuMjgyMDMxMjV9LHsieCI6MTEzLjM3MTA5Mzc1LCJ5IjozOTguMTk2MDkzNzV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-20_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M271.706,226.97L284.956,239.856C298.206,252.741,324.706,278.511,337.956,297.046C351.206,315.58,351.206,326.878,351.206,332.527L351.206,338.177&quot; id=&quot;epmb-20-L_T_Q_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_T_Q_0&quot; data-points=&quot;W3sieCI6MjcxLjcwNTg2MzM5OTE0NDU2LCJ5IjoyMjYuOTcwMzA4NDc1ODU1NDZ9LHsieCI6MzUxLjIwNjI1LCJ5IjozMDQuMjgyMDMxMjV9LHsieCI6MzUxLjIwNjI0OTk5OTk5OTg0LCJ5IjozNDIuMTc2NTYyNTAwMDAwM31d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-20_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M311.066,466.965L298.732,479.971C286.398,492.976,261.729,518.988,249.394,537.643C237.06,556.297,237.06,567.596,237.06,573.245L237.06,578.894&quot; id=&quot;epmb-20-L_Q_S_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_Q_S_0&quot; data-points=&quot;W3sieCI6MzExLjA2NjQ2NzU0MDIwMjcsInkiOjQ2Ni45NjQ5MDUwNDAyMDI2N30seyJ4IjoyMzcuMDU5NzY1NjI1LCJ5Ijo1NDQuOTk5MjE4NzV9LHsieCI6MjM3LjA1OTc2NTYyNSwieSI6NTgyLjg5Mzc1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-20_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M391.346,466.965L403.68,479.971C416.015,492.976,440.684,518.988,453.018,537.643C465.353,556.297,465.353,567.596,465.353,573.245L465.353,578.894&quot; id=&quot;epmb-20-L_Q_X_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_Q_X_0&quot; data-points=&quot;W3sieCI6MzkxLjM0NjAzMjQ1OTc5NzM2LCJ5Ijo0NjYuOTY0OTA1MDQwMjAyNX0seyJ4Ijo0NjUuMzUyNzM0Mzc1LCJ5Ijo1NDQuOTk5MjE4NzV9LHsieCI6NDY1LjM1MjczNDM3NSwieSI6NTgyLjg5Mzc1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-20_flowchart-v2-pointEnd)&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabels&quot;&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_E_T_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(113.37109375, 304.28203125)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_T_N_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-14.78515625&quot; y=&quot;-18.1015625&quot; width=&quot;29.5703125&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Yes&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(351.20625, 304.28203125)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_T_Q_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-12.86328125&quot; y=&quot;-18.1015625&quot; width=&quot;25.7265625&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;No&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(237.059765625, 544.99921875)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q_S_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-14.78515625&quot; y=&quot;-18.1015625&quot; width=&quot;29.5703125&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Yes&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(465.352734375, 544.99921875)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q_X_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-12.86328125&quot; y=&quot;-18.1015625&quot; width=&quot;25.7265625&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;No&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;nodes&quot;&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-20-flowchart-E-0&quot; data-look=&quot;classic&quot; transform=&quot;translate(232.288671875, 34.44453125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-94.22265625&quot; y=&quot;-26.44453125&quot; width=&quot;188.4453125&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Admin&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; event&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; that&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;will&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; fire&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; at&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; peak&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-20-flowchart-T-1&quot; data-look=&quot;classic&quot; transform=&quot;translate(232.288671875, 188.63828124999998)&quot;&gt;&lt;polygon points=&quot;77.74921875,0 155.4984375,-77.74921875 77.74921875,-155.4984375 0,-77.74921875&quot; class=&quot;label-container&quot; transform=&quot;translate(-77.24921875, 77.74921875)&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Native&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Flow&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;trigger&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; exists?&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-20-flowchart-N-3&quot; data-look=&quot;classic&quot; transform=&quot;translate(113.37109375, 424.640625)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-105.37109375&quot; y=&quot;-26.44453125&quot; width=&quot;210.7421875&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Native&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; workflow&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;tested&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; before&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; freeze&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-20-flowchart-Q-5&quot; data-look=&quot;classic&quot; transform=&quot;translate(351.20625, 424.640625)&quot;&gt;&lt;polygon points=&quot;82.4640625,0 164.928125,-82.4640625 82.4640625,-164.928125 0,-82.4640625&quot; class=&quot;label-container&quot; transform=&quot;translate(-81.9640625, 82.4640625)&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Must&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; the&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; team&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;act&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; in&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; minutes?&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-20-flowchart-S-7&quot; data-look=&quot;classic&quot; transform=&quot;translate(237.059765625, 609.3382812499999)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-90.92578125&quot; y=&quot;-26.44453125&quot; width=&quot;181.8515625&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Staff&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; queue&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; with&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;a&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; saved&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; view&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-20-flowchart-X-9&quot; data-look=&quot;classic&quot; transform=&quot;translate(465.352734375, 609.3382812499999)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-87.3671875&quot; y=&quot;-26.44453125&quot; width=&quot;174.734375&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;External&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; tool&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; or&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;scheduled&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; poll&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-20-drop-shadow&quot; height=&quot;130%&quot; width=&quot;130%&quot;&gt;&lt;fedropshadow dx=&quot;4&quot; dy=&quot;4&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-20-drop-shadow-small&quot; height=&quot;150%&quot; width=&quot;150%&quot;&gt;&lt;fedropshadow dx=&quot;2&quot; dy=&quot;2&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;linearGradient id=&quot;epmb-20-gradient&quot; gradientUnits=&quot;objectBoundingBox&quot; x1=&quot;0%&quot; y1=&quot;0%&quot; x2=&quot;100%&quot; y2=&quot;0%&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#db5461&quot; stop-opacity=&quot;1&quot;/&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;hsl(0, 0%, 20.1960784314%)&quot; stop-opacity=&quot;1&quot;/&gt;&lt;/linearGradient&gt;&lt;text text-anchor=&quot;middle&quot; x=&quot;290.0435546875&quot; y=&quot;-25&quot; class=&quot;flowchartTitleText&quot;&gt;Assign each Black Friday event&lt;/text&gt;&lt;/svg&gt;
  &lt;/div&gt;
  
  &lt;figcaption class=&quot;epmb-figure__caption&quot; id=&quot;epmb-20-caption&quot;&gt;Assign each Black Friday event&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h2&gt;Who is affected&lt;/h2&gt;&lt;p&gt;Any store on Basic or above that will run Flow during Black Friday should complete this list. The rows change by how you sell, not by whether you have an automation app installed.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;EU and UK brands&lt;/strong&gt; that turned on self-serve cancellation now have a customer request queue with a refund clock, and high-volume stores cannot click every order to find it.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Basic-plan stores&lt;/strong&gt; can still tag, email internally, and hold fulfilment with native actions. They cannot post a new order to a 3PL or a wholesale portal through Send HTTP request until they move to Grow or replace that hop with an app that already owns the connection.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Stores with email-based custom fulfilment services&lt;/strong&gt; can prompt staff from Flow. They cannot submit the fulfilment request automatically, because that action only talks to app-based fulfilment services.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Plus brands&lt;/strong&gt; can add custom partner Flow tasks, and those tasks still belong in the freeze if they have not processed a week of production events.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Card-testing and low-value fraud&lt;/strong&gt; still lands as an order first, so Flow can tag and Slack after Order risk analyzed and still cannot stop the authorisation.&lt;/p&gt;&lt;p&gt;If you are still choosing the plan because HTTP is the missing action, use &lt;a href=&quot;https://ocontis.studio/blog/post/choosing-the-right-shopify-plan-a-practical-decision-framework/&quot;&gt;&lt;em&gt;Choosing the Right Shopify Plan&lt;/em&gt;&lt;/a&gt; before you treat an upgrade as a November patch.&lt;/p&gt;&lt;h2&gt;Mark whether Flow can trigger on each event&lt;/h2&gt;&lt;p&gt;Write one row per event that will fire in your admin during peak week. The trigger name must match Shopify&#39;s reference, including American spelling on Order canceled. A blank cell means the row is not ready.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Admin event&lt;/th&gt;&lt;th&gt;Native Flow trigger&lt;/th&gt;&lt;th&gt;Assignment before freeze&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Order created or paid&lt;/td&gt;&lt;td&gt;Order created, Order paid&lt;/td&gt;&lt;td&gt;Native: tag, Slack, hold, or route&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Return requested&lt;/td&gt;&lt;td&gt;Return requested&lt;/td&gt;&lt;td&gt;Native: notify the returns owner&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Order cancelled after staff or system cancel&lt;/td&gt;&lt;td&gt;Order canceled&lt;/td&gt;&lt;td&gt;Native: release inventory notes, stop a pick&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Customer cancellation request (self-serve)&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;td&gt;Staff queue: saved Orders view on Customer request, or a scheduled poll / third-party event trigger&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Order confirmation email not delivered&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;td&gt;Staff queue: Inbox owner plus timeline check on high-value orders&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Variant sold out or inventory quantity changed&lt;/td&gt;&lt;td&gt;Product variant out of stock, Product variant inventory quantity changed&lt;/td&gt;&lt;td&gt;Native: hide, tag, or alert. Pair with the oversell rule, do not replace it&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fulfilment order placed on hold&lt;/td&gt;&lt;td&gt;Fulfillment order placed on hold&lt;/td&gt;&lt;td&gt;Native: notify ops with the hold reason&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Request fulfilment from a custom email supplier&lt;/td&gt;&lt;td&gt;Submit fulfillment request covers app services only&lt;/td&gt;&lt;td&gt;Staff queue, or move the supplier to an app-based service Flow can call&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Order metafield or status note changed&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;td&gt;External tool or a scheduled Get-order job. Do not invent a metafield-changed trigger&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fraud or card-testing order&lt;/td&gt;&lt;td&gt;Order risk analyzed, after the order exists&lt;/td&gt;&lt;td&gt;External or Plus checkout validation for the block. Flow only for the after-the-fact tag&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Flow run failed&lt;/td&gt;&lt;td&gt;Workflow error occurred&lt;/td&gt;&lt;td&gt;Native: page the owner with the run URL&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Inventory rows still need a written available-to-sell number. Flow can alert when a variant hits zero. The hide-or-backorder rule lives in &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-stop-shopify-oversells-during-black-friday-flash-sales/&quot;&gt;&lt;em&gt;How to Stop Shopify Oversells During Black Friday Flash Sales&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;International checkout rows (duties, currency, catalog) are a market walk, not a Flow trigger. That job sits in &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-markets-black-friday-traps-duties-currency-and-catalog-gaps/&quot;&gt;&lt;em&gt;Shopify Markets Black Friday Traps: Duties, Currency, and Catalog Gaps&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Assign a native workflow, a staff queue, or an external tool&lt;/h2&gt;&lt;p&gt;Once the trigger column is filled, the assignment is a three-way choice.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Native Flow&lt;/strong&gt; when the trigger exists, the action is a Shopify object or a Grow+ HTTP call you already tested, and the run can fail without charging the customer twice. Typical Black Friday natives: tag VIP or wholesale orders, Slack a high-value paid order, hold fulfilment when risk is high, notify returns, and page the owner when a workflow errors.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Staff queue&lt;/strong&gt; when the event is visible in admin and the team must act in minutes, yet Flow has no start condition. The cancellation-request saved view is the clean example, and a weekend Inbox owner for bounced confirmations is the other; write the view name, the owner, and the latest hour they will check, because a queue without a rota is an unsigned row.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;External tool&lt;/strong&gt; when you need a scheduled GraphQL poll, a webhook Shopify will not emit, or a write into a system that is not an installed Flow action. Make and n8n show up here because merchants hit item limits, silent failures, and missing triggers inside Flow, then move the poll off-platform. That move is valid when the runner already has credentials, retries, and an owner. A new Make scenario built on 20 November is a peak-week risk.&lt;/p&gt;&lt;p&gt;Copy and paste is still missing inside the Flow editor for some teams, and For each loops over Get-data results still break when the variable picker cannot see the list item. Those editor limits argue for simpler native graphs, not for a last-minute HTTP rewrite.&lt;/p&gt;&lt;p&gt;Plus custom partner tasks can sit in the native column only after a week of production runs. Treat an untested partner action as external until the run log is boring.&lt;/p&gt;&lt;h2&gt;Freeze the list before peak&lt;/h2&gt;&lt;p&gt;The freeze date is the same one you already use for theme deploys and new apps: two weeks before Black Friday, unless a hotfix has an owner and a rollback. The Flow list freezes three things: no new triggers or HTTP endpoints after the freeze, including templates from apps that have not processed your live events; no new scheduled Get-data loops that walk the catalogue every few minutes and compete with Admin API budget when inventory and discounts are already moving; and no editor experiments on live workflows, so you duplicate a workflow, test it, then swap, because pausing a peak-week Flow while someone is still dragging conditions is how a hold never fires.&lt;/p&gt;&lt;p&gt;Send HTTP request waits up to 30 seconds for a response and then retries. A 3PL that slows on Friday afternoon will stack retries and look like a fulfilment outage. Prove the endpoint on a weekday peak-shaped batch before you leave it on.&lt;/p&gt;&lt;p&gt;Workflow error occurred is the safety net, so wire it to the same Slack channel as checkout errors and a failed tag or a failed HTTP call is visible without opening Flow history.&lt;/p&gt;&lt;p&gt;After Cyber Monday, keep the list and add any event that surprised the war room. January is when you reopen HTTP, partner tasks, and missing-trigger workarounds.&lt;/p&gt;&lt;h2&gt;What this does not change&lt;/h2&gt;&lt;p&gt;This list leaves the readiness checklist in place: checkout test orders, 3PL last-dispatch times, and the support rota still need named owners and latest safe dates. Promo math stays on the Discounts page and in Functions, which keeps this list off automatic discounts versus Discount Functions, and warehouse available-to-sell remains a separate artefact even when Flow reports a variant at zero. Pre-checkout blocking still belongs in Fraud Control, a validation Function, or a fraud app, because Flow starts after the order exists.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;You can now list the Black Friday events that fire in your Shopify admin, mark the ones Flow can start, and assign each row to a native workflow, a staff queue, or an external tool. Freeze that sheet before peak week. A trigger that does not exist will not appear because the sale is large.&lt;/p&gt;&lt;p&gt;If the HTTP hop, the 3PL connection, or the cancellation-request workaround still has no owner, &lt;a href=&quot;https://ocontis.studio/services/integrations-and-system-optimisation/&quot;&gt;Integrations and system optimisation&lt;/a&gt; is the path for wiring those events before you raise spend. For a wider stack read, &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;book a discovery call&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Shopify Markets Black Friday Traps: Duties, Currency, and Catalog Gaps</title>
    <link href="https://ocontis.studio/blog/post/shopify-markets-black-friday-traps-duties-currency-and-catalog-gaps/" />
    <updated>2026-09-23T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/shopify-markets-black-friday-traps-duties-currency-and-catalog-gaps/</id>
    <content type="html">&lt;h1&gt;Shopify Markets Black Friday Traps: Duties, Currency, and Catalog Gaps&lt;/h1&gt;&lt;p&gt;The merchandising lead opens Markets on a Tuesday in late September and ticks the United Kingdom, the EU, and Australia as active. Local currencies are on. A percentage off is scheduled. Paid creative already names those countries.&lt;/p&gt;&lt;p&gt;She then walks checkout as a buyer in each of those markets and writes four lines on a sheet: duties at checkout, currency and tax display, inventory and shipping profile, catalog and language completeness. The UK row shows sterling and VAT with no duty line. The German row shows a converted fixed-amount code, English fallback on the &lt;code&gt;/de/&lt;/code&gt; product URL, and no DHL rate. The Australian row returns &lt;strong&gt;Shipping not available&lt;/strong&gt; on a print-on-demand SKU that looked published in admin.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Shopify Markets Black Friday traps&lt;/strong&gt; show up in that sheet, not in the Markets toggle. A market that is on can still surprise a buyer at checkout, and Black Friday ads will send that buyer before anyone has time to argue about settings.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;This article teaches you to walk each Shopify market that will take Black Friday traffic and record those four rows before international ads go live. The dated sign-off of checkout, inventory, fulfilment, and support for a brand that already scales belongs in &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-black-friday-readiness-checklist-for-scaling-brands/&quot;&gt;&lt;em&gt;A Shopify Black Friday Readiness Checklist for Brands That Already Scale&lt;/em&gt;&lt;/a&gt;. Intermittent 404s and stale banners after a catalog split belong in &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-markets-cache-issues-when-products-disappear-after-a-catalog-split/&quot;&gt;&lt;em&gt;How to Fix Shopify Markets Cache Issues When Products Disappear After a Catalog Split&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Community threads this month keep returning to the same cluster: Markets configured, catalogs assigned, and checkout still refusing a rate, converting a discount at an unexpected amount, or shipping a parcel that will collect duties on the doorstep. Shopify is also moving shipping options into Markets, with a market-driven shipping model rolling through autumn 2026, so an older delivery-profile setup can fail on a country-wide market just as paid traffic ramps.&lt;/p&gt;&lt;p&gt;The useful opinion is narrow. Markets is a buyer-context layer. Black Friday is a load test of that context. Treat every live market as a separate checkout you have already completed.&lt;/p&gt;&lt;h2&gt;The common assumption&lt;/h2&gt;&lt;p&gt;The assumption is that an active Shopify market is an international launch. Currency is on, a language is published, and a catalog is assigned, so the store is ready to take Black Friday orders from those countries.&lt;/p&gt;&lt;p&gt;That story is easy to believe because the admin presents Markets as a list of audiences with customisations. Shopify&#39;s own Markets documentation describes those customisations as currency, product availability, theme content, domains, languages, and taxes, plus shipping options where the store has them. The screen looks finished when the row is green.&lt;/p&gt;&lt;p&gt;Managed Markets, powered by Global-e, adds another layer of confidence. Global-e becomes the merchant of record on qualifying stores, remits tax, accepts local payment methods, and manages duties and import tax. The product is only available to merchants based in the continental United States and to certain stores in Canada and the United Kingdom. A UK or EU brand that already uses standard Markets still owns tax registration, DDP versus DAP, and the HS codes on each SKU.&lt;/p&gt;&lt;p&gt;The assumption collapses when paid traffic lands on a market that was never walked as a buyer. The admin row stays green. The checkout is the first place the gap appears.&lt;/p&gt;&lt;h2&gt;Record duties at checkout for each market&lt;/h2&gt;&lt;p&gt;For every market that will see Black Friday ads, complete a checkout and write whether duties and import taxes appear as a line, whether the product page already included them, and who pays if they do not.&lt;/p&gt;&lt;p&gt;Shopify can collect duties and import taxes at checkout when the destination is set to collect and each product has a Harmonized System code and a country of origin. Shopify&#39;s own duties guide is explicit: a missing HS code forces a guess from description and category, and a product with no HS code, description, or category skips duty calculation even when the market is set to collect. HS codes are required for all international orders. A sale SKU added in October often inherits neither.&lt;/p&gt;&lt;p&gt;DDP (Delivered Duty Paid) means the seller takes import costs at checkout. DAP (Delivered at Place) means the buyer meets the carrier at the door. Shopify can purchase DDP labels through its carrier accounts only for named services: Canada Post to the United States, DHL Express, DHL Express Canada, and DHL eCommerce. Other carriers on those accounts cannot print a DDP label for an order that already collected duties, so the team either buys the label outside Shopify or refunds. Brokerage and disbursement fees sit outside the checkout duty line. If you need the buyer to pay them, add the cost to the shipping rate or the policy, because the duty toggle will not.&lt;/p&gt;&lt;p&gt;United States de minimis no longer applies from 29 August 2025. Duties and import taxes can apply to every US import regardless of order value. A UK or EU brand buying US traffic for Black Friday now has a duty line on low-value carts that used to clear. Preferential treaties can still reduce rates when you can produce a certificate of origin. If you cannot, turn that setting off before checkout quotes a rate you cannot document.&lt;/p&gt;&lt;p&gt;A quieter trap is the product-level &lt;strong&gt;Charge tax&lt;/strong&gt; checkbox. Community reports this autumn still ask Shopify to restore a bulk warning for products with tax collection disabled. A catalog that grew through apps and CSV imports can hide dozens of SKUs that never charge tax. On a Black Friday weekend those SKUs under-collect VAT or sales tax in silence. Filter for Charge tax off, fix the promoted set first, and keep the rest off paid landing pages.&lt;/p&gt;&lt;p&gt;Write one row per market: collect at checkout or DAP, HS and origin complete on promoted SKUs, DDP label path named, brokerage handled, Charge tax on.&lt;/p&gt;&lt;h2&gt;Record currency and tax display&lt;/h2&gt;&lt;p&gt;Walk the same cart on a phone from each market and write the currency the buyer sees on the product page, the currency and tax treatment at checkout, and the local amount of every scheduled discount.&lt;/p&gt;&lt;p&gt;Shopify Markets can present a local currency while tax inclusion still follows the shop or the market customisation. A UK buyer expects a VAT-inclusive price. A US buyer expects tax at checkout. A German buyer on a &lt;code&gt;/de/&lt;/code&gt; URL who still sees a tax-exclusive sterling price will abandon or email support, and both outcomes look like a conversion problem.&lt;/p&gt;&lt;p&gt;Discounts and gift cards work across markets, with a conversion rule that surprises teams during peak. Percentage discounts apply to the local price. Fixed-amount discounts and free-shipping minimums are created in the store default currency and convert at the checkout rate. A $10 or £10 code is a different local amount by the afternoon. Gift card balances stay in the store default currency and convert at redemption, so a card bought in euros can cover a different sterling total a week later. The gift card balance page still shows the shop currency.&lt;/p&gt;&lt;p&gt;Assign Black Friday codes and automatic discounts to the markets that should see them. A global fixed-amount code on a store whose default is USD will look random in EUR and GBP once the rate moves. Percentage off is the safer default when you cannot staff a rate watch. If you need a local fixed amount, treat it as a market-specific offer and test it in that currency, then compare the converted total to the margin you already approved on the promo sheet.&lt;/p&gt;&lt;p&gt;Place four live test orders if the budget allows: home-market guest checkout, Shop Pay in a second currency, a gift card plus the sale code, and the market you are about to advertise. Refund them. The sheet needs the actual totals, not the admin preview.&lt;/p&gt;&lt;p&gt;Checkout that already drops purchases after Markets looks correct belongs in &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-checkout-abandonment-when-your-funnel-looks-healthy/&quot;&gt;&lt;em&gt;How to Fix Shopify Checkout Abandonment When Your Funnel Looks Healthy&lt;/em&gt;&lt;/a&gt;. This walk stops earlier: it records what the buyer is asked to pay.&lt;/p&gt;&lt;h2&gt;Record inventory and shipping profiles&lt;/h2&gt;&lt;p&gt;For each market, write which catalog the buyer can purchase from, which inventory location or 3PL can fulfil that catalog, and which shipping profile or market shipping option returns a rate on the promoted SKUs.&lt;/p&gt;&lt;p&gt;A market can be active while no rate covers that destination, that product class, or that origin. Print-on-demand and app-fulfilled SKUs are the usual failure: catalogs and Markets look correct, weights look correct, and checkout still returns &lt;strong&gt;Shipping not available&lt;/strong&gt; for Australia or New Zealand because the print partner never registered a rate for that zone. The buyer never sees the duty debate. They never see a total.&lt;/p&gt;&lt;p&gt;Shopify help now documents shipping options by market where the store has them. Developer threads this month describe a market-driven shipping model rolling out from October 2026, with older &lt;code&gt;deliveryProfiles&lt;/code&gt; province lists no longer available when a market covers a whole country. Apps that built country-plus-province maps from delivery profiles need a new Markets conditions path. If your 3PL or shipping app has not confirmed that path, a country-wide EU or UK market can fail rate generation under Black Friday volume.&lt;/p&gt;&lt;p&gt;Inventory is a separate row from the flash-sale oversell rule. &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-stop-shopify-oversells-during-black-friday-flash-sales/&quot;&gt;&lt;em&gt;How to Stop Shopify Oversells During Black Friday Flash Sales&lt;/em&gt;&lt;/a&gt; is the SKU-level available-to-sell number and channel-sync check. Here you record whether a market catalog includes the SKU, whether Continue selling is on, and whether a second location can fulfil that market when the first location sells out. A UK catalog that still points at a US warehouse will quote a US origin for duties and a US transit time on a UK landing page.&lt;/p&gt;&lt;p&gt;If shipping options have already moved into Markets on your shop, rebuild the rate test from the market, not from the old shipping profile screen. Save the screenshot of a successful rate next to the SKU list you intend to advertise.&lt;/p&gt;&lt;h2&gt;Record catalog and language gaps&lt;/h2&gt;&lt;p&gt;For each market, write which products are in the market catalog and published to Online Store, which language URLs will go live, and which customs identifiers the carrier will need on those SKUs.&lt;/p&gt;&lt;p&gt;Publishing a new language in Shopify Markets can expose thousands of untranslated pages under the new locale path. Translate &amp;amp; Adapt will serve the source language on those URLs. Search engines then see the same English body on a second address. Before you publish a Black Friday language, check whether the Publish toggle will create that duplicate window, whether hreflang on the new locale is self-referencing, and whether the promoted collection is actually translated. A partial language launch is workable when the advertised URLs are complete and the rest stay unpublished.&lt;/p&gt;&lt;p&gt;Catalog membership and Online Store publishing remain separate controls. A product can sit in a market catalog and still fail to render if the Online Store channel publish is incomplete in that buyer context. New SKUs added after the original Markets split are the usual miss, which is why the cache-and-catalog article exists. For this walk, export the promoted collection per market and confirm each handle is present, published, and in stock for that context.&lt;/p&gt;&lt;p&gt;Carriers and customs brokers that file distance-sale declarations into the EU are asking merchants for three product identifiers by 1 November 2026: the merchant&#39;s own code (usually the Shopify SKU), the manufacturer or supplier code, and a standardised barcode such as a GTIN where one exists. Shopify&#39;s product export has SKU and a barcodes column that can hold several typed values. It does not have a native manufacturer-code field. That value usually lives in a variant metafield or a 3PL sheet. Placeholder barcodes, repeated SKUs, and blank manufacturer codes fail when a broker rejects the row during peak. Export now, mark the gaps, and send suppliers a list before November. Managed Markets and other merchant-of-record providers will file the declaration, and their own setup notes still put catalog completeness on the merchant.&lt;/p&gt;&lt;p&gt;Plan selection still matters when checkout customisation or Plus support is part of the peak plan. &lt;a href=&quot;https://ocontis.studio/blog/post/choosing-the-right-shopify-plan-a-practical-decision-framework/&quot;&gt;&lt;em&gt;Choosing the Right Shopify Plan&lt;/em&gt;&lt;/a&gt; is the decision framework. Markets itself is not a plan upgrade. Managed Markets is a merchant-of-record product with a geography gate.&lt;/p&gt;&lt;h2&gt;A better framing&lt;/h2&gt;&lt;p&gt;Treat each live market as a checkout you have already completed, with four recorded answers, rather than as a toggle you turned on in September.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Assumption&lt;/th&gt;&lt;th&gt;What to record per market&lt;/th&gt;&lt;th&gt;Fail signal on a Black Friday walk&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Markets is on, so international checkout is ready&lt;/td&gt;&lt;td&gt;Duties at checkout, DDP or DAP, HS codes and country of origin on promoted SKUs&lt;/td&gt;&lt;td&gt;No duty line on a US or EU cart, or a carrier invoice the buyer never saw&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Local currency means local pricing is correct&lt;/td&gt;&lt;td&gt;Product-page currency, tax-inclusive or exclusive treatment, converted discount and gift-card totals&lt;/td&gt;&lt;td&gt;Fixed-amount code converts to a different local amount, or VAT appears twice&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;A shipping profile covers the new market&lt;/td&gt;&lt;td&gt;Market shipping option or profile, origin location, print or 3PL rate for that destination&lt;/td&gt;&lt;td&gt;Checkout returns Shipping not available, or a US origin on a UK landing page&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;The catalog and language are published&lt;/td&gt;&lt;td&gt;Catalog membership, Online Store publish, translated URLs, SKU and manufacturer identifiers&lt;/td&gt;&lt;td&gt;English fallback on a locale URL, missing new SKUs, or a broker-rejected identifier&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Managed Markets will handle duties and tax everywhere&lt;/td&gt;&lt;td&gt;Whether that market actually uses Managed Markets, and who is merchant of record&lt;/td&gt;&lt;td&gt;A non-qualifying store expected Global-e behaviour on a standard Markets checkout&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;The dated operational checklist still needs owners for fulfilment and support. This sheet is the international layer those gates sit on. A green Markets row without these five records is an unfinished launch.&lt;/p&gt;&lt;h2&gt;What to do differently&lt;/h2&gt;&lt;p&gt;Build a market sheet with one row per country or region that will take paid or email traffic between Black Friday and Cyber Monday. Columns are the four records plus merchant of record. Name an owner and a latest safe date, then treat an unsigned row as a blocked geo, not as a soft launch.&lt;/p&gt;&lt;p&gt;Complete the walk in this order. First, duties and HS codes on the promoted set, because a missing identifier cannot be fixed during a sale weekend. Second, currency, tax display, and every scheduled discount in that market&#39;s currency. Third, a live rate from the actual origin and the actual app or 3PL. Fourth, catalog publish and language completeness on the URLs in the ads. Fifth, a refunded test order from a phone on that market.&lt;/p&gt;&lt;p&gt;Freeze unscheduled Markets edits, new language publishes, and shipping-app changes once the sheet is green, on the same calendar as the storefront freeze in the readiness checklist. If a market still fails a rate or a duty line after the walk, turn off paid spend to that geo and leave the market active only if organic traffic can tolerate DAP and English fallback.&lt;/p&gt;&lt;p&gt;This reflects patterns we see regularly across the Shopify merchant and developer community as Markets, duties, and peak trading collide: admin looks complete, checkout is the first honest test, and the expensive failures are the ones nobody recorded.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;You can now walk each Shopify market that will take Black Friday traffic and record duties at checkout, currency and tax display, inventory and shipping profiles, and catalog or language gaps. Markets remains the right native layer for that work. The launch is the completed sheet and the refunded test orders, signed before ads name those countries.&lt;/p&gt;&lt;p&gt;If more than one market will take paid traffic and the rows still disagree, book a &lt;a href=&quot;https://ocontis.studio/services/shopify-stack-audit/&quot;&gt;Shopify stack audit&lt;/a&gt; or a &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;discovery call&lt;/a&gt; so Markets, checkout, and fulfilment can be owned as one system before the freeze.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Shopify Automatic Discounts vs Functions for Black Friday Promos</title>
    <link href="https://ocontis.studio/blog/post/shopify-automatic-discounts-vs-functions-for-black-friday-promos/" />
    <updated>2026-09-21T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/shopify-automatic-discounts-vs-functions-for-black-friday-promos/</id>
    <content type="html">&lt;h1&gt;Shopify Automatic Discounts vs Functions for Black Friday Promos&lt;/h1&gt;&lt;p&gt;The merchandising lead opens two cards on the same September board. Card one is a 20% sitewide automatic discount marketing already scheduled in the Shopify admin. Card two is the founder brief from Monday: buy two, take 40% off the third, free shipping over £75, and a gift pot once the cart hits £120.&lt;/p&gt;&lt;p&gt;Those are two different discount engines. &lt;strong&gt;Shopify automatic discounts&lt;/strong&gt; and discount codes live in the admin Discounts page and cover percentage, fixed amount, Buy X Get Y, and free shipping. &lt;strong&gt;Discount Functions&lt;/strong&gt; are app-defined types that run as Shopify Functions when the cart changes, so one rule can hit lines, the order, and shipping together, or apply tier and tag logic the native form cannot encode.&lt;/p&gt;&lt;p&gt;Choose the engine per promo before the freeze. Native automatic or code first when the rule fits. A public Function app or a Plus custom Discount Function only when the rule is genuinely custom, and only if you can test it on peak-sized carts while you still have time to roll back.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;This article teaches you to choose native Shopify automatic discounts or Discount Functions for each Black Friday promo by mapping stacking, BOGO, tiers, gift-with-purchase, Plus access, and peak performance before the freeze. Pairing a checkout banner with backend checkout logic is a different job, and it belongs in &lt;a href=&quot;https://ocontis.studio/blog/post/when-to-use-checkout-ui-extensions-vs-shopify-functions/&quot;&gt;&lt;em&gt;When to Use Checkout UI Extensions vs Shopify Functions&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The dated walk of checkout, inventory, fulfilment, and support gates sits in &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-black-friday-readiness-checklist-for-scaling-brands/&quot;&gt;&lt;em&gt;A Shopify Black Friday Readiness Checklist for Brands That Already Scale&lt;/em&gt;&lt;/a&gt;. This post stays on the discount method for the offers you already decided to run.&lt;/p&gt;&lt;p&gt;Merchant and developer threads in autumn keep returning to the same gap: a sitewide automatic that stacks with a code nobody re-checked, a gift that never appears as a line, or a Function that cannot see a discount code and a shipping country in the same run. The community signal is decision friction, not a missing campaign idea.&lt;/p&gt;&lt;h2&gt;The decision merchants face&lt;/h2&gt;&lt;p&gt;Shopify gives you three ways to reduce price, and they are easy to brief as one “promo”:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Automatic discounts&lt;/strong&gt; apply when the cart meets the conditions. The buyer never types a code.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Discount codes&lt;/strong&gt; apply when the buyer, an email, or an abandoned-checkout recovery message supplies the code.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;App discounts&lt;/strong&gt;, including Discount Functions, appear as extra types on the Discounts page after you install an app. Shopify then executes the Function to calculate the reduction.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Native automatic and code types are the same four shapes: percentage, fixed amount, Buy X Get Y (or Spend X Get Y), and free shipping. Combination settings decide whether a product discount, an order discount, and a shipping discount can sit on the same order.&lt;/p&gt;&lt;p&gt;A Discount Function is a new type. Shopify’s Discount API can return product and order operations from &lt;code&gt;cart.lines.discounts.generate.run&lt;/code&gt;, and shipping operations from &lt;code&gt;cart.delivery-options.discounts.generate.run&lt;/code&gt;. One Function can therefore do work that would otherwise be three native discounts with three combination matrices.&lt;/p&gt;&lt;p&gt;That power is why teams brief Functions too early. A 20% collection automatic with combination boxes written down is faster to test, cheaper to staff, and easier to turn off on 2 December than a WASM module you still have in review.&lt;/p&gt;&lt;figure class=&quot;blog-diagram epmb-figure&quot; role=&quot;figure&quot; aria-labelledby=&quot;epmb-19-caption&quot; data-diagram-id=&quot;epmb-19&quot;&gt;
  &lt;p class=&quot;epmb-figure__summary visually-hidden&quot; id=&quot;epmb-19-summary&quot;&gt;Black Friday discount engine&lt;/p&gt;
  &lt;div class=&quot;epmb-figure__brand epmb-figure__brand--top-right&quot;&gt;
  &lt;img class=&quot;epmb-figure__logo&quot; src=&quot;/assets/favicons/safari-pinned-tab.svg&quot; alt=&quot;oContis Studio&quot; width=&quot;32&quot; height=&quot;32&quot; decoding=&quot;async&quot; /&gt;
&lt;/div&gt;
  &lt;div class=&quot;epmb-figure__content&quot;&gt;
    
    &lt;svg id=&quot;epmb-19&quot; width=&quot;100%&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; class=&quot;flowchart&quot; style=&quot;max-width: 651.400390625px;&quot; viewBox=&quot;-8 -50.1015625 651.400390625 762.2671875&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot;&gt;&lt;style&gt;#epmb-19{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;fill:#fafae6;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#epmb-19 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#epmb-19 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#epmb-19 .error-icon{fill:#141414;}#epmb-19 .error-text{fill:#ebebeb;stroke:#ebebeb;}#epmb-19 .edge-thickness-normal{stroke-width:1px;}#epmb-19 .edge-thickness-thick{stroke-width:3.5px;}#epmb-19 .edge-pattern-solid{stroke-dasharray:0;}#epmb-19 .edge-thickness-invisible{stroke-width:0;fill:none;}#epmb-19 .edge-pattern-dashed{stroke-dasharray:3;}#epmb-19 .edge-pattern-dotted{stroke-dasharray:2;}#epmb-19 .marker{fill:#8a8a7a;stroke:#8a8a7a;}#epmb-19 .marker.cross{stroke:#8a8a7a;}#epmb-19 svg{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;}#epmb-19 p{margin:0;}#epmb-19 .label{font-family:&#39;Syne&#39;,system-ui,sans-serif;color:#fafae6;}#epmb-19 .cluster-label text{fill:#fafae6;}#epmb-19 .cluster-label span{color:#fafae6;}#epmb-19 .cluster-label span p{background-color:transparent;}#epmb-19 .label text,#epmb-19 span{fill:#fafae6;color:#fafae6;}#epmb-19 .node rect,#epmb-19 .node circle,#epmb-19 .node ellipse,#epmb-19 .node polygon,#epmb-19 .node path{fill:#141414;stroke:#db5461;stroke-width:1px;}#epmb-19 .rough-node .label text,#epmb-19 .node .label text,#epmb-19 .image-shape .label,#epmb-19 .icon-shape .label{text-anchor:middle;}#epmb-19 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#epmb-19 .rough-node .label,#epmb-19 .node .label,#epmb-19 .image-shape .label,#epmb-19 .icon-shape .label{text-align:center;}#epmb-19 .node.clickable{cursor:pointer;}#epmb-19 .root .anchor path{fill:#8a8a7a!important;stroke-width:0;stroke:#8a8a7a;}#epmb-19 .arrowheadPath{fill:#f1eff0;}#epmb-19 .edgePath .path{stroke:#8a8a7a;stroke-width:1px;}#epmb-19 .flowchart-link{stroke:#8a8a7a;fill:none;}#epmb-19 .edgeLabel{background-color:#141414;text-align:center;}#epmb-19 .edgeLabel p{background-color:#141414;}#epmb-19 .edgeLabel rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-19 .labelBkg{background-color:rgba(20, 20, 20, 0.5);}#epmb-19 .cluster rect{fill:#141414;stroke:hsl(0, 0%, 17.8431372549%);stroke-width:1px;}#epmb-19 .cluster text{fill:#fafae6;}#epmb-19 .cluster span{color:#fafae6;}#epmb-19 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:12px;background:#141414;border:1px solid hsl(0, 0%, 17.8431372549%);border-radius:2px;pointer-events:none;z-index:100;}#epmb-19 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fafae6;}#epmb-19 rect.text{fill:none;stroke-width:0;}#epmb-19 .icon-shape,#epmb-19 .image-shape{background-color:#141414;text-align:center;}#epmb-19 .icon-shape p,#epmb-19 .image-shape p{background-color:#141414;padding:2px;}#epmb-19 .icon-shape .label rect,#epmb-19 .image-shape .label rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-19 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#epmb-19 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#epmb-19 .node .neo-node{stroke:#db5461;}#epmb-19 [data-look=&quot;neo&quot;].node rect,#epmb-19 [data-look=&quot;neo&quot;].cluster rect,#epmb-19 [data-look=&quot;neo&quot;].node polygon{stroke:url(#epmb-19-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-19 [data-look=&quot;neo&quot;].swimlane.cluster rect{filter:none;}#epmb-19 [data-look=&quot;neo&quot;].node path{stroke:url(#epmb-19-gradient);stroke-width:1px;}#epmb-19 [data-look=&quot;neo&quot;].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-19 [data-look=&quot;neo&quot;].node .neo-line path{stroke:#db5461;filter:none;}#epmb-19 [data-look=&quot;neo&quot;].node circle{stroke:url(#epmb-19-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-19 [data-look=&quot;neo&quot;].node circle .state-start{fill:#000000;}#epmb-19 [data-look=&quot;neo&quot;].icon-shape .icon{fill:url(#epmb-19-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-19 [data-look=&quot;neo&quot;].icon-shape .icon-neo path{stroke:url(#epmb-19-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-19 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;epmb-19_flowchart-v2-pointEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 10 5 L 0 10 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-19_flowchart-v2-pointStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;4.5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 5 L 10 10 L 10 0 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-19_flowchart-v2-pointEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;11.5&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;10.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 11.5 7 L 0 14 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-19_flowchart-v2-pointStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;1&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;polygon points=&quot;0,7 11.5,14 11.5,0&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-19_flowchart-v2-circleEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;11&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-19_flowchart-v2-circleStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-1&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-19_flowchart-v2-circleEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refY=&quot;5&quot; refX=&quot;12.25&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-19_flowchart-v2-circleStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-2&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-19_flowchart-v2-crossEnd&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;12&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-19_flowchart-v2-crossStart&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;-1&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-19_flowchart-v2-crossEnd-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;17.7&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-19_flowchart-v2-crossStart-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;-3.5&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;g class=&quot;root&quot;&gt;&lt;g class=&quot;clusters&quot;/&gt;&lt;g class=&quot;edgePaths&quot;&gt;&lt;path d=&quot;M171.818,188.053L160.179,202.843C148.539,217.632,125.26,247.212,113.62,267.651C101.98,288.09,101.98,299.388,101.98,305.037L101.98,310.686&quot; id=&quot;epmb-19-L_Q_NATIVE_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_Q_NATIVE_0&quot; data-points=&quot;W3sieCI6MTcxLjgxODExMDgxMjcxNjU4LCJ5IjoxODguMDUyODc2NDM3NzE2NTh9LHsieCI6MTAxLjk4MDQ2ODc1LCJ5IjoyNzYuNzkxNDA2MjV9LHsieCI6MTAxLjk4MDQ2ODc1LCJ5IjozMTQuNjg1OTM3NX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-19_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M273.506,188.053L285.146,202.843C296.785,217.632,320.065,247.212,331.704,267.651C343.344,288.09,343.344,299.388,343.344,305.037L343.344,310.686&quot; id=&quot;epmb-19-L_Q_FUNC_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_Q_FUNC_0&quot; data-points=&quot;W3sieCI6MjczLjUwNjEwNzkzNzI4MzQ1LCJ5IjoxODguMDUyODc2NDM3NzE2NTh9LHsieCI6MzQzLjM0Mzc1LCJ5IjoyNzYuNzkxNDA2MjV9LHsieCI6MzQzLjM0Mzc1LCJ5IjozMTQuNjg1OTM3NX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-19_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M343.344,367.575L343.344,371.742C343.344,375.908,343.344,384.242,343.344,391.908C343.344,399.575,343.344,406.575,343.344,410.075L343.344,413.575&quot; id=&quot;epmb-19-L_FUNC_PLUS_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_FUNC_PLUS_0&quot; data-points=&quot;W3sieCI6MzQzLjM0Mzc1LCJ5IjozNjcuNTc1MDAwMDAwMDAwMDV9LHsieCI6MzQzLjM0Mzc1LCJ5IjozOTIuNTc1MDAwMDAwMDAwMDV9LHsieCI6MzQzLjM0Mzc1MDAwMDAwMDEsInkiOjQxNy41NzQ5OTk5OTk5OTk5M31d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-19_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M302.051,534.195L287.581,547.393C273.111,560.59,244.172,586.986,229.702,605.833C215.232,624.68,215.232,635.978,215.232,641.627L215.232,647.277&quot; id=&quot;epmb-19-L_PLUS_APP_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_PLUS_APP_0&quot; data-points=&quot;W3sieCI6MzAyLjA1MDg3MzgxOTc3MTE0LCJ5Ijo1MzQuMTk0NjIzODE5NzcxM30seyJ4IjoyMTUuMjMyNDIxODc1LCJ5Ijo2MTMuMzgyMDMxMjUwMDAwMX0seyJ4IjoyMTUuMjMyNDIxODc1LCJ5Ijo2NTEuMjc2NTYyNTAwMDAwMX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-19_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M384.637,534.195L399.106,547.393C413.576,560.59,442.516,586.986,456.985,605.833C471.455,624.68,471.455,635.978,471.455,641.627L471.455,647.277&quot; id=&quot;epmb-19-L_PLUS_BUILD_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_PLUS_BUILD_0&quot; data-points=&quot;W3sieCI6Mzg0LjYzNjYyNjE4MDIyODcsInkiOjUzNC4xOTQ2MjM4MTk3NzEzfSx7IngiOjQ3MS40NTUwNzgxMjUsInkiOjYxMy4zODIwMzEyNTAwMDAxfSx7IngiOjQ3MS40NTUwNzgxMjUsInkiOjY1MS4yNzY1NjI1MDAwMDAxfV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-19_flowchart-v2-pointEnd)&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabels&quot;&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(101.98046875, 276.79140625)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q_NATIVE_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-14.78515625&quot; y=&quot;-18.1015625&quot; width=&quot;29.5703125&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Yes&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(343.34375, 276.79140625)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q_FUNC_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-12.86328125&quot; y=&quot;-18.1015625&quot; width=&quot;25.7265625&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;No&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_FUNC_PLUS_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(215.232421875, 613.3820312500001)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_PLUS_APP_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-24.484375&quot; y=&quot;-18.1015625&quot; width=&quot;48.96875&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Public&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(471.455078125, 613.3820312500001)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_PLUS_BUILD_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-30.87109375&quot; y=&quot;-18.1015625&quot; width=&quot;61.7421875&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Custom&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;nodes&quot;&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-19-flowchart-Q-0&quot; data-look=&quot;classic&quot; transform=&quot;translate(222.662109375, 123.4484375)&quot;&gt;&lt;polygon points=&quot;115.4484375,0 230.896875,-115.4484375 115.4484375,-230.896875 0,-115.4484375&quot; class=&quot;label-container&quot; transform=&quot;translate(-114.9484375, 115.4484375)&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Native&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; automatic&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;or&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; code&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; covers&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; the&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; rule?&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-19-flowchart-NATIVE-2&quot; data-look=&quot;classic&quot; transform=&quot;translate(101.98046875, 341.13046875000003)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-93.98046875&quot; y=&quot;-26.44453125&quot; width=&quot;187.9609375&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Admin&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; automatic&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;or&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; discount&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; code&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-19-flowchart-FUNC-4&quot; data-look=&quot;classic&quot; transform=&quot;translate(343.34375, 341.13046875000003)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-97.3828125&quot; y=&quot;-26.44453125&quot; width=&quot;194.765625&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Discount&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Function&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;or&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Function&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; app&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-19-flowchart-PLUS-6&quot; data-look=&quot;classic&quot; transform=&quot;translate(343.34375, 496.53125000000006)&quot;&gt;&lt;polygon points=&quot;78.95625,0 157.9125,-78.95625 78.95625,-157.9125 0,-78.95625&quot; class=&quot;label-container&quot; transform=&quot;translate(-78.45625, 78.95625)&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Custom&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; app&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;or&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; public&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; app?&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-19-flowchart-APP-8&quot; data-look=&quot;classic&quot; transform=&quot;translate(215.232421875, 677.72109375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-94.25&quot; y=&quot;-26.44453125&quot; width=&quot;188.5&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Install&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; and&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; test&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;before&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; the&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; freeze&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-19-flowchart-BUILD-10&quot; data-look=&quot;classic&quot; transform=&quot;translate(471.455078125, 677.72109375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-111.97265625&quot; y=&quot;-26.44453125&quot; width=&quot;223.9453125&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Plus&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; custom&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Function&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;shipped&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; before&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; freeze&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-19-drop-shadow&quot; height=&quot;130%&quot; width=&quot;130%&quot;&gt;&lt;fedropshadow dx=&quot;4&quot; dy=&quot;4&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-19-drop-shadow-small&quot; height=&quot;150%&quot; width=&quot;150%&quot;&gt;&lt;fedropshadow dx=&quot;2&quot; dy=&quot;2&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;linearGradient id=&quot;epmb-19-gradient&quot; gradientUnits=&quot;objectBoundingBox&quot; x1=&quot;0%&quot; y1=&quot;0%&quot; x2=&quot;100%&quot; y2=&quot;0%&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#db5461&quot; stop-opacity=&quot;1&quot;/&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;hsl(0, 0%, 20.1960784314%)&quot; stop-opacity=&quot;1&quot;/&gt;&lt;/linearGradient&gt;&lt;text text-anchor=&quot;middle&quot; x=&quot;317.7001953125&quot; y=&quot;-25&quot; class=&quot;flowchartTitleText&quot;&gt;Black Friday discount engine&lt;/text&gt;&lt;/svg&gt;
  &lt;/div&gt;
  
  &lt;figcaption class=&quot;epmb-figure__caption&quot; id=&quot;epmb-19-caption&quot;&gt;Black Friday discount engine&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h2&gt;Criteria that actually matter&lt;/h2&gt;&lt;p&gt;Write one row per Black Friday offer. The columns below are the job. If a cell is blank two weeks before the freeze, the offer is not ready.&lt;/p&gt;&lt;h3&gt;Stacking and combination classes&lt;/h3&gt;&lt;p&gt;Shopify applies discounts to the subtotal before tax. Combination is class-based: product, order, and shipping. Two product discounts do not stack the way two different classes can.&lt;/p&gt;&lt;p&gt;Community prep threads keep landing on the same September homework: list every code, automatic, and free-shipping rule that will be live, then inspect each pair. A 20% automatic on the collection plus a 25% welcome code can become a 40% effective cut when both combination boxes stay ticked. That is a written policy, or it is an accident.&lt;/p&gt;&lt;p&gt;Discount Functions still participate in that model. The Function declares discount classes. Those classes decide which targets Shopify runs and how the Function sits next to native automatics and codes. A custom type that claims product, order, and shipping in one owner can hide the pair you thought you had isolated.&lt;/p&gt;&lt;p&gt;Replay last year’s peak SKUs against this year’s planned stack on a spreadsheet before you trust the admin preview. Cost per item has to be on the variant, or no report will tell you whether the pair still leaves contribution.&lt;/p&gt;&lt;h3&gt;BOGO, tiers, and gift-with-purchase&lt;/h3&gt;&lt;p&gt;Native Buy X Get Y covers “buy two, get the third at a set percentage or amount” when the rewarded item is already a catalogue line the buyer can add. Spend X Get Y covers a threshold on the same shapes.&lt;/p&gt;&lt;p&gt;The brief leaves native once the third unit needs a different rate from the sixth, once customer tags change the band, or once the gift is a SKU that should appear only after the threshold. Volume apps that only expose static percentage steps hit the same wall; a Discount Function can encode a formula or a tag table the admin form cannot.&lt;/p&gt;&lt;p&gt;Gift-with-purchase is the usual trap. Zeroing a qualifying item the buyer already added is a discount job. Inserting a new gift line with its own title and image is a cart-shape job. Cart Transform can expand, merge, and update lines. Adding a brand-new line is still a requested gap, which is why gift apps still mix Functions with storefront cart calls. If the founder wants a pot that “just appears”, name the add path on the row before ads mention the threshold.&lt;/p&gt;&lt;h3&gt;Codes versus automatic&lt;/h3&gt;&lt;p&gt;Automatic discounts are the right default for a sitewide or collection sale the whole weekend. Codes are the right default when the offer is for a list, an affiliate, or an abandoned checkout, because you can expire the code without touching the automatic that still sits on the storefront.&lt;/p&gt;&lt;p&gt;Mixing both is where BFCM goes quiet-then-loud. Recovery emails can attach a code to a cart that already received the automatic. Combination settings decide whether that is a second reduction or a rejected code. Test guest checkout, logged-in checkout, and the recovery path on the same SKU.&lt;/p&gt;&lt;p&gt;A Function that must reject a code for some shipping countries has a second constraint. The cart-lines discount target can see entered codes and often cannot see delivery address. The delivery-options target can see country and may not run once a code is present. If the Black Friday rule needs both inputs in one decision, treat that as a Function-design risk and settle it in October, or drop the geo rule from the promo.&lt;/p&gt;&lt;h3&gt;Plus versus a public Function app&lt;/h3&gt;&lt;p&gt;Stores on any plan can install a public App Store app that contains Functions. Only Shopify Plus can run a custom app that contains Shopify Function APIs. Shopify Help states the same split for building your own custom discounts app.&lt;/p&gt;&lt;p&gt;Checkout UI extensions, payment customisation, and delivery customisation remain Plus checkout work. They do not unlock a better percentage automatic. If the plan question is still open, use &lt;a href=&quot;https://ocontis.studio/blog/post/choosing-the-right-shopify-plan-a-practical-decision-framework/&quot;&gt;&lt;em&gt;Choosing the Right Shopify Plan&lt;/em&gt;&lt;/a&gt; before you treat an upgrade as a November discount patch.&lt;/p&gt;&lt;p&gt;A public Function app is still a production dependency at peak. You inherit the app’s WASM budget, its input queries, and its support hours. Prefer an app you already run in ordinary weeks over a seasonal discount install you will forget in January.&lt;/p&gt;&lt;h3&gt;Performance at peak&lt;/h3&gt;&lt;p&gt;Shopify executes Discount Functions inside checkout. Delays and failed runs affect whether the buyer can purchase. Shopify recommends Rust for large carts because JavaScript Functions are more likely to hit instruction or memory limits when the cart is full.&lt;/p&gt;&lt;p&gt;Function order is fixed: cart lines, Cart Transform, line discounts, then later delivery discounts and validation. A slow Discount Function sits on the purchase path, in front of fulfilment and payment customisation. Peak weekend is a poor first load test.&lt;/p&gt;&lt;p&gt;If you ship a custom Function, replay carts with last year’s line counts, plus a worst-case gift or bundle expansion, and read the Function run logs before the freeze. If you cannot name the last successful run against a large cart, the offer still belongs on a native automatic.&lt;/p&gt;&lt;h2&gt;Framework&lt;/h2&gt;&lt;p&gt;Use this matrix on the promo sheet. One row per offer. The recommendation is the first column that the rule actually needs.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Criterion&lt;/th&gt;&lt;th&gt;Native automatic or code&lt;/th&gt;&lt;th&gt;Public Discount Function app&lt;/th&gt;&lt;th&gt;Custom Discount Function (Plus)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Rule shape&lt;/td&gt;&lt;td&gt;Percentage, fixed amount, Buy X Get Y, free shipping&lt;/td&gt;&lt;td&gt;Tiers, tags, bundles, or mixed product and shipping in one type the app already ships&lt;/td&gt;&lt;td&gt;Brand-specific formula, membership table, or a class mix no public app can configure&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Stacking&lt;/td&gt;&lt;td&gt;Write product, order, and shipping combination pairs; test each pair on a live cart&lt;/td&gt;&lt;td&gt;Read the app’s discount classes and how they sit next to native automatics&lt;/td&gt;&lt;td&gt;Declare classes on purpose; one Function can replace three native discounts&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;BOGO and tiers&lt;/td&gt;&lt;td&gt;One rewarded rate, rewarded item already in catalogue&lt;/td&gt;&lt;td&gt;Stepped volume or category thresholds the app exposes&lt;/td&gt;&lt;td&gt;Formula or tag-driven bands the admin cannot store&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Gift-with-purchase&lt;/td&gt;&lt;td&gt;Discount or zero a line the buyer already added&lt;/td&gt;&lt;td&gt;App that owns the gift add path and inventory&lt;/td&gt;&lt;td&gt;Function plus Cart Transform or cart API, with the add path named&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Who can build it&lt;/td&gt;&lt;td&gt;Any plan, Discounts page&lt;/td&gt;&lt;td&gt;Any plan, App Store install&lt;/td&gt;&lt;td&gt;Plus custom app only&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Peak risk&lt;/td&gt;&lt;td&gt;Combination mishap, recovery code stacking&lt;/td&gt;&lt;td&gt;App WASM limits, leftover seasonal install&lt;/td&gt;&lt;td&gt;Untested large-cart runs, input-query gaps, deploy during freeze&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Choose this when&lt;/td&gt;&lt;td&gt;The brief fits a native type and you can write the pairs&lt;/td&gt;&lt;td&gt;The app already matches the brief and has run on this store&lt;/td&gt;&lt;td&gt;The brief is unique and the Function is in production before the freeze&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Recommendation by scenario&lt;/h2&gt;&lt;h3&gt;Sitewide or collection percentage&lt;/h3&gt;&lt;p&gt;Use a native automatic. Put the collection or product list on the discount, write the combination boxes, and keep marketing codes on a separate class or with combinations off. This is the card you can schedule, screenshot, and turn off on 2 December without a deploy.&lt;/p&gt;&lt;h3&gt;Simple BOGO on the same SKU&lt;/h3&gt;&lt;p&gt;Use native Buy X Get Y. “Buy two, get the third at 40%” is an admin rule when the third unit is the same product. Save Functions for a different rate on unit six, or for a gift that is a different SKU.&lt;/p&gt;&lt;h3&gt;Tiered volume or member pricing&lt;/h3&gt;&lt;p&gt;Start with a public Discount Function app you already trust if the tiers match its configuration. Commission a custom Discount Function on Plus only when the table is brand-specific and the app would need a rewrite. Either path needs a large-cart Function log before paid traffic.&lt;/p&gt;&lt;h3&gt;Gift-with-purchase plus free shipping&lt;/h3&gt;&lt;p&gt;Split the brief. Free shipping over £75 is a native shipping automatic or code. The gift pot is a separate row: native only if the pot is a catalogue item the buyer adds, otherwise an app or Function whose add path you have already tested with inventory. Do not hide both rules inside one untested Function the week ads start.&lt;/p&gt;&lt;h3&gt;Code for a list, automatic for the weekend&lt;/h3&gt;&lt;p&gt;Keep the weekend sale automatic. Give the list a code on a different class, or with combinations disabled against the automatic. Test abandoned-checkout recovery on a cart that already received the automatic, because that is the path that silently stacks.&lt;/p&gt;&lt;p&gt;If checkout itself is dropping purchases, fix that path first with &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-checkout-abandonment-when-your-funnel-looks-healthy/&quot;&gt;&lt;em&gt;How to Fix Shopify Checkout Abandonment When Your Funnel Looks Healthy&lt;/em&gt;&lt;/a&gt;. A Function that calculates a perfect discount still fails if Shop Pay or the payment step cannot complete.&lt;/p&gt;&lt;h3&gt;The brief arrived in November&lt;/h3&gt;&lt;p&gt;Simplify. Peak week is for combination audits and live test orders, not a new discount type. Park the gift pot or the tag table until January. The freeze in the readiness checklist exists so you stop inventing engines while the warehouse is already loading.&lt;/p&gt;&lt;h2&gt;What to lock before the freeze&lt;/h2&gt;&lt;p&gt;Put these dates on the same sheet as the offers. They sit beside the inventory work in &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-stop-shopify-oversells-during-black-friday-flash-sales/&quot;&gt;&lt;em&gt;How to Stop Shopify Oversells During Black Friday Flash Sales&lt;/em&gt;&lt;/a&gt;, because a gift SKU with no available-to-sell number is an oversell you scheduled as a promo.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Black Friday minus 21 days:&lt;/strong&gt; every offer has an engine (native automatic, code, public Function app, or Plus custom Function) and a named owner.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Black Friday minus 14 days:&lt;/strong&gt; combination pairs tested on guest, Shop Pay, and recovery; Function run logs exist for a large cart; gift add path proven with inventory.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Black Friday minus 10 days:&lt;/strong&gt; live test orders show the expected discount lines and shipping, with no staff workaround.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Freeze:&lt;/strong&gt; no new discount apps, no Function deploys, no combination edits except a documented hotfix with rollback.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Seasonal badge, timer, and gift apps are easy to install in October and easy to forget in January. If the discount engine is an app you only need for three weeks, write the uninstall date on the same row as the start date.&lt;/p&gt;&lt;p&gt;This reflects patterns we see regularly across the Shopify merchant and developer community.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;You can now choose native Shopify automatic discounts or Discount Functions for each Black Friday promo. Map stacking classes, BOGO and tier shape, gift-with-purchase add path, code versus automatic, Plus versus a public Function app, and peak Function performance, then freeze whatever you did not finish.&lt;/p&gt;&lt;p&gt;Start with the admin Discounts page when the rule fits. Use a Function, or a Function app, when one type must do work the native form cannot, and only when the run has already survived a large cart. The founder brief can wait until January if the engine is still a spec.&lt;/p&gt;&lt;p&gt;If the promo sheet needs a Discount Function or a checkout-adjacent build scoped and shipped before the freeze, start with &lt;a href=&quot;https://ocontis.studio/services/shopify-ui-extensions-and-functions/&quot;&gt;Shopify UI Extensions and Functions&lt;/a&gt; or &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;book a discovery call&lt;/a&gt; and we will map each offer to an engine the store can actually run on the Friday.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>How to Stop Shopify Oversells During Black Friday Flash Sales</title>
    <link href="https://ocontis.studio/blog/post/how-to-stop-shopify-oversells-during-black-friday-flash-sales/" />
    <updated>2026-09-18T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/how-to-stop-shopify-oversells-during-black-friday-flash-sales/</id>
    <content type="html">&lt;h1&gt;How to Stop Shopify Oversells During Black Friday Flash Sales&lt;/h1&gt;&lt;p&gt;The merchandising lead opens the 3PL screen at 07:40 on Black Friday and counts 47 units of the hero SKU still on the shelf. Shopify still shows 61 available because yesterday’s marketplace orders have not landed, and Continue selling is still on from an October restock campaign. Paid traffic is already live against that product page.&lt;/p&gt;&lt;p&gt;A &lt;strong&gt;Shopify oversell&lt;/strong&gt; during a flash sale is a cancelled order for a unit the warehouse no longer has. You stop it by writing a per-SKU &lt;strong&gt;available-to-sell&lt;/strong&gt; number, one hide-or-backorder rule, and a channel-sync check before ads send buyers into checkout. The work is inventory truth, not a larger discount.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;This article teaches you to write that available-to-sell number, oversell rule, and sync check so flash-sale checkout cannot sell units the warehouse has already lost. The dated walk of checkout, inventory, fulfilment, and support gates before peak season belongs in &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-black-friday-readiness-checklist-for-scaling-brands/&quot;&gt;&lt;em&gt;A Shopify Black Friday Readiness Checklist for Brands That Already Scale&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Merchant and developer threads keep returning to the same pattern: a storefront that looks in stock, a connector that is a few minutes behind, and a cancellation email before breakfast. Shared physical stock across separate products, Flow jobs that decrement siblings, and inventory apps that retry stale writes all widen the same gap. This post stays on the SKU sheet for the hours ads are live.&lt;/p&gt;&lt;h2&gt;What merchants are running into&lt;/h2&gt;&lt;p&gt;Flash-sale oversells rarely look like a storefront outage. Checkout completes, the confirmation email sends, and the 3PL rejects the order an hour later because the pick face is empty.&lt;/p&gt;&lt;p&gt;The usual tickets look like this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Shopify available still shows units while the warehouse count is already zero&lt;/li&gt;&lt;li&gt;Two channels sell the last unit in the same minute&lt;/li&gt;&lt;li&gt;Continue selling accepts the order after available hits zero&lt;/li&gt;&lt;li&gt;A bundle, kit, or duplicate listing sells a component another product still claims&lt;/li&gt;&lt;li&gt;An inventory app retries a failed write and applies the decrement twice, or overwrites a newer count with an older one&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Community questions about linking three product pages to one physical plate, or about storefront sold-out gaps that look like a replenishment failure, are the same ownership problem. The public page is a poor inventory report. Peak traffic only makes the lie expensive.&lt;/p&gt;&lt;p&gt;A second cluster shows up in BFCM prep threads: apps and theme scripts that were quiet in September start fighting when checkout volume jumps. Inventory is part of that pile. If a widget, a marketplace connector, and a 3PL feed can all change available stock, the first hour of the sale is a write race.&lt;/p&gt;&lt;h2&gt;Why this happens&lt;/h2&gt;&lt;p&gt;Shopify inventory is accurate for one item at one location, in the states Shopify owns. &lt;strong&gt;On-hand&lt;/strong&gt; is what is physically at that location. &lt;strong&gt;Available&lt;/strong&gt; is what that location can still sell inside Shopify. &lt;strong&gt;Committed&lt;/strong&gt; is already on an order. &lt;strong&gt;Reserved&lt;/strong&gt; is held, often by a draft order or a process Shopify does not treat as committed yet.&lt;/p&gt;&lt;p&gt;Ads, checkout, and the warehouse do not share that clock.&lt;/p&gt;&lt;p&gt;Paid traffic keeps sending people to a product page until someone stops the ad set. Checkout starts from the available number Shopify had when the buyer opened the cart. The warehouse ships from the units a picker can actually touch. When those three numbers diverge, the store sells a unit that is already gone.&lt;/p&gt;&lt;p&gt;Continue selling when out of stock widens the gap on purpose. Shopify will take the order after available hits zero. That is a backorder policy, and it is only safe when the product page already prints a dispatch date the warehouse has signed.&lt;/p&gt;&lt;p&gt;A second writer makes the same mess without that setting. Marketplace connectors, POS, 3PL feeds, and inventory-sync apps all adjust available. Shopify’s 2026 inventory mutations now expect compare-and-swap quantities and idempotent retries so a timeout does not apply the same change twice. Older connectors that still POST a new count from a cached read will overwrite the flash-sale decrement with yesterday afternoon’s number.&lt;/p&gt;&lt;p&gt;Shared-component setups add a third failure. Three storefront products that draw from one physical stack need one inventory item, a native bundle, or a dedicated component SKU. A Flow that decrements the siblings after each sale will miss cancellations, returns, and draft-order holds, then sell the last unit three times.&lt;/p&gt;&lt;figure class=&quot;blog-diagram epmb-figure&quot; role=&quot;figure&quot; aria-labelledby=&quot;epmb-18-caption&quot; data-diagram-id=&quot;epmb-18&quot;&gt;
  &lt;p class=&quot;epmb-figure__summary visually-hidden&quot; id=&quot;epmb-18-summary&quot;&gt;Flash-sale oversell diagnostic&lt;/p&gt;
  &lt;div class=&quot;epmb-figure__brand epmb-figure__brand--top-right&quot;&gt;
  &lt;img class=&quot;epmb-figure__logo&quot; src=&quot;/assets/favicons/safari-pinned-tab.svg&quot; alt=&quot;oContis Studio&quot; width=&quot;32&quot; height=&quot;32&quot; decoding=&quot;async&quot; /&gt;
&lt;/div&gt;
  &lt;div class=&quot;epmb-figure__content&quot;&gt;
    
    &lt;svg id=&quot;epmb-18&quot; width=&quot;100%&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; class=&quot;flowchart&quot; style=&quot;max-width: 342.3515625px;&quot; viewBox=&quot;-8 -50.1015625 342.3515625 428.7578125&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot;&gt;&lt;style&gt;#epmb-18{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;fill:#fafae6;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#epmb-18 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#epmb-18 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#epmb-18 .error-icon{fill:#141414;}#epmb-18 .error-text{fill:#ebebeb;stroke:#ebebeb;}#epmb-18 .edge-thickness-normal{stroke-width:1px;}#epmb-18 .edge-thickness-thick{stroke-width:3.5px;}#epmb-18 .edge-pattern-solid{stroke-dasharray:0;}#epmb-18 .edge-thickness-invisible{stroke-width:0;fill:none;}#epmb-18 .edge-pattern-dashed{stroke-dasharray:3;}#epmb-18 .edge-pattern-dotted{stroke-dasharray:2;}#epmb-18 .marker{fill:#8a8a7a;stroke:#8a8a7a;}#epmb-18 .marker.cross{stroke:#8a8a7a;}#epmb-18 svg{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;}#epmb-18 p{margin:0;}#epmb-18 .label{font-family:&#39;Syne&#39;,system-ui,sans-serif;color:#fafae6;}#epmb-18 .cluster-label text{fill:#fafae6;}#epmb-18 .cluster-label span{color:#fafae6;}#epmb-18 .cluster-label span p{background-color:transparent;}#epmb-18 .label text,#epmb-18 span{fill:#fafae6;color:#fafae6;}#epmb-18 .node rect,#epmb-18 .node circle,#epmb-18 .node ellipse,#epmb-18 .node polygon,#epmb-18 .node path{fill:#141414;stroke:#db5461;stroke-width:1px;}#epmb-18 .rough-node .label text,#epmb-18 .node .label text,#epmb-18 .image-shape .label,#epmb-18 .icon-shape .label{text-anchor:middle;}#epmb-18 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#epmb-18 .rough-node .label,#epmb-18 .node .label,#epmb-18 .image-shape .label,#epmb-18 .icon-shape .label{text-align:center;}#epmb-18 .node.clickable{cursor:pointer;}#epmb-18 .root .anchor path{fill:#8a8a7a!important;stroke-width:0;stroke:#8a8a7a;}#epmb-18 .arrowheadPath{fill:#f1eff0;}#epmb-18 .edgePath .path{stroke:#8a8a7a;stroke-width:1px;}#epmb-18 .flowchart-link{stroke:#8a8a7a;fill:none;}#epmb-18 .edgeLabel{background-color:#141414;text-align:center;}#epmb-18 .edgeLabel p{background-color:#141414;}#epmb-18 .edgeLabel rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-18 .labelBkg{background-color:rgba(20, 20, 20, 0.5);}#epmb-18 .cluster rect{fill:#141414;stroke:hsl(0, 0%, 17.8431372549%);stroke-width:1px;}#epmb-18 .cluster text{fill:#fafae6;}#epmb-18 .cluster span{color:#fafae6;}#epmb-18 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:12px;background:#141414;border:1px solid hsl(0, 0%, 17.8431372549%);border-radius:2px;pointer-events:none;z-index:100;}#epmb-18 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fafae6;}#epmb-18 rect.text{fill:none;stroke-width:0;}#epmb-18 .icon-shape,#epmb-18 .image-shape{background-color:#141414;text-align:center;}#epmb-18 .icon-shape p,#epmb-18 .image-shape p{background-color:#141414;padding:2px;}#epmb-18 .icon-shape .label rect,#epmb-18 .image-shape .label rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-18 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#epmb-18 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#epmb-18 .node .neo-node{stroke:#db5461;}#epmb-18 [data-look=&quot;neo&quot;].node rect,#epmb-18 [data-look=&quot;neo&quot;].cluster rect,#epmb-18 [data-look=&quot;neo&quot;].node polygon{stroke:url(#epmb-18-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-18 [data-look=&quot;neo&quot;].swimlane.cluster rect{filter:none;}#epmb-18 [data-look=&quot;neo&quot;].node path{stroke:url(#epmb-18-gradient);stroke-width:1px;}#epmb-18 [data-look=&quot;neo&quot;].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-18 [data-look=&quot;neo&quot;].node .neo-line path{stroke:#db5461;filter:none;}#epmb-18 [data-look=&quot;neo&quot;].node circle{stroke:url(#epmb-18-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-18 [data-look=&quot;neo&quot;].node circle .state-start{fill:#000000;}#epmb-18 [data-look=&quot;neo&quot;].icon-shape .icon{fill:url(#epmb-18-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-18 [data-look=&quot;neo&quot;].icon-shape .icon-neo path{stroke:url(#epmb-18-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-18 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;epmb-18_flowchart-v2-pointEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 10 5 L 0 10 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-18_flowchart-v2-pointStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;4.5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 5 L 10 10 L 10 0 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-18_flowchart-v2-pointEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;11.5&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;10.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 11.5 7 L 0 14 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-18_flowchart-v2-pointStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;1&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;polygon points=&quot;0,7 11.5,14 11.5,0&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-18_flowchart-v2-circleEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;11&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-18_flowchart-v2-circleStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-1&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-18_flowchart-v2-circleEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refY=&quot;5&quot; refX=&quot;12.25&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-18_flowchart-v2-circleStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-2&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-18_flowchart-v2-crossEnd&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;12&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-18_flowchart-v2-crossStart&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;-1&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-18_flowchart-v2-crossEnd-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;17.7&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-18_flowchart-v2-crossStart-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;-3.5&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;g class=&quot;root&quot;&gt;&lt;g class=&quot;clusters&quot;/&gt;&lt;g class=&quot;edgePaths&quot;&gt;&lt;path d=&quot;M134.117,61.989L134.117,66.156C134.117,70.322,134.117,78.656,134.117,86.322C134.117,93.989,134.117,100.989,134.117,104.489L134.117,107.989&quot; id=&quot;epmb-18-L_S1_S2_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_S1_S2_0&quot; data-points=&quot;W3sieCI6MTM0LjExNzE4NzUsInkiOjYxLjk4OTA2MjV9LHsieCI6MTM0LjExNzE4NzUsInkiOjg2Ljk4OTA2MjV9LHsieCI6MTM0LjExNzE4NzUsInkiOjExMS45ODkwNjI1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-18_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M134.117,164.878L134.117,169.045C134.117,173.211,134.117,181.545,134.117,189.211C134.117,196.878,134.117,203.878,134.117,207.378L134.117,210.878&quot; id=&quot;epmb-18-L_S2_S3_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_S2_S3_0&quot; data-points=&quot;W3sieCI6MTM0LjExNzE4NzUsInkiOjE2NC44NzgxMjV9LHsieCI6MTM0LjExNzE4NzUsInkiOjE4OS44NzgxMjV9LHsieCI6MTM0LjExNzE4NzUsInkiOjIxNC44NzgxMjV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-18_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M134.117,267.767L134.117,271.934C134.117,276.101,134.117,284.434,134.117,292.101C134.117,299.767,134.117,306.767,134.117,310.267L134.117,313.767&quot; id=&quot;epmb-18-L_S3_S4_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_S3_S4_0&quot; data-points=&quot;W3sieCI6MTM0LjExNzE4NzUsInkiOjI2Ny43NjcxODc1MDAwMDAwM30seyJ4IjoxMzQuMTE3MTg3NSwieSI6MjkyLjc2NzE4NzV9LHsieCI6MTM0LjExNzE4NzUsInkiOjMxNy43NjcxODc1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-18_flowchart-v2-pointEnd)&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabels&quot;&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_S1_S2_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_S2_S3_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_S3_S4_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;nodes&quot;&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-18-flowchart-S1-0&quot; data-look=&quot;classic&quot; transform=&quot;translate(134.1171875, 34.99453125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-123.0078125&quot; y=&quot;-26.99453125&quot; width=&quot;246.015625&quot; height=&quot;53.9890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.99453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;1&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; ·&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Compare&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Shopify&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;available&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;2.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;with&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; warehouse&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; on-hand&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-18-flowchart-S2-1&quot; data-look=&quot;classic&quot; transform=&quot;translate(134.1171875, 138.43359375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-117.20703125&quot; y=&quot;-26.44453125&quot; width=&quot;234.4140625&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;2&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; ·&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Name&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; every&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; channel&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;that&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; can&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; sell&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; the&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; SKU&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-18-flowchart-S3-2&quot; data-look=&quot;classic&quot; transform=&quot;translate(134.1171875, 241.32265625000002)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-126.1171875&quot; y=&quot;-26.44453125&quot; width=&quot;252.234375&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;3&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; ·&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Write&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; ATS,&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; one&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; oversell&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;rule,&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; and&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; a&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; sync&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; check&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-18-flowchart-S4-3&quot; data-look=&quot;classic&quot; transform=&quot;translate(134.1171875, 344.21171875)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-119.91796875&quot; y=&quot;-26.44453125&quot; width=&quot;239.8359375&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;4&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; ·&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Hide&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; the&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; variant&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; or&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;stop&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; spend&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; when&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; it&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; trips&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-18-drop-shadow&quot; height=&quot;130%&quot; width=&quot;130%&quot;&gt;&lt;fedropshadow dx=&quot;4&quot; dy=&quot;4&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-18-drop-shadow-small&quot; height=&quot;150%&quot; width=&quot;150%&quot;&gt;&lt;fedropshadow dx=&quot;2&quot; dy=&quot;2&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;linearGradient id=&quot;epmb-18-gradient&quot; gradientUnits=&quot;objectBoundingBox&quot; x1=&quot;0%&quot; y1=&quot;0%&quot; x2=&quot;100%&quot; y2=&quot;0%&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#db5461&quot; stop-opacity=&quot;1&quot;/&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;hsl(0, 0%, 20.1960784314%)&quot; stop-opacity=&quot;1&quot;/&gt;&lt;/linearGradient&gt;&lt;text text-anchor=&quot;middle&quot; x=&quot;163.17578125&quot; y=&quot;-25&quot; class=&quot;flowchartTitleText&quot;&gt;Flash-sale oversell diagnostic&lt;/text&gt;&lt;/svg&gt;
  &lt;/div&gt;
  
  &lt;figcaption class=&quot;epmb-figure__caption&quot; id=&quot;epmb-18-caption&quot;&gt;Flash-sale oversell diagnostic&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h2&gt;How to diagnose it&lt;/h2&gt;&lt;p&gt;Diagnose on the SKU that will take the most paid traffic, not on a store-wide inventory export.&lt;/p&gt;&lt;p&gt;Open Shopify, the 3PL, and every marketplace on the same variant. Write four numbers on one row: on-hand at the fulfilment location, Shopify available, committed plus reserved, and what the other channels still claim they can sell. If those numbers disagree by more than the buffer you are willing to eat, the SKU is not ready for a flash sale.&lt;/p&gt;&lt;p&gt;Then answer four questions:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Is Continue selling on for this variant?&lt;/li&gt;&lt;li&gt;Which apps or feeds are allowed to write inventory after the freeze?&lt;/li&gt;&lt;li&gt;Does another product, bundle, or kit consume the same physical unit?&lt;/li&gt;&lt;li&gt;What happens in the first sixty seconds after available hits the buffer: hide, dated backorder, or stop spend?&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;If you cannot name the writer, treat every extra inventory app as a suspect. Admin tasks that still bounce between five systems in ordinary weeks are the same ownership gap, and that year-round version lives in &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-operational-friction-when-simple-tasks-still-take-too-long/&quot;&gt;&lt;em&gt;How to Fix Shopify Operational Friction When Simple Tasks Still Take Too Long&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Place one live test order on a phone for the exact offer you will advertise, then refund it. Confirm the line deducts the fulfilment location you will actually pick from, the 3PL sees the order, and Shopify available moves by the same quantity. A checkout that looks healthy while the warehouse never sees the SKU is a different failure, covered in &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-checkout-abandonment-when-your-funnel-looks-healthy/&quot;&gt;&lt;em&gt;How to Fix Shopify Checkout Abandonment When Your Funnel Looks Healthy&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;How to fix it&lt;/h2&gt;&lt;p&gt;Fix the SKU sheet before you touch the ad account.&lt;/p&gt;&lt;h3&gt;Write available-to-sell&lt;/h3&gt;&lt;p&gt;For each promoted variant, set:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Available-to-sell = on-hand at the pick location − committed − reserved − marketplace holds − buffer&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The buffer is units you will not advertise: damage, wholesale leakage, or the days you stocked out last year and never counted as lost demand. Last year’s units sold are a floor if you were out of stock. Add those missing days back or you will reprint the stock-out on an earlier date.&lt;/p&gt;&lt;p&gt;Put that number into Shopify as the available quantity at the fulfilment location you will pick from. Do not leave a second location sellable if that location cannot ship the flash-sale promise. Incoming purchase orders stay in incoming until the units are on the shelf.&lt;/p&gt;&lt;h3&gt;Write one oversell rule&lt;/h3&gt;&lt;p&gt;Pick one rule per SKU and print it on the same row:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Rule&lt;/th&gt;&lt;th&gt;When to use it&lt;/th&gt;&lt;th&gt;What buyers see&lt;/th&gt;&lt;th&gt;What you do in the same hour&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Hide&lt;/td&gt;&lt;td&gt;Finite flash inventory with no dated restock&lt;/td&gt;&lt;td&gt;Variant gone, or page redirected&lt;/td&gt;&lt;td&gt;Cut the ad set and remove the SKU from sale collections&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Dated backorder&lt;/td&gt;&lt;td&gt;You can name a dispatch week the warehouse has signed&lt;/td&gt;&lt;td&gt;Buy button stays, dispatch date on PDP and checkout&lt;/td&gt;&lt;td&gt;Keep Continue selling on only for that SKU, and staff the delay emails&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Stop spend&lt;/td&gt;&lt;td&gt;The page must stay up for organic or email, but paid traffic must die&lt;/td&gt;&lt;td&gt;Page may remain, add-to-cart optional&lt;/td&gt;&lt;td&gt;Pause campaigns first, then hide if remaining units keep leaking&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Mixed rules across Shopify, Amazon, and wholesale are how the last unit sells twice. If Amazon still has 12 and Shopify has 0, Amazon is on a different rule unless you wrote that allocation into available-to-sell this morning.&lt;/p&gt;&lt;h3&gt;Run the channel-sync check&lt;/h3&gt;&lt;p&gt;The morning the offer goes live, and again every two hours while ads spend:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Shopify available at the pick location&lt;/li&gt;&lt;li&gt;3PL on-hand and open pick backlog&lt;/li&gt;&lt;li&gt;Each marketplace’s remaining quantity&lt;/li&gt;&lt;li&gt;Whether Continue selling is still off, unless the SKU is on the dated-backorder rule&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;When the remaining units hit the buffer, execute the rule in the same hour. Hide and cut spend together. A hidden product with a live ad is still an oversell you paid for.&lt;/p&gt;&lt;p&gt;Give one system permission to write Shopify available during the sale. The 3PL or ERP can be that system if it already owns on-hand. Shopify can be that system if every other channel only reads. Two writers is the race you are trying to close.&lt;/p&gt;&lt;p&gt;If a connector still adjusts inventory with a cached count, turn that write off for the weekend or replace it with a compare-and-swap update that refuses to apply when the current quantity has already changed. Shopify now documents that pattern for inventory mutations; peak weekend is a poor time to discover your app still uses the old overwrite.&lt;/p&gt;&lt;p&gt;Kits and duplicate listings need a structural fix, not a faster Flow. Use one product with variants, Shopify Bundles against a component SKU, or a dedicated inventory item that every listing reads. A Flow that subtracts siblings after the order is a second writer with no compare-and-swap and no return path.&lt;/p&gt;&lt;p&gt;Draft orders and invoice checkouts deserve their own line on the sheet. A wholesale invoice that uses real variant IDs so shipping rates calculate can decrement the same flash-sale SKU again. Park those drafts or use inventory behaviour that does not touch available stock until Cyber Monday is over.&lt;/p&gt;&lt;h2&gt;When to get help&lt;/h2&gt;&lt;p&gt;Get help when the numbers disagree and you cannot name a single writer.&lt;/p&gt;&lt;p&gt;That usually means a 3PL feed, a marketplace connector, and an inventory app all update the same variant, or three product pages share one physical stack with no component SKU. It also shows up when POS, Collective, or a second Shopify store sells the same units the flash sale is advertising.&lt;/p&gt;&lt;p&gt;Plus does not fix that map. Plus helps when you already use checkout extensibility and want launch support, which is a plan conversation, not an inventory switch. If that decision is still open, use &lt;a href=&quot;https://ocontis.studio/blog/post/choosing-the-right-shopify-plan-a-practical-decision-framework/&quot;&gt;&lt;em&gt;Choosing the Right Shopify Plan&lt;/em&gt;&lt;/a&gt; before you book a connector rebuild against the freeze.&lt;/p&gt;&lt;p&gt;Finance should know the volume conversation before the weekend as well. A reserve or a delayed payout during the same days you are cancelling oversold orders is a cash problem stacked on a stock problem, and the reserve mechanics sit in &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-payments-reserves-does-upgrading-to-plus-change-anything/&quot;&gt;&lt;em&gt;Shopify Payments Reserves: Does Upgrading to Plus Change Anything?&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;You can now write a per-SKU available-to-sell number, a hide-or-backorder oversell rule, and a channel-sync check so flash-sale checkout stops at the units the warehouse still has. The sale can stay aggressive. The inventory row has to stay honest.&lt;/p&gt;&lt;p&gt;If Shopify, the 3PL, and the marketplaces still write the same SKU without a source of truth, that is integration work, which we scope through &lt;a href=&quot;https://ocontis.studio/services/integrations-and-system-optimisation/&quot;&gt;integrations and system optimisation&lt;/a&gt;. If the gap is a custom inventory writer or a bundle that native tools cannot model, that is &lt;a href=&quot;https://ocontis.studio/services/shopify-app-development/&quot;&gt;custom app development&lt;/a&gt;. For a discovery conversation that starts from the SKUs you plan to advertise, &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;book a stack assessment&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>A Shopify Black Friday Readiness Checklist for Brands That Already Scale</title>
    <link href="https://ocontis.studio/blog/post/shopify-black-friday-readiness-checklist-for-scaling-brands/" />
    <updated>2026-09-16T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/shopify-black-friday-readiness-checklist-for-scaling-brands/</id>
    <content type="html">&lt;h1&gt;A Shopify Black Friday Readiness Checklist for Brands That Already Scale&lt;/h1&gt;&lt;p&gt;The ops lead opens last year’s peak sheet on a Tuesday in September. Three rows still have no owner: discount stacking at checkout, the 3PL last-dispatch time, and who answers Inbox after 22:00 on the Friday. Last year’s revenue already scaled. This year’s risk is an unsigned gate, not a missing campaign idea.&lt;/p&gt;&lt;p&gt;A &lt;strong&gt;Shopify Black Friday readiness checklist&lt;/strong&gt; for a brand that already scales is a dated sign-off. You walk checkout, inventory, fulfilment, and support until each gate has an owner, a pass criterion, and a latest safe date. Marketing can still plan offers. Those offers only go live when the operational rows are green.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;This article teaches you to walk a scaling Shopify brand through that dated Black Friday checklist and sign the four gates before peak season. Year-round workflow ownership, when a simple admin task still takes too long in ordinary weeks, belongs in &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-operational-friction-when-simple-tasks-still-take-too-long/&quot;&gt;&lt;em&gt;How to Fix Shopify Operational Friction When Simple Tasks Still Take Too Long&lt;/em&gt;&lt;/a&gt;. Diagnosing a checkout that already drops purchases belongs in &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-checkout-abandonment-when-your-funnel-looks-healthy/&quot;&gt;&lt;em&gt;How to Fix Shopify Checkout Abandonment When Your Funnel Looks Healthy&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Shopify’s own 2026 merchant checklist still starts with offers, email, and homepage creative, which is the right work for a store that is still building demand. Brands that already trade at scale fail in a narrower way: a promotion prints a dispatch promise the warehouse cannot keep, a discount stacks twice, inventory disagrees across channels, or support has no weekend rota. Community threads after peak keep returning to cancelled orders, tracking that went quiet, and order-status copy that no longer matches how pickup and partial fulfilment actually work.&lt;/p&gt;&lt;p&gt;Treat BFCM as a change-control problem with a calendar. The table below is the whole walk. The sections after it are how you pass each row.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Gate&lt;/th&gt;&lt;th&gt;Named owner&lt;/th&gt;&lt;th&gt;Pass criterion&lt;/th&gt;&lt;th&gt;Latest safe date&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Change control&lt;/td&gt;&lt;td&gt;Tech / theme lead&lt;/td&gt;&lt;td&gt;No unscheduled theme, app, or checkout-extension deploys until the freeze lifts&lt;/td&gt;&lt;td&gt;Black Friday minus 14 days&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Inventory&lt;/td&gt;&lt;td&gt;Ops / merchandising&lt;/td&gt;&lt;td&gt;Every promoted SKU has a written buffer, oversell rule, and channel-sync check&lt;/td&gt;&lt;td&gt;Black Friday minus 21 days&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fulfilment&lt;/td&gt;&lt;td&gt;Ops / 3PL&lt;/td&gt;&lt;td&gt;Last-dispatch times and packing capacity match the on-site shipping promise&lt;/td&gt;&lt;td&gt;Black Friday minus 14 days&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Checkout and payments&lt;/td&gt;&lt;td&gt;Commerce / finance&lt;/td&gt;&lt;td&gt;Live test orders clear discounts, Shop Pay, and fraud review without a staff workaround&lt;/td&gt;&lt;td&gt;Black Friday minus 10 days&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Support and returns&lt;/td&gt;&lt;td&gt;CX lead&lt;/td&gt;&lt;td&gt;Weekend rota, macros, and return window published on PDP, FAQ, and confirmation email&lt;/td&gt;&lt;td&gt;Black Friday minus 7 days&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;How the dated checklist works&lt;/h2&gt;&lt;p&gt;Print the five rows into a shared sheet the leadership team already opens. Each row needs a person, a date, and a binary pass: the gate is signed or the promotion stays unpublished for that SKU or channel.&lt;/p&gt;&lt;p&gt;Dates count backward from the first heavy trading day you actually run, which for most European and US brands is the Friday after US Thanksgiving, with Cyber Monday still inside the same freeze. Shopify reported $14.6 billion in merchant sales over BFCM 2025, up 27% on 2024, so the calendar is crowded even when your category is not US-centric. Adobe’s 2025 holiday read, cited in Shopify’s own checklist, also had smartphones taking more than half of online holiday transactions, which is why every checkout test in this article starts on a phone.&lt;/p&gt;&lt;p&gt;Do not add a sixth row for “brand” or “creative.” Creative is a child of the freeze: banners, sale collections, and scheduled discounts may change inside rules you already tested. New apps, new checkout logic, and new theme architecture wait until January.&lt;/p&gt;&lt;p&gt;If Plus checkout extensibility is still an open project, park it or finish it before the freeze. The split between display and logic is covered in &lt;a href=&quot;https://ocontis.studio/blog/post/when-to-use-checkout-ui-extensions-vs-shopify-functions/&quot;&gt;&lt;em&gt;When to Use Checkout UI Extensions vs Shopify Functions&lt;/em&gt;&lt;/a&gt;. Peak week is a poor moment to discover that a Function cannot call your ERP at runtime.&lt;/p&gt;&lt;h2&gt;Gate 1: Freeze storefront, apps, and checkout changes&lt;/h2&gt;&lt;p&gt;Sign this gate when the theme lead can name what is allowed to change after the freeze date, and everything else has a rollback owner.&lt;/p&gt;&lt;p&gt;Allowed after freeze: collection merchandising, product badges you already styled, scheduled automatic discounts, gift-card denominations, and copy on the shipping policy. Blocked after freeze: theme code, new App Store installs, checkout UI extensions, Shopify Functions, and pixel work that still needs a developer on the Thank you page.&lt;/p&gt;&lt;p&gt;The freeze exists because peak traffic runs the last thing you shipped. A discount app installed on the Tuesday before Black Friday will be the first ticket when codes stack. A homepage rebuild the same week will be the first ticket when mobile menu, sale badges, or a countdown timer regresses. Community questions about Horizon sale badges and menus that stay open after a tap are ordinary merchandising tickets in September and expensive ones in November.&lt;/p&gt;&lt;p&gt;Write the freeze in the same place you write the promo calendar. If marketing needs a new bundle, the bundle uses cart transforms or discounts that already passed Gate 4. If they need a new checkout banner, it uses an extension that is already in production.&lt;/p&gt;&lt;p&gt;Plus merchants sometimes treat Shopify Plus as extra headroom for last-minute checkout work. Plus helps when you already use checkout extensibility and want launch support, which is a plan decision, not a November patch. If the plan question is still open, use &lt;a href=&quot;https://ocontis.studio/blog/post/choosing-the-right-shopify-plan-a-practical-decision-framework/&quot;&gt;&lt;em&gt;Choosing the Right Shopify Plan&lt;/em&gt;&lt;/a&gt; before you book a Function sprint against the freeze.&lt;/p&gt;&lt;h2&gt;Gate 2: Sign off inventory, allocations, and oversell rules&lt;/h2&gt;&lt;p&gt;Sign this gate when merchandising can point at every promoted SKU and say how many units you will sell, where those units live, and what happens when they run out.&lt;/p&gt;&lt;p&gt;Last year’s units sold are a floor, not a forecast, if you stocked out. The Christmas-order thread that keeps returning in merchant communities is the same censored-demand problem: the report shows what was on the shelf, and the days of zero availability never appear as lost demand. Add those days back as a buffer, or you will reprint last year’s stock-out on an earlier date.&lt;/p&gt;&lt;p&gt;Then write three fields per SKU:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Buffer:&lt;/strong&gt; units you will not advertise, held for damage, wholesale, or marketplace leakage.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Oversell rule:&lt;/strong&gt; hide, backorder with a dated dispatch, or stop paid spend. Pick one. Mixed rules across channels create cancelled orders.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Sync check:&lt;/strong&gt; Shopify, the 3PL, and every marketplace agree on available units the morning the offer goes live.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Channel drift is the expensive branding problem merchants describe after a pretty storefront sells units that another channel already took. Peak weekend compresses that failure into breakfast cancellation emails. A brand that already scales usually has more than one selling surface, so this gate is a sync problem before it is a purchase-order problem. The SKU-level available-to-sell number, hide-or-backorder rule, and morning sync check live in &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-stop-shopify-oversells-during-black-friday-flash-sales/&quot;&gt;&lt;em&gt;How to Stop Shopify Oversells During Black Friday Flash Sales&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Hide or redirect out-of-stock products on the storefront you are advertising. Paid traffic against a dead variant is a refund and a support ticket you scheduled yourself.&lt;/p&gt;&lt;h2&gt;Gate 3: Confirm fulfilment capacity and the printed promise&lt;/h2&gt;&lt;p&gt;Sign this gate when the shipping sentence on the storefront, in email, and at checkout matches the last time a box can actually leave the building.&lt;/p&gt;&lt;p&gt;Accuracy outranks a cheap rate once you are already converting. If you print “dispatch tomorrow” you need Saturday labour, packing supplies, and a carrier cut-off that survives the volume you are buying ads against. If the 3PL’s last intake is Friday noon, the site cannot promise Friday night.&lt;/p&gt;&lt;p&gt;Walk the physical path once with the people who pick:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Where the A-grade promoted SKUs sit, and whether the pick path still works when those locations empty.&lt;/li&gt;&lt;li&gt;How mixed-carrier or multi-box orders get tracking into Shopify without staff inventing extra fulfilments.&lt;/li&gt;&lt;li&gt;Which Flow, ERP, or 3PL rule decides an order is allowed to leave, especially when fraud tools and address validation sit in the middle.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Fulfilment release logic that lives in five apps will stall the first time volume spikes. You do not need a new system of record in October. You need one named path and a person who can override it at 21:00.&lt;/p&gt;&lt;p&gt;Update the FAQ, confirmation email, and checkout delivery description with the same dates. If a carrier later slips, change the public sentence in one place and stop selling a speed you cannot keep.&lt;/p&gt;&lt;h2&gt;Gate 4: Prove checkout, discounts, and payments on a real order&lt;/h2&gt;&lt;p&gt;Sign this gate when a phone can complete the exact offer you plan to run, including the ugly combinations.&lt;/p&gt;&lt;p&gt;Run at least four live checkouts, then refund them: guest checkout with an automatic discount and standard shipping; Shop Pay with a discount code and expedited shipping; a gift card plus a stacked promotion you will actually advertise; and a market or currency you care about if you sell through Shopify Markets.&lt;/p&gt;&lt;p&gt;Watch the money path, not only the thank-you screen. Confirm Shopify Payments or your gateway settles, the discount line is correct, shipping tax matches the policy, and the order lands in the 3PL with the right SKU. Confirm order confirmation and shipping emails send. Confirm purchase pixels fire on Thank you and Order status pages; Additional Scripts on those pages stopped for non-Plus stores on 26 August 2026, so a tracking gap can look like a sales drop while checkout is healthy.&lt;/p&gt;&lt;p&gt;Fraud review is part of this gate. A queue that is fine on a Tuesday will age out on Friday night if nobody owns it. Plus does not automatically remove &lt;strong&gt;Shopify Payments&lt;/strong&gt; reserves when volume jumps; the mechanics sit in &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-payments-reserves-does-upgrading-to-plus-change-anything/&quot;&gt;&lt;em&gt;Shopify Payments Reserves: Does Upgrading to Plus Change Anything?&lt;/em&gt;&lt;/a&gt;. Finance should know the reserve conversation before the weekend, not during it.&lt;/p&gt;&lt;p&gt;If checkout still needs a new Function or UI extension to make the offer true, that work belongs before Gate 1. Shipping a checkout change inside the freeze turns Gate 4 into an incident.&lt;/p&gt;&lt;h2&gt;Gate 5: Staff support, returns, and the war-room rota&lt;/h2&gt;&lt;p&gt;Sign this gate when CX can show a named person for every hour the store will take paid traffic, plus macros for the tickets you already know you will get.&lt;/p&gt;&lt;p&gt;Peak tickets cluster: Where is my order, the discount did not apply, the variant is gone, the parcel is split, I want to return a gift. Write those answers into Shopify Inbox instant replies, the FAQ, and a short internal macro list. Turn on order-status self-serve so the queue is not a tracking desk.&lt;/p&gt;&lt;p&gt;Publish the return window where the buyer is looking while they still have the card out: PDP, FAQ, and the confirmation email. An extended holiday return is an operations cost, so put the date on the same sheet as inventory and keep merchandising from advertising a deal finance cannot absorb on the way back.&lt;/p&gt;&lt;p&gt;Write the war-room rota as named hours on a calendar rather than an informal Slack channel. Name who watches checkout errors, who can pause a discount, who can stop a campaign, and who can change the shipping sentence. Overnight coverage is the row brands skip, then rediscover at 01:00 when a code goes viral on a market you did not staff.&lt;/p&gt;&lt;h2&gt;Gate 6: Run the peak window and close with a written debrief&lt;/h2&gt;&lt;p&gt;Once the five gates are signed, the live job is to keep them true.&lt;/p&gt;&lt;p&gt;On a shared board, refresh every two hours through the heavy days:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Checkout errors and discount misfires&lt;/li&gt;&lt;li&gt;Inventory remaining versus the oversell rule&lt;/li&gt;&lt;li&gt;3PL backlog versus the printed dispatch promise&lt;/li&gt;&lt;li&gt;Fraud-review age&lt;/li&gt;&lt;li&gt;Support queue time&lt;/li&gt;&lt;li&gt;Purchase pixels versus paid orders&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If a SKU hits the oversell rule, hide it and cut spend in the same hour. If a carrier slips, rewrite the public promise and email people who already paid for a speed you lost. If pixels go quiet while Shopify still shows orders, treat that as an ads-reporting incident, not a conversion collapse.&lt;/p&gt;&lt;p&gt;After Cyber Monday, write a debrief while the tickets are still in living memory. Capture sell-through against the buffer, refund and return reasons, which discounts stacked, which gates you would date earlier, and which freeze exceptions you would refuse next year. That document is next September’s sheet. Brands that already scale improve peak by closing the last one, not by inventing a new campaign type.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;You can now walk a scaling Shopify brand through a dated Black Friday readiness checklist and sign checkout, inventory, fulfilment, and support before peak traffic. The work is owners, pass criteria, and freeze dates, with live test orders and a war-room rota sitting on top of the same sheet.&lt;/p&gt;&lt;p&gt;If a gate fails because inventory, 3PL, or order routing cannot keep the promise you print, that is integration and workflow work, which we scope through &lt;a href=&quot;https://ocontis.studio/services/integrations-and-system-optimisation/&quot;&gt;integrations and system optimisation&lt;/a&gt;. If checkout display or discount logic is the unsigned row, that is &lt;a href=&quot;https://ocontis.studio/services/shopify-ui-extensions-and-functions/&quot;&gt;checkout UI extensions and Functions&lt;/a&gt; finished before the freeze, not during it. For a discovery conversation that starts from the unsigned gates on your sheet, &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;book a stack assessment&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>When Shopify WebMCP Matters vs the Claude Admin Connector</title>
    <link href="https://ocontis.studio/blog/post/when-shopify-webmcp-matters-vs-the-claude-admin-connector/" />
    <updated>2026-09-14T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/when-shopify-webmcp-matters-vs-the-claude-admin-connector/</id>
    <content type="html">&lt;h1&gt;When Shopify WebMCP Matters vs the Claude Admin Connector&lt;/h1&gt;&lt;p&gt;A marketing lead and an ops lead land in the same Slack thread with the same three letters. Marketing wants to know whether an in-browser agent can already search the catalogue and fill a cart. Ops wants Claude to answer yesterday&#39;s order count and, if the answer looks clean, tidy a leftover discount code.&lt;/p&gt;&lt;p&gt;Both people call the work &lt;strong&gt;MCP&lt;/strong&gt;. Those are two sessions, two write surfaces, and two first tickets. Enable the wrong door first and you either spend a week testing a storefront contract most shoppers still cannot invoke, or you hand a staff assistant production keys before anyone has named who may approve a write.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Shopify WebMCP&lt;/strong&gt; matters when the shopper holds the tab and the job is catalogue, cart, policy, or checkout navigation in that session. The &lt;strong&gt;Claude admin connector&lt;/strong&gt; matters when a staff member holds Claude and the job is live admin data. Sequence them from the session owner and the data each surface can change.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;This article teaches you to sequence whether shopper-tab WebMCP or staff Claude admin access should go live first. The in-tab tool map and theme contract test belong in &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-webmcp-what-in-browser-ai-agents-can-do-on-your-store/&quot;&gt;&lt;em&gt;Shopify WebMCP: What In-Browser AI Agents Can Do on Your Store&lt;/em&gt;&lt;/a&gt;. Isolation patterns for admin writes belong in &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-keep-the-shopify-claude-connector-away-from-production-data/&quot;&gt;&lt;em&gt;How to Keep the Shopify Claude Connector Away from Production Data&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Community traffic still folds several doors into one story. Partners already split a front-end Claude review of the public site from any request for admin access. Merchants who added &lt;code&gt;llms.txt&lt;/code&gt; or noticed UCP and MCP endpoints then blame that bundle for traffic they cannot attribute. Off-site catalogue syndication is a third discovery path, covered in &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-ai-product-discovery-ucp-catalog-and-data-readiness/&quot;&gt;&lt;em&gt;Shopify AI product discovery: UCP catalog and data readiness&lt;/em&gt;&lt;/a&gt;. This piece stays on the first-choice question: WebMCP versus the official Claude connector.&lt;/p&gt;&lt;p&gt;Install steps and permission screens for the connector stay in &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-and-claude-connector-setup-benefits-and-risks-for-merchants/&quot;&gt;&lt;em&gt;Shopify Claude Connector App: Setup, Permissions, and Risks&lt;/em&gt;&lt;/a&gt;. Skip another setup walkthrough when the only decision is which door opens first.&lt;/p&gt;&lt;h2&gt;Name who holds the session&lt;/h2&gt;&lt;p&gt;The first filter is the person sitting in front of the glass, because each surface only works for that person.&lt;/p&gt;&lt;p&gt;Shopify documents &lt;a href=&quot;https://shopify.dev/docs/api/web-mcp&quot;&gt;WebMCP tools&lt;/a&gt; for agents that shoppers bring into the storefront tab. Catalogue tools read through the Storefront API. Cart tools call the same &lt;code&gt;Shopify.actions&lt;/code&gt; surface apps already use. Checkout and account tools move that live session. Everything the agent does happens in the tab the shopper is looking at.&lt;/p&gt;&lt;p&gt;The official Claude connector sits on the other side of the counter. A staff member opens Claude, authenticates a store, and asks operational questions against admin data. Writes, when they exist, wait for a confirmation and then apply to the connected store. There is no shopper in that loop, and there is no cart drawer for a customer to watch.&lt;/p&gt;&lt;p&gt;If you cannot name the session owner in one sentence, you do not have a first ticket yet. &amp;quot;We want AI on Shopify&amp;quot; is a budget line. &amp;quot;The shopper&#39;s agent should add the navy hoodie in size M&amp;quot; is a WebMCP job. &amp;quot;Ops should ask Claude for yesterday&#39;s refund count&amp;quot; is a connector job.&lt;/p&gt;&lt;p&gt;A third owner shows up in the same meetings and still sits outside this choice. Sidekick lives in admin as Shopify&#39;s own assistant, with a different training loop, as &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-sidekicks-continual-learning-flywheel-what-merchants-should-know/&quot;&gt;&lt;em&gt;Shopify Sidekick&#39;s continual learning flywheel&lt;/em&gt;&lt;/a&gt; describes. Remote Storefront MCP and UCP catalog endpoints serve agents that never load your theme. Keep those names on a parking list so they stop stealing the first decision.&lt;/p&gt;&lt;figure class=&quot;blog-diagram epmb-figure&quot; role=&quot;figure&quot; aria-labelledby=&quot;epmb-17-caption&quot; data-diagram-id=&quot;epmb-17&quot;&gt;
  &lt;p class=&quot;epmb-figure__summary visually-hidden&quot; id=&quot;epmb-17-summary&quot;&gt;Who holds the session&lt;/p&gt;
  &lt;div class=&quot;epmb-figure__brand epmb-figure__brand--top-right&quot;&gt;
  &lt;img class=&quot;epmb-figure__logo&quot; src=&quot;/assets/favicons/safari-pinned-tab.svg&quot; alt=&quot;oContis Studio&quot; width=&quot;32&quot; height=&quot;32&quot; decoding=&quot;async&quot; /&gt;
&lt;/div&gt;
  &lt;div class=&quot;epmb-figure__content&quot;&gt;
    
    &lt;svg id=&quot;epmb-17&quot; width=&quot;100%&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; class=&quot;flowchart&quot; style=&quot;max-width: 789.02734375px;&quot; viewBox=&quot;-8 -50.1015625 789.02734375 425.33281250000005&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot;&gt;&lt;style&gt;#epmb-17{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;fill:#fafae6;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#epmb-17 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#epmb-17 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#epmb-17 .error-icon{fill:#141414;}#epmb-17 .error-text{fill:#ebebeb;stroke:#ebebeb;}#epmb-17 .edge-thickness-normal{stroke-width:1px;}#epmb-17 .edge-thickness-thick{stroke-width:3.5px;}#epmb-17 .edge-pattern-solid{stroke-dasharray:0;}#epmb-17 .edge-thickness-invisible{stroke-width:0;fill:none;}#epmb-17 .edge-pattern-dashed{stroke-dasharray:3;}#epmb-17 .edge-pattern-dotted{stroke-dasharray:2;}#epmb-17 .marker{fill:#8a8a7a;stroke:#8a8a7a;}#epmb-17 .marker.cross{stroke:#8a8a7a;}#epmb-17 svg{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;}#epmb-17 p{margin:0;}#epmb-17 .label{font-family:&#39;Syne&#39;,system-ui,sans-serif;color:#fafae6;}#epmb-17 .cluster-label text{fill:#fafae6;}#epmb-17 .cluster-label span{color:#fafae6;}#epmb-17 .cluster-label span p{background-color:transparent;}#epmb-17 .label text,#epmb-17 span{fill:#fafae6;color:#fafae6;}#epmb-17 .node rect,#epmb-17 .node circle,#epmb-17 .node ellipse,#epmb-17 .node polygon,#epmb-17 .node path{fill:#141414;stroke:#db5461;stroke-width:1px;}#epmb-17 .rough-node .label text,#epmb-17 .node .label text,#epmb-17 .image-shape .label,#epmb-17 .icon-shape .label{text-anchor:middle;}#epmb-17 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#epmb-17 .rough-node .label,#epmb-17 .node .label,#epmb-17 .image-shape .label,#epmb-17 .icon-shape .label{text-align:center;}#epmb-17 .node.clickable{cursor:pointer;}#epmb-17 .root .anchor path{fill:#8a8a7a!important;stroke-width:0;stroke:#8a8a7a;}#epmb-17 .arrowheadPath{fill:#f1eff0;}#epmb-17 .edgePath .path{stroke:#8a8a7a;stroke-width:1px;}#epmb-17 .flowchart-link{stroke:#8a8a7a;fill:none;}#epmb-17 .edgeLabel{background-color:#141414;text-align:center;}#epmb-17 .edgeLabel p{background-color:#141414;}#epmb-17 .edgeLabel rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-17 .labelBkg{background-color:rgba(20, 20, 20, 0.5);}#epmb-17 .cluster rect{fill:#141414;stroke:hsl(0, 0%, 17.8431372549%);stroke-width:1px;}#epmb-17 .cluster text{fill:#fafae6;}#epmb-17 .cluster span{color:#fafae6;}#epmb-17 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:12px;background:#141414;border:1px solid hsl(0, 0%, 17.8431372549%);border-radius:2px;pointer-events:none;z-index:100;}#epmb-17 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fafae6;}#epmb-17 rect.text{fill:none;stroke-width:0;}#epmb-17 .icon-shape,#epmb-17 .image-shape{background-color:#141414;text-align:center;}#epmb-17 .icon-shape p,#epmb-17 .image-shape p{background-color:#141414;padding:2px;}#epmb-17 .icon-shape .label rect,#epmb-17 .image-shape .label rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-17 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#epmb-17 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#epmb-17 .node .neo-node{stroke:#db5461;}#epmb-17 [data-look=&quot;neo&quot;].node rect,#epmb-17 [data-look=&quot;neo&quot;].cluster rect,#epmb-17 [data-look=&quot;neo&quot;].node polygon{stroke:url(#epmb-17-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-17 [data-look=&quot;neo&quot;].swimlane.cluster rect{filter:none;}#epmb-17 [data-look=&quot;neo&quot;].node path{stroke:url(#epmb-17-gradient);stroke-width:1px;}#epmb-17 [data-look=&quot;neo&quot;].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-17 [data-look=&quot;neo&quot;].node .neo-line path{stroke:#db5461;filter:none;}#epmb-17 [data-look=&quot;neo&quot;].node circle{stroke:url(#epmb-17-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-17 [data-look=&quot;neo&quot;].node circle .state-start{fill:#000000;}#epmb-17 [data-look=&quot;neo&quot;].icon-shape .icon{fill:url(#epmb-17-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-17 [data-look=&quot;neo&quot;].icon-shape .icon-neo path{stroke:url(#epmb-17-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-17 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;epmb-17_flowchart-v2-pointEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 10 5 L 0 10 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-17_flowchart-v2-pointStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;4.5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 5 L 10 10 L 10 0 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-17_flowchart-v2-pointEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;11.5&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;10.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 11.5 7 L 0 14 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-17_flowchart-v2-pointStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;1&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;polygon points=&quot;0,7 11.5,14 11.5,0&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-17_flowchart-v2-circleEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;11&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-17_flowchart-v2-circleStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-1&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-17_flowchart-v2-circleEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refY=&quot;5&quot; refX=&quot;12.25&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-17_flowchart-v2-circleStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-2&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-17_flowchart-v2-crossEnd&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;12&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-17_flowchart-v2-crossStart&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;-1&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-17_flowchart-v2-crossEnd-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;17.7&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-17_flowchart-v2-crossStart-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;-3.5&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;g class=&quot;root&quot;&gt;&lt;g class=&quot;clusters&quot;/&gt;&lt;g class=&quot;edgePaths&quot;&gt;&lt;path d=&quot;M341.602,45.289L341.518,49.372C341.435,53.456,341.268,61.622,341.185,69.206C341.102,76.789,341.102,83.789,341.102,87.289L341.102,90.789&quot; id=&quot;epmb-17-L_JOB_WHO_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_JOB_WHO_0&quot; data-points=&quot;W3sieCI6MzQxLjYwMTU2MjUsInkiOjQ1LjI4OTA2MjV9LHsieCI6MzQxLjEwMTU2MjUsInkiOjY5Ljc4OTA2MjV9LHsieCI6MzQxLjEwMTU2MjUwMDAwMDA2LCJ5Ijo5NC43ODkwNjI1MDAwMDAwMX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-17_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M291.822,189.274L260.145,203.803C228.469,218.332,165.115,247.39,133.438,267.568C101.762,287.746,101.762,299.044,101.762,304.693L101.762,310.342&quot; id=&quot;epmb-17-L_WHO_WEB_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_WHO_WEB_0&quot; data-points=&quot;W3sieCI6MjkxLjgyMjE5OTQ1NzE1MzUsInkiOjE4OS4yNzM3NjE5NTcxNTM1N30seyJ4IjoxMDEuNzYxNzE4NzUsInkiOjI3Ni40NDc2NTYyNX0seyJ4IjoxMDEuNzYxNzE4NzUsInkiOjMxNC4zNDIxODc1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-17_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M341.102,238.553L341.102,244.869C341.102,251.185,341.102,263.816,341.102,275.781C341.102,287.746,341.102,299.044,341.102,304.693L341.102,310.342&quot; id=&quot;epmb-17-L_WHO_CLAUDE_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_WHO_CLAUDE_0&quot; data-points=&quot;W3sieCI6MzQxLjEwMTU2MjQ5OTk5OTk0LCJ5IjoyMzguNTUzMTI1MDAwMDAwMX0seyJ4IjozNDEuMTAxNTYyNSwieSI6Mjc2LjQ0NzY1NjI1fSx7IngiOjM0MS4xMDE1NjI1LCJ5IjozMTQuMzQyMTg3NX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-17_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M391.703,187.952L426.774,202.701C461.845,217.45,531.987,246.949,567.058,267.347C602.129,287.746,602.129,299.044,602.129,304.693L602.129,310.342&quot; id=&quot;epmb-17-L_WHO_REMOTE_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_WHO_REMOTE_0&quot; data-points=&quot;W3sieCI6MzkxLjcwMjkwNTU5MzQzNDUsInkiOjE4Ny45NTE3ODE5MDY1NjUzN30seyJ4Ijo2MDIuMTI4OTA2MjUsInkiOjI3Ni40NDc2NTYyNX0seyJ4Ijo2MDIuMTI4OTA2MjUsInkiOjMxNC4zNDIxODc1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-17_flowchart-v2-pointEnd)&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabels&quot;&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_JOB_WHO_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(101.76171875, 276.44765625)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_WHO_WEB_0&quot; transform=&quot;translate(-46.28515625, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-33.69140625&quot; y=&quot;-18.1015625&quot; width=&quot;159.953125&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Shopper&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; in&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; the&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; tab&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(341.1015625, 276.44765625)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_WHO_CLAUDE_0&quot; transform=&quot;translate(-31.505859375, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-19.08984375&quot; y=&quot;-18.1015625&quot; width=&quot;101.19140625&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Staff&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; in&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Claude&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(602.12890625, 276.44765625)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_WHO_REMOTE_0&quot; transform=&quot;translate(-64.5390625, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-31.01953125&quot; y=&quot;-18.1015625&quot; width=&quot;191.1171875&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Remote&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; agent,&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; no&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; theme&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;nodes&quot;&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-17-flowchart-JOB-0&quot; data-look=&quot;classic&quot; transform=&quot;translate(341.1015625, 26.39453125)&quot;&gt;&lt;g class=&quot;basic label-container outer-path&quot;&gt;&lt;path d=&quot;M-51.5712890625 -18.39453125 C-16.21838271596149 -18.39453125, 19.13452363057702 -18.39453125, 51.5712890625 -18.39453125 C51.5712890625 -18.39453125, 51.5712890625 -18.39453125, 51.5712890625 -18.39453125 C51.90846712734288 -18.383718605737776, 52.24564519218577 -18.372905961475556, 52.749830726129595 -18.356737712739584 C53.16797889460824 -18.3163994618232, 53.586127063086884 -18.276061210906814, 53.92352950926695 -18.243512402709634 C54.22741500645709 -18.194382552191158, 54.53130050364724 -18.145252701672682, 55.087562431854536 -18.05532058699581 C55.446788384599245 -17.973329607450246, 55.80601433734395 -17.89133862790468, 56.23714623292918 -17.792935586135897 C56.6789814558096 -17.6618012112254, 57.120816678690026 -17.5306668363149, 57.3675570260673 -17.457435596379838 C57.788872087555006 -17.302387759158627, 58.2101871490427 -17.14733992193742, 58.47414971084755 -17.050199259150062 C58.88791310139879 -16.86703848000792, 59.301676491950026 -16.683877700865775, 59.552377060564766 -16.57289999590817 C59.857980857714324 -16.41346669068382, 60.16358465486388 -16.25403338545947, 60.59780840775993 -16.02749913170719 C60.98014663371412 -15.795723452264946, 61.362484859668314 -15.563947772822702, 61.6061478507831 -15.416237835686243 C61.880896370626985 -15.22458516191488, 62.15564489047087 -15.03293248814352, 62.573251906574754 -14.74162791162581 C62.9010594903195 -14.480210086915537, 63.22886707406424 -14.218792262205262, 63.49514653712646 -14.006441476407245 C63.83445344411452 -13.698291921049488, 64.17376035110259 -13.390142365691732, 64.36804347965554 -13.21369956878984 C64.61687259494441 -12.956763078003789, 64.86570171023327 -12.699826587217737, 65.1883558133893 -12.366659735314617 C65.35916115154816 -12.166022066014138, 65.52996648970704 -11.96538439671366, 65.952712698992 -11.468802644346782 C66.20962509954363 -11.124563432808776, 66.46653750009527 -10.780324221270769, 66.65797323006666 -10.523817783262883 C66.90865433169246 -10.138704293864555, 67.15933543331826 -9.753590804466226, 67.30123933981318 -9.535588297555714 C67.51691282298033 -9.152638188884092, 67.73258630614748 -8.769688080212468, 67.87986770980648 -8.508175034156615 C68.04274943087901 -8.169947655238957, 68.20563115195155 -7.831720276321299, 68.39148063195883 -7.44579985454435 C68.51673263518008 -7.136424985005126, 68.64198463840133 -6.8270501154659025, 68.8339757790325 -6.352828286210703 C68.95761918893865 -5.980434035475446, 69.0812625988448 -5.60803978474019, 69.20553484355327 -5.233751583771614 C69.29402791493966 -4.89628914943553, 69.38252098632606 -4.558826715099446, 69.50463100962581 -4.0931682734386134 C69.56300809545348 -3.7934142757149543, 69.62138518128117 -3.4936602779912946, 69.73003522694783 -2.935765256688221 C69.76051970350264 -2.6993336763699127, 69.79100418005746 -2.4629020960516046, 69.88082126124131 -1.766298550778415 C69.90494586068435 -1.3905384414268047, 69.92907046012739 -1.0147783320751942, 69.9563695003478 -0.5895737452536101 C69.9563695003478 -0.14993480314816537, 69.9563695003478 0.2897041389572793, 69.9563695003478 0.5895737452536056 C69.93017305465493 0.9976045323106277, 69.90397660896204 1.4056353193676498, 69.88082126124131 1.7662985507784026 C69.82329991539586 2.212422750281125, 69.76577856955042 2.6585469497838474, 69.73003522694783 2.935765256688208 C69.66538099966273 3.26775104912148, 69.60072677237761 3.5997368415547513, 69.50463100962581 4.093168273438609 C69.3862880802164 4.544461153426719, 69.26794515080701 4.99575403341483, 69.20553484355327 5.2337515837716015 C69.08126342956368 5.608037282747302, 68.95699201557409 5.982322981723003, 68.8339757790325 6.35282828621069 C68.73522702138573 6.596739626775578, 68.63647826373895 6.840650967340466, 68.39148063195883 7.445799854544345 C68.27563777469584 7.686350026291024, 68.15979491743285 7.9269001980377025, 67.87986770980648 8.50817503415661 C67.71686056463072 8.797610726679494, 67.55385341945495 9.087046419202379, 67.30123933981318 9.53558829755571 C67.12804551401409 9.801660523037217, 66.954851688215 10.067732748518726, 66.65797323006666 10.523817783262873 C66.43954379483259 10.816493327145611, 66.22111435959852 11.109168871028352, 65.952712698992 11.468802644346779 C65.78988687185542 11.660067125953443, 65.62706104471883 11.851331607560109, 65.18835581338931 12.366659735314606 C64.98323507333018 12.578463740151607, 64.77811433327105 12.790267744988608, 64.36804347965554 13.213699568789837 C64.07487110728182 13.479950960463736, 63.78169873490812 13.746202352137635, 63.49514653712648 14.006441476407232 C63.25794598801046 14.195602602155553, 63.02074543889444 14.384763727903874, 62.573251906574754 14.741627911625809 C62.32944268879349 14.911698667619085, 62.08563347101224 15.08176942361236, 61.60614785078311 15.416237835686236 C61.23020416593972 15.644137106728623, 60.85426048109632 15.872036377771009, 60.597808407759935 16.02749913170719 C60.313669390160264 16.175734275189214, 60.02953037256059 16.323969418671236, 59.55237706056477 16.57289999590817 C59.27778155881649 16.694455278945988, 59.00318605706821 16.816010561983806, 58.474149710847556 17.050199259150062 C58.059965816882915 17.202622760802996, 57.64578192291828 17.355046262455925, 57.36755702606732 17.457435596379835 C57.10679727841549 17.53482772072705, 56.84603753076366 17.612219845074268, 56.2371462329292 17.792935586135894 C55.907046278013695 17.86827874674184, 55.576946323098184 17.94362190734779, 55.08756243185454 18.05532058699581 C54.77262148045738 18.106237797614146, 54.45768052906021 18.157155008232483, 53.923529509266956 18.24351240270963 C53.656964868117406 18.269227573050443, 53.390400226967856 18.294942743391253, 52.749830726129595 18.356737712739584 C52.299485327780445 18.3711794131205, 51.84913992943129 18.38562111350142, 51.5712890625 18.39453125 C51.5712890625 18.39453125, 51.5712890625 18.39453125, 51.5712890625 18.39453125 C16.140091444235395 18.39453125, -19.29110617402921 18.39453125, -51.5712890625 18.39453125 C-52.00912596115987 18.3804906728578, -52.446962859819735 18.366450095715603, -52.74983072612959 18.356737712739584 C-53.010381576576286 18.331602685555236, -53.27093242702298 18.306467658370885, -53.92352950926695 18.24351240270963 C-54.29197141886725 18.18394557207514, -54.66041332846755 18.124378741440644, -55.087562431854536 18.05532058699581 C-55.51913910781429 17.956816027009, -55.95071578377404 17.858311467022197, -56.23714623292918 17.792935586135897 C-56.49910762922216 17.71518681877957, -56.761069025515134 17.637438051423242, -57.367557026067296 17.45743559637984 C-57.79837378969522 17.29889104493826, -58.229190553323136 17.140346493496676, -58.47414971084755 17.050199259150062 C-58.69793552201034 16.95113591891852, -58.92172133317313 16.85207257868698, -59.552377060564766 16.572899995908173 C-59.843217246796264 16.42116885704323, -60.13405743302776 16.26943771817829, -60.59780840775993 16.027499131707195 C-60.865317540613134 15.86533352331342, -61.13282667346634 15.703167914919645, -61.60614785078309 15.416237835686248 C-61.88006903265961 15.225162277066032, -62.153990214536144 15.034086718445815, -62.57325190657475 14.741627911625814 C-62.931116075878634 14.456240759771456, -63.28898024518252 14.170853607917095, -63.49514653712646 14.006441476407247 C-63.69333300007355 13.826453774485158, -63.89151946302065 13.64646607256307, -64.36804347965553 13.213699568789847 C-64.63114615399267 12.942024456405454, -64.89424882832982 12.67034934402106, -65.18835581338931 12.366659735314613 C-65.3708342296107 12.152310204304946, -65.55331264583208 11.937960673295278, -65.952712698992 11.468802644346786 C-66.11578256297598 11.25030388257848, -66.27885242695996 11.031805120810175, -66.65797323006666 10.523817783262885 C-66.81557891297778 10.28169313125974, -66.97318459588892 10.039568479256594, -67.30123933981318 9.535588297555725 C-67.48608966214496 9.207367832130776, -67.67093998447676 8.879147366705828, -67.87986770980648 8.508175034156617 C-67.98908720471958 8.28137841604673, -68.09830669963269 8.054581797936843, -68.39148063195883 7.445799854544352 C-68.48867222743233 7.205734734653123, -68.58586382290584 6.965669614761894, -68.8339757790325 6.352828286210705 C-68.95027688686714 6.002547879477846, -69.0665779947018 5.652267472744987, -69.20553484355327 5.233751583771609 C-69.27651254430799 4.963082848863731, -69.34749024506272 4.692414113955855, -69.50463100962581 4.093168273438616 C-69.55734652140234 3.82248526189352, -69.61006203317886 3.551802250348424, -69.73003522694783 2.9357652566882226 C-69.78946338790668 2.474852175709212, -69.84889154886551 2.0139390947302016, -69.88082126124131 1.7662985507784255 C-69.90145559412903 1.444902160318302, -69.92208992701677 1.1235057698581787, -69.9563695003478 0.5895737452536124 C-69.9563695003478 0.3068936455022384, -69.9563695003478 0.02421354575086443, -69.9563695003478 -0.5895737452536034 C-69.93224437211688 -0.9653420909031474, -69.90811924388598 -1.3411104365526914, -69.88082126124131 -1.7662985507784004 C-69.8341771635646 -2.128060961440004, -69.7875330658879 -2.489823372101608, -69.73003522694783 -2.935765256688214 C-69.64285002197441 -3.3834428576271134, -69.555664817001 -3.831120458566013, -69.50463100962581 -4.093168273438607 C-69.38660006007544 -4.54327143901129, -69.26856911052508 -4.993374604583973, -69.20553484355327 -5.2337515837716 C-69.07811627924741 -5.617515998069612, -68.95069771494154 -6.001280412367623, -68.83397577903251 -6.3528282862106815 C-68.69187170517442 -6.703828096035522, -68.54976763131633 -7.054827905860362, -68.39148063195883 -7.445799854544344 C-68.28202280818373 -7.673091367635585, -68.17256498440862 -7.900382880726826, -67.87986770980648 -8.508175034156608 C-67.6894081209116 -8.846355320364166, -67.49894853201671 -9.184535606571727, -67.30123933981318 -9.535588297555718 C-67.12124976077834 -9.812100624922598, -66.9412601817435 -10.08861295228948, -66.65797323006666 -10.523817783262878 C-66.49897040056923 -10.73686708933367, -66.33996757107181 -10.949916395404461, -65.952712698992 -11.468802644346779 C-65.64960788053175 -11.824846811262951, -65.3465030620715 -12.180890978179125, -65.18835581338931 -12.366659735314604 C-64.92367154989242 -12.639967968357311, -64.65898728639553 -12.91327620140002, -64.36804347965554 -13.213699568789831 C-64.08253461366317 -13.472991166733465, -63.7970257476708 -13.732282764677098, -63.49514653712648 -14.00644147640723 C-63.27502165446538 -14.181985212560324, -63.054896771804266 -14.357528948713417, -62.573251906574754 -14.741627911625807 C-62.24748131291882 -14.968871375378479, -61.92171071926289 -15.196114839131148, -61.60614785078311 -15.416237835686234 C-61.25836721062677 -15.627064503534902, -60.91058657047044 -15.83789117138357, -60.597808407759935 -16.027499131707188 C-60.320591353058965 -16.172123091578683, -60.043374298358 -16.316747051450182, -59.55237706056477 -16.57289999590817 C-59.13425416788151 -16.757990597324124, -58.716131275198244 -16.943081198740078, -58.474149710847556 -17.05019925915006 C-58.098375657878684 -17.188487584259875, -57.722601604909805 -17.326775909369687, -57.36755702606732 -17.457435596379835 C-57.0594067281081 -17.54889298730021, -56.75125643014888 -17.64035037822058, -56.2371462329292 -17.79293558613589 C-55.830740310613876 -17.885695085857876, -55.42433438829856 -17.978454585579858, -55.08756243185455 -18.05532058699581 C-54.62931583266941 -18.129406343396607, -54.171069233484275 -18.20349209979741, -53.92352950926696 -18.24351240270963 C-53.6483606593793 -18.270057610719334, -53.373191809491644 -18.296602818729035, -52.7498307261296 -18.356737712739584 C-52.495480446783446 -18.36489423113543, -52.24113016743729 -18.373050749531277, -51.57128906250001 -18.39453125 C-51.57128906250001 -18.39453125, -51.5712890625 -18.39453125, -51.5712890625 -18.39453125&quot; stroke=&quot;none&quot; stroke-width=&quot;0&quot; fill=&quot;#141414&quot; style=&quot;&quot;/&gt;&lt;path d=&quot;M-51.5712890625 -18.39453125 C-17.13898896250339 -18.39453125, 17.29331113749322 -18.39453125, 51.5712890625 -18.39453125 M-51.5712890625 -18.39453125 C-21.207738050129255 -18.39453125, 9.155812962241491 -18.39453125, 51.5712890625 -18.39453125 M51.5712890625 -18.39453125 C51.5712890625 -18.39453125, 51.5712890625 -18.39453125, 51.5712890625 -18.39453125 M51.5712890625 -18.39453125 C51.5712890625 -18.39453125, 51.5712890625 -18.39453125, 51.5712890625 -18.39453125 M51.5712890625 -18.39453125 C51.853310933522536 -18.385487357518578, 52.13533280454507 -18.376443465037156, 52.749830726129595 -18.356737712739584 M51.5712890625 -18.39453125 C51.942954843291254 -18.38261265181358, 52.31462062408251 -18.37069405362716, 52.749830726129595 -18.356737712739584 M52.749830726129595 -18.356737712739584 C53.18740694216012 -18.314525261441513, 53.62498315819066 -18.272312810143443, 53.92352950926695 -18.243512402709634 M52.749830726129595 -18.356737712739584 C53.06003495650818 -18.32681268371013, 53.37023918688677 -18.29688765468068, 53.92352950926695 -18.243512402709634 M53.92352950926695 -18.243512402709634 C54.36142923093047 -18.172716171674136, 54.79932895259399 -18.101919940638638, 55.087562431854536 -18.05532058699581 M53.92352950926695 -18.243512402709634 C54.241016445377504 -18.19218357702724, 54.55850338148806 -18.140854751344847, 55.087562431854536 -18.05532058699581 M55.087562431854536 -18.05532058699581 C55.422348816727904 -17.97890777933379, 55.75713520160127 -17.90249497167178, 56.23714623292918 -17.792935586135897 M55.087562431854536 -18.05532058699581 C55.428734228316124 -17.977450350807487, 55.76990602477772 -17.899580114619162, 56.23714623292918 -17.792935586135897 M56.23714623292918 -17.792935586135897 C56.62081598284607 -17.679064418284177, 57.00448573276296 -17.565193250432458, 57.3675570260673 -17.457435596379838 M56.23714623292918 -17.792935586135897 C56.53122176269857 -17.705655512534296, 56.825297292467965 -17.618375438932695, 57.3675570260673 -17.457435596379838 M57.3675570260673 -17.457435596379838 C57.71273849197024 -17.330405626105062, 58.05791995787319 -17.203375655830285, 58.47414971084755 -17.050199259150062 M57.3675570260673 -17.457435596379838 C57.79478195431609 -17.300212873560337, 58.222006882564884 -17.14299015074084, 58.47414971084755 -17.050199259150062 M58.47414971084755 -17.050199259150062 C58.79064353674659 -16.910096830880327, 59.10713736264563 -16.769994402610596, 59.552377060564766 -16.57289999590817 M58.47414971084755 -17.050199259150062 C58.83217298952178 -16.8917129740642, 59.19019626819602 -16.733226688978334, 59.552377060564766 -16.57289999590817 M59.552377060564766 -16.57289999590817 C59.89543096136854 -16.393928995595353, 60.238484862172314 -16.214957995282532, 60.59780840775993 -16.02749913170719 M59.552377060564766 -16.57289999590817 C59.88441965570719 -16.399673586705802, 60.21646225084961 -16.226447177503434, 60.59780840775993 -16.02749913170719 M60.59780840775993 -16.02749913170719 C60.900883578303464 -15.843773182256303, 61.203958748847 -15.660047232805415, 61.6061478507831 -15.416237835686243 M60.59780840775993 -16.02749913170719 C60.961541068832304 -15.80700225503474, 61.32527372990467 -15.586505378362292, 61.6061478507831 -15.416237835686243 M61.6061478507831 -15.416237835686243 C61.893279291843584 -15.215947372122201, 62.180410732904065 -15.015656908558158, 62.573251906574754 -14.74162791162581 M61.6061478507831 -15.416237835686243 C61.81725474402869 -15.268978805628242, 62.028361637274266 -15.121719775570243, 62.573251906574754 -14.74162791162581 M62.573251906574754 -14.74162791162581 C62.89126529618356 -14.48802069610449, 63.20927868579237 -14.234413480583171, 63.49514653712646 -14.006441476407245 M62.573251906574754 -14.74162791162581 C62.79574431829851 -14.564196134047846, 63.01823673002227 -14.38676435646988, 63.49514653712646 -14.006441476407245 M63.49514653712646 -14.006441476407245 C63.80254758554604 -13.72726797761863, 64.10994863396562 -13.448094478830017, 64.36804347965554 -13.21369956878984 M63.49514653712646 -14.006441476407245 C63.83023189076478 -13.702125824105549, 64.1653172444031 -13.397810171803854, 64.36804347965554 -13.21369956878984 M64.36804347965554 -13.21369956878984 C64.54667621859154 -13.029246599817792, 64.72530895752756 -12.844793630845745, 65.1883558133893 -12.366659735314617 M64.36804347965554 -13.21369956878984 C64.54804048852498 -13.027837879102885, 64.72803749739441 -12.841976189415929, 65.1883558133893 -12.366659735314617 M65.1883558133893 -12.366659735314617 C65.41533701601088 -12.100034699118993, 65.64231821863247 -11.83340966292337, 65.952712698992 -11.468802644346782 M65.1883558133893 -12.366659735314617 C65.39831859399258 -12.120025505997322, 65.60828137459588 -11.873391276680026, 65.952712698992 -11.468802644346782 M65.952712698992 -11.468802644346782 C66.15976594137838 -11.191370162487468, 66.36681918376476 -10.913937680628152, 66.65797323006666 -10.523817783262883 M65.952712698992 -11.468802644346782 C66.18234333868538 -11.161118506939292, 66.41197397837875 -10.853434369531803, 66.65797323006666 -10.523817783262883 M66.65797323006666 -10.523817783262883 C66.82634030829527 -10.265160738212819, 66.9947073865239 -10.006503693162754, 67.30123933981318 -9.535588297555714 M66.65797323006666 -10.523817783262883 C66.91176873574422 -10.133919732906463, 67.16556424142178 -9.744021682550043, 67.30123933981318 -9.535588297555714 M67.30123933981318 -9.535588297555714 C67.51932881674443 -9.148348347310037, 67.73741829367569 -8.761108397064358, 67.87986770980648 -8.508175034156615 M67.30123933981318 -9.535588297555714 C67.46469605820292 -9.245354342267177, 67.62815277659267 -8.95512038697864, 67.87986770980648 -8.508175034156615 M67.87986770980648 -8.508175034156615 C68.02202662323218 -8.21297900871467, 68.16418553665788 -7.917782983272726, 68.39148063195883 -7.44579985454435 M67.87986770980648 -8.508175034156615 C68.02205182601232 -8.21292667460246, 68.16423594221816 -7.917678315048305, 68.39148063195883 -7.44579985454435 M68.39148063195883 -7.44579985454435 C68.5675125245372 -7.010997676530683, 68.74354441711554 -6.5761954985170155, 68.8339757790325 -6.352828286210703 M68.39148063195883 -7.44579985454435 C68.48269245330854 -7.2205048923499415, 68.57390427465826 -6.995209930155534, 68.8339757790325 -6.352828286210703 M68.8339757790325 -6.352828286210703 C68.96344987690529 -5.962872932313897, 69.09292397477809 -5.572917578417091, 69.20553484355327 -5.233751583771614 M68.8339757790325 -6.352828286210703 C68.97750965230031 -5.920527128945072, 69.12104352556814 -5.488225971679443, 69.20553484355327 -5.233751583771614 M69.20553484355327 -5.233751583771614 C69.32014616551983 -4.796688940251937, 69.4347574874864 -4.3596262967322605, 69.50463100962581 -4.0931682734386134 M69.20553484355327 -5.233751583771614 C69.27025228554709 -4.986955928732361, 69.33496972754092 -4.740160273693108, 69.50463100962581 -4.0931682734386134 M69.50463100962581 -4.0931682734386134 C69.56052250182641 -3.8061772736596144, 69.616413994027 -3.5191862738806154, 69.73003522694783 -2.935765256688221 M69.50463100962581 -4.0931682734386134 C69.59027735994813 -3.6533923658960723, 69.67592371027044 -3.213616458353531, 69.73003522694783 -2.935765256688221 M69.73003522694783 -2.935765256688221 C69.77446699642036 -2.591161226704597, 69.81889876589288 -2.2465571967209725, 69.88082126124131 -1.766298550778415 M69.73003522694783 -2.935765256688221 C69.77722233523488 -2.569791362962326, 69.82440944352194 -2.203817469236431, 69.88082126124131 -1.766298550778415 M69.88082126124131 -1.766298550778415 C69.89897453380017 -1.483546677616215, 69.91712780635903 -1.2007948044540147, 69.9563695003478 -0.5895737452536101 M69.88082126124131 -1.766298550778415 C69.90774810001263 -1.346891301961952, 69.93467493878396 -0.9274840531454888, 69.9563695003478 -0.5895737452536101 M69.9563695003478 -0.5895737452536101 C69.9563695003478 -0.20572396947846944, 69.9563695003478 0.17812580629667119, 69.9563695003478 0.5895737452536056 M69.9563695003478 -0.5895737452536101 C69.9563695003478 -0.1207737117110515, 69.9563695003478 0.34802632183150706, 69.9563695003478 0.5895737452536056 M69.9563695003478 0.5895737452536056 C69.93810668038901 0.8740319075947807, 69.91984386043022 1.1584900699359557, 69.88082126124131 1.7662985507784026 M69.9563695003478 0.5895737452536056 C69.93024969031936 0.9964108699779237, 69.90412988029091 1.4032479947022418, 69.88082126124131 1.7662985507784026 M69.88082126124131 1.7662985507784026 C69.84380064676618 2.0534231261003018, 69.80678003229104 2.340547701422201, 69.73003522694783 2.935765256688208 M69.88082126124131 1.7662985507784026 C69.82505889309816 2.1987804665715447, 69.76929652495502 2.6312623823646866, 69.73003522694783 2.935765256688208 M69.73003522694783 2.935765256688208 C69.6503605487592 3.3448778899376572, 69.57068587057056 3.753990523187107, 69.50463100962581 4.093168273438609 M69.73003522694783 2.935765256688208 C69.67805984985843 3.2026478330424926, 69.62608447276901 3.4695304093967776, 69.50463100962581 4.093168273438609 M69.50463100962581 4.093168273438609 C69.40563180036649 4.470695164873086, 69.30663259110719 4.848222056307563, 69.20553484355327 5.2337515837716015 M69.50463100962581 4.093168273438609 C69.39463638597327 4.512625445397216, 69.28464176232072 4.932082617355824, 69.20553484355327 5.2337515837716015 M69.20553484355327 5.2337515837716015 C69.06993576341355 5.642154408372981, 68.93433668327383 6.050557232974362, 68.8339757790325 6.35282828621069 M69.20553484355327 5.2337515837716015 C69.0916686039621 5.576698555298646, 68.97780236437094 5.91964552682569, 68.8339757790325 6.35282828621069 M68.8339757790325 6.35282828621069 C68.73307150796354 6.60206378660239, 68.63216723689457 6.851299286994089, 68.39148063195883 7.445799854544345 M68.8339757790325 6.35282828621069 C68.70887512189677 6.6618293279926055, 68.58377446476105 6.9708303697745215, 68.39148063195883 7.445799854544345 M68.39148063195883 7.445799854544345 C68.27350769007813 7.6907731925761915, 68.15553474819744 7.935746530608038, 67.87986770980648 8.50817503415661 M68.39148063195883 7.445799854544345 C68.25453641994112 7.730167440935866, 68.11759220792341 8.014535027327389, 67.87986770980648 8.50817503415661 M67.87986770980648 8.50817503415661 C67.72682999381406 8.779908995650286, 67.57379227782165 9.051642957143962, 67.30123933981318 9.53558829755571 M67.87986770980648 8.50817503415661 C67.74916212011965 8.740256044021718, 67.61845653043282 8.972337053886829, 67.30123933981318 9.53558829755571 M67.30123933981318 9.53558829755571 C67.16631756783134 9.742864370888492, 67.03139579584949 9.950140444221276, 66.65797323006666 10.523817783262873 M67.30123933981318 9.53558829755571 C67.15430819889731 9.761313986538262, 67.00737705798143 9.987039675520814, 66.65797323006666 10.523817783262873 M66.65797323006666 10.523817783262873 C66.49958580123187 10.736042508509875, 66.34119837239709 10.948267233756878, 65.952712698992 11.468802644346779 M66.65797323006666 10.523817783262873 C66.41369334297326 10.851130577612494, 66.16941345587986 11.178443371962116, 65.952712698992 11.468802644346779 M65.952712698992 11.468802644346779 C65.78609044009724 11.664526630719681, 65.61946818120248 11.860250617092584, 65.18835581338931 12.366659735314606 M65.952712698992 11.468802644346779 C65.66177923731364 11.81054964301713, 65.37084577563527 12.15229664168748, 65.18835581338931 12.366659735314606 M65.18835581338931 12.366659735314606 C64.87648631078578 12.688690601715106, 64.56461680818224 13.010721468115605, 64.36804347965554 13.213699568789837 M65.18835581338931 12.366659735314606 C64.95499160343509 12.607627441650294, 64.72162739348087 12.84859514798598, 64.36804347965554 13.213699568789837 M64.36804347965554 13.213699568789837 C64.1810563204158 13.383516359402247, 63.99406916117606 13.553333150014655, 63.49514653712648 14.006441476407232 M64.36804347965554 13.213699568789837 C64.18043255562976 13.384082846077005, 63.992821631604 13.554466123364175, 63.49514653712648 14.006441476407232 M63.49514653712648 14.006441476407232 C63.21645200199955 14.228692951797912, 62.93775746687262 14.450944427188592, 62.573251906574754 14.741627911625809 M63.49514653712648 14.006441476407232 C63.271562199106796 14.18474403614882, 63.04797786108711 14.363046595890406, 62.573251906574754 14.741627911625809 M62.573251906574754 14.741627911625809 C62.18765783035422 15.010601647098726, 61.802063754133684 15.279575382571643, 61.60614785078311 15.416237835686236 M62.573251906574754 14.741627911625809 C62.271694442865375 14.951981344097263, 61.970136979156 15.162334776568718, 61.60614785078311 15.416237835686236 M61.60614785078311 15.416237835686236 C61.38233206631738 15.551916279516904, 61.15851628185166 15.687594723347571, 60.597808407759935 16.02749913170719 M61.60614785078311 15.416237835686236 C61.28650374975111 15.610007968169073, 60.966859648719115 15.803778100651913, 60.597808407759935 16.02749913170719 M60.597808407759935 16.02749913170719 C60.238196427719316 16.215108471351915, 59.8785844476787 16.402717810996638, 59.55237706056477 16.57289999590817 M60.597808407759935 16.02749913170719 C60.19756852532666 16.23630402200675, 59.79732864289338 16.44510891230631, 59.55237706056477 16.57289999590817 M59.55237706056477 16.57289999590817 C59.336322968223115 16.668540733570886, 59.12026887588145 16.764181471233602, 58.474149710847556 17.050199259150062 M59.55237706056477 16.57289999590817 C59.227790175336494 16.71658498147088, 58.903203290108216 16.86026996703359, 58.474149710847556 17.050199259150062 M58.474149710847556 17.050199259150062 C58.15736246750859 17.166779893047977, 57.840575224169626 17.283360526945895, 57.36755702606732 17.457435596379835 M58.474149710847556 17.050199259150062 C58.183881353151875 17.157020697993357, 57.893612995456195 17.263842136836654, 57.36755702606732 17.457435596379835 M57.36755702606732 17.457435596379835 C57.06389023599118 17.547562305694925, 56.76022344591504 17.637689015010015, 56.2371462329292 17.792935586135894 M57.36755702606732 17.457435596379835 C56.9852964314282 17.57088853434192, 56.6030358367891 17.684341472304, 56.2371462329292 17.792935586135894 M56.2371462329292 17.792935586135894 C55.79205160755232 17.894525529864296, 55.34695698217544 17.996115473592695, 55.08756243185454 18.05532058699581 M56.2371462329292 17.792935586135894 C55.838185822783444 17.88399569629168, 55.43922541263769 17.975055806447468, 55.08756243185454 18.05532058699581 M55.08756243185454 18.05532058699581 C54.67292528013969 18.12235590612593, 54.25828812842483 18.18939122525605, 53.923529509266956 18.24351240270963 M55.08756243185454 18.05532058699581 C54.73499027629471 18.11232171886882, 54.38241812073487 18.169322850741832, 53.923529509266956 18.24351240270963 M53.923529509266956 18.24351240270963 C53.48002590353568 18.2862966621634, 53.0365222978044 18.329080921617177, 52.749830726129595 18.356737712739584 M53.923529509266956 18.24351240270963 C53.482265280818 18.286080632130222, 53.04100105236904 18.328648861550814, 52.749830726129595 18.356737712739584 M52.749830726129595 18.356737712739584 C52.45862600417961 18.366076081376914, 52.16742128222961 18.375414450014244, 51.5712890625 18.39453125 M52.749830726129595 18.356737712739584 C52.38169327807809 18.368543164162524, 52.01355583002658 18.38034861558546, 51.5712890625 18.39453125 M51.5712890625 18.39453125 C51.5712890625 18.39453125, 51.5712890625 18.39453125, 51.5712890625 18.39453125 M51.5712890625 18.39453125 C51.5712890625 18.39453125, 51.5712890625 18.39453125, 51.5712890625 18.39453125 M51.5712890625 18.39453125 C28.01281451857185 18.39453125, 4.454339974643702 18.39453125, -51.5712890625 18.39453125 M51.5712890625 18.39453125 C24.009666632920208 18.39453125, -3.551955796659584 18.39453125, -51.5712890625 18.39453125 M-51.5712890625 18.39453125 C-52.03476109796544 18.379668603916212, -52.49823313343089 18.364805957832427, -52.74983072612959 18.356737712739584 M-51.5712890625 18.39453125 C-51.89057610936929 18.384292335861435, -52.20986315623858 18.374053421722873, -52.74983072612959 18.356737712739584 M-52.74983072612959 18.356737712739584 C-53.19156160818777 18.314124465806543, -53.63329249024594 18.271511218873503, -53.92352950926695 18.24351240270963 M-52.74983072612959 18.356737712739584 C-53.17913620074601 18.31532312991871, -53.60844167536243 18.273908547097836, -53.92352950926695 18.24351240270963 M-53.92352950926695 18.24351240270963 C-54.296533334866155 18.18320803687462, -54.66953716046536 18.122903671039612, -55.087562431854536 18.05532058699581 M-53.92352950926695 18.24351240270963 C-54.1652492681147 18.204433026663853, -54.40696902696244 18.165353650618076, -55.087562431854536 18.05532058699581 M-55.087562431854536 18.05532058699581 C-55.50376387372545 17.960325323857003, -55.919965315596365 17.865330060718193, -56.23714623292918 17.792935586135897 M-55.087562431854536 18.05532058699581 C-55.47351263846401 17.967229970897666, -55.85946284507348 17.879139354799523, -56.23714623292918 17.792935586135897 M-56.23714623292918 17.792935586135897 C-56.63572833652227 17.674638509989624, -57.03431044011537 17.556341433843347, -57.367557026067296 17.45743559637984 M-56.23714623292918 17.792935586135897 C-56.56421292459504 17.695863908857568, -56.8912796162609 17.59879223157924, -57.367557026067296 17.45743559637984 M-57.367557026067296 17.45743559637984 C-57.72804493456654 17.324772713738422, -58.08853284306578 17.192109831097003, -58.47414971084755 17.050199259150062 M-57.367557026067296 17.45743559637984 C-57.75820763436613 17.313672561391233, -58.148858242664964 17.169909526402623, -58.47414971084755 17.050199259150062 M-58.47414971084755 17.050199259150062 C-58.75120106109907 16.927556844830022, -59.02825241135058 16.804914430509978, -59.552377060564766 16.572899995908173 M-58.47414971084755 17.050199259150062 C-58.731157334399796 16.93642960806376, -58.98816495795204 16.82265995697746, -59.552377060564766 16.572899995908173 M-59.552377060564766 16.572899995908173 C-59.84700369941844 16.41919346713558, -60.14163033827211 16.26548693836299, -60.59780840775993 16.027499131707195 M-59.552377060564766 16.572899995908173 C-59.88901805192231 16.39727460634579, -60.225659043279855 16.221649216783405, -60.59780840775993 16.027499131707195 M-60.59780840775993 16.027499131707195 C-60.82647075665512 15.888882672037811, -61.05513310555031 15.750266212368428, -61.60614785078309 15.416237835686248 M-60.59780840775993 16.027499131707195 C-60.85558539814351 15.871233205270926, -61.11336238852709 15.714967278834655, -61.60614785078309 15.416237835686248 M-61.60614785078309 15.416237835686248 C-61.97889681936068 15.156224291249302, -62.351645787938274 14.896210746812356, -62.57325190657475 14.741627911625814 M-61.60614785078309 15.416237835686248 C-61.95195208706574 15.17501977007959, -62.297756323348395 14.93380170447293, -62.57325190657475 14.741627911625814 M-62.57325190657475 14.741627911625814 C-62.79881509495684 14.561747271379623, -63.02437828333894 14.38186663113343, -63.49514653712646 14.006441476407247 M-62.57325190657475 14.741627911625814 C-62.84800103291372 14.522522794751794, -63.12275015925269 14.303417677877775, -63.49514653712646 14.006441476407247 M-63.49514653712646 14.006441476407247 C-63.82410840943581 13.707687007830078, -64.15307028174516 13.408932539252909, -64.36804347965553 13.213699568789847 M-63.49514653712646 14.006441476407247 C-63.7489403058006 13.775952690712536, -64.00273407447474 13.545463905017824, -64.36804347965553 13.213699568789847 M-64.36804347965553 13.213699568789847 C-64.62653867335197 12.946782058448173, -64.88503386704843 12.679864548106497, -65.18835581338931 12.366659735314613 M-64.36804347965553 13.213699568789847 C-64.54366146616512 13.032359579213855, -64.71927945267471 12.851019589637863, -65.18835581338931 12.366659735314613 M-65.18835581338931 12.366659735314613 C-65.43049926047631 12.082224264013755, -65.67264270756331 11.797788792712895, -65.952712698992 11.468802644346786 M-65.18835581338931 12.366659735314613 C-65.46608575365796 12.040422344193763, -65.74381569392662 11.714184953072913, -65.952712698992 11.468802644346786 M-65.952712698992 11.468802644346786 C-66.09409301720338 11.27936589795549, -66.23547333541477 11.089929151564196, -66.65797323006666 10.523817783262885 M-65.952712698992 11.468802644346786 C-66.18886733141694 11.152376951026966, -66.42502196384189 10.835951257707144, -66.65797323006666 10.523817783262885 M-66.65797323006666 10.523817783262885 C-66.8197543513804 10.275278536611133, -66.98153547269413 10.026739289959378, -67.30123933981318 9.535588297555725 M-66.65797323006666 10.523817783262885 C-66.80479788371687 10.298255687316223, -66.95162253736709 10.07269359136956, -67.30123933981318 9.535588297555725 M-67.30123933981318 9.535588297555725 C-67.46968121550348 9.236502690678114, -67.6381230911938 8.937417083800502, -67.87986770980648 8.508175034156617 M-67.30123933981318 9.535588297555725 C-67.52854055593627 9.131991971585194, -67.75584177205937 8.728395645614661, -67.87986770980648 8.508175034156617 M-67.87986770980648 8.508175034156617 C-68.03331329775565 8.189541987570514, -68.18675888570485 7.870908940984411, -68.39148063195883 7.445799854544352 M-67.87986770980648 8.508175034156617 C-67.992618436369 8.274045737970459, -68.10536916293152 8.039916441784301, -68.39148063195883 7.445799854544352 M-68.39148063195883 7.445799854544352 C-68.55720408326243 7.036459725779473, -68.72292753456605 6.627119597014593, -68.8339757790325 6.352828286210705 M-68.39148063195883 7.445799854544352 C-68.4982267181663 7.182134957816727, -68.60497280437376 6.918470061089102, -68.8339757790325 6.352828286210705 M-68.8339757790325 6.352828286210705 C-68.91249549559767 6.116339410334298, -68.99101521216285 5.879850534457891, -69.20553484355327 5.233751583771609 M-68.8339757790325 6.352828286210705 C-68.96066048844227 5.971274125935831, -69.08734519785203 5.589719965660957, -69.20553484355327 5.233751583771609 M-69.20553484355327 5.233751583771609 C-69.26541539430193 5.005401091372099, -69.32529594505058 4.777050598972589, -69.50463100962581 4.093168273438616 M-69.20553484355327 5.233751583771609 C-69.32307694848421 4.785512594599385, -69.44061905341516 4.337273605427161, -69.50463100962581 4.093168273438616 M-69.50463100962581 4.093168273438616 C-69.5669112387863 3.7733724596306146, -69.62919146794678 3.453576645822613, -69.73003522694783 2.9357652566882226 M-69.50463100962581 4.093168273438616 C-69.55473359434802 3.8359020900750846, -69.60483617907023 3.5786359067115527, -69.73003522694783 2.9357652566882226 M-69.73003522694783 2.9357652566882226 C-69.77525624858391 2.585039942779587, -69.82047727021998 2.234314628870951, -69.88082126124131 1.7662985507784255 M-69.73003522694783 2.9357652566882226 C-69.77322876768739 2.600764684241619, -69.81642230842694 2.265764111795016, -69.88082126124131 1.7662985507784255 M-69.88082126124131 1.7662985507784255 C-69.90688600625475 1.3603191081105233, -69.9329507512682 0.954339665442621, -69.9563695003478 0.5895737452536124 M-69.88082126124131 1.7662985507784255 C-69.9064209304149 1.3675630397187803, -69.93202059958847 0.9688275286591351, -69.9563695003478 0.5895737452536124 M-69.9563695003478 0.5895737452536124 C-69.9563695003478 0.13874464511409723, -69.9563695003478 -0.31208445502541793, -69.9563695003478 -0.5895737452536034 M-69.9563695003478 0.5895737452536124 C-69.9563695003478 0.3190634801428157, -69.9563695003478 0.04855321503201904, -69.9563695003478 -0.5895737452536034 M-69.9563695003478 -0.5895737452536034 C-69.93784060377887 -0.878176265570987, -69.91931170720993 -1.1667787858883707, -69.88082126124131 -1.7662985507784004 M-69.9563695003478 -0.5895737452536034 C-69.9276065751996 -1.0375795214521348, -69.8988436500514 -1.485585297650666, -69.88082126124131 -1.7662985507784004 M-69.88082126124131 -1.7662985507784004 C-69.85018045459493 -2.0039425964160738, -69.81953964794855 -2.241586642053747, -69.73003522694783 -2.935765256688214 M-69.88082126124131 -1.7662985507784004 C-69.84598791590305 -2.036459098599863, -69.8111545705648 -2.306619646421326, -69.73003522694783 -2.935765256688214 M-69.73003522694783 -2.935765256688214 C-69.6427607067284 -3.3839014725386267, -69.55548618650897 -3.8320376883890397, -69.50463100962581 -4.093168273438607 M-69.73003522694783 -2.935765256688214 C-69.67311583344444 -3.2280343124100352, -69.61619643994106 -3.5203033681318567, -69.50463100962581 -4.093168273438607 M-69.50463100962581 -4.093168273438607 C-69.43070967489473 -4.375062360477343, -69.35678834016366 -4.656956447516078, -69.20553484355327 -5.2337515837716 M-69.50463100962581 -4.093168273438607 C-69.41893340116265 -4.419970396087092, -69.3332357926995 -4.746772518735577, -69.20553484355327 -5.2337515837716 M-69.20553484355327 -5.2337515837716 C-69.11743168015235 -5.4991042746023675, -69.02932851675145 -5.764456965433135, -68.83397577903251 -6.3528282862106815 M-69.20553484355327 -5.2337515837716 C-69.13025416459334 -5.4604849944515825, -69.05497348563341 -5.687218405131564, -68.83397577903251 -6.3528282862106815 M-68.83397577903251 -6.3528282862106815 C-68.72055936384555 -6.6329690244796975, -68.60714294865858 -6.913109762748713, -68.39148063195883 -7.445799854544344 M-68.83397577903251 -6.3528282862106815 C-68.66366379726036 -6.77350217394606, -68.49335181548821 -7.194176061681439, -68.39148063195883 -7.445799854544344 M-68.39148063195883 -7.445799854544344 C-68.23598359741231 -7.768692773883733, -68.0804865628658 -8.091585693223122, -67.87986770980648 -8.508175034156608 M-68.39148063195883 -7.445799854544344 C-68.23785778111002 -7.764800991334327, -68.08423493026122 -8.08380212812431, -67.87986770980648 -8.508175034156608 M-67.87986770980648 -8.508175034156608 C-67.74414202084269 -8.749169738628133, -67.6084163318789 -8.990164443099658, -67.30123933981318 -9.535588297555718 M-67.87986770980648 -8.508175034156608 C-67.67115635307997 -8.87876318234113, -67.46244499635344 -9.24935133052565, -67.30123933981318 -9.535588297555718 M-67.30123933981318 -9.535588297555718 C-67.04706191355916 -9.926073080477604, -66.79288448730514 -10.31655786339949, -66.65797323006666 -10.523817783262878 M-67.30123933981318 -9.535588297555718 C-67.16264980731192 -9.748499035977929, -67.02406027481067 -9.96140977440014, -66.65797323006666 -10.523817783262878 M-66.65797323006666 -10.523817783262878 C-66.50798412874944 -10.72478951473972, -66.35799502743222 -10.925761246216561, -65.952712698992 -11.468802644346779 M-66.65797323006666 -10.523817783262878 C-66.45017967693705 -10.802242214074418, -66.24238612380746 -11.080666644885959, -65.952712698992 -11.468802644346779 M-65.952712698992 -11.468802644346779 C-65.71555567645943 -11.747380777630399, -65.47839865392687 -12.025958910914019, -65.18835581338931 -12.366659735314604 M-65.952712698992 -11.468802644346779 C-65.66076022947296 -11.811746627609974, -65.36880775995392 -12.15469061087317, -65.18835581338931 -12.366659735314604 M-65.18835581338931 -12.366659735314604 C-64.94261326251062 -12.620409094935491, -64.69687071163195 -12.874158454556376, -64.36804347965554 -13.213699568789831 M-65.18835581338931 -12.366659735314604 C-64.97447000878668 -12.587514388917945, -64.76058420418407 -12.808369042521287, -64.36804347965554 -13.213699568789831 M-64.36804347965554 -13.213699568789831 C-64.11249500360809 -13.445781933293967, -63.85694652756064 -13.677864297798102, -63.49514653712648 -14.00644147640723 M-64.36804347965554 -13.213699568789831 C-64.08188328514485 -13.473582686060585, -63.79572309063418 -13.73346580333134, -63.49514653712648 -14.00644147640723 M-63.49514653712648 -14.00644147640723 C-63.133680523908836 -14.294701002933715, -62.7722145106912 -14.5829605294602, -62.573251906574754 -14.741627911625807 M-63.49514653712648 -14.00644147640723 C-63.24277621049744 -14.20770009603745, -62.9904058838684 -14.408958715667673, -62.573251906574754 -14.741627911625807 M-62.573251906574754 -14.741627911625807 C-62.262710429933 -14.958248202607235, -61.95216895329125 -15.174868493588663, -61.60614785078311 -15.416237835686234 M-62.573251906574754 -14.741627911625807 C-62.225820763677376 -14.983980836859246, -61.87838962078 -15.226333762092686, -61.60614785078311 -15.416237835686234 M-61.60614785078311 -15.416237835686234 C-61.336147980032024 -15.579913344030903, -61.06614810928094 -15.743588852375574, -60.597808407759935 -16.027499131707188 M-61.60614785078311 -15.416237835686234 C-61.35919868352228 -15.565939872114143, -61.11224951626144 -15.71564190854205, -60.597808407759935 -16.027499131707188 M-60.597808407759935 -16.027499131707188 C-60.36769778476441 -16.147547696331067, -60.137587161768884 -16.267596260954942, -59.55237706056477 -16.57289999590817 M-60.597808407759935 -16.027499131707188 C-60.33039384496554 -16.16700913782982, -60.06297928217115 -16.306519143952453, -59.55237706056477 -16.57289999590817 M-59.55237706056477 -16.57289999590817 C-59.17609390711276 -16.739469385898218, -58.799810753660736 -16.906038775888266, -58.474149710847556 -17.05019925915006 M-59.55237706056477 -16.57289999590817 C-59.255648059169175 -16.704253122672913, -58.95891905777358 -16.835606249437657, -58.474149710847556 -17.05019925915006 M-58.474149710847556 -17.05019925915006 C-58.1781142323433 -17.159143051761593, -57.88207875383904 -17.268086844373123, -57.36755702606732 -17.457435596379835 M-58.474149710847556 -17.05019925915006 C-58.113539073001895 -17.182907307325458, -57.75292843515624 -17.315615355500853, -57.36755702606732 -17.457435596379835 M-57.36755702606732 -17.457435596379835 C-56.990712302671774 -17.569281132185314, -56.61386757927624 -17.68112666799079, -56.2371462329292 -17.79293558613589 M-57.36755702606732 -17.457435596379835 C-57.0736722213815 -17.544659063777765, -56.77978741669569 -17.631882531175695, -56.2371462329292 -17.79293558613589 M-56.2371462329292 -17.79293558613589 C-56.00218200899773 -17.846564636963397, -55.76721778506625 -17.900193687790903, -55.08756243185455 -18.05532058699581 M-56.2371462329292 -17.79293558613589 C-55.79214208251093 -17.894504879545394, -55.347137932092664 -17.9960741729549, -55.08756243185455 -18.05532058699581 M-55.08756243185455 -18.05532058699581 C-54.6306387893092 -18.12919245802677, -54.173715146763854 -18.203064329057728, -53.92352950926696 -18.24351240270963 M-55.08756243185455 -18.05532058699581 C-54.700332855529396 -18.117924861885843, -54.31310327920425 -18.180529136775878, -53.92352950926696 -18.24351240270963 M-53.92352950926696 -18.24351240270963 C-53.51340610984052 -18.283076513806748, -53.10328271041408 -18.322640624903865, -52.7498307261296 -18.356737712739584 M-53.92352950926696 -18.24351240270963 C-53.68837522761636 -18.266197453446065, -53.453220945965754 -18.288882504182496, -52.7498307261296 -18.356737712739584 M-52.7498307261296 -18.356737712739584 C-52.300901633251975 -18.3711339949607, -51.85197254037435 -18.385530277181815, -51.57128906250001 -18.39453125 M-52.7498307261296 -18.356737712739584 C-52.45404281866573 -18.366223055215716, -52.15825491120185 -18.375708397691845, -51.57128906250001 -18.39453125 M-51.57128906250001 -18.39453125 C-51.57128906250001 -18.39453125, -51.5712890625 -18.39453125, -51.5712890625 -18.39453125 M-51.57128906250001 -18.39453125 C-51.57128906250001 -18.39453125, -51.5712890625 -18.39453125, -51.5712890625 -18.39453125&quot; stroke=&quot;#db5461&quot; stroke-width=&quot;1.3&quot; fill=&quot;none&quot; stroke-dasharray=&quot;0 0&quot; style=&quot;&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Named&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; first&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; job&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-17-flowchart-WHO-2&quot; data-look=&quot;classic&quot; transform=&quot;translate(341.1015625, 166.67109375)&quot;&gt;&lt;polygon points=&quot;71.88203125,0 143.7640625,-71.88203125 71.88203125,-143.7640625 0,-71.88203125&quot; class=&quot;label-container&quot; transform=&quot;translate(-71.38203125, 71.88203125)&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Who&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; holds&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;the&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; session?&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-17-flowchart-WEB-4&quot; data-look=&quot;classic&quot; transform=&quot;translate(101.76171875, 340.78671875000003)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-93.76171875&quot; y=&quot;-26.44453125&quot; width=&quot;187.5234375&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Shopify&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; WebMCP&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Storefront&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; tools&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-17-flowchart-CLAUDE-6&quot; data-look=&quot;classic&quot; transform=&quot;translate(341.1015625, 340.78671875000003)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-95.578125&quot; y=&quot;-26.44453125&quot; width=&quot;191.15625&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Claude&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; connector&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Admin&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; data&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-17-flowchart-REMOTE-8&quot; data-look=&quot;classic&quot; transform=&quot;translate(602.12890625, 340.78671875000003)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-115.44921875&quot; y=&quot;-26.44453125&quot; width=&quot;230.8984375&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Storefront&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; or&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; UCP&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; MCP&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Separate&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; ticket&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-17-drop-shadow&quot; height=&quot;130%&quot; width=&quot;130%&quot;&gt;&lt;fedropshadow dx=&quot;4&quot; dy=&quot;4&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-17-drop-shadow-small&quot; height=&quot;150%&quot; width=&quot;150%&quot;&gt;&lt;fedropshadow dx=&quot;2&quot; dy=&quot;2&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;linearGradient id=&quot;epmb-17-gradient&quot; gradientUnits=&quot;objectBoundingBox&quot; x1=&quot;0%&quot; y1=&quot;0%&quot; x2=&quot;100%&quot; y2=&quot;0%&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#db5461&quot; stop-opacity=&quot;1&quot;/&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;hsl(0, 0%, 20.1960784314%)&quot; stop-opacity=&quot;1&quot;/&gt;&lt;/linearGradient&gt;&lt;text text-anchor=&quot;middle&quot; x=&quot;386.513671875&quot; y=&quot;-25&quot; class=&quot;flowchartTitleText&quot;&gt;Who holds the session&lt;/text&gt;&lt;/svg&gt;
  &lt;/div&gt;
  
  &lt;figcaption class=&quot;epmb-figure__caption&quot; id=&quot;epmb-17-caption&quot;&gt;Who holds the session&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h2&gt;Name the first job the team wants done&lt;/h2&gt;&lt;p&gt;Once the owner is named, write the first job as a verb plus an artifact. Vague briefs create duplicate work because both surfaces can &amp;quot;search products&amp;quot; in conversation while doing different things in the system.&lt;/p&gt;&lt;p&gt;WebMCP jobs look like this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Search the live catalogue and land the shopper on a product or collection.&lt;/li&gt;&lt;li&gt;Select a variant the theme can actually honour.&lt;/li&gt;&lt;li&gt;Add, change, or empty a line in the cart the shopper can see.&lt;/li&gt;&lt;li&gt;Answer a returns or shipping question from your own policy pages.&lt;/li&gt;&lt;li&gt;Take a non-empty cart to hosted checkout, where the shopper still pays.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Claude connector jobs look like this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Report yesterday&#39;s orders, a low-stock list, or a campaign code status.&lt;/li&gt;&lt;li&gt;Explain a refund pattern from live order data.&lt;/li&gt;&lt;li&gt;Propose a price or discount change that a human must still approve.&lt;/li&gt;&lt;li&gt;Draft an admin task that still needs a person who knows your custom apps.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If the first job is a storefront walk-through with no staff credentials, WebMCP is the door even when the person asking works in marketing. If the first job needs customer records, inventory ledgers, or write confirmations, the connector is the door even when someone used the word &amp;quot;agent&amp;quot; in the brief.&lt;/p&gt;&lt;p&gt;A useful stress test: could the work finish if Claude never opened, or if the shopper never opened an in-tab agent? The path that still has a job after that test is the one you sequence first.&lt;/p&gt;&lt;h2&gt;Map the data each surface can change&lt;/h2&gt;&lt;p&gt;Risk follows the data, not the acronym.&lt;/p&gt;&lt;p&gt;WebMCP can change the shopper&#39;s cart and can navigate the shopper to checkout or order history. &lt;code&gt;update_cart&lt;/code&gt; may refuse an ambiguous request and return options instead of guessing a line. &lt;code&gt;proceed_to_checkout&lt;/code&gt; checks that the cart is not empty. &lt;code&gt;manage_orders&lt;/code&gt; sends a logged-out shopper through login first. Shopify&#39;s published tool list does not include a tool that charges a card or creates an irreversible order from the agent alone. The shopper still finishes payment.&lt;/p&gt;&lt;p&gt;The practical WebMCP failure is a theme that already left the supportable path. Custom add-to-cart that never calls &lt;code&gt;Shopify.actions&lt;/code&gt;, or swatches that paint a selected state without writing the variant &lt;code&gt;id&lt;/code&gt;, will look decisive to a human and stall or mis-select for an agent. That contract test lives in the WebMCP article and in &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-theme-customisation-limits-when-your-store-leaves-the-supportable-path/&quot;&gt;&lt;em&gt;Shopify theme customisation limits&lt;/em&gt;&lt;/a&gt;. Catalogue titles, availability, and empty policy HTML become the agent&#39;s voice whether or not the theme is clean.&lt;/p&gt;&lt;p&gt;The Claude connector can read live orders, products, customers, inventory, and analytics, and can apply approved writes to that same store. Shopify does not ship a sandbox, a staging toggle, or a dry-run mode for the official connector. An approved price or discount change shows on the next storefront load. Coarse scopes are hard to narrow later without uninstalling. Customer data also enters Anthropic&#39;s context under their privacy policy, which is a different conversation from a shopper&#39;s own browser calling storefront tools.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Criterion&lt;/th&gt;&lt;th&gt;Shopify WebMCP&lt;/th&gt;&lt;th&gt;Claude admin connector&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Who holds the session&lt;/td&gt;&lt;td&gt;Shopper, in the storefront tab&lt;/td&gt;&lt;td&gt;Staff member, in Claude&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Where it runs&lt;/td&gt;&lt;td&gt;Liquid storefront (Hydrogen developer preview)&lt;/td&gt;&lt;td&gt;Connected Shopify admin via Claude&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;First useful job&lt;/td&gt;&lt;td&gt;Search, variant, cart, policy, checkout handoff&lt;/td&gt;&lt;td&gt;Operational Q&amp;amp;A and confirmed admin writes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;What it can change&lt;/td&gt;&lt;td&gt;The shopper&#39;s live cart and navigation&lt;/td&gt;&lt;td&gt;Live admin records you authorised&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Payment&lt;/td&gt;&lt;td&gt;Shopper still pays in hosted checkout&lt;/td&gt;&lt;td&gt;No customer checkout in this session&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Default risk&lt;/td&gt;&lt;td&gt;Theme and catalogue contract the agent inherits&lt;/td&gt;&lt;td&gt;Production writes and coarse admin scopes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Install burden&lt;/td&gt;&lt;td&gt;Already on hosted Liquid; client support still limited&lt;/td&gt;&lt;td&gt;Optional connector install and permission review&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Choose this first when&lt;/td&gt;&lt;td&gt;The first job is an in-tab shopping request&lt;/td&gt;&lt;td&gt;The first job is a staff ops question on live data&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;If the data in the first job is a cart line the shopper can undo, WebMCP&#39;s risk is recoverable in the same tab. If the data is a price, a discount code, or a customer record, the connector&#39;s risk is a production change with no built-in rollback. That difference is why &amp;quot;turn on both and see&amp;quot; is a sequencing failure, not a speed play.&lt;/p&gt;&lt;h2&gt;Choose which surface goes live first&lt;/h2&gt;&lt;p&gt;Write the sequence as a one-page brief the two Slack owners can share, using four fields: session owner (shopper in the tab, or staff in Claude); first job (one verb and one artifact, in the present tense); data that can change (cart and navigation, or live admin records); and first surface (WebMCP, the Claude connector, or a parked third door).&lt;/p&gt;&lt;p&gt;Then add the gate that belongs to that surface. For WebMCP, the gate is a four-template walk (homepage, collection, product, cart) with search, variant, add, policy, and checkout handoff, logged where the UI and the tool disagree. For the connector, the gate is a named approver for writes, plus a decision on whether production is even the right store. The isolation article covers development-store mirrors, scoped tokens, and a custom Admin MCP server when the team still needs to learn prompts.&lt;/p&gt;&lt;p&gt;Run the WebMCP walk now when the first job is in-tab shopping, even while Chromium origin trials remain limited, because the tools are already on Liquid. Most buyers still lack a client that can call them, and the walk still tells you whether a later client will inherit an honest cart and variant path.&lt;/p&gt;&lt;p&gt;Refuse a connector write on production while the first job is staff Q&amp;amp;A, even if the catalogue still needs cleanup, because read queries can leak customer data into a chat transcript and approved writes can land on the live storefront. Sequence access after you name who may approve, and after you decide whether a development store should take the first month of experiments.&lt;/p&gt;&lt;p&gt;Running both in the same sprint is valid when marketing owns the WebMCP walk and ops owns connector permissions as two tickets with two done definitions. Combining them into one &amp;quot;AI enablement&amp;quot; epic hides the gate that actually blocks go-live.&lt;/p&gt;&lt;h2&gt;Recommendation by scenario&lt;/h2&gt;&lt;h3&gt;Scenario A: leadership saw a post about agents shopping &amp;quot;directly&amp;quot;&lt;/h3&gt;&lt;p&gt;Start with WebMCP. Confirm you are talking about the in-tab door, not ChatGPT Shopping, not UCP catalog rank, and not a third-party widget that borrowed the WebMCP name. Run the contract test. Leave traffic forecasts for when a stable client exists. If the theme&#39;s cart already ignores standard actions, the first spend is theme recovery, not a connector install.&lt;/p&gt;&lt;h3&gt;Scenario B: ops wants Claude to replace a Monday CSV export&lt;/h3&gt;&lt;p&gt;Start with the Claude connector, keep the first week read-heavy, and name the person who may confirm a write. If the team wants to iterate on prompts or bulk edits, move that work off production using the isolation patterns rather than practising on live prices. The July setup post covers the install; this article stops at the sequencing call.&lt;/p&gt;&lt;h3&gt;Scenario C: both Slack messages arrived in the same hour&lt;/h3&gt;&lt;p&gt;Split the work so marketing owns the WebMCP walk with a theme owner while ops owns a connector permission review with a store-access owner. Share the four-field brief so nobody &amp;quot;helps&amp;quot; by enabling the other door as a shortcut, and reconvene only to park third doors such as Sidekick, Storefront MCP sunsets, and UCP feeds.&lt;/p&gt;&lt;h3&gt;Scenario D: a developer is counting down a remote MCP cutoff&lt;/h3&gt;&lt;p&gt;That ticket is Storefront MCP or UCP, not WebMCP versus Claude. Do not use this framework to sequence an admin connector against an in-tab tool when the actual risk is a remote cart tool sunset. Send the developer back to the endpoint they named.&lt;/p&gt;&lt;h3&gt;Scenario E: legal or a regulated category is in the thread&lt;/h3&gt;&lt;p&gt;Default the first live surface away from customer records in a staff chat. WebMCP still exposes whatever the Storefront API and policy pages already publish. The connector adds admin-scoped customer and order data to a third-party model context. Sequence a scoped or development-store pattern before anyone treats production Claude as the daily ops desk.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;You can now sequence Shopify WebMCP against the Claude admin connector from three facts: who holds the session, which job comes first, and which data that surface can change. WebMCP is the shopper-tab door for catalogue, cart, and checkout handoff. The Claude connector is the staff door for live admin questions and confirmed writes. Mixing those doors into one MCP project is how teams test the wrong contract or approve the wrong write.&lt;/p&gt;&lt;p&gt;If you want that sequence written against your theme actions and your admin access model, book a &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;Shopify stack assessment&lt;/a&gt; with oContis Studio. &lt;a href=&quot;https://ocontis.studio/services/shopify-theme-development/&quot;&gt;Shopify theme development&lt;/a&gt; is the recovery path when custom cart and variant code will fail an in-tab agent. &lt;a href=&quot;https://ocontis.studio/services/shopify-stack-audit/&quot;&gt;Shopify stack audit&lt;/a&gt; is the better first call when staff AI access is landing on a catalogue and app graph nobody has mapped.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>When to Use Checkout UI Extensions vs Shopify Functions</title>
    <link href="https://ocontis.studio/blog/post/when-to-use-checkout-ui-extensions-vs-shopify-functions/" />
    <updated>2026-09-11T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/when-to-use-checkout-ui-extensions-vs-shopify-functions/</id>
    <content type="html">&lt;h1&gt;When to Use Checkout UI Extensions vs Shopify Functions&lt;/h1&gt;&lt;p&gt;A merchant on Shopify Plus asks for gift-wrap at checkout. The requirement sounds simple: let the buyer add a £5 gift-wrap option and include a message for the recipient.&lt;/p&gt;&lt;p&gt;The build requires two components: a UI Extension that renders the gift-wrap checkbox and message field, and a Function that adds the £5 line item when the buyer selects the option. Miss either piece and the checkout either cannot collect the input or cannot apply the charge.&lt;/p&gt;&lt;p&gt;Shopify Plus checkout extensibility splits work into display (UI Extensions) and logic (Functions). Knowing where each lives before scoping prevents spec drift, duplicate effort, and &amp;quot;we thought the other part was included&amp;quot; conversations mid-project.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;This article teaches you when a Shopify Plus checkout project needs a UI Extension, a Function, or both working together. If your question is whether Plus is the right plan at all, see &lt;a href=&quot;https://ocontis.studio/blog/post/choosing-the-right-shopify-plan-a-practical-decision-framework/&quot;&gt;&lt;em&gt;Choosing the Right Shopify Plan&lt;/em&gt;&lt;/a&gt;. If checkout abandonment is the immediate pain, start with &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-checkout-abandonment-when-your-funnel-looks-healthy/&quot;&gt;&lt;em&gt;How to Fix Shopify Checkout Abandonment&lt;/em&gt;&lt;/a&gt; before adding custom extensions.&lt;/p&gt;&lt;h2&gt;The decision merchants face&lt;/h2&gt;&lt;p&gt;Shopify Plus unlocks two distinct extension surfaces at checkout:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Checkout UI Extensions&lt;/strong&gt; render visual elements at defined insertion points: banners, custom fields, product recommendations, trust badges, consent checkboxes, and promotional blocks.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Shopify Functions&lt;/strong&gt; run backend logic that modifies checkout behaviour: discount calculations, cart line transformations, validation rules, delivery option filtering, and payment method customisation.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The confusion happens because both are &amp;quot;checkout extensions&amp;quot; and both ship via the same app deployment. Merchants often brief a requirement as one thing when the build is two, or scope a Function when the job is purely display.&lt;/p&gt;&lt;figure class=&quot;blog-diagram epmb-figure&quot; role=&quot;figure&quot; aria-labelledby=&quot;epmb-16-caption&quot; data-diagram-id=&quot;epmb-16&quot;&gt;
  &lt;p class=&quot;epmb-figure__summary visually-hidden&quot; id=&quot;epmb-16-summary&quot;&gt;Checkout extensibility split&lt;/p&gt;
  &lt;div class=&quot;epmb-figure__brand epmb-figure__brand--top-right&quot;&gt;
  &lt;img class=&quot;epmb-figure__logo&quot; src=&quot;/assets/favicons/safari-pinned-tab.svg&quot; alt=&quot;oContis Studio&quot; width=&quot;32&quot; height=&quot;32&quot; decoding=&quot;async&quot; /&gt;
&lt;/div&gt;
  &lt;div class=&quot;epmb-figure__content&quot;&gt;
    
    &lt;svg id=&quot;epmb-16&quot; width=&quot;100%&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; class=&quot;flowchart&quot; style=&quot;max-width: 830.977734375px;&quot; viewBox=&quot;-8 -50.1015625 830.977734375 1101.775&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot;&gt;&lt;style&gt;#epmb-16{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;fill:#fafae6;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#epmb-16 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#epmb-16 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#epmb-16 .error-icon{fill:#141414;}#epmb-16 .error-text{fill:#ebebeb;stroke:#ebebeb;}#epmb-16 .edge-thickness-normal{stroke-width:1px;}#epmb-16 .edge-thickness-thick{stroke-width:3.5px;}#epmb-16 .edge-pattern-solid{stroke-dasharray:0;}#epmb-16 .edge-thickness-invisible{stroke-width:0;fill:none;}#epmb-16 .edge-pattern-dashed{stroke-dasharray:3;}#epmb-16 .edge-pattern-dotted{stroke-dasharray:2;}#epmb-16 .marker{fill:#8a8a7a;stroke:#8a8a7a;}#epmb-16 .marker.cross{stroke:#8a8a7a;}#epmb-16 svg{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;}#epmb-16 p{margin:0;}#epmb-16 .label{font-family:&#39;Syne&#39;,system-ui,sans-serif;color:#fafae6;}#epmb-16 .cluster-label text{fill:#fafae6;}#epmb-16 .cluster-label span{color:#fafae6;}#epmb-16 .cluster-label span p{background-color:transparent;}#epmb-16 .label text,#epmb-16 span{fill:#fafae6;color:#fafae6;}#epmb-16 .node rect,#epmb-16 .node circle,#epmb-16 .node ellipse,#epmb-16 .node polygon,#epmb-16 .node path{fill:#141414;stroke:#db5461;stroke-width:1px;}#epmb-16 .rough-node .label text,#epmb-16 .node .label text,#epmb-16 .image-shape .label,#epmb-16 .icon-shape .label{text-anchor:middle;}#epmb-16 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#epmb-16 .rough-node .label,#epmb-16 .node .label,#epmb-16 .image-shape .label,#epmb-16 .icon-shape .label{text-align:center;}#epmb-16 .node.clickable{cursor:pointer;}#epmb-16 .root .anchor path{fill:#8a8a7a!important;stroke-width:0;stroke:#8a8a7a;}#epmb-16 .arrowheadPath{fill:#f1eff0;}#epmb-16 .edgePath .path{stroke:#8a8a7a;stroke-width:1px;}#epmb-16 .flowchart-link{stroke:#8a8a7a;fill:none;}#epmb-16 .edgeLabel{background-color:#141414;text-align:center;}#epmb-16 .edgeLabel p{background-color:#141414;}#epmb-16 .edgeLabel rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-16 .labelBkg{background-color:rgba(20, 20, 20, 0.5);}#epmb-16 .cluster rect{fill:#141414;stroke:hsl(0, 0%, 17.8431372549%);stroke-width:1px;}#epmb-16 .cluster text{fill:#fafae6;}#epmb-16 .cluster span{color:#fafae6;}#epmb-16 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:12px;background:#141414;border:1px solid hsl(0, 0%, 17.8431372549%);border-radius:2px;pointer-events:none;z-index:100;}#epmb-16 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fafae6;}#epmb-16 rect.text{fill:none;stroke-width:0;}#epmb-16 .icon-shape,#epmb-16 .image-shape{background-color:#141414;text-align:center;}#epmb-16 .icon-shape p,#epmb-16 .image-shape p{background-color:#141414;padding:2px;}#epmb-16 .icon-shape .label rect,#epmb-16 .image-shape .label rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-16 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#epmb-16 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#epmb-16 .node .neo-node{stroke:#db5461;}#epmb-16 [data-look=&quot;neo&quot;].node rect,#epmb-16 [data-look=&quot;neo&quot;].cluster rect,#epmb-16 [data-look=&quot;neo&quot;].node polygon{stroke:url(#epmb-16-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-16 [data-look=&quot;neo&quot;].swimlane.cluster rect{filter:none;}#epmb-16 [data-look=&quot;neo&quot;].node path{stroke:url(#epmb-16-gradient);stroke-width:1px;}#epmb-16 [data-look=&quot;neo&quot;].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-16 [data-look=&quot;neo&quot;].node .neo-line path{stroke:#db5461;filter:none;}#epmb-16 [data-look=&quot;neo&quot;].node circle{stroke:url(#epmb-16-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-16 [data-look=&quot;neo&quot;].node circle .state-start{fill:#000000;}#epmb-16 [data-look=&quot;neo&quot;].icon-shape .icon{fill:url(#epmb-16-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-16 [data-look=&quot;neo&quot;].icon-shape .icon-neo path{stroke:url(#epmb-16-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-16 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;epmb-16_flowchart-v2-pointEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 10 5 L 0 10 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-16_flowchart-v2-pointStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;4.5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 5 L 10 10 L 10 0 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-16_flowchart-v2-pointEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;11.5&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;10.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 11.5 7 L 0 14 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-16_flowchart-v2-pointStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;1&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;polygon points=&quot;0,7 11.5,14 11.5,0&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-16_flowchart-v2-circleEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;11&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-16_flowchart-v2-circleStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-1&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-16_flowchart-v2-circleEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refY=&quot;5&quot; refX=&quot;12.25&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-16_flowchart-v2-circleStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-2&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-16_flowchart-v2-crossEnd&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;12&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-16_flowchart-v2-crossStart&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;-1&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-16_flowchart-v2-crossEnd-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;17.7&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-16_flowchart-v2-crossStart-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;-3.5&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;g class=&quot;root&quot;&gt;&lt;g class=&quot;clusters&quot;/&gt;&lt;g class=&quot;edgePaths&quot;&gt;&lt;path d=&quot;M341.037,45.289L340.953,49.372C340.87,53.456,340.703,61.622,340.62,69.206C340.537,76.789,340.537,83.789,340.537,87.289L340.537,90.789&quot; id=&quot;epmb-16-L_REQ_Q1_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_REQ_Q1_0&quot; data-points=&quot;W3sieCI6MzQxLjAzNjcxODc0OTk5OTksInkiOjQ1LjI4OTA2MjQ5OTk5OTk5fSx7IngiOjM0MC41MzY3MTg3NSwieSI6NjkuNzg5MDYyNX0seyJ4IjozNDAuNTM2NzE4NzQ5OTk5OSwieSI6OTQuNzg5MDYyNDk5OTk5OTZ9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-16_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M408.365,239.193L439.581,256.814C470.797,274.434,533.228,309.675,564.444,348.074C595.659,386.472,595.659,428.028,595.659,448.806L595.659,469.584&quot; id=&quot;epmb-16-L_Q1_FUNC_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_Q1_FUNC_0&quot; data-points=&quot;W3sieCI6NDA4LjM2NTM4NTI4NzA1MjQ1LCJ5IjoyMzkuMTkzMjA4NDYyOTQ3NTh9LHsieCI6NTk1LjY1OTM3NSwieSI6MzQ0LjkxNjQwNjI1fSx7IngiOjU5NS42NTkzNzUsInkiOjQ3My41ODQzNzV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-16_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M289.006,255.491L274.935,270.395C260.865,285.299,232.725,315.108,218.654,335.661C204.584,356.215,204.584,367.513,204.584,373.162L204.584,378.811&quot; id=&quot;epmb-16-L_Q1_Q2_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_Q1_Q2_0&quot; data-points=&quot;W3sieCI6Mjg5LjAwNTY5MTU0NTIzNzU0LCJ5IjoyNTUuNDkwODQ3Nzk1MjM3NDd9LHsieCI6MjA0LjU4Mzk4NDM3NDk5OTk0LCJ5IjozNDQuOTE2NDA2MjV9LHsieCI6MjA0LjU4Mzk4NDM3NDk5OTkxLCJ5IjozODIuODEwOTM3NX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-16_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M153.655,566.318L142.282,581.122C130.908,595.926,108.161,625.534,96.788,660.076C85.414,694.618,85.414,734.095,85.414,753.833L85.414,773.571&quot; id=&quot;epmb-16-L_Q2_EXT_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_Q2_EXT_0&quot; data-points=&quot;W3sieCI6MTUzLjY1NTI1MTU2NDUxODMyLCJ5Ijo1NjYuMzE4MTQyMTg5NTE4NH0seyJ4Ijo4NS40MTQwNjI0OTk5OTk5NCwieSI6NjU1LjE0MTQwNjI1fSx7IngiOjg1LjQxNDA2MjQ5OTk5OTk0LCJ5Ijo3NzcuNTcxMDkzNzV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-16_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M255.513,566.318L266.886,581.122C278.26,595.926,301.007,625.534,312.38,660.076C323.754,694.618,323.754,734.095,323.754,753.833L323.754,773.571&quot; id=&quot;epmb-16-L_Q2_NEITHER_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_Q2_NEITHER_0&quot; data-points=&quot;W3sieCI6MjU1LjUxMjcxNzE4NTQ4MTU2LCJ5Ijo1NjYuMzE4MTQyMTg5NTE4M30seyJ4IjozMjMuNzUzOTA2MjQ5OTk5OTQsInkiOjY1NS4xNDE0MDYyNX0seyJ4IjozMjMuNzUzOTA2MjQ5OTk5OTQsInkiOjc3Ny41NzEwOTM3NX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-16_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M595.659,526.473L595.659,547.918C595.659,569.363,595.659,612.252,595.659,639.346C595.659,666.44,595.659,677.738,595.659,683.387L595.659,689.036&quot; id=&quot;epmb-16-L_FUNC_BOTH_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_FUNC_BOTH_0&quot; data-points=&quot;W3sieCI6NTk1LjY1OTM3NSwieSI6NTI2LjQ3MzQzNzV9LHsieCI6NTk1LjY1OTM3NSwieSI6NjU1LjE0MTQwNjI1fSx7IngiOjU5NS42NTkzNzQ5OTk5OTk4LCJ5Ijo2OTMuMDM1OTM3NX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-16_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M546.387,865.723L534.787,880.251C523.187,894.779,499.987,923.834,488.386,944.011C476.786,964.188,476.786,975.486,476.786,981.135L476.786,986.784&quot; id=&quot;epmb-16-L_BOTH_PAIR_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_BOTH_PAIR_0&quot; data-points=&quot;W3sieCI6NTQ2LjM4NzE4NzA1MjI5LCJ5Ijo4NjUuNzIzMTI0NTUyMjkwM30seyJ4Ijo0NzYuNzg2MzI4MTI0OTk5OTUsInkiOjk1Mi44ODk4NDM3NTAwMDAxfSx7IngiOjQ3Ni43ODYzMjgxMjQ5OTk5NSwieSI6OTkwLjc4NDM3NTAwMDAwMDF9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-16_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M644.932,865.723L656.532,880.251C668.132,894.779,691.332,923.834,702.932,944.103C714.532,964.371,714.532,975.853,714.532,981.594L714.532,987.334&quot; id=&quot;epmb-16-L_BOTH_FUNC_ONLY_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_BOTH_FUNC_ONLY_0&quot; data-points=&quot;W3sieCI6NjQ0LjkzMTU2Mjk0NzcwOTYsInkiOjg2NS43MjMxMjQ1NTIyOTAxfSx7IngiOjcxNC41MzI0MjE4NzUsInkiOjk1Mi44ODk4NDM3NTAwMDAxfSx7IngiOjcxNC41MzI0MjE4NzUsInkiOjk5MS4zMzQzNzV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-16_flowchart-v2-pointEnd)&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabels&quot;&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_REQ_Q1_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(595.659375, 344.91640625)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q1_FUNC_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-14.78515625&quot; y=&quot;-18.1015625&quot; width=&quot;29.5703125&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Yes&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(204.58398437499994, 344.91640625)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q1_Q2_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-12.86328125&quot; y=&quot;-18.1015625&quot; width=&quot;25.7265625&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;No&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(85.41406249999994, 655.14140625)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q2_EXT_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-14.78515625&quot; y=&quot;-18.1015625&quot; width=&quot;29.5703125&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Yes&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(323.75390624999994, 655.14140625)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q2_NEITHER_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-12.86328125&quot; y=&quot;-18.1015625&quot; width=&quot;25.7265625&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;No&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_FUNC_BOTH_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(476.78632812499995, 952.8898437500001)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_BOTH_PAIR_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-14.78515625&quot; y=&quot;-18.1015625&quot; width=&quot;29.5703125&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Yes&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(714.532421875, 952.8898437500001)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_BOTH_FUNC_ONLY_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-12.86328125&quot; y=&quot;-18.1015625&quot; width=&quot;25.7265625&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;No&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;nodes&quot;&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-16-flowchart-REQ-0&quot; data-look=&quot;classic&quot; transform=&quot;translate(340.53671875, 26.39453125)&quot;&gt;&lt;g class=&quot;basic label-container outer-path&quot;&gt;&lt;path d=&quot;M-77.8095703125 -18.39453125 C-40.04263863946249 -18.39453125, -2.275706966424977 -18.39453125, 77.8095703125 -18.39453125 C77.8095703125 -18.39453125, 77.8095703125 -18.39453125, 77.8095703125 -18.39453125 C78.14474026783661 -18.383783001901097, 78.47991022317322 -18.37303475380219, 78.9881119761296 -18.356737712739584 C79.23656677784095 -18.332769576829108, 79.4850215795523 -18.30880144091863, 80.16181075926694 -18.243512402709634 C80.43327148719422 -18.199624737427737, 80.7047322151215 -18.155737072145843, 81.32584368185454 -18.05532058699581 C81.77117192411652 -17.953677321737878, 82.2165001663785 -17.852034056479944, 82.47542748292918 -17.792935586135897 C82.74635272113981 -17.712526397550576, 83.01727795935044 -17.632117208965255, 83.6058382760673 -17.457435596379838 C84.02938976259215 -17.301564734071675, 84.45294124911699 -17.14569387176351, 84.71243096084756 -17.050199259150062 C85.09362809574942 -16.881454595340244, 85.47482523065129 -16.71270993153043, 85.79065831056477 -16.57289999590817 C86.13775288352036 -16.39182097952192, 86.48484745647595 -16.210741963135675, 86.83608965775993 -16.02749913170719 C87.15228830516347 -15.835817653461657, 87.46848695256702 -15.644136175216122, 87.8444291007831 -15.416237835686243 C88.149624389448 -15.203346814004725, 88.45481967811288 -14.990455792323207, 88.81153315657475 -14.74162791162581 C89.03677986280164 -14.561999657476456, 89.26202656902852 -14.382371403327099, 89.73342778712646 -14.006441476407245 C89.97074653815571 -13.790914865832553, 90.20806528918494 -13.575388255257861, 90.60632472965554 -13.21369956878984 C90.77802419304197 -13.036405776055242, 90.9497236564284 -12.859111983320641, 91.4266370633893 -12.366659735314617 C91.61229692964311 -12.148573092067215, 91.79795679589694 -11.930486448819815, 92.190993948992 -11.468802644346782 C92.37158919437371 -11.226821468100603, 92.55218443975542 -10.984840291854422, 92.89625448006666 -10.523817783262883 C93.05509653425659 -10.279793732963334, 93.21393858844651 -10.035769682663783, 93.53952058981318 -9.535588297555714 C93.67560021915443 -9.293965136103644, 93.81167984849569 -9.052341974651576, 94.11814895980648 -8.508175034156615 C94.28655706715311 -8.15847199589508, 94.45496517449973 -7.8087689576335455, 94.62976188195883 -7.44579985454435 C94.7305155629154 -7.19693631464172, 94.83126924387197 -6.948072774739089, 95.0722570290325 -6.352828286210703 C95.19157034232236 -5.993475596576502, 95.31088365561223 -5.634122906942301, 95.44381609355327 -5.233751583771614 C95.51529411913742 -4.961174893446946, 95.58677214472159 -4.68859820312228, 95.74291225962581 -4.0931682734386134 C95.82497991137924 -3.671768226689041, 95.90704756313269 -3.2503681799394686, 95.96831647694783 -2.935765256688221 C96.02607000049191 -2.487840332803529, 96.08382352403599 -2.0399154089188376, 96.11910251124131 -1.766298550778415 C96.13969962673337 -1.4454818512969827, 96.16029674222546 -1.1246651518155506, 96.1946507503478 -0.5895737452536101 C96.1946507503478 -0.23976805999433298, 96.1946507503478 0.1100376252649441, 96.1946507503478 0.5895737452536056 C96.1760992564197 0.878528237680209, 96.1575477624916 1.1674827301068125, 96.11910251124131 1.7662985507784026 C96.07930837027625 2.074934049861451, 96.03951422931118 2.3835695489444992, 95.96831647694783 2.935765256688208 C95.89081532663198 3.3337172836862243, 95.81331417631611 3.7316693106842407, 95.74291225962581 4.093168273438609 C95.63145222496604 4.518213692680932, 95.51999219030625 4.943259111923255, 95.44381609355327 5.2337515837716015 C95.337140761382 5.555040687865402, 95.23046542921075 5.876329791959202, 95.0722570290325 6.35282828621069 C94.93451067872896 6.693064434604971, 94.7967643284254 7.033300582999253, 94.62976188195883 7.445799854544345 C94.45995179831806 7.798414126578133, 94.2901417146773 8.15102839861192, 94.11814895980648 8.50817503415661 C93.92445328687177 8.852101315265907, 93.73075761393707 9.196027596375203, 93.53952058981318 9.53558829755571 C93.33275602704474 9.85323419002723, 93.12599146427631 10.170880082498751, 92.89625448006666 10.523817783262873 C92.73116673155869 10.745020326460272, 92.56607898305072 10.96622286965767, 92.190993948992 11.468802644346779 C91.92054636903464 11.78648576066794, 91.65009878907729 12.104168876989103, 91.42663706338931 12.366659735314606 C91.14402210448266 12.658482883505364, 90.86140714557601 12.95030603169612, 90.60632472965554 13.213699568789837 C90.30908633445799 13.483643614811278, 90.01184793926045 13.75358766083272, 89.73342778712649 14.006441476407232 C89.39637766683023 14.27522997806311, 89.05932754653398 14.544018479718984, 88.81153315657475 14.741627911625809 C88.46294628600009 14.984787022456276, 88.11435941542544 15.227946133286745, 87.84442910078312 15.416237835686236 C87.56028934725376 15.588485024066264, 87.27614959372441 15.760732212446293, 86.83608965775993 16.02749913170719 C86.5897663691292 16.156005833608255, 86.34344308049845 16.284512535509315, 85.79065831056478 16.57289999590817 C85.3742596877903 16.757227314184156, 84.95786106501582 16.94155463246014, 84.71243096084756 17.050199259150062 C84.41810455814188 17.158514096069194, 84.1237781554362 17.26682893298833, 83.60583827606732 17.457435596379835 C83.18353312510033 17.582773548461866, 82.76122797413335 17.708111500543893, 82.47542748292919 17.792935586135894 C82.11739162815577 17.874654933585628, 81.75935577338234 17.956374281035362, 81.32584368185455 18.05532058699581 C80.99256644107099 18.10920226668209, 80.65928920028743 18.16308394636837, 80.16181075926696 18.24351240270963 C79.85483421737885 18.27312606051227, 79.54785767549075 18.30273971831491, 78.9881119761296 18.356737712739584 C78.67470007562149 18.36678822236962, 78.36128817511337 18.376838731999662, 77.8095703125 18.39453125 C77.8095703125 18.39453125, 77.8095703125 18.39453125, 77.8095703125 18.39453125 C17.526933445612855 18.39453125, -42.75570342127429 18.39453125, -77.8095703125 18.39453125 C-78.23100440210003 18.38101667901822, -78.65243849170005 18.367502108036437, -78.98811197612959 18.356737712739584 C-79.2722420540465 18.329328025839352, -79.55637213196343 18.30191833893912, -80.16181075926696 18.24351240270963 C-80.41609791438793 18.20240122749601, -80.67038506950891 18.161290052282393, -81.32584368185454 18.05532058699581 C-81.68702643889671 17.97288297963869, -82.04820919593888 17.890445372281572, -82.47542748292918 17.792935586135897 C-82.73962958764145 17.714521788282443, -83.0038316923537 17.636107990428993, -83.60583827606729 17.45743559637984 C-84.0125089967283 17.307777011953657, -84.41917971738931 17.158118427527473, -84.71243096084756 17.050199259150062 C-85.06074500137646 16.89601096577682, -85.40905904190537 16.741822672403575, -85.79065831056477 16.572899995908173 C-86.19272134609922 16.363143967803516, -86.59478438163367 16.153387939698856, -86.83608965775993 16.027499131707195 C-87.19252173010669 15.81142791482323, -87.54895380245345 15.595356697939266, -87.84442910078309 15.416237835686248 C-88.19574285563567 15.171176568428427, -88.54705661048824 14.926115301170604, -88.81153315657475 14.741627911625814 C-89.0170969207782 14.577696279955068, -89.22266068498165 14.413764648284321, -89.73342778712646 14.006441476407247 C-89.9153372677338 13.84123609918077, -90.09724674834114 13.676030721954294, -90.60632472965553 13.213699568789847 C-90.8837483342409 12.927236920153915, -91.16117193882629 12.640774271517982, -91.42663706338931 12.366659735314613 C-91.63812558157373 12.118233287817587, -91.84961409975817 11.869806840320562, -92.190993948992 11.468802644346786 C-92.46853273469155 11.096925955812917, -92.7460715203911 10.725049267279049, -92.89625448006666 10.523817783262885 C-93.13398530653059 10.158599394148975, -93.37171613299454 9.793381005035066, -93.53952058981318 9.535588297555725 C-93.76597224457547 9.133500453808724, -93.99242389933775 8.731412610061723, -94.11814895980648 8.508175034156617 C-94.29982283801363 8.130925338861203, -94.48149671622076 7.753675643565792, -94.62976188195883 7.445799854544352 C-94.75180767831625 7.144344377946573, -94.87385347467367 6.842888901348794, -95.0722570290325 6.352828286210705 C-95.1938760282468 5.986531237933269, -95.3154950274611 5.620234189655833, -95.44381609355327 5.233751583771609 C-95.53227508159269 4.8964191240093475, -95.62073406963212 4.559086664247086, -95.74291225962581 4.093168273438616 C-95.79997135182704 3.8001818944286816, -95.85703044402828 3.507195515418747, -95.96831647694783 2.9357652566882226 C-96.02758851943702 2.4760629997308334, -96.08686056192619 2.016360742773444, -96.11910251124131 1.7662985507784255 C-96.13537628182505 1.5128214379855938, -96.15165005240877 1.2593443251927618, -96.1946507503478 0.5895737452536124 C-96.1946507503478 0.19009505361538115, -96.1946507503478 -0.2093836380228501, -96.1946507503478 -0.5895737452536034 C-96.17294644626082 -0.9276358008072602, -96.15124214217384 -1.265697856360917, -96.11910251124131 -1.7662985507784004 C-96.07215766253697 -2.130393527020404, -96.02521281383261 -2.4944885032624073, -95.96831647694783 -2.935765256688214 C-95.88268709831692 -3.375454018182375, -95.79705771968601 -3.8151427796765356, -95.74291225962581 -4.093168273438607 C-95.62924008774772 -4.526649530640688, -95.51556791586964 -4.960130787842767, -95.44381609355327 -5.2337515837716 C-95.30279382038724 -5.65848820169978, -95.1617715472212 -6.083224819627961, -95.07225702903251 -6.3528282862106815 C-94.9221863596355 -6.723505741040293, -94.77211569023851 -7.094183195869905, -94.62976188195883 -7.445799854544344 C-94.49015924796923 -7.735687711041594, -94.35055661397963 -8.025575567538844, -94.11814895980648 -8.508175034156608 C-93.99532744973271 -8.726257062319105, -93.87250593965894 -8.9443390904816, -93.53952058981318 -9.535588297555718 C-93.30621689168777 -9.894005428691235, -93.07291319356236 -10.252422559826751, -92.89625448006666 -10.523817783262878 C-92.67378066424816 -10.821912428678097, -92.45130684842967 -11.120007074093316, -92.190993948992 -11.468802644346779 C-91.90959152643785 -11.799353942130331, -91.62818910388371 -12.129905239913885, -91.42663706338931 -12.366659735314604 C-91.21946659291228 -12.580580255094088, -91.01229612243525 -12.794500774873569, -90.60632472965554 -13.213699568789831 C-90.27669628220278 -13.51305940327564, -89.94706783475002 -13.812419237761448, -89.73342778712649 -14.00644147640723 C-89.48288640389698 -14.206241562346543, -89.2323450206675 -14.406041648285854, -88.81153315657475 -14.741627911625807 C-88.4355288562222 -15.003912234587922, -88.05952455586966 -15.266196557550037, -87.84442910078312 -15.416237835686234 C-87.49419425376314 -15.628552258158166, -87.14395940674315 -15.840866680630098, -86.83608965775994 -16.027499131707188 C-86.51594304064005 -16.194519416794936, -86.19579642352018 -16.361539701882688, -85.79065831056478 -16.57289999590817 C-85.3662931189883 -16.760753877872936, -84.9419279274118 -16.948607759837703, -84.71243096084756 -17.05019925915006 C-84.34942526079917 -17.183788712355774, -83.98641956075078 -17.31737816556149, -83.60583827606732 -17.457435596379835 C-83.37207415289996 -17.526815561082987, -83.13831002973258 -17.59619552578614, -82.4754274829292 -17.79293558613589 C-82.02842307325508 -17.89496142566763, -81.58141866358096 -17.996987265199373, -81.32584368185455 -18.05532058699581 C-81.06542899794545 -18.097422413544194, -80.80501431403634 -18.139524240092584, -80.16181075926696 -18.24351240270963 C-79.82655965294413 -18.275853673738148, -79.49130854662128 -18.30819494476667, -78.9881119761296 -18.356737712739584 C-78.61151676685786 -18.368814388102823, -78.23492155758613 -18.38089106346606, -77.8095703125 -18.39453125 C-77.8095703125 -18.39453125, -77.8095703125 -18.39453125, -77.8095703125 -18.39453125&quot; stroke=&quot;none&quot; stroke-width=&quot;0&quot; fill=&quot;#141414&quot; style=&quot;&quot;/&gt;&lt;path d=&quot;M-77.8095703125 -18.39453125 C-36.463019222778115 -18.39453125, 4.88353186694377 -18.39453125, 77.8095703125 -18.39453125 M-77.8095703125 -18.39453125 C-20.031799579265872 -18.39453125, 37.745971153968256 -18.39453125, 77.8095703125 -18.39453125 M77.8095703125 -18.39453125 C77.8095703125 -18.39453125, 77.8095703125 -18.39453125, 77.8095703125 -18.39453125 M77.8095703125 -18.39453125 C77.8095703125 -18.39453125, 77.8095703125 -18.39453125, 77.8095703125 -18.39453125 M77.8095703125 -18.39453125 C78.22466390955668 -18.381220006273065, 78.63975750661336 -18.36790876254613, 78.9881119761296 -18.356737712739584 M77.8095703125 -18.39453125 C78.10155491855522 -18.385167871997368, 78.39353952461043 -18.375804493994735, 78.9881119761296 -18.356737712739584 M78.9881119761296 -18.356737712739584 C79.37415116257397 -18.319496976703345, 79.76019034901833 -18.282256240667106, 80.16181075926694 -18.243512402709634 M78.9881119761296 -18.356737712739584 C79.35211403353966 -18.321622872037757, 79.71611609094974 -18.28650803133593, 80.16181075926694 -18.243512402709634 M80.16181075926694 -18.243512402709634 C80.45919999127581 -18.195432817966378, 80.75658922328468 -18.147353233223125, 81.32584368185454 -18.05532058699581 M80.16181075926694 -18.243512402709634 C80.55276677826676 -18.180305665466953, 80.94372279726659 -18.11709892822427, 81.32584368185454 -18.05532058699581 M81.32584368185454 -18.05532058699581 C81.566306493314 -18.000436519446676, 81.80676930477345 -17.945552451897548, 82.47542748292918 -17.792935586135897 M81.32584368185454 -18.05532058699581 C81.61763778700421 -17.98872048662988, 81.9094318921539 -17.922120386263952, 82.47542748292918 -17.792935586135897 M82.47542748292918 -17.792935586135897 C82.79182004206787 -17.69903193536197, 83.10821260120655 -17.60512828458804, 83.6058382760673 -17.457435596379838 M82.47542748292918 -17.792935586135897 C82.90153740608204 -17.666468397640756, 83.3276473292349 -17.540001209145615, 83.6058382760673 -17.457435596379838 M83.6058382760673 -17.457435596379838 C83.97469086784703 -17.32169443296892, 84.34354345962676 -17.185953269557995, 84.71243096084756 -17.050199259150062 M83.6058382760673 -17.457435596379838 C84.03650352862228 -17.298946802413656, 84.46716878117725 -17.14045800844747, 84.71243096084756 -17.050199259150062 M84.71243096084756 -17.050199259150062 C85.0240812128029 -16.912240937385686, 85.33573146475824 -16.77428261562131, 85.79065831056477 -16.57289999590817 M84.71243096084756 -17.050199259150062 C85.01814873101806 -16.914867071091017, 85.32386650118858 -16.779534883031967, 85.79065831056477 -16.57289999590817 M85.79065831056477 -16.57289999590817 C86.1724788681556 -16.373704455580775, 86.55429942574642 -16.17450891525338, 86.83608965775993 -16.02749913170719 M85.79065831056477 -16.57289999590817 C86.04102456398002 -16.44228408186867, 86.29139081739527 -16.311668167829172, 86.83608965775993 -16.02749913170719 M86.83608965775993 -16.02749913170719 C87.18644645275245 -15.815110783657659, 87.53680324774498 -15.602722435608126, 87.8444291007831 -15.416237835686243 M86.83608965775993 -16.02749913170719 C87.22064621349114 -15.794378687717765, 87.60520276922234 -15.56125824372834, 87.8444291007831 -15.416237835686243 M87.8444291007831 -15.416237835686243 C88.08559212743981 -15.24801294806969, 88.32675515409652 -15.079788060453135, 88.81153315657475 -14.74162791162581 M87.8444291007831 -15.416237835686243 C88.21005243124951 -15.161194827931759, 88.57567576171591 -14.906151820177277, 88.81153315657475 -14.74162791162581 M88.81153315657475 -14.74162791162581 C89.05982318579936 -14.54362322059435, 89.30811321502397 -14.345618529562888, 89.73342778712646 -14.006441476407245 M88.81153315657475 -14.74162791162581 C89.13026310896704 -14.487449256353202, 89.44899306135933 -14.23327060108059, 89.73342778712646 -14.006441476407245 M89.73342778712646 -14.006441476407245 C90.04200534785473 -13.72619950026869, 90.350582908583 -13.445957524130137, 90.60632472965554 -13.21369956878984 M89.73342778712646 -14.006441476407245 C90.07179335657507 -13.699146818896397, 90.41015892602368 -13.39185216138555, 90.60632472965554 -13.21369956878984 M90.60632472965554 -13.21369956878984 C90.82058902532766 -12.992454092082541, 91.03485332099979 -12.77120861537524, 91.4266370633893 -12.366659735314617 M90.60632472965554 -13.21369956878984 C90.89554007675068 -12.915060977892512, 91.18475542384581 -12.616422386995186, 91.4266370633893 -12.366659735314617 M91.4266370633893 -12.366659735314617 C91.60120776734809 -12.161599053090168, 91.77577847130688 -11.956538370865719, 92.190993948992 -11.468802644346782 M91.4266370633893 -12.366659735314617 C91.67743139860677 -12.07206243856623, 91.92822573382425 -11.777465141817844, 92.190993948992 -11.468802644346782 M92.190993948992 -11.468802644346782 C92.44086942184077 -11.133992274853304, 92.69074489468956 -10.799181905359823, 92.89625448006666 -10.523817783262883 M92.190993948992 -11.468802644346782 C92.41938276380624 -11.162782439144761, 92.64777157862049 -10.85676223394274, 92.89625448006666 -10.523817783262883 M92.89625448006666 -10.523817783262883 C93.10525325528548 -10.202739540497518, 93.3142520305043 -9.881661297732151, 93.53952058981318 -9.535588297555714 M92.89625448006666 -10.523817783262883 C93.02680019473493 -10.323264509099667, 93.1573459094032 -10.122711234936453, 93.53952058981318 -9.535588297555714 M93.53952058981318 -9.535588297555714 C93.68786234704025 -9.272192486367295, 93.83620410426731 -9.008796675178877, 94.11814895980648 -8.508175034156615 M93.53952058981318 -9.535588297555714 C93.75716058944396 -9.149146439771556, 93.97480058907472 -8.762704581987398, 94.11814895980648 -8.508175034156615 M94.11814895980648 -8.508175034156615 C94.29158305873149 -8.14803541684359, 94.46501715765649 -7.787895799530563, 94.62976188195883 -7.44579985454435 M94.11814895980648 -8.508175034156615 C94.29989936210056 -8.130766434957325, 94.48164976439463 -7.753357835758034, 94.62976188195883 -7.44579985454435 M94.62976188195883 -7.44579985454435 C94.72144146915856 -7.219349501656765, 94.8131210563583 -6.9928991487691805, 95.0722570290325 -6.352828286210703 M94.62976188195883 -7.44579985454435 C94.77815632477956 -7.079262711765762, 94.92655076760029 -6.712725568987174, 95.0722570290325 -6.352828286210703 M95.0722570290325 -6.352828286210703 C95.15262915638804 -6.110760244175277, 95.23300128374359 -5.868692202139853, 95.44381609355327 -5.233751583771614 M95.0722570290325 -6.352828286210703 C95.21826843232189 -5.91306520326091, 95.36427983561128 -5.473302120311117, 95.44381609355327 -5.233751583771614 M95.44381609355327 -5.233751583771614 C95.54802234594216 -4.836367980137295, 95.65222859833105 -4.438984376502976, 95.74291225962581 -4.0931682734386134 M95.44381609355327 -5.233751583771614 C95.5481642564553 -4.8358268138463, 95.65251241935732 -4.437902043920985, 95.74291225962581 -4.0931682734386134 M95.74291225962581 -4.0931682734386134 C95.80178284740822 -3.7908802474791017, 95.86065343519061 -3.48859222151959, 95.96831647694783 -2.935765256688221 M95.74291225962581 -4.0931682734386134 C95.82506004840232 -3.671356740012573, 95.90720783717882 -3.2495452065865322, 95.96831647694783 -2.935765256688221 M95.96831647694783 -2.935765256688221 C96.01593002390536 -2.5664839888439914, 96.06354357086288 -2.1972027209997624, 96.11910251124131 -1.766298550778415 M95.96831647694783 -2.935765256688221 C96.0093460275711 -2.617548164255365, 96.05037557819436 -2.2993310718225093, 96.11910251124131 -1.766298550778415 M96.11910251124131 -1.766298550778415 C96.13677028206267 -1.4911087590678573, 96.15443805288402 -1.2159189673572997, 96.1946507503478 -0.5895737452536101 M96.11910251124131 -1.766298550778415 C96.1408337305123 -1.4278172695082152, 96.16256494978329 -1.0893359882380151, 96.1946507503478 -0.5895737452536101 M96.1946507503478 -0.5895737452536101 C96.1946507503478 -0.2528377376063001, 96.1946507503478 0.08389827004100991, 96.1946507503478 0.5895737452536056 M96.1946507503478 -0.5895737452536101 C96.1946507503478 -0.20241641952505457, 96.1946507503478 0.18474090620350092, 96.1946507503478 0.5895737452536056 M96.1946507503478 0.5895737452536056 C96.1781614115427 0.8464085070978381, 96.1616720727376 1.1032432689420706, 96.11910251124131 1.7662985507784026 M96.1946507503478 0.5895737452536056 C96.17052220229384 0.9653953574074992, 96.14639365423989 1.3412169695613927, 96.11910251124131 1.7662985507784026 M96.11910251124131 1.7662985507784026 C96.08645594226354 2.0194988929757045, 96.05380937328579 2.272699235173006, 95.96831647694783 2.935765256688208 M96.11910251124131 1.7662985507784026 C96.06917474911326 2.153528414491781, 96.0192469869852 2.540758278205159, 95.96831647694783 2.935765256688208 M95.96831647694783 2.935765256688208 C95.89594774962636 3.3073633763480217, 95.8235790223049 3.678961496007836, 95.74291225962581 4.093168273438609 M95.96831647694783 2.935765256688208 C95.8825878881775 3.375963441280269, 95.79685929940715 3.8161616258723297, 95.74291225962581 4.093168273438609 M95.74291225962581 4.093168273438609 C95.64877653061971 4.45214860682191, 95.5546408016136 4.8111289402052115, 95.44381609355327 5.2337515837716015 M95.74291225962581 4.093168273438609 C95.6492672278135 4.450277365752498, 95.55562219600118 4.807386458066388, 95.44381609355327 5.2337515837716015 M95.44381609355327 5.2337515837716015 C95.3574636831435 5.493831285537648, 95.27111127273373 5.753910987303693, 95.0722570290325 6.35282828621069 M95.44381609355327 5.2337515837716015 C95.31309292128152 5.627468950745064, 95.18236974900978 6.021186317718527, 95.0722570290325 6.35282828621069 M95.0722570290325 6.35282828621069 C94.92478414705815 6.7170891558815375, 94.77731126508381 7.081350025552385, 94.62976188195883 7.445799854544345 M95.0722570290325 6.35282828621069 C94.90513658025984 6.765619025733235, 94.73801613148719 7.17840976525578, 94.62976188195883 7.445799854544345 M94.62976188195883 7.445799854544345 C94.45952642531736 7.7992974227156235, 94.28929096867589 8.152794990886903, 94.11814895980648 8.50817503415661 M94.62976188195883 7.445799854544345 C94.45637442405481 7.8058426207793215, 94.2829869661508 8.1658853870143, 94.11814895980648 8.50817503415661 M94.11814895980648 8.50817503415661 C93.92590823497811 8.849517907573638, 93.73366751014974 9.190860780990668, 93.53952058981318 9.53558829755571 M94.11814895980648 8.50817503415661 C93.9639756039629 8.78192543920205, 93.80980224811931 9.055675844247489, 93.53952058981318 9.53558829755571 M93.53952058981318 9.53558829755571 C93.3938521956765 9.759374068390434, 93.24818380153982 9.983159839225156, 92.89625448006666 10.523817783262873 M93.53952058981318 9.53558829755571 C93.39662419037596 9.755115540147274, 93.25372779093873 9.974642782738838, 92.89625448006666 10.523817783262873 M92.89625448006666 10.523817783262873 C92.64739022809687 10.85727320890263, 92.39852597612708 11.190728634542387, 92.190993948992 11.468802644346779 M92.89625448006666 10.523817783262873 C92.63107518379374 10.879133881937719, 92.36589588752081 11.234449980612567, 92.190993948992 11.468802644346779 M92.190993948992 11.468802644346779 C91.93495802550993 11.769557008925586, 91.67892210202785 12.070311373504394, 91.42663706338931 12.366659735314606 M92.190993948992 11.468802644346779 C91.89764768677685 11.813383855819877, 91.6043014245617 12.157965067292977, 91.42663706338931 12.366659735314606 M91.42663706338931 12.366659735314606 C91.17689146880004 12.62454256622267, 90.92714587421078 12.882425397130737, 90.60632472965554 13.213699568789837 M91.42663706338931 12.366659735314606 C91.11503951020086 12.688409791616564, 90.80344195701241 13.010159847918523, 90.60632472965554 13.213699568789837 M90.60632472965554 13.213699568789837 C90.31710795971004 13.476358586997936, 90.02789118976456 13.739017605206033, 89.73342778712649 14.006441476407232 M90.60632472965554 13.213699568789837 C90.28763188513588 13.503127978032, 89.96893904061622 13.792556387274164, 89.73342778712649 14.006441476407232 M89.73342778712649 14.006441476407232 C89.52143347518896 14.175501298771847, 89.30943916325143 14.34456112113646, 88.81153315657475 14.741627911625809 M89.73342778712649 14.006441476407232 C89.41513182599408 14.260274035199068, 89.09683586486169 14.514106593990904, 88.81153315657475 14.741627911625809 M88.81153315657475 14.741627911625809 C88.5007694251766 14.958403237904053, 88.19000569377845 15.175178564182296, 87.84442910078312 15.416237835686236 M88.81153315657475 14.741627911625809 C88.52327183643813 14.942706529921688, 88.23501051630151 15.143785148217567, 87.84442910078312 15.416237835686236 M87.84442910078312 15.416237835686236 C87.6224758983803 15.550787171324615, 87.4005226959775 15.685336506962994, 86.83608965775993 16.02749913170719 M87.84442910078312 15.416237835686236 C87.52650176741375 15.608967253523138, 87.20857443404438 15.80169667136004, 86.83608965775993 16.02749913170719 M86.83608965775993 16.02749913170719 C86.43700420769211 16.23570175538114, 86.03791875762431 16.443904379055088, 85.79065831056478 16.57289999590817 M86.83608965775993 16.02749913170719 C86.55768264684711 16.172743890972203, 86.27927563593431 16.31798865023722, 85.79065831056478 16.57289999590817 M85.79065831056478 16.57289999590817 C85.44816995216269 16.724509432616593, 85.1056815937606 16.876118869325015, 84.71243096084756 17.050199259150062 M85.79065831056478 16.57289999590817 C85.43071287564561 16.732237162544926, 85.07076744072644 16.891574329181683, 84.71243096084756 17.050199259150062 M84.71243096084756 17.050199259150062 C84.29968590271686 17.20209325591565, 83.88694084458616 17.35398725268124, 83.60583827606732 17.457435596379835 M84.71243096084756 17.050199259150062 C84.29452435729584 17.20399275234339, 83.87661775374411 17.35778624553672, 83.60583827606732 17.457435596379835 M83.60583827606732 17.457435596379835 C83.16855748953306 17.587218238489516, 82.73127670299878 17.717000880599198, 82.47542748292919 17.792935586135894 M83.60583827606732 17.457435596379835 C83.32081555229459 17.54202884468077, 83.03579282852188 17.62662209298171, 82.47542748292919 17.792935586135894 M82.47542748292919 17.792935586135894 C82.11999722511659 17.874060223082427, 81.76456696730399 17.955184860028965, 81.32584368185455 18.05532058699581 M82.47542748292919 17.792935586135894 C82.23809122764276 17.84710603764122, 82.00075497235633 17.90127648914654, 81.32584368185455 18.05532058699581 M81.32584368185455 18.05532058699581 C80.98711904500185 18.110082959433363, 80.64839440814913 18.164845331870914, 80.16181075926696 18.24351240270963 M81.32584368185455 18.05532058699581 C80.97859563797759 18.111460957781034, 80.63134759410063 18.16760132856626, 80.16181075926696 18.24351240270963 M80.16181075926696 18.24351240270963 C79.70955791985747 18.287140690213846, 79.257305080448 18.330768977718062, 78.9881119761296 18.356737712739584 M80.16181075926696 18.24351240270963 C79.82741934875965 18.275770739916762, 79.49302793825234 18.30802907712389, 78.9881119761296 18.356737712739584 M78.9881119761296 18.356737712739584 C78.6807139147646 18.36659537025353, 78.3733158533996 18.37645302776748, 77.8095703125 18.39453125 M78.9881119761296 18.356737712739584 C78.7327451572351 18.36492682958017, 78.4773783383406 18.37311594642076, 77.8095703125 18.39453125 M77.8095703125 18.39453125 C77.8095703125 18.39453125, 77.8095703125 18.39453125, 77.8095703125 18.39453125 M77.8095703125 18.39453125 C77.8095703125 18.39453125, 77.8095703125 18.39453125, 77.8095703125 18.39453125 M77.8095703125 18.39453125 C38.50653188607635 18.39453125, -0.7965065403472948 18.39453125, -77.8095703125 18.39453125 M77.8095703125 18.39453125 C32.85978136687837 18.39453125, -12.090007578743254 18.39453125, -77.8095703125 18.39453125 M-77.8095703125 18.39453125 C-78.09831536648781 18.385271758126763, -78.38706042047562 18.376012266253525, -78.98811197612959 18.356737712739584 M-77.8095703125 18.39453125 C-78.07886421574464 18.385895518671727, -78.34815811898929 18.377259787343455, -78.98811197612959 18.356737712739584 M-78.98811197612959 18.356737712739584 C-79.3439645060441 18.32240904715401, -79.69981703595863 18.28808038156844, -80.16181075926696 18.24351240270963 M-78.98811197612959 18.356737712739584 C-79.4061484760454 18.316410234355153, -79.82418497596122 18.276082755970723, -80.16181075926696 18.24351240270963 M-80.16181075926696 18.24351240270963 C-80.57534379643452 18.176655588256978, -80.98887683360209 18.109798773804325, -81.32584368185454 18.05532058699581 M-80.16181075926696 18.24351240270963 C-80.46972398473629 18.193731380318475, -80.77763721020563 18.14395035792732, -81.32584368185454 18.05532058699581 M-81.32584368185454 18.05532058699581 C-81.58761237538056 17.995573590898857, -81.84938106890658 17.93582659480191, -82.47542748292918 17.792935586135897 M-81.32584368185454 18.05532058699581 C-81.55996907028232 18.001882994898107, -81.79409445871009 17.94844540280041, -82.47542748292918 17.792935586135897 M-82.47542748292918 17.792935586135897 C-82.7458151442397 17.71268594755273, -83.01620280555024 17.63243630896956, -83.60583827606729 17.45743559637984 M-82.47542748292918 17.792935586135897 C-82.82138988429995 17.690255761402753, -83.16735228567073 17.58757593666961, -83.60583827606729 17.45743559637984 M-83.60583827606729 17.45743559637984 C-83.83893981995833 17.37165207346089, -84.07204136384937 17.285868550541934, -84.71243096084756 17.050199259150062 M-83.60583827606729 17.45743559637984 C-84.02579221508839 17.30288866480842, -84.4457461541095 17.148341733236997, -84.71243096084756 17.050199259150062 M-84.71243096084756 17.050199259150062 C-85.13111104879611 16.864862003918773, -85.54979113674466 16.679524748687488, -85.79065831056477 16.572899995908173 M-84.71243096084756 17.050199259150062 C-85.03383423169366 16.907923565235777, -85.35523750253977 16.76564787132149, -85.79065831056477 16.572899995908173 M-85.79065831056477 16.572899995908173 C-86.0524452221054 16.436325931839946, -86.31423213364603 16.299751867771718, -86.83608965775993 16.027499131707195 M-85.79065831056477 16.572899995908173 C-86.01559354451712 16.455551428433125, -86.24052877846947 16.338202860958077, -86.83608965775993 16.027499131707195 M-86.83608965775993 16.027499131707195 C-87.14944397733959 15.837541901703624, -87.46279829691925 15.647584671700052, -87.84442910078309 15.416237835686248 M-86.83608965775993 16.027499131707195 C-87.17696947775126 15.820855781596277, -87.51784929774257 15.61421243148536, -87.84442910078309 15.416237835686248 M-87.84442910078309 15.416237835686248 C-88.14116480442149 15.209247854309673, -88.43790050805991 15.0022578729331, -88.81153315657475 14.741627911625814 M-87.84442910078309 15.416237835686248 C-88.06747943615353 15.260647577425223, -88.29052977152398 15.105057319164198, -88.81153315657475 14.741627911625814 M-88.81153315657475 14.741627911625814 C-88.99826643307729 14.592713092796215, -89.18499970957984 14.443798273966616, -89.73342778712646 14.006441476407247 M-88.81153315657475 14.741627911625814 C-89.13047720197845 14.487278522873863, -89.44942124738215 14.23292913412191, -89.73342778712646 14.006441476407247 M-89.73342778712646 14.006441476407247 C-89.97003401984641 13.791561956108849, -90.20664025256637 13.57668243581045, -90.60632472965553 13.213699568789847 M-89.73342778712646 14.006441476407247 C-89.95352767050062 13.806552585850632, -90.17362755387477 13.606663695294017, -90.60632472965553 13.213699568789847 M-90.60632472965553 13.213699568789847 C-90.89320716769399 12.917469898028948, -91.18008960573243 12.621240227268046, -91.42663706338931 12.366659735314613 M-90.60632472965553 13.213699568789847 C-90.90300763805742 12.907350107745128, -91.1996905464593 12.601000646700408, -91.42663706338931 12.366659735314613 M-91.42663706338931 12.366659735314613 C-91.63821658721488 12.11812638741313, -91.84979611104046 11.869593039511646, -92.190993948992 11.468802644346786 M-91.42663706338931 12.366659735314613 C-91.69282472511611 12.053980561343268, -91.95901238684293 11.741301387371923, -92.190993948992 11.468802644346786 M-92.190993948992 11.468802644346786 C-92.44738261061106 11.125265195264824, -92.70377127223013 10.781727746182863, -92.89625448006666 10.523817783262885 M-92.190993948992 11.468802644346786 C-92.46942486180099 11.095730586760727, -92.74785577460996 10.722658529174666, -92.89625448006666 10.523817783262885 M-92.89625448006666 10.523817783262885 C-93.05304696889705 10.282942415740933, -93.20983945772745 10.042067048218982, -93.53952058981318 9.535588297555725 M-92.89625448006666 10.523817783262885 C-93.0629052241944 10.267797488292022, -93.22955596832212 10.011777193321159, -93.53952058981318 9.535588297555725 M-93.53952058981318 9.535588297555725 C-93.76442613544035 9.136245727138649, -93.98933168106751 8.736903156721572, -94.11814895980648 8.508175034156617 M-93.53952058981318 9.535588297555725 C-93.71460787855901 9.224703086877005, -93.88969516730484 8.913817876198285, -94.11814895980648 8.508175034156617 M-94.11814895980648 8.508175034156617 C-94.29624810618593 8.138348345988403, -94.4743472525654 7.768521657820187, -94.62976188195883 7.445799854544352 M-94.11814895980648 8.508175034156617 C-94.22807631393778 8.27990853123437, -94.33800366806909 8.051642028312122, -94.62976188195883 7.445799854544352 M-94.62976188195883 7.445799854544352 C-94.72136849445104 7.219529750595214, -94.81297510694326 6.993259646646076, -95.0722570290325 6.352828286210705 M-94.62976188195883 7.445799854544352 C-94.73162413979522 7.194198108315711, -94.83348639763159 6.9425963620870705, -95.0722570290325 6.352828286210705 M-95.0722570290325 6.352828286210705 C-95.21351381516503 5.927385352591986, -95.35477060129757 5.501942418973268, -95.44381609355327 5.233751583771609 M-95.0722570290325 6.352828286210705 C-95.21146646016985 5.933551659635798, -95.35067589130718 5.514275033060892, -95.44381609355327 5.233751583771609 M-95.44381609355327 5.233751583771609 C-95.52778518411108 4.913541049040616, -95.61175427466888 4.593330514309624, -95.74291225962581 4.093168273438616 M-95.44381609355327 5.233751583771609 C-95.52250566547617 4.933674141753356, -95.60119523739908 4.633596699735103, -95.74291225962581 4.093168273438616 M-95.74291225962581 4.093168273438616 C-95.82360001944244 3.6788536801443166, -95.90428777925906 3.264539086850017, -95.96831647694783 2.9357652566882226 M-95.74291225962581 4.093168273438616 C-95.8007381456717 3.796244570098309, -95.85856403171759 3.4993208667580022, -95.96831647694783 2.9357652566882226 M-95.96831647694783 2.9357652566882226 C-96.02816669847233 2.471578757307204, -96.08801691999685 2.0073922579261856, -96.11910251124131 1.7662985507784255 M-95.96831647694783 2.9357652566882226 C-96.00156951530673 2.6778612577317604, -96.03482255366563 2.419957258775298, -96.11910251124131 1.7662985507784255 M-96.11910251124131 1.7662985507784255 C-96.13929777131106 1.451741073871487, -96.1594930313808 1.1371835969645487, -96.1946507503478 0.5895737452536124 M-96.11910251124131 1.7662985507784255 C-96.14676302836588 1.3354636693956738, -96.17442354549044 0.9046287880129221, -96.1946507503478 0.5895737452536124 M-96.1946507503478 0.5895737452536124 C-96.1946507503478 0.3128040993612352, -96.1946507503478 0.03603445346885803, -96.1946507503478 -0.5895737452536034 M-96.1946507503478 0.5895737452536124 C-96.1946507503478 0.2941510403399914, -96.1946507503478 -0.001271664573629594, -96.1946507503478 -0.5895737452536034 M-96.1946507503478 -0.5895737452536034 C-96.17621793592178 -0.8766797086389613, -96.15778512149576 -1.1637856720243192, -96.11910251124131 -1.7662985507784004 M-96.1946507503478 -0.5895737452536034 C-96.16874491093039 -0.9930781049972397, -96.14283907151295 -1.396582464740876, -96.11910251124131 -1.7662985507784004 M-96.11910251124131 -1.7662985507784004 C-96.08594900135822 -2.0234306265306823, -96.05279549147511 -2.2805627022829644, -95.96831647694783 -2.935765256688214 M-96.11910251124131 -1.7662985507784004 C-96.07265883179548 -2.1265065572183444, -96.02621515234966 -2.486714563658288, -95.96831647694783 -2.935765256688214 M-95.96831647694783 -2.935765256688214 C-95.90564297604982 -3.2575804377503976, -95.84296947515182 -3.5793956188125806, -95.74291225962581 -4.093168273438607 M-95.96831647694783 -2.935765256688214 C-95.89389551589753 -3.3179011628058546, -95.81947455484722 -3.7000370689234945, -95.74291225962581 -4.093168273438607 M-95.74291225962581 -4.093168273438607 C-95.63349948528804 -4.510406601784863, -95.52408671095029 -4.92764493013112, -95.44381609355327 -5.2337515837716 M-95.74291225962581 -4.093168273438607 C-95.66000169083532 -4.409342205904583, -95.57709112204482 -4.725516138370558, -95.44381609355327 -5.2337515837716 M-95.44381609355327 -5.2337515837716 C-95.3594677335852 -5.487795404909315, -95.27511937361713 -5.741839226047031, -95.07225702903251 -6.3528282862106815 M-95.44381609355327 -5.2337515837716 C-95.33021784447816 -5.575891410562801, -95.21661959540305 -5.918031237354002, -95.07225702903251 -6.3528282862106815 M-95.07225702903251 -6.3528282862106815 C-94.96776113929103 -6.61093515416273, -94.86326524954954 -6.869042022114778, -94.62976188195883 -7.445799854544344 M-95.07225702903251 -6.3528282862106815 C-94.97791204201877 -6.585862228170862, -94.88356705500503 -6.818896170131043, -94.62976188195883 -7.445799854544344 M-94.62976188195883 -7.445799854544344 C-94.44827455837257 -7.822662165177842, -94.26678723478632 -8.19952447581134, -94.11814895980648 -8.508175034156608 M-94.62976188195883 -7.445799854544344 C-94.5123908467643 -7.689523320463605, -94.3950198115698 -7.933246786382866, -94.11814895980648 -8.508175034156608 M-94.11814895980648 -8.508175034156608 C-93.91730770977404 -8.864789010971084, -93.7164664597416 -9.221402987785558, -93.53952058981318 -9.535588297555718 M-94.11814895980648 -8.508175034156608 C-93.88998495812287 -8.91330332325636, -93.66182095643924 -9.31843161235611, -93.53952058981318 -9.535588297555718 M-93.53952058981318 -9.535588297555718 C-93.33096648350568 -9.855983409462974, -93.12241237719817 -10.176378521370228, -92.89625448006666 -10.523817783262878 M-93.53952058981318 -9.535588297555718 C-93.40262041317793 -9.745903731712175, -93.26572023654268 -9.956219165868633, -92.89625448006666 -10.523817783262878 M-92.89625448006666 -10.523817783262878 C-92.63126493582018 -10.87887963150905, -92.36627539157371 -11.233941479755224, -92.190993948992 -11.468802644346779 M-92.89625448006666 -10.523817783262878 C-92.73974477652283 -10.733526527684301, -92.583235072979 -10.943235272105722, -92.190993948992 -11.468802644346779 M-92.190993948992 -11.468802644346779 C-92.00778930481317 -11.684005244038806, -91.82458466063434 -11.899207843730833, -91.42663706338931 -12.366659735314604 M-92.190993948992 -11.468802644346779 C-91.88774508653704 -11.825016013535482, -91.58449622408206 -12.181229382724187, -91.42663706338931 -12.366659735314604 M-91.42663706338931 -12.366659735314604 C-91.13924919049917 -12.663411309056833, -90.85186131760905 -12.960162882799063, -90.60632472965554 -13.213699568789831 M-91.42663706338931 -12.366659735314604 C-91.1552581010773 -12.646880794528927, -90.88387913876528 -12.92710185374325, -90.60632472965554 -13.213699568789831 M-90.60632472965554 -13.213699568789831 C-90.36553830003031 -13.432375433315656, -90.12475187040508 -13.65105129784148, -89.73342778712649 -14.00644147640723 M-90.60632472965554 -13.213699568789831 C-90.4053135112237 -13.396252638904242, -90.20430229279185 -13.578805709018651, -89.73342778712649 -14.00644147640723 M-89.73342778712649 -14.00644147640723 C-89.47159793329148 -14.215243817255619, -89.20976807945647 -14.424046158104007, -88.81153315657475 -14.741627911625807 M-89.73342778712649 -14.00644147640723 C-89.51995146392645 -14.176683163315722, -89.3064751407264 -14.346924850224212, -88.81153315657475 -14.741627911625807 M-88.81153315657475 -14.741627911625807 C-88.49490981836463 -14.962490645957791, -88.1782864801545 -15.183353380289775, -87.84442910078312 -15.416237835686234 M-88.81153315657475 -14.741627911625807 C-88.4691798172124 -14.98043878092778, -88.12682647785006 -15.219249650229754, -87.84442910078312 -15.416237835686234 M-87.84442910078312 -15.416237835686234 C-87.46887181731366 -15.643902867944998, -87.09331453384418 -15.871567900203763, -86.83608965775994 -16.027499131707188 M-87.84442910078312 -15.416237835686234 C-87.64263336698066 -15.538567595400645, -87.4408376331782 -15.660897355115056, -86.83608965775994 -16.027499131707188 M-86.83608965775994 -16.027499131707188 C-86.44481099533256 -16.23162895926961, -86.05353233290516 -16.435758786832036, -85.79065831056478 -16.57289999590817 M-86.83608965775994 -16.027499131707188 C-86.60875456260183 -16.146099705236093, -86.38141946744373 -16.264700278765, -85.79065831056478 -16.57289999590817 M-85.79065831056478 -16.57289999590817 C-85.53480666350164 -16.686157930493565, -85.27895501643852 -16.79941586507896, -84.71243096084756 -17.05019925915006 M-85.79065831056478 -16.57289999590817 C-85.41765509584141 -16.73801745431897, -85.04465188111803 -16.903134912729772, -84.71243096084756 -17.05019925915006 M-84.71243096084756 -17.05019925915006 C-84.4067303789837 -17.16269989914116, -84.10102979711985 -17.27520053913226, -83.60583827606732 -17.457435596379835 M-84.71243096084756 -17.05019925915006 C-84.28970026666221 -17.205768062289966, -83.86696957247688 -17.361336865429873, -83.60583827606732 -17.457435596379835 M-83.60583827606732 -17.457435596379835 C-83.26814645446584 -17.55766075645061, -82.93045463286437 -17.657885916521384, -82.4754274829292 -17.79293558613589 M-83.60583827606732 -17.457435596379835 C-83.30817587665943 -17.545780234062274, -83.01051347725156 -17.634124871744714, -82.4754274829292 -17.79293558613589 M-82.4754274829292 -17.79293558613589 C-82.0415791045944 -17.89195864736556, -81.60773072625959 -17.990981708595232, -81.32584368185455 -18.05532058699581 M-82.4754274829292 -17.79293558613589 C-82.09845658043078 -17.87897673466612, -81.72148567793235 -17.965017883196357, -81.32584368185455 -18.05532058699581 M-81.32584368185455 -18.05532058699581 C-80.93027249751445 -18.119273468379564, -80.53470131317434 -18.18322634976332, -80.16181075926696 -18.24351240270963 M-81.32584368185455 -18.05532058699581 C-80.89666840748602 -18.12470631705175, -80.46749313311749 -18.19409204710769, -80.16181075926696 -18.24351240270963 M-80.16181075926696 -18.24351240270963 C-79.7370718402791 -18.2844864554011, -79.31233292129126 -18.325460508092576, -78.9881119761296 -18.356737712739584 M-80.16181075926696 -18.24351240270963 C-79.71752417821475 -18.286372194850948, -79.27323759716252 -18.329231986992266, -78.9881119761296 -18.356737712739584 M-78.9881119761296 -18.356737712739584 C-78.59930076659559 -18.36920613145423, -78.21048955706158 -18.381674550168878, -77.8095703125 -18.39453125 M-78.9881119761296 -18.356737712739584 C-78.65177322466887 -18.367523441855266, -78.31543447320814 -18.378309170970947, -77.8095703125 -18.39453125 M-77.8095703125 -18.39453125 C-77.8095703125 -18.39453125, -77.8095703125 -18.39453125, -77.8095703125 -18.39453125 M-77.8095703125 -18.39453125 C-77.8095703125 -18.39453125, -77.8095703125 -18.39453125, -77.8095703125 -18.39453125&quot; stroke=&quot;#db5461&quot; stroke-width=&quot;1.3&quot; fill=&quot;none&quot; stroke-dasharray=&quot;0 0&quot; style=&quot;&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Checkout&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; requirement&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-16-flowchart-Q1-2&quot; data-look=&quot;classic&quot; transform=&quot;translate(340.53671875, 200.90546875)&quot;&gt;&lt;polygon points=&quot;106.11640625,0 212.2328125,-106.11640625 106.11640625,-212.2328125 0,-106.11640625&quot; class=&quot;label-container&quot; transform=&quot;translate(-105.61640625, 106.11640625)&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Does&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; the&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; job&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; change&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;how&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; checkout&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; works?&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-16-flowchart-FUNC-4&quot; data-look=&quot;classic&quot; transform=&quot;translate(595.659375, 500.02890625000003)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-92.2265625&quot; y=&quot;-26.44453125&quot; width=&quot;184.453125&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Shopify&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Function&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Backend&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; logic&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-16-flowchart-Q2-6&quot; data-look=&quot;classic&quot; transform=&quot;translate(204.58398437499994, 500.02890625000003)&quot;&gt;&lt;polygon points=&quot;117.21796875,0 234.4359375,-117.21796875 117.21796875,-234.4359375 0,-117.21796875&quot; class=&quot;label-container&quot; transform=&quot;translate(-116.71796875, 117.21796875)&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Does&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; the&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; job&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; show&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;something&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; to&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; the&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; buyer?&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-16-flowchart-EXT-8&quot; data-look=&quot;classic&quot; transform=&quot;translate(85.41406249999994, 804.015625)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-77.4140625&quot; y=&quot;-26.44453125&quot; width=&quot;154.828125&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;UI&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Extension&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Display&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; layer&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-16-flowchart-NEITHER-10&quot; data-look=&quot;classic&quot; transform=&quot;translate(323.75390624999994, 804.015625)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-110.92578125&quot; y=&quot;-26.44453125&quot; width=&quot;221.8515625&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;May&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; not&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; need&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; custom&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;build&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-16-flowchart-BOTH-12&quot; data-look=&quot;classic&quot; transform=&quot;translate(595.659375, 804.015625)&quot;&gt;&lt;polygon points=&quot;110.9796875,0 221.959375,-110.9796875 110.9796875,-221.959375 0,-110.9796875&quot; class=&quot;label-container&quot; transform=&quot;translate(-110.4796875, 110.9796875)&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Does&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; the&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; buyer&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;need&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; to&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; see&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; the&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; result?&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-16-flowchart-PAIR-14&quot; data-look=&quot;classic&quot; transform=&quot;translate(476.78632812499995, 1017.22890625)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-107.5234375&quot; y=&quot;-26.44453125&quot; width=&quot;215.046875&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Function&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; +&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Extension&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;paired&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; build&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-16-flowchart-FUNC_ONLY-16&quot; data-look=&quot;classic&quot; transform=&quot;translate(714.532421875, 1017.22890625)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-80.22265625&quot; y=&quot;-25.89453125&quot; width=&quot;160.4453125&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Function&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; only&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-16-drop-shadow&quot; height=&quot;130%&quot; width=&quot;130%&quot;&gt;&lt;fedropshadow dx=&quot;4&quot; dy=&quot;4&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-16-drop-shadow-small&quot; height=&quot;150%&quot; width=&quot;150%&quot;&gt;&lt;fedropshadow dx=&quot;2&quot; dy=&quot;2&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;linearGradient id=&quot;epmb-16-gradient&quot; gradientUnits=&quot;objectBoundingBox&quot; x1=&quot;0%&quot; y1=&quot;0%&quot; x2=&quot;100%&quot; y2=&quot;0%&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#db5461&quot; stop-opacity=&quot;1&quot;/&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;hsl(0, 0%, 20.1960784314%)&quot; stop-opacity=&quot;1&quot;/&gt;&lt;/linearGradient&gt;&lt;text text-anchor=&quot;middle&quot; x=&quot;407.4888671875&quot; y=&quot;-25&quot; class=&quot;flowchartTitleText&quot;&gt;Checkout extensibility split&lt;/text&gt;&lt;/svg&gt;
  &lt;/div&gt;
  
  &lt;figcaption class=&quot;epmb-figure__caption&quot; id=&quot;epmb-16-caption&quot;&gt;Checkout extensibility split&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h2&gt;Checkout UI Extensions: what they do&lt;/h2&gt;&lt;p&gt;UI Extensions are Preact or vanilla JS components that render inside Shopify&#39;s hosted checkout. They cannot access the network freely, cannot run arbitrary DOM manipulation, and are sandboxed for security. What they can do:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Render components at &lt;strong&gt;defined targets&lt;/strong&gt;: after contact fields, around shipping options, in the order summary, in the header or footer, and as merchant-positionable blocks.&lt;/li&gt;&lt;li&gt;Read checkout state: cart lines, buyer identity, delivery address, selected shipping method, applied discounts.&lt;/li&gt;&lt;li&gt;Write to checkout state via approved APIs: attributes, metafields, selected options.&lt;/li&gt;&lt;li&gt;Present inputs: text fields, checkboxes, selects, consent collection.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Common UI Extension jobs&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Job&lt;/th&gt;&lt;th&gt;Extension target&lt;/th&gt;&lt;th&gt;What the Extension does&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Gift message field&lt;/td&gt;&lt;td&gt;&lt;code&gt;purchase.checkout.block.render&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Renders a text area; writes to cart attributes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Trust badges&lt;/td&gt;&lt;td&gt;&lt;code&gt;purchase.checkout.cart-line-list.render-after&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Displays payment icons and guarantee copy&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Age verification&lt;/td&gt;&lt;td&gt;&lt;code&gt;purchase.checkout.contact.render-after&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Presents a checkbox; blocks proceed until checked&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Delivery instructions&lt;/td&gt;&lt;td&gt;&lt;code&gt;purchase.checkout.delivery-address.render-after&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Renders a field for driver notes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Upsell banner&lt;/td&gt;&lt;td&gt;&lt;code&gt;purchase.checkout.reductions.render-before&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Shows a product recommendation with add button&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Shipping option explainer&lt;/td&gt;&lt;td&gt;&lt;code&gt;purchase.checkout.shipping-option-item.details.render&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Adds detail text under each shipping method&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;UI Extensions handle display work: they show information, collect input, and present options. Discount calculations, payment filtering, and cart validation belong in Functions because those jobs change checkout rules rather than render content.&lt;/p&gt;&lt;h2&gt;Shopify Functions: what they do&lt;/h2&gt;&lt;p&gt;Functions are Rust or JavaScript modules that run on Shopify&#39;s backend. They are pure: no network access, no file system, no current time. All data comes via a GraphQL input query; all output is a structured JSON result.&lt;/p&gt;&lt;p&gt;Functions modify checkout behaviour:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Discount Functions&lt;/strong&gt; compute product, order, or shipping discounts and return the discount operations to apply.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Cart Transform Functions&lt;/strong&gt; expand or modify cart lines: bundle expansion, gift-with-purchase, subscription upgrades.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Validation Functions&lt;/strong&gt; accept or reject the cart at checkout, with an error message if rejected.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Delivery Customisation Functions&lt;/strong&gt; sort, rename, or hide shipping options based on cart contents or buyer location.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Payment Customisation Functions&lt;/strong&gt; sort, rename, or hide payment methods.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fulfillment Constraints Functions&lt;/strong&gt; control how orders route to fulfillment locations.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Common Function jobs&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Job&lt;/th&gt;&lt;th&gt;Function API&lt;/th&gt;&lt;th&gt;What the Function does&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Tiered volume discount&lt;/td&gt;&lt;td&gt;Discount&lt;/td&gt;&lt;td&gt;Returns discount operations when cart total exceeds thresholds&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Hide COD for high-value orders&lt;/td&gt;&lt;td&gt;Payment Customisation&lt;/td&gt;&lt;td&gt;Removes cash-on-delivery when cart exceeds £500&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Block checkout for restricted products&lt;/td&gt;&lt;td&gt;Validation&lt;/td&gt;&lt;td&gt;Rejects cart with an error if product requires age verification&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Auto-add free gift&lt;/td&gt;&lt;td&gt;Cart Transform&lt;/td&gt;&lt;td&gt;Adds a gift line when cart qualifies&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Sort shipping by delivery speed&lt;/td&gt;&lt;td&gt;Delivery Customisation&lt;/td&gt;&lt;td&gt;Reorders shipping options fastest-first&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Regional payment filtering&lt;/td&gt;&lt;td&gt;Payment Customisation&lt;/td&gt;&lt;td&gt;Hides Klarna for buyers outside supported countries&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Functions handle backend logic exclusively, with no rendering capability. When the buyer needs to see why a payment method is hidden or how close they are to a discount threshold, a paired UI Extension handles that display layer.&lt;/p&gt;&lt;h2&gt;Criteria that actually matter&lt;/h2&gt;&lt;p&gt;Before scoping, answer these questions:&lt;/p&gt;&lt;h3&gt;1. Does the job change checkout rules?&lt;/h3&gt;&lt;p&gt;If yes, the job needs a Function. Discounts, validation, cart modification, delivery filtering, and payment filtering all live in Functions.&lt;/p&gt;&lt;h3&gt;2. Does the job display something to the buyer?&lt;/h3&gt;&lt;p&gt;If yes, the job needs a UI Extension. Banners, fields, badges, consent checkboxes, and promotional messages are Extension work.&lt;/p&gt;&lt;h3&gt;3. Does the buyer need to see the result of a rule change?&lt;/h3&gt;&lt;p&gt;If a Function does something invisible (hide a payment method, auto-apply a discount), and the buyer should understand why, a paired Extension explains it. The Function does the logic; the Extension shows the logic.&lt;/p&gt;&lt;h3&gt;4. Does an app already solve this?&lt;/h3&gt;&lt;p&gt;Many common jobs (upsells, trust badges, tiered discounts) have App Store solutions that package Extensions and Functions already. Check before building custom. If an app fits, it is faster and cheaper. Custom development is for business-specific logic that apps cannot configure.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Requirement type&lt;/th&gt;&lt;th&gt;UI Extension&lt;/th&gt;&lt;th&gt;Function&lt;/th&gt;&lt;th&gt;Both&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Collect gift message&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Add gift-wrap fee&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Collect gift message and add fee&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Show trust badges&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tiered discount based on cart total&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tiered discount with progress bar&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Block checkout for age-restricted items&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Age verification with checkbox&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Hide payment method for certain products&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Explain why payment method is hidden&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Delivery date selector&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Filter delivery options by postcode&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Framework for scoping checkout projects&lt;/h2&gt;&lt;p&gt;Use this sequence when a merchant briefs a checkout requirement:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Name the job in buyer terms.&lt;/strong&gt; What does the buyer do or see differently at checkout?&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Split display from logic.&lt;/strong&gt; If the answer has &amp;quot;show&amp;quot; or &amp;quot;collect&amp;quot;, that is Extension work. If the answer has &amp;quot;calculate&amp;quot;, &amp;quot;filter&amp;quot;, &amp;quot;add&amp;quot;, &amp;quot;block&amp;quot;, or &amp;quot;sort&amp;quot;, that is Function work.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Check whether display depends on logic.&lt;/strong&gt; If the Extension needs to show the outcome of a rule (discount amount, validation status), the build is paired.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Search the App Store.&lt;/strong&gt; If an app handles the job, quote the app first. Custom build if the app cannot configure the business-specific requirement.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Map to extension points.&lt;/strong&gt; For UI work, identify the render target. For Function work, identify the API (Discount, Validation, Cart Transform, etc.).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scope the data contract.&lt;/strong&gt; If paired, define how the Extension reads the Function output. Usually via cart attributes, metafields, or checkout state that the Function populates.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;Recommendation by scenario&lt;/h2&gt;&lt;h3&gt;Scenario A: Display only&lt;/h3&gt;&lt;p&gt;The job is to show something at checkout without changing checkout behaviour. Examples: trust badges, delivery estimates, brand messaging, field to collect a note.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Build:&lt;/strong&gt; UI Extension only. Pick the render target closest to where the buyer needs the information. Store collected input in cart attributes or metafields.&lt;/p&gt;&lt;h3&gt;Scenario B: Logic only&lt;/h3&gt;&lt;p&gt;The job is to change checkout behaviour invisibly. Examples: auto-apply a discount, hide a payment method, block checkout for out-of-stock bundles.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Build:&lt;/strong&gt; Function only. Define the input query, implement the logic in Rust or JS, return the structured output. No display component.&lt;/p&gt;&lt;h3&gt;Scenario C: Logic with display&lt;/h3&gt;&lt;p&gt;The job is to change checkout behaviour and communicate the change to the buyer. Examples: tiered discount with progress bar, age verification with checkbox, hidden payment method with explanation.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Build:&lt;/strong&gt; Function and UI Extension as a paired build. The Function handles logic; the Extension reads checkout state (including Function output where visible) and renders the display. Define the data contract between the two.&lt;/p&gt;&lt;h3&gt;Scenario D: App handles it&lt;/h3&gt;&lt;p&gt;The job is common enough that an App Store app packages the Extension, Function, or both. Examples: standard upsell modules, Klaviyo checkout fields, ReCharge subscription upgrades.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Build:&lt;/strong&gt; Configure the app. Reserve custom development for requirements the app cannot meet. Apps are faster to deploy and maintained by the vendor.&lt;/p&gt;&lt;h2&gt;Technical constraints worth knowing&lt;/h2&gt;&lt;p&gt;Before promising a checkout build, verify:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Plus is active.&lt;/strong&gt; Checkout UI Extensions and checkout-specific Functions require Shopify Plus. Standard plans do not have checkout extensibility.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Target availability.&lt;/strong&gt; Not all render targets are available on all checkout surfaces. Shop Pay and Thank You pages have different target lists than the main checkout flow.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Function purity.&lt;/strong&gt; Functions cannot call external APIs at runtime. All data must come via the input query. If the logic depends on external state (inventory in an ERP, loyalty points in a CRM), that data must sync to Shopify metafields before checkout.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Component limits.&lt;/strong&gt; UI Extensions use Shopify&#39;s Polaris component library. Custom HTML or third-party JS libraries are not supported. If the design requires unsupported UI, the spec needs adjustment.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Deployment coupling.&lt;/strong&gt; Extensions and Functions deploy together as part of a Shopify app. Versioning, testing, and rollback affect both. Plan for coordinated releases if the build is paired.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For a breakdown of how these constraints fit into broader stack architecture, see &lt;a href=&quot;https://ocontis.studio/blog/post/the-anatomy-of-a-high-performance-shopify-theme/&quot;&gt;&lt;em&gt;The Anatomy of a High-Performance Shopify Theme&lt;/em&gt;&lt;/a&gt;. If the project involves migrating checkout customisations from another platform, migration blueprints cover data and logic porting: &lt;a href=&quot;https://ocontis.studio/blog/post/migrating-from-magento-to-shopify/&quot;&gt;Magento to Shopify&lt;/a&gt;, &lt;a href=&quot;https://ocontis.studio/blog/post/migrating-from-woocommerce-to-shopify/&quot;&gt;WooCommerce to Shopify&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;When to get help&lt;/h2&gt;&lt;p&gt;Checkout extensibility is mature, but the build surface is not trivial. Consider specialist help when:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The requirement spans multiple Function APIs and multiple Extension targets.&lt;/li&gt;&lt;li&gt;The logic depends on external data that needs a sync pipeline before checkout.&lt;/li&gt;&lt;li&gt;The existing theme or app stack has legacy checkout scripts that need migration.&lt;/li&gt;&lt;li&gt;The build is paired and the data contract between Function and Extension is unclear.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;A structured stack review identifies which checkout jobs are standard, which need custom build, and which need architectural prep before extensibility work starts. See &lt;a href=&quot;https://ocontis.studio/services/shopify-ui-extensions-and-functions/&quot;&gt;Shopify UI Extensions and Functions services&lt;/a&gt; for how we scope these projects, or &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;book a stack assessment&lt;/a&gt; to map your checkout roadmap.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Shopify Plus checkout extensibility spans two surfaces: UI Extensions for display and Functions for logic. Most checkout requirements touch one or the other; many touch both.&lt;/p&gt;&lt;p&gt;Before scoping, split the job: what changes checkout rules, and what shows information to the buyer? Match each part to the right extension point. Check the App Store before building custom. If the build is paired, define the data contract between Function and Extension early.&lt;/p&gt;&lt;p&gt;The right split prevents spec drift, keeps builds maintainable, and ensures the buyer sees a coherent checkout experience without invisible logic doing one thing and visible UI doing another.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Why Shopify Contribution Margin Breaks When Stack, PDP, and Ads Don&#39;t Align</title>
    <link href="https://ocontis.studio/blog/post/why-shopify-contribution-margin-breaks-when-stack-pdp-and-ads-dont-align/" />
    <updated>2026-09-09T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/why-shopify-contribution-margin-breaks-when-stack-pdp-and-ads-dont-align/</id>
    <content type="html">&lt;h1&gt;Why Shopify Contribution Margin Breaks When Stack, PDP, and Ads Don&#39;t Align&lt;/h1&gt;&lt;p&gt;Export last week’s paid orders from Shopify. Sit them next to the ad platform’s revenue number for the same dates. If finance cannot get from one file to the other without a side spreadsheet, you do not have a shared commercial number. You have two departments reporting success on different maths.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Contribution margin&lt;/strong&gt; is the number that should sit in both files: what remains on an order after every cost that moves with volume. When marketing, ecommerce, and operations never put that number on the same page, each team can hit its own target while the business funds unprofitable growth.&lt;/p&gt;&lt;p&gt;This article is the operating model: a worksheet, a weekly review, and a rule for what to change. How ROAS is calculated already lives in &lt;a href=&quot;https://ocontis.studio/blog/post/why-your-shopify-store-can-hit-4x-roas-and-still-lose-money/&quot;&gt;&lt;em&gt;Why Your Shopify Store Can Hit 4x ROAS and Still Lose Money&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;Shopify makes ad efficiency easy to screenshot and contribution hard to see. The platform will not join COGS, shipping, refunds, and fees to a campaign ID for you. Someone in the business has to own that join, or each team will keep optimising the metric they can export in one click.&lt;/p&gt;&lt;p&gt;Use this piece when the dashboards look fine and cash does not. Use &lt;a href=&quot;https://ocontis.studio/blog/post/the-real-cost-of-running-a-shopify-store/&quot;&gt;&lt;em&gt;The Real Cost of Running a Shopify Store&lt;/em&gt;&lt;/a&gt; for plan fees and app invoices. Use &lt;a href=&quot;https://ocontis.studio/blog/post/why-most-shopify-stores-dont-scale-past-50k-month/&quot;&gt;&lt;em&gt;What Should I Do If My Shopify Revenue Is Plateauing?&lt;/em&gt;&lt;/a&gt; when revenue is flat and you need a constraint sequence. Here the job is narrower: &lt;strong&gt;one order-level number, three seats at the same table&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Bring last week’s ad export and last week’s Shopify order CSV to the first session. If those two files cannot be joined on date and order name without a third mystery sheet, start there. The worksheet is the join, written down, so both teams can point at the same row in the same week instead of arguing from two exports.&lt;/p&gt;&lt;p&gt;Stress-test the inputs in the &lt;a href=&quot;https://ocontis.studio/tools/unit-economics-simulator/&quot;&gt;Unit Economics Simulator&lt;/a&gt; once the worksheet exists. If you need help standing the review up, &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;book a discovery call&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;The number both teams can see&lt;/h2&gt;&lt;p&gt;ROAS answers how much attributed revenue you bought per pound of media. Contribution margin answers how much of an order is left after variable costs. Both can be true on the same Tuesday.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Object&lt;/th&gt;&lt;th&gt;Who already sees it&lt;/th&gt;&lt;th&gt;What it cannot tell you&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Campaign ROAS&lt;/td&gt;&lt;td&gt;Media buyer, ad platform&lt;/td&gt;&lt;td&gt;COGS, shipping, refunds, fees on those orders&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Store conversion rate&lt;/td&gt;&lt;td&gt;Ecommerce, Shopify analytics&lt;/td&gt;&lt;td&gt;Whether the order was discounted into a loss&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Payout / P&amp;amp;L&lt;/td&gt;&lt;td&gt;Finance, monthly&lt;/td&gt;&lt;td&gt;Which campaign or SKU caused this week’s hole&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Contribution per order&lt;/td&gt;&lt;td&gt;Nobody, until you build it&lt;/td&gt;&lt;td&gt;Nothing useful if the inputs are guessed&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;The gap starts with incentives. Marketing is paid to hit ROAS. Ecommerce is paid to hit conversion. Ops is paid to ship. Finance sees the remainder a month later. Without a shared worksheet, the only person who notices the collision is the person who does the VAT return.&lt;/p&gt;&lt;figure class=&quot;blog-diagram epmb-figure&quot; role=&quot;figure&quot; aria-labelledby=&quot;epmb-15-caption&quot; data-diagram-id=&quot;epmb-15&quot;&gt;
  &lt;p class=&quot;epmb-figure__summary visually-hidden&quot; id=&quot;epmb-15-summary&quot;&gt;Weekly contribution review&lt;/p&gt;
  &lt;div class=&quot;epmb-figure__brand epmb-figure__brand--top-right&quot;&gt;
  &lt;img class=&quot;epmb-figure__logo&quot; src=&quot;/assets/favicons/safari-pinned-tab.svg&quot; alt=&quot;oContis Studio&quot; width=&quot;32&quot; height=&quot;32&quot; decoding=&quot;async&quot; /&gt;
&lt;/div&gt;
  &lt;div class=&quot;epmb-figure__content&quot;&gt;
    
    &lt;svg id=&quot;epmb-15&quot; width=&quot;100%&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; class=&quot;flowchart&quot; style=&quot;max-width: 835.384765625px;&quot; viewBox=&quot;-8 -50.1015625 835.384765625 322.56875&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot;&gt;&lt;style&gt;#epmb-15{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;fill:#fafae6;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#epmb-15 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#epmb-15 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#epmb-15 .error-icon{fill:#141414;}#epmb-15 .error-text{fill:#ebebeb;stroke:#ebebeb;}#epmb-15 .edge-thickness-normal{stroke-width:1px;}#epmb-15 .edge-thickness-thick{stroke-width:3.5px;}#epmb-15 .edge-pattern-solid{stroke-dasharray:0;}#epmb-15 .edge-thickness-invisible{stroke-width:0;fill:none;}#epmb-15 .edge-pattern-dashed{stroke-dasharray:3;}#epmb-15 .edge-pattern-dotted{stroke-dasharray:2;}#epmb-15 .marker{fill:#8a8a7a;stroke:#8a8a7a;}#epmb-15 .marker.cross{stroke:#8a8a7a;}#epmb-15 svg{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;}#epmb-15 p{margin:0;}#epmb-15 .label{font-family:&#39;Syne&#39;,system-ui,sans-serif;color:#fafae6;}#epmb-15 .cluster-label text{fill:#fafae6;}#epmb-15 .cluster-label span{color:#fafae6;}#epmb-15 .cluster-label span p{background-color:transparent;}#epmb-15 .label text,#epmb-15 span{fill:#fafae6;color:#fafae6;}#epmb-15 .node rect,#epmb-15 .node circle,#epmb-15 .node ellipse,#epmb-15 .node polygon,#epmb-15 .node path{fill:#141414;stroke:#db5461;stroke-width:1px;}#epmb-15 .rough-node .label text,#epmb-15 .node .label text,#epmb-15 .image-shape .label,#epmb-15 .icon-shape .label{text-anchor:middle;}#epmb-15 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#epmb-15 .rough-node .label,#epmb-15 .node .label,#epmb-15 .image-shape .label,#epmb-15 .icon-shape .label{text-align:center;}#epmb-15 .node.clickable{cursor:pointer;}#epmb-15 .root .anchor path{fill:#8a8a7a!important;stroke-width:0;stroke:#8a8a7a;}#epmb-15 .arrowheadPath{fill:#f1eff0;}#epmb-15 .edgePath .path{stroke:#8a8a7a;stroke-width:1px;}#epmb-15 .flowchart-link{stroke:#8a8a7a;fill:none;}#epmb-15 .edgeLabel{background-color:#141414;text-align:center;}#epmb-15 .edgeLabel p{background-color:#141414;}#epmb-15 .edgeLabel rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-15 .labelBkg{background-color:rgba(20, 20, 20, 0.5);}#epmb-15 .cluster rect{fill:#141414;stroke:hsl(0, 0%, 17.8431372549%);stroke-width:1px;}#epmb-15 .cluster text{fill:#fafae6;}#epmb-15 .cluster span{color:#fafae6;}#epmb-15 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:12px;background:#141414;border:1px solid hsl(0, 0%, 17.8431372549%);border-radius:2px;pointer-events:none;z-index:100;}#epmb-15 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fafae6;}#epmb-15 rect.text{fill:none;stroke-width:0;}#epmb-15 .icon-shape,#epmb-15 .image-shape{background-color:#141414;text-align:center;}#epmb-15 .icon-shape p,#epmb-15 .image-shape p{background-color:#141414;padding:2px;}#epmb-15 .icon-shape .label rect,#epmb-15 .image-shape .label rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-15 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#epmb-15 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#epmb-15 .node .neo-node{stroke:#db5461;}#epmb-15 [data-look=&quot;neo&quot;].node rect,#epmb-15 [data-look=&quot;neo&quot;].cluster rect,#epmb-15 [data-look=&quot;neo&quot;].node polygon{stroke:url(#epmb-15-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-15 [data-look=&quot;neo&quot;].swimlane.cluster rect{filter:none;}#epmb-15 [data-look=&quot;neo&quot;].node path{stroke:url(#epmb-15-gradient);stroke-width:1px;}#epmb-15 [data-look=&quot;neo&quot;].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-15 [data-look=&quot;neo&quot;].node .neo-line path{stroke:#db5461;filter:none;}#epmb-15 [data-look=&quot;neo&quot;].node circle{stroke:url(#epmb-15-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-15 [data-look=&quot;neo&quot;].node circle .state-start{fill:#000000;}#epmb-15 [data-look=&quot;neo&quot;].icon-shape .icon{fill:url(#epmb-15-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-15 [data-look=&quot;neo&quot;].icon-shape .icon-neo path{stroke:url(#epmb-15-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-15 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;epmb-15_flowchart-v2-pointEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 10 5 L 0 10 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-15_flowchart-v2-pointStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;4.5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 5 L 10 10 L 10 0 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-15_flowchart-v2-pointEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;11.5&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;10.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 11.5 7 L 0 14 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-15_flowchart-v2-pointStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;1&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;polygon points=&quot;0,7 11.5,14 11.5,0&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-15_flowchart-v2-circleEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;11&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-15_flowchart-v2-circleStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-1&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-15_flowchart-v2-circleEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refY=&quot;5&quot; refX=&quot;12.25&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-15_flowchart-v2-circleStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-2&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-15_flowchart-v2-crossEnd&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;12&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-15_flowchart-v2-crossStart&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;-1&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-15_flowchart-v2-crossEnd-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;17.7&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-15_flowchart-v2-crossStart-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;-3.5&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;g class=&quot;root&quot;&gt;&lt;g class=&quot;clusters&quot;/&gt;&lt;g class=&quot;edgePaths&quot;&gt;&lt;path d=&quot;M335.174,59.789L329.874,63.956C324.573,68.122,313.972,76.456,308.672,84.122C303.371,91.789,303.371,98.789,303.371,102.289L303.371,105.789&quot; id=&quot;epmb-15-L_SHEET_MEET_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_SHEET_MEET_0&quot; data-points=&quot;W3sieCI6MzM1LjE3NDE4Njg1MDAwNzcsInkiOjU5Ljc4OTA2MjV9LHsieCI6MzAzLjM3MTA5Mzc1LCJ5Ijo4NC43ODkwNjI1fSx7IngiOjMwMy4zNzEwOTM3NSwieSI6MTA5Ljc4OTA2MjV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-15_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M208.883,159.457L190.917,163.977C172.952,168.497,137.021,177.538,119.738,185.57C102.455,193.603,103.821,200.627,104.503,204.139L105.186,207.652&quot; id=&quot;epmb-15-L_MEET_MKT_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_MEET_MKT_0&quot; data-points=&quot;W3sieCI6MjA4Ljg4MjgxMjUsInkiOjE1OS40NTcxMTA5ODMyNDI5fSx7IngiOjEwMS4wODk4NDM3NSwieSI6MTg2LjU3ODEyNX0seyJ4IjoxMDUuOTQ5NDQ2NzgxMTc3MzksInkiOjIxMS41NzgxMjV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-15_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M303.371,161.578L303.371,165.745C303.371,169.911,303.371,178.245,308.093,186.163C312.815,194.082,322.259,201.586,326.981,205.338L331.702,209.09&quot; id=&quot;epmb-15-L_MEET_ECOM_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_MEET_ECOM_0&quot; data-points=&quot;W3sieCI6MzAzLjM3MTA5Mzc1LCJ5IjoxNjEuNTc4MTI1fSx7IngiOjMwMy4zNzEwOTM3NSwieSI6MTg2LjU3ODEyNX0seyJ4IjozMzQuODM0MTc1OTUzMjIyNTQsInkiOjIxMS41NzgxMjV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-15_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M397.859,158.516L417.214,163.193C436.569,167.87,475.279,177.224,504.211,185.816C533.144,194.407,552.299,202.236,561.877,206.15L571.455,210.065&quot; id=&quot;epmb-15-L_MEET_OPS_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_MEET_OPS_0&quot; data-points=&quot;W3sieCI6Mzk3Ljg1OTM3NSwieSI6MTU4LjUxNjE4Nzk5MzIyNTgzfSx7IngiOjUxMy45ODgyODEyNSwieSI6MTg2LjU3ODEyNX0seyJ4Ijo1NzUuMTU3NTg1MjYzNzI4NCwieSI6MjExLjU3ODEyNX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-15_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M143.368,211.578L148.454,207.411C153.54,203.245,163.711,194.911,168.797,182.262C173.883,169.613,173.883,152.648,173.883,135.684C173.883,118.719,173.883,101.754,190.064,89.032C206.245,76.309,238.607,67.83,254.788,63.59L270.969,59.35&quot; id=&quot;epmb-15-L_MKT_SHEET_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_MKT_SHEET_0&quot; data-points=&quot;W3sieCI6MTQzLjM2NzkyMjM3MjU4NzI2LCJ5IjoyMTEuNTc4MTI1fSx7IngiOjE3My44ODI4MTI1LCJ5IjoxODYuNTc4MTI1fSx7IngiOjE3My44ODI4MTI1LCJ5IjoxMzUuNjgzNTkzNzV9LHsieCI6MTczLjg4MjgxMjUsInkiOjg0Ljc4OTA2MjV9LHsieCI6Mjc0LjgzNzg5MDYyNSwieSI6NTguMzM1OTAyMjY2MDkzOTk2fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-15_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M432.819,211.578L443.014,207.411C453.209,203.245,473.599,194.911,483.793,182.262C493.988,169.613,493.988,152.648,493.988,135.684C493.988,118.719,493.988,101.754,484.301,89.355C474.614,76.956,455.24,69.122,445.553,65.205L435.866,61.288&quot; id=&quot;epmb-15-L_ECOM_SHEET_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_ECOM_SHEET_0&quot; data-points=&quot;W3sieCI6NDMyLjgxODk3NzIzNjI3MTYsInkiOjIxMS41NzgxMjV9LHsieCI6NDkzLjk4ODI4MTI1LCJ5IjoxODYuNTc4MTI1fSx7IngiOjQ5My45ODgyODEyNSwieSI6MTM1LjY4MzU5Mzc1fSx7IngiOjQ5My45ODgyODEyNSwieSI6ODQuNzg5MDYyNX0seyJ4Ijo0MzIuMTU3OTQxMjM5MjU0NzQsInkiOjU5Ljc4OTA2MjV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-15_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M645.002,211.578L645.812,207.411C646.622,203.245,648.241,194.911,649.051,182.262C649.861,169.613,649.861,152.648,649.861,135.684C649.861,118.719,649.861,101.754,619.106,87.716C588.351,73.678,526.84,62.566,496.084,57.011L465.329,51.455&quot; id=&quot;epmb-15-L_OPS_SHEET_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_OPS_SHEET_0&quot; data-points=&quot;W3sieCI6NjQ1LjAwMTcyNTA5MzgyMjYsInkiOjIxMS41NzgxMjV9LHsieCI6NjQ5Ljg2MTMyODEyNSwieSI6MTg2LjU3ODEyNX0seyJ4Ijo2NDkuODYxMzI4MTI1LCJ5IjoxMzUuNjgzNTkzNzV9LHsieCI6NjQ5Ljg2MTMyODEyNSwieSI6ODQuNzg5MDYyNX0seyJ4Ijo0NjEuMzkyNTc4MTI1LCJ5Ijo1MC43NDQxMjMxMDQ5MDUyNH1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-15_flowchart-v2-pointEnd)&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabels&quot;&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_SHEET_MEET_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_MEET_MKT_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_MEET_ECOM_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_MEET_OPS_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_MKT_SHEET_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_ECOM_SHEET_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_OPS_SHEET_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;nodes&quot;&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-15-flowchart-SHEET-0&quot; data-look=&quot;classic&quot; transform=&quot;translate(368.115234375, 33.89453125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-93.27734375&quot; y=&quot;-25.89453125&quot; width=&quot;186.5546875&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Order&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; worksheet&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-15-flowchart-MEET-1&quot; data-look=&quot;classic&quot; transform=&quot;translate(303.37109375, 135.68359375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-94.48828125&quot; y=&quot;-25.89453125&quot; width=&quot;188.9765625&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Same&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; 30&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; minutes&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-15-flowchart-MKT-3&quot; data-look=&quot;classic&quot; transform=&quot;translate(111.08984375, 238.02265625)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-103.08984375&quot; y=&quot;-26.44453125&quot; width=&quot;206.1796875&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Media:&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; keep,&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; cut,&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; or&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;reshape&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-15-flowchart-ECOM-5&quot; data-look=&quot;classic&quot; transform=&quot;translate(368.115234375, 238.02265625)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-101.984375&quot; y=&quot;-26.44453125&quot; width=&quot;203.96875&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Offer:&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; discount&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; and&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;default&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; price&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-15-flowchart-OPS-7&quot; data-look=&quot;classic&quot; transform=&quot;translate(639.861328125, 238.02265625)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-119.76171875&quot; y=&quot;-26.44453125&quot; width=&quot;239.5234375&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Cost&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; to&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; serve:&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; ship,&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; fees,&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;apps&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-15-drop-shadow&quot; height=&quot;130%&quot; width=&quot;130%&quot;&gt;&lt;fedropshadow dx=&quot;4&quot; dy=&quot;4&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-15-drop-shadow-small&quot; height=&quot;150%&quot; width=&quot;150%&quot;&gt;&lt;fedropshadow dx=&quot;2&quot; dy=&quot;2&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;linearGradient id=&quot;epmb-15-gradient&quot; gradientUnits=&quot;objectBoundingBox&quot; x1=&quot;0%&quot; y1=&quot;0%&quot; x2=&quot;100%&quot; y2=&quot;0%&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#db5461&quot; stop-opacity=&quot;1&quot;/&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;hsl(0, 0%, 20.1960784314%)&quot; stop-opacity=&quot;1&quot;/&gt;&lt;/linearGradient&gt;&lt;text text-anchor=&quot;middle&quot; x=&quot;409.6923828125&quot; y=&quot;-25&quot; class=&quot;flowchartTitleText&quot;&gt;Weekly contribution review&lt;/text&gt;&lt;/svg&gt;
  &lt;/div&gt;
  
  &lt;figcaption class=&quot;epmb-figure__caption&quot; id=&quot;epmb-15-caption&quot;&gt;Weekly contribution review&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h2&gt;Build one order worksheet&lt;/h2&gt;&lt;p&gt;Do this on real orders, not a model of an ideal customer.&lt;/p&gt;&lt;p&gt;Pick one paid order and one organic order from the same week, same product if you can. For each row, fill:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Gross&lt;/strong&gt; the customer paid (after shop discounts, before refunds).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;COGS&lt;/strong&gt; for the units on that order.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Discount value&lt;/strong&gt; if a code or automatic discount applied.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Shipping cost&lt;/strong&gt; you paid, minus shipping the customer paid.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Payment fees&lt;/strong&gt; on that tender.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Returns provision&lt;/strong&gt; for that channel (use your trailing return rate, not a hope).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Packaging&lt;/strong&gt; if you track it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Attributed ad cost&lt;/strong&gt; for the paid order only (campaign spend allocated by your current rule).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;App or labour cost per order&lt;/strong&gt; only if you already measure it. &lt;a href=&quot;https://ocontis.studio/blog/post/the-hidden-cost-of-running-a-shopify-store-when-12-apps-quietly-eat-your-margins/&quot;&gt;&lt;em&gt;The Hidden Cost of Running a Shopify Store When 12 Apps Quietly Eat Your Margins&lt;/em&gt;&lt;/a&gt; is the place to get that line honest. Leave it blank rather than invent a figure.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The remainder is contribution for that order. Two orders are a sample, enough to see whether paid and organic live in different businesses.&lt;/p&gt;&lt;p&gt;Write the allocation rule next to the ad-cost line: last click, data-driven, or a simple spend divided by paid orders. Changing the rule later is fine. Hiding the rule is how two teams “disagree” while using different files.&lt;/p&gt;&lt;p&gt;Repeat across a handful of SKUs and one more channel if you run more than one. You are looking for the largest leak, not a perfect cost-accounting system.&lt;/p&gt;&lt;p&gt;If you have no COGS in Shopify, pull it from the same sheet finance already uses for stock. Guessing a margin percentage to make the worksheet finish is how the meeting becomes theatre. A missing COGS cell is an honest blocker. Fill it from purchasing, then continue.&lt;/p&gt;&lt;p&gt;Attributed ad cost is the other cell people fake. Until you have a proper model, pick one boring rule and write it on the sheet: last week’s campaign spend divided by paid orders in that campaign, or last-click from your current ads export. The point is that marketing and finance use the same rule this week. You can replace it later. You cannot compare two weeks that used different silent rules.&lt;/p&gt;&lt;h2&gt;A weekly review that includes ops&lt;/h2&gt;&lt;p&gt;A monthly board pack cannot steer a campaign. Put 30 minutes on the calendar with three seats: media, ecommerce, and whoever owns fulfilment or the app list. Same worksheet. Same date range.&lt;/p&gt;&lt;p&gt;Agenda, in order:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Paid versus organic contribution for last week.&lt;/li&gt;&lt;li&gt;The largest line that moved (discount rate, refunds, shipping, CAC).&lt;/li&gt;&lt;li&gt;One change for the coming week, owned by one seat.&lt;/li&gt;&lt;li&gt;What will be true on the worksheet if that change worked.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;If ops is absent, shipping and app overhead stay “someone else’s problem” and marketing will keep buying volume. If ecommerce is absent, discount experiments stay invisible to the P&amp;amp;L. If media is absent, the meeting becomes a finance lecture with no lever.&lt;/p&gt;&lt;p&gt;The output is a decision: keep spend, cut a cohort, change the offer, or change cost to serve. Skip a new dashboard until that decision exists.&lt;/p&gt;&lt;p&gt;Keep a running note of the decision and the expected worksheet change. Next week starts by checking that note. If the discount code came off and paid contribution stayed flat, look at the next largest line on the sheet. Run one hypothesis at a time, on the same rows.&lt;/p&gt;&lt;h2&gt;What to change when the gap is discount, CAC, or overhead&lt;/h2&gt;&lt;p&gt;Once two weeks of worksheets exist, the largest leak usually names the next action. Resist the urge to “align everything.”&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Largest leak on the worksheet&lt;/th&gt;&lt;th&gt;Owner this week&lt;/th&gt;&lt;th&gt;Move&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Ad cost per order vs organic&lt;/td&gt;&lt;td&gt;Media&lt;/td&gt;&lt;td&gt;Cut the cohort with high refunds or one-and-done buyers; do not raise budget&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Discount value on paid orders&lt;/td&gt;&lt;td&gt;Ecommerce&lt;/td&gt;&lt;td&gt;Remove the default sitewide code; measure conversion at a thinner offer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Shipping subsidy&lt;/td&gt;&lt;td&gt;Ecommerce + ops&lt;/td&gt;&lt;td&gt;Raise threshold or stop free shipping on the SKUs that already lose money&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Returns on paid vs organic&lt;/td&gt;&lt;td&gt;Media + ecommerce&lt;/td&gt;&lt;td&gt;Stop buying the audience; fix PDP honesty if the ad oversold the product&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;App / labour per order&lt;/td&gt;&lt;td&gt;Ops&lt;/td&gt;&lt;td&gt;Cut duplicate tools; do not treat this article as an integration rebuild&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;If paid contribution sits under your floor and the leak is audience quality, more creative tests will not save it. If the leak is a 20 percent code on every paid session, the media team cannot “find better ROAS” until the offer changes. If the leak is cost to serve, buying cheaper clicks adds more unprofitable parcels.&lt;/p&gt;&lt;p&gt;Set the floor in pounds per order, not as a ROAS slogan. Example shape, using your numbers: “Paid orders must clear £X contribution after the worksheet lines above before we increase daily spend.” Fill X from the two-order exercise, then tighten it as you sample more weeks.&lt;/p&gt;&lt;p&gt;Keep X visible in the same sheet as the orders. When someone asks to raise budget in Slack, the answer is whether last week’s paid rows cleared X, which saves you from negotiating from a screenshot of ROAS.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Contribution margin breaks when each team reports a metric the others cannot use. The fix is a worksheet on real orders and a weekly meeting that is allowed to change spend, offer, or cost to serve.&lt;/p&gt;&lt;p&gt;Build the two-order sheet. Name the allocation rule. Put three seats in the same 30 minutes. Change the largest leak first.&lt;/p&gt;&lt;p&gt;Model the same inputs in the &lt;a href=&quot;https://ocontis.studio/tools/unit-economics-simulator/&quot;&gt;Unit Economics Simulator&lt;/a&gt;. If the numbers are clear and the review still does not exist, &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;book a discovery call&lt;/a&gt; and we will help you stand up the operating model before you scale.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>AI Shopping Traffic and Agentic Commerce on Shopify</title>
    <link href="https://ocontis.studio/blog/post/ai-shopping-traffic-and-agentic-commerce-on-shopify/" />
    <updated>2026-09-07T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/ai-shopping-traffic-and-agentic-commerce-on-shopify/</id>
    <content type="html">&lt;h1&gt;AI Shopping Traffic and Agentic Commerce on Shopify&lt;/h1&gt;&lt;p&gt;Merchants are checking their analytics and finding a new line item: ChatGPT. A few orders a day, sometimes more. The referrer shows chatgpt.com, the landing page is a product, and the conversion rate is higher than organic.&lt;/p&gt;&lt;p&gt;This is not theoretical anymore. AI assistants are driving real Shopify revenue, and the stores that understand where that traffic lands, how to attribute it, and what makes a product visible to an agent will capture more of it as the channel scales.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;Agentic commerce describes a shift in how shoppers find and buy products. Instead of typing a search query, clicking ten results, and comparing tabs, a buyer asks an assistant: &amp;quot;Find me a waterproof hiking backpack under £150 with good reviews.&amp;quot; The assistant searches, compares, and returns a short list with prices and links.&lt;/p&gt;&lt;p&gt;Shopify tracks this traffic separately through the Agentic sales channel. Merchants can preview how their products rank for specific queries and see field-level scores for description, images, reviews, and policies. But the data is new, the measurement is incomplete, and the guidance is scattered across forum threads, changelog entries, and app-developer experiments.&lt;/p&gt;&lt;p&gt;This piece synthesises what the Shopify community is seeing, what the platform is actually doing, and what merchants should act on before the next promotional season. The patterns here apply whether you are preparing for BFCM traffic spikes or simply want to understand where AI fits into the broader question of &lt;a href=&quot;https://ocontis.studio/blog/post/the-real-cost-of-running-a-shopify-store/&quot;&gt;Shopify costs and channel economics&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;What the community is reacting to&lt;/h2&gt;&lt;p&gt;Forum threads in August and September 2026 show a mix of curiosity, confusion, and early wins.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Traffic attribution is harder than expected.&lt;/strong&gt; Merchants adding utm_source to checkout URLs found the parameter did not stick. Shopify&#39;s order webhook reports the landing page, not the checkout URL, so the source must be tagged on the first product or collection link. Google AI Overviews sends traffic as plain google.com, which lumps it into the organic bucket and makes measurement incomplete.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Product pages dominate, but collections matter.&lt;/strong&gt; Shopify&#39;s Q2 data shows roughly half of AI-referred sessions land on product pages. But merchants selling apparel, outdoor gear, and home goods report meaningful collection traffic because AI assistants answer comparison queries (&amp;quot;best X under Y&amp;quot;) by linking to category pages, not individual products.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Structured data is a gate.&lt;/strong&gt; Developers testing agentic checkout found that assistants read the JSON-LD block on product pages to match listings across stores. Without a GTIN (Global Trade Item Number), the assistant falls back to fuzzy title matching, which loses to the store that declares identifiers explicitly. Roughly 70% of US fashion Shopify storefronts that resell third-party brands fail to render a GTIN in their product schema. This gap often traces back to &lt;a href=&quot;https://ocontis.studio/blog/post/the-hidden-cost-of-running-a-shopify-store-when-12-apps-quietly-eat-your-margins/&quot;&gt;app sprawl and scattered data ownership&lt;/a&gt;: the barcode lives in the variant, but the theme or a third-party app never renders it.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Shopify Catalog ranking is a black box.&lt;/strong&gt; Merchants experimenting with the Agentic channel preview can see whether their products rank in the top ten for a given query, but the preview does not explain which field changes caused the movement. Downstream AI platforms like ChatGPT may also re-rank Shopify Catalog results using their own logic.&lt;/p&gt;&lt;h2&gt;What is actually changing&lt;/h2&gt;&lt;p&gt;Three shifts are underway, and they compound each other.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Traffic is real.&lt;/strong&gt; AI-referred sessions convert at roughly 50% higher rates than organic, with higher average order values, according to Shopify&#39;s Q2 reporting. The volume is still small relative to paid and organic, but it is growing steadily. Merchants processing high order volumes during BFCM expect agentic-channel orders to contribute meaningful revenue.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Attribution depends on first touch.&lt;/strong&gt; The only reliable trace of AI origin is the utm_source value or referring hostname on the first landing URL. Order webhooks report the landing page, not downstream navigation. Substring-matching the whole URL introduces false positives (a campaign named spring_chatgpt_test counts as ChatGPT). Match only where origin is explicitly declared: the referrer hostname, the exact utm_source, and Shopify&#39;s source_name.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Product visibility is now a data quality problem.&lt;/strong&gt; Assistants decide which products to recommend based on the structured data they can read. If your JSON-LD lacks identifiers, your descriptions are thin, or your reviews are hidden behind an app that does not expose them, the assistant will recommend a competitor whose data is cleaner. Traditional SEO optimises for search engine crawlers. AI visibility optimises for machine shoppers that need to compare, recommend, and sometimes complete purchases on behalf of humans.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Signal&lt;/th&gt;&lt;th&gt;Where it lives&lt;/th&gt;&lt;th&gt;Why it matters for AI&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;GTIN / barcode&lt;/td&gt;&lt;td&gt;Variant barcode field → JSON-LD&lt;/td&gt;&lt;td&gt;Exact product matching across stores&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Brand&lt;/td&gt;&lt;td&gt;Vendor or brand metafield → JSON-LD&lt;/td&gt;&lt;td&gt;Assists query routing and comparison&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Price and availability&lt;/td&gt;&lt;td&gt;Offers object in Product schema&lt;/td&gt;&lt;td&gt;Required for purchase intent queries&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Reviews&lt;/td&gt;&lt;td&gt;AggregateRating in JSON-LD or third-party app&lt;/td&gt;&lt;td&gt;Trust signal; assistants may cite review count&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Description quality&lt;/td&gt;&lt;td&gt;Product description and Agentic channel score&lt;/td&gt;&lt;td&gt;Semantic match for natural-language queries&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Hype vs reality&lt;/h2&gt;&lt;p&gt;The community discussion oscillates between &amp;quot;AI will replace Google&amp;quot; and &amp;quot;this is just noise.&amp;quot; Neither framing is useful. Here is what the data supports versus what remains unproven.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Claim&lt;/th&gt;&lt;th&gt;Reality&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;AI traffic is the future of ecommerce&lt;/td&gt;&lt;td&gt;AI traffic is growing and converts well, but it is still a small fraction of total sessions. Treat it as an emerging channel, not a replacement for paid and organic.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;You need a GEO strategy&lt;/td&gt;&lt;td&gt;Generative Engine Optimisation is real but immature. Fix structured data and product content first. Sophisticated GEO tactics are premature for most stores.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AI agents can complete checkout&lt;/td&gt;&lt;td&gt;Most AI-attributed orders are demand referrals, not agent-executed purchases. The assistant sends the shopper; the shopper completes checkout. Agent-executed checkout is experimental.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Shopify Catalog ranking is SEO for AI&lt;/td&gt;&lt;td&gt;The preview helps diagnose weak fields, but downstream AI platforms re-rank results. Optimising for Shopify Catalog does not guarantee placement in ChatGPT.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;You cannot measure AI traffic&lt;/td&gt;&lt;td&gt;You can measure named referrers (ChatGPT, Perplexity, Copilot) with utm_source and referrer hostname. Google AI Overviews is harder because it appears as organic.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;What merchants should do now&lt;/h2&gt;&lt;p&gt;Split actions into three tiers: skip for now, monitor, and act. The goal is to avoid premature optimisation while still capturing the channel&#39;s upside as it grows.&lt;/p&gt;&lt;h3&gt;Why tiered action matters&lt;/h3&gt;&lt;p&gt;AI traffic is real but uneven. Some stores see dozens of ChatGPT referrals per day. Others see none. The stores seeing volume tend to have clean product data, indexed collections, and content that answers specific buyer questions. The stores seeing nothing often have thin descriptions, no identifiers, and themes that render incomplete structured data.&lt;/p&gt;&lt;h3&gt;Ignore for now&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Skip the agentic checkout overhaul.&lt;/strong&gt; Current volumes are too small to justify architectural changes. A checkout that works for humans will work for most AI-referred shoppers. The friction points merchants report, such as &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-checkout-abandonment-when-your-funnel-looks-healthy/&quot;&gt;checkout abandonment&lt;/a&gt;, tend to affect AI-referred sessions the same way they affect organic ones.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Hold off on GEO agencies.&lt;/strong&gt; The playbook for Generative Engine Optimisation is still forming, and most of what passes for GEO advice is recycled SEO with AI buzzwords. Wait until measurement stabilises and the channel represents a meaningful share of revenue.&lt;/p&gt;&lt;h3&gt;Monitor&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Segment AI traffic in your analytics.&lt;/strong&gt; Filter sessions by referrer hostname (chatgpt.com, copilot.microsoft.com, gemini.google.com, perplexity.ai) and track landing pages, conversion rate, and AOV separately. If the numbers are meaningful, the channel deserves attention.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Watch the Agentic channel in Shopify admin.&lt;/strong&gt; Run preview queries for your top categories and note which products rank and which do not. Check the field-quality scores and flag products with low description or image ratings.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Track Shopify changelog and developer announcements.&lt;/strong&gt; The Agentic channel is evolving quickly. New triggers, new fields, and new ranking signals will roll out over the next two quarters.&lt;/p&gt;&lt;h3&gt;Act&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Fix product identifiers.&lt;/strong&gt; If you resell third-party brands, confirm the barcode field is populated on every variant and the theme renders it in JSON-LD. View source on a product page, search for ld+json, and check for gtin13 or gtin. If the field is missing, the data is not reaching crawlers or assistants.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Improve thin descriptions.&lt;/strong&gt; AI assistants match queries to descriptions semantically. A description that says &amp;quot;great for outdoor use&amp;quot; will lose to one that says &amp;quot;waterproof 600D polyester, YKK zippers, padded laptop sleeve fits 15-inch screens, three external pockets.&amp;quot; Specifics win. This is the same principle that improves &lt;a href=&quot;https://ocontis.studio/blog/post/common-theme-mistakes-that-kill-conversion-rates/&quot;&gt;product page conversion&lt;/a&gt;: give the buyer what they need to decide without making them hunt.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tag AI links on first landing.&lt;/strong&gt; Standardise utm_source on the first product or collection URL in any AI-surfaced link. Test the flow in an incognito window: land on the tagged URL, complete checkout, and confirm the order&#39;s conversion summary shows the correct source.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Run one controlled experiment.&lt;/strong&gt; Pick five products, record their Agentic channel scores and current ranking for a frozen set of queries. Change one field family (description, images, or variant data) on two of them, leave three as controls. Re-run the queries after a week and compare. That tells you whether your edits move the needle before you scale the work.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;AI shopping traffic is no longer speculative. It converts, it is growing, and it rewards stores whose product data is clean enough for machines to read and recommend.&lt;/p&gt;&lt;p&gt;The work required is data hygiene: identifiers in place, descriptions that answer real queries, structured data that renders correctly, and attribution that tracks where AI referrals land. This overlaps with the same &lt;a href=&quot;https://ocontis.studio/blog/post/the-anatomy-of-a-high-performance-shopify-theme/&quot;&gt;theme architecture fundamentals&lt;/a&gt; that improve organic search visibility, so the effort compounds across channels.&lt;/p&gt;&lt;p&gt;If your analytics already show ChatGPT orders, the channel is working despite incomplete setup. Fixing the gaps compounds that advantage before the next promotional spike.&lt;/p&gt;&lt;p&gt;For stores where product data lives in scattered apps, undocumented metafields, and themes that never render the right schema, a &lt;a href=&quot;https://ocontis.studio/services/shopify-stack-audit/&quot;&gt;structured stack audit&lt;/a&gt; maps what is missing and prioritises what to fix. The goal is a catalogue that AI assistants can read as easily as human shoppers.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Why DTC Brands Must Fix the Shopify PDP Before Turning On Ads</title>
    <link href="https://ocontis.studio/blog/post/why-dtc-brands-must-fix-the-shopify-pdp-before-turning-on-ads/" />
    <updated>2026-09-04T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/why-dtc-brands-must-fix-the-shopify-pdp-before-turning-on-ads/</id>
    <content type="html">&lt;h1&gt;Why DTC Brands Must Fix the Shopify PDP Before Turning On Ads&lt;/h1&gt;&lt;p&gt;Open the product page on a phone. If the ad showed a three-jar bundle at a set price and the first screen shows a single jar, a “from” price, and a collapsed review tab, the click already failed. The buyer has to reconstruct the offer you paid to put in front of them.&lt;/p&gt;&lt;p&gt;That reconstruction is the leak. It happens before checkout, before the thank-you page, and before anyone debates targeting.&lt;/p&gt;&lt;p&gt;Paid media multiplies whatever the product page already does. Unpaid visitors who cannot read the offer will bounce, and paid visitors will bounce in the same place. Do the work on the page: price, variants, media, trust, and a button that still works when the connection is average.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;This is a &lt;strong&gt;product-page audit&lt;/strong&gt;, not a media plan and not an app-stack review. &lt;a href=&quot;https://ocontis.studio/blog/post/common-theme-mistakes-that-kill-conversion-rates/&quot;&gt;&lt;em&gt;Common Theme Mistakes That Kill Conversion Rates&lt;/em&gt;&lt;/a&gt; covers JavaScript weight, motion, and section sprawl across the theme. &lt;a href=&quot;https://ocontis.studio/blog/post/the-anatomy-of-a-high-performance-shopify-theme/&quot;&gt;&lt;em&gt;The Anatomy of a High-Performance Shopify Theme&lt;/em&gt;&lt;/a&gt; covers how sections and assets should be structured. This piece stays on one template: the PDP a paid click actually lands on.&lt;/p&gt;&lt;p&gt;After add-to-cart, the funnel is a different job. &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-checkout-abandonment-when-your-funnel-looks-healthy/&quot;&gt;&lt;em&gt;How to Fix Shopify Checkout Abandonment When Your Funnel Looks Healthy&lt;/em&gt;&lt;/a&gt; is the place for payment and checkout-step failures.&lt;/p&gt;&lt;p&gt;Print the first screen. If you cannot circle the product, the price, and one trust line on that printout, the paid click has nowhere to land. Desktop preview will lie to you here because the buy box looks complete at 1200 pixels and empty at 390.&lt;/p&gt;&lt;p&gt;If the audit shows Liquid or schema work your team cannot ship, &lt;a href=&quot;https://ocontis.studio/services/shopify-theme-development/&quot;&gt;Shopify theme development&lt;/a&gt; is the hire path.&lt;/p&gt;&lt;h2&gt;What the product page has to answer in five seconds&lt;/h2&gt;&lt;p&gt;On mobile, the first screen has to answer three questions without a tap: what is this, what does it cost, and can I trust it enough to continue. Everything else is secondary.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Question&lt;/th&gt;&lt;th&gt;If the page answers it&lt;/th&gt;&lt;th&gt;If the page hides it&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;What is this?&lt;/td&gt;&lt;td&gt;Hero matches the ad; bundle or subscription is labelled&lt;/td&gt;&lt;td&gt;White-background shot of a different item or size&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;What does it cost?&lt;/td&gt;&lt;td&gt;The displayed price is the price for the default variant&lt;/td&gt;&lt;td&gt;Lowest price in the title, mid-tier selected, surprise at cart&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Why trust this?&lt;/td&gt;&lt;td&gt;A review, shipping line, or returns line in the first viewport&lt;/td&gt;&lt;td&gt;Reviews, delivery, and returns behind tabs&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Ads can be precise. The page still has to finish the sentence. Low add-to-cart often gets labelled unqualified traffic even after a tap, because the offer was unreadable on the first screen.&lt;/p&gt;&lt;figure class=&quot;blog-diagram epmb-figure&quot; role=&quot;figure&quot; aria-labelledby=&quot;epmb-14-caption&quot; data-diagram-id=&quot;epmb-14&quot;&gt;
  &lt;p class=&quot;epmb-figure__summary visually-hidden&quot; id=&quot;epmb-14-summary&quot;&gt;First five seconds on a Shopify PDP&lt;/p&gt;
  &lt;div class=&quot;epmb-figure__brand epmb-figure__brand--top-right&quot;&gt;
  &lt;img class=&quot;epmb-figure__logo&quot; src=&quot;/assets/favicons/safari-pinned-tab.svg&quot; alt=&quot;oContis Studio&quot; width=&quot;32&quot; height=&quot;32&quot; decoding=&quot;async&quot; /&gt;
&lt;/div&gt;
  &lt;div class=&quot;epmb-figure__content&quot;&gt;
    
    &lt;svg id=&quot;epmb-14&quot; width=&quot;100%&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; class=&quot;flowchart&quot; style=&quot;max-width: 454.353515625px;&quot; viewBox=&quot;-8 -50.1015625 454.353515625 1034.8734375&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot;&gt;&lt;style&gt;#epmb-14{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;fill:#fafae6;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#epmb-14 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#epmb-14 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#epmb-14 .error-icon{fill:#141414;}#epmb-14 .error-text{fill:#ebebeb;stroke:#ebebeb;}#epmb-14 .edge-thickness-normal{stroke-width:1px;}#epmb-14 .edge-thickness-thick{stroke-width:3.5px;}#epmb-14 .edge-pattern-solid{stroke-dasharray:0;}#epmb-14 .edge-thickness-invisible{stroke-width:0;fill:none;}#epmb-14 .edge-pattern-dashed{stroke-dasharray:3;}#epmb-14 .edge-pattern-dotted{stroke-dasharray:2;}#epmb-14 .marker{fill:#8a8a7a;stroke:#8a8a7a;}#epmb-14 .marker.cross{stroke:#8a8a7a;}#epmb-14 svg{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;}#epmb-14 p{margin:0;}#epmb-14 .label{font-family:&#39;Syne&#39;,system-ui,sans-serif;color:#fafae6;}#epmb-14 .cluster-label text{fill:#fafae6;}#epmb-14 .cluster-label span{color:#fafae6;}#epmb-14 .cluster-label span p{background-color:transparent;}#epmb-14 .label text,#epmb-14 span{fill:#fafae6;color:#fafae6;}#epmb-14 .node rect,#epmb-14 .node circle,#epmb-14 .node ellipse,#epmb-14 .node polygon,#epmb-14 .node path{fill:#141414;stroke:#db5461;stroke-width:1px;}#epmb-14 .rough-node .label text,#epmb-14 .node .label text,#epmb-14 .image-shape .label,#epmb-14 .icon-shape .label{text-anchor:middle;}#epmb-14 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#epmb-14 .rough-node .label,#epmb-14 .node .label,#epmb-14 .image-shape .label,#epmb-14 .icon-shape .label{text-align:center;}#epmb-14 .node.clickable{cursor:pointer;}#epmb-14 .root .anchor path{fill:#8a8a7a!important;stroke-width:0;stroke:#8a8a7a;}#epmb-14 .arrowheadPath{fill:#f1eff0;}#epmb-14 .edgePath .path{stroke:#8a8a7a;stroke-width:1px;}#epmb-14 .flowchart-link{stroke:#8a8a7a;fill:none;}#epmb-14 .edgeLabel{background-color:#141414;text-align:center;}#epmb-14 .edgeLabel p{background-color:#141414;}#epmb-14 .edgeLabel rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-14 .labelBkg{background-color:rgba(20, 20, 20, 0.5);}#epmb-14 .cluster rect{fill:#141414;stroke:hsl(0, 0%, 17.8431372549%);stroke-width:1px;}#epmb-14 .cluster text{fill:#fafae6;}#epmb-14 .cluster span{color:#fafae6;}#epmb-14 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:12px;background:#141414;border:1px solid hsl(0, 0%, 17.8431372549%);border-radius:2px;pointer-events:none;z-index:100;}#epmb-14 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fafae6;}#epmb-14 rect.text{fill:none;stroke-width:0;}#epmb-14 .icon-shape,#epmb-14 .image-shape{background-color:#141414;text-align:center;}#epmb-14 .icon-shape p,#epmb-14 .image-shape p{background-color:#141414;padding:2px;}#epmb-14 .icon-shape .label rect,#epmb-14 .image-shape .label rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-14 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#epmb-14 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#epmb-14 .node .neo-node{stroke:#db5461;}#epmb-14 [data-look=&quot;neo&quot;].node rect,#epmb-14 [data-look=&quot;neo&quot;].cluster rect,#epmb-14 [data-look=&quot;neo&quot;].node polygon{stroke:url(#epmb-14-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-14 [data-look=&quot;neo&quot;].swimlane.cluster rect{filter:none;}#epmb-14 [data-look=&quot;neo&quot;].node path{stroke:url(#epmb-14-gradient);stroke-width:1px;}#epmb-14 [data-look=&quot;neo&quot;].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-14 [data-look=&quot;neo&quot;].node .neo-line path{stroke:#db5461;filter:none;}#epmb-14 [data-look=&quot;neo&quot;].node circle{stroke:url(#epmb-14-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-14 [data-look=&quot;neo&quot;].node circle .state-start{fill:#000000;}#epmb-14 [data-look=&quot;neo&quot;].icon-shape .icon{fill:url(#epmb-14-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-14 [data-look=&quot;neo&quot;].icon-shape .icon-neo path{stroke:url(#epmb-14-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-14 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;epmb-14_flowchart-v2-pointEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 10 5 L 0 10 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-14_flowchart-v2-pointStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;4.5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 5 L 10 10 L 10 0 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-14_flowchart-v2-pointEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;11.5&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;10.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 11.5 7 L 0 14 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-14_flowchart-v2-pointStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;1&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;polygon points=&quot;0,7 11.5,14 11.5,0&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-14_flowchart-v2-circleEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;11&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-14_flowchart-v2-circleStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-1&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-14_flowchart-v2-circleEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refY=&quot;5&quot; refX=&quot;12.25&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-14_flowchart-v2-circleStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-2&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-14_flowchart-v2-crossEnd&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;12&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-14_flowchart-v2-crossStart&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;-1&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-14_flowchart-v2-crossEnd-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;17.7&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-14_flowchart-v2-crossStart-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;-3.5&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;g class=&quot;root&quot;&gt;&lt;g class=&quot;clusters&quot;/&gt;&lt;g class=&quot;edgePaths&quot;&gt;&lt;path d=&quot;M157.172,59.789L157.172,63.956C157.172,68.122,157.172,76.456,157.172,84.122C157.172,91.789,157.172,98.789,157.172,102.289L157.172,105.789&quot; id=&quot;epmb-14-L_LAND_HERO_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_LAND_HERO_0&quot; data-points=&quot;W3sieCI6MTU3LjE3MTg3NSwieSI6NTkuNzg5MDYyNX0seyJ4IjoxNTcuMTcxODc1LCJ5Ijo4NC43ODkwNjI1fSx7IngiOjE1Ny4xNzE4NzUsInkiOjEwOS43ODkwNjI1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-14_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M109.958,277.302L98.824,291.487C87.69,305.671,65.422,334.041,54.288,370.035C43.154,406.03,43.154,449.649,43.154,493.269C43.154,536.888,43.154,580.508,45.271,619.254C47.387,658,51.621,691.872,53.737,708.808L55.854,725.744&quot; id=&quot;epmb-14-L_HERO_LEAVE_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_HERO_LEAVE_0&quot; data-points=&quot;W3sieCI6MTA5Ljk1ODM2NDc2OTkzMjM2LCJ5IjoyNzcuMzAyMTE0NzY5OTMyMzZ9LHsieCI6NDMuMTU0Mjk2ODc1LCJ5IjozNjIuNDEwMTU2MjV9LHsieCI6NDMuMTU0Mjk2ODc1LCJ5Ijo0OTMuMjY4NzV9LHsieCI6NDMuMTU0Mjk2ODc1LCJ5Ijo2MjQuMTI3MzQzNzV9LHsieCI6NTYuMzQ5Nzk0MjQ4NDczNjY0LCJ5Ijo3MjkuNzEzMjgxMjV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-14_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M193.33,288.358L199.597,300.7C205.864,313.042,218.399,337.726,224.666,355.717C230.934,373.708,230.934,385.007,230.934,390.656L230.934,396.305&quot; id=&quot;epmb-14-L_HERO_PRICE_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_HERO_PRICE_0&quot; data-points=&quot;W3sieCI6MTkzLjMyOTgzODIyMTA5ODEsInkiOjI4OC4zNTc2NjE3Nzg5MDE5fSx7IngiOjIzMC45MzM1OTM3NSwieSI6MzYyLjQxMDE1NjI1fSx7IngiOjIzMC45MzM1OTM3NDk5OTk5NywieSI6NDAwLjMwNDY4NzQ5OTk5OTk0fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-14_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M191.222,546.521L181.576,559.455C171.93,572.39,152.639,598.259,133.447,628.209C114.255,658.16,95.163,692.192,85.616,709.209L76.07,726.225&quot; id=&quot;epmb-14-L_PRICE_LEAVE_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_PRICE_LEAVE_0&quot; data-points=&quot;W3sieCI6MTkxLjIyMTYxMTQwMDM2MywieSI6NTQ2LjUyMDgzMDE1MDM2M30seyJ4IjoxMzMuMzQ3NjU2MjUsInkiOjYyNC4xMjczNDM3NX0seyJ4Ijo3NC4xMTMwMDEwOTY0NzQ5NSwieSI6NzI5LjcxMzI4MTI1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-14_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M245.252,571.915L246.836,580.617C248.421,589.319,251.589,606.723,253.173,621.074C254.758,635.426,254.758,646.724,254.758,652.373L254.758,658.022&quot; id=&quot;epmb-14-L_PRICE_TRUST_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_PRICE_TRUST_0&quot; data-points=&quot;W3sieCI6MjQ1LjI1MTkwMTgwOTUyNDQsInkiOjU3MS45MTQ1MDQ0NDA0NzU1fSx7IngiOjI1NC43NTc4MTI1LCJ5Ijo2MjQuMTI3MzQzNzV9LHsieCI6MjU0Ljc1NzgxMjUsInkiOjY2Mi4wMjE4NzQ5OTk5OTk5fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-14_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M213.977,808.413L203.85,821.525C193.724,834.638,173.47,860.863,163.343,879.625C153.217,898.386,153.217,909.685,153.217,915.334L153.217,920.983&quot; id=&quot;epmb-14-L_TRUST_HESITATE_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_TRUST_HESITATE_0&quot; data-points=&quot;W3sieCI6MjEzLjk3Njk3NTYyODAwMTcsInkiOjgwOC40MTI5MTMxMjgwMDJ9LHsieCI6MTUzLjIxNjc5Njg3NSwieSI6ODg3LjA4ODI4MTI1fSx7IngiOjE1My4yMTY3OTY4NzUsInkiOjkyNC45ODI4MTI1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-14_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M295.539,808.413L305.665,821.525C315.792,834.638,336.045,860.863,346.172,879.625C356.299,898.386,356.299,909.685,356.299,915.334L356.299,920.983&quot; id=&quot;epmb-14-L_TRUST_ATC_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_TRUST_ATC_0&quot; data-points=&quot;W3sieCI6Mjk1LjUzODY0OTM3MTk5ODUsInkiOjgwOC40MTI5MTMxMjgwMDE3fSx7IngiOjM1Ni4yOTg4MjgxMjUsInkiOjg4Ny4wODgyODEyNX0seyJ4IjozNTYuMjk4ODI4MTI1LCJ5Ijo5MjQuOTgyODEyNX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-14_flowchart-v2-pointEnd)&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabels&quot;&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_LAND_HERO_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(43.154296875, 493.26875)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_HERO_LEAVE_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-12.86328125&quot; y=&quot;-18.1015625&quot; width=&quot;25.7265625&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;No&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(230.93359375, 362.41015625)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_HERO_PRICE_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-14.78515625&quot; y=&quot;-18.1015625&quot; width=&quot;29.5703125&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Yes&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(133.34765625, 624.12734375)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_PRICE_LEAVE_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-12.86328125&quot; y=&quot;-18.1015625&quot; width=&quot;25.7265625&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;No&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(254.7578125, 624.12734375)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_PRICE_TRUST_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-14.78515625&quot; y=&quot;-18.1015625&quot; width=&quot;29.5703125&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Yes&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(153.216796875, 887.08828125)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_TRUST_HESITATE_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-12.86328125&quot; y=&quot;-18.1015625&quot; width=&quot;25.7265625&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;No&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(356.298828125, 887.08828125)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_TRUST_ATC_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-14.78515625&quot; y=&quot;-18.1015625&quot; width=&quot;29.5703125&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Yes&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;nodes&quot;&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-14-flowchart-LAND-0&quot; data-look=&quot;classic&quot; transform=&quot;translate(157.171875, 33.89453125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-85.171875&quot; y=&quot;-25.89453125&quot; width=&quot;170.34375&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Mobile&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; landing&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-14-flowchart-HERO-1&quot; data-look=&quot;classic&quot; transform=&quot;translate(157.171875, 217.15234375)&quot;&gt;&lt;polygon points=&quot;107.36328125,0 214.7265625,-107.36328125 107.36328125,-214.7265625 0,-107.36328125&quot; class=&quot;label-container&quot; transform=&quot;translate(-106.86328125, 107.36328125)&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Hero&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; matches&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; the&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; ad?&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-14-flowchart-LEAVE-3&quot; data-look=&quot;classic&quot; transform=&quot;translate(59.5859375, 755.6078125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-51.5859375&quot; y=&quot;-25.89453125&quot; width=&quot;103.171875&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Leave&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-14-flowchart-PRICE-5&quot; data-look=&quot;classic&quot; transform=&quot;translate(230.93359375, 493.26875)&quot;&gt;&lt;polygon points=&quot;92.9640625,0 185.928125,-92.9640625 92.9640625,-185.928125 0,-92.9640625&quot; class=&quot;label-container&quot; transform=&quot;translate(-92.4640625, 92.9640625)&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Price&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; matches&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; the&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;promise?&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-14-flowchart-TRUST-9&quot; data-look=&quot;classic&quot; transform=&quot;translate(254.7578125, 755.6078125)&quot;&gt;&lt;polygon points=&quot;93.5859375,0 187.171875,-93.5859375 93.5859375,-187.171875 0,-93.5859375&quot; class=&quot;label-container&quot; transform=&quot;translate(-93.0859375, 93.5859375)&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Trust&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; copy&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; visible?&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-14-flowchart-HESITATE-11&quot; data-look=&quot;classic&quot; transform=&quot;translate(153.216796875, 950.87734375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-82.0546875&quot; y=&quot;-25.89453125&quot; width=&quot;164.109375&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Scroll&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; or&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; leave&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-14-flowchart-ATC-13&quot; data-look=&quot;classic&quot; transform=&quot;translate(356.298828125, 950.87734375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-71.02734375&quot; y=&quot;-25.89453125&quot; width=&quot;142.0546875&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Add&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; to&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; cart&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-14-drop-shadow&quot; height=&quot;130%&quot; width=&quot;130%&quot;&gt;&lt;fedropshadow dx=&quot;4&quot; dy=&quot;4&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-14-drop-shadow-small&quot; height=&quot;150%&quot; width=&quot;150%&quot;&gt;&lt;fedropshadow dx=&quot;2&quot; dy=&quot;2&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;linearGradient id=&quot;epmb-14-gradient&quot; gradientUnits=&quot;objectBoundingBox&quot; x1=&quot;0%&quot; y1=&quot;0%&quot; x2=&quot;100%&quot; y2=&quot;0%&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#db5461&quot; stop-opacity=&quot;1&quot;/&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;hsl(0, 0%, 20.1960784314%)&quot; stop-opacity=&quot;1&quot;/&gt;&lt;/linearGradient&gt;&lt;text text-anchor=&quot;middle&quot; x=&quot;219.1767578125&quot; y=&quot;-25&quot; class=&quot;flowchartTitleText&quot;&gt;First five seconds on a Shopify PDP&lt;/text&gt;&lt;/svg&gt;
  &lt;/div&gt;
  
  &lt;figcaption class=&quot;epmb-figure__caption&quot; id=&quot;epmb-14-caption&quot;&gt;First five seconds on a Shopify PDP&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h2&gt;Run the audit on a phone&lt;/h2&gt;&lt;p&gt;Do this on the live theme, on a mid-range handset, not on a desktop preview at full width. Most paid traffic will arrive the same way.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Media.&lt;/strong&gt; Open the ad creative in one tab and the PDP in another. If the colourway, pack size, or lifestyle context does not appear in the first image, change the hero or use variant-specific media that updates on select. Do not wait for a full photoshoot if you already have the asset the ad uses.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Price.&lt;/strong&gt; Select the default variant. Write down the number on screen. Add to cart. If cart price differs, stop the campaign plan until the template is honest. Bundles and selling plans are the usual source: the heading shows a subscription rate while the picker defaults to one-time, or the reverse.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Availability.&lt;/strong&gt; Choose a colour or size you know is out of stock. The page should say so before add-to-cart. A disabled or labelled option is cheaper than an error after the tap.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Trust.&lt;/strong&gt; Without scrolling, can you see one review, a shipping estimate, or a returns summary? Accordions are fine for policy depth. They are the wrong home for the one line that removes the objection.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Button.&lt;/strong&gt; Throttle the connection. Tap add-to-cart. If the control does nothing, or if a third-party script queues before the cart drawer, you have a theme-and-script issue. &lt;a href=&quot;https://ocontis.studio/blog/post/online-store-2-0-what-changed-and-why-it-matters/&quot;&gt;&lt;em&gt;Online Store 2.0: What Changed and Why It Matters&lt;/em&gt;&lt;/a&gt; is useful when the template itself is still on a JSON-unfriendly setup. For customisation that has already left a supportable path, see &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-theme-customisation-limits-when-your-store-leaves-the-supportable-path/&quot;&gt;&lt;em&gt;Shopify Theme Customisation Limits&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Check&lt;/th&gt;&lt;th&gt;Pass&lt;/th&gt;&lt;th&gt;Typical fix&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Hero&lt;/td&gt;&lt;td&gt;Same product and context as the ad&lt;/td&gt;&lt;td&gt;Swap media or bind variant images&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Price&lt;/td&gt;&lt;td&gt;Default variant price matches cart&lt;/td&gt;&lt;td&gt;Default selling plan and compare-at logic&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Variants&lt;/td&gt;&lt;td&gt;Out of stock labelled before ATC&lt;/td&gt;&lt;td&gt;Liquid or app selector behaviour&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Trust&lt;/td&gt;&lt;td&gt;One proof point in the first viewport&lt;/td&gt;&lt;td&gt;Pull snippet above the fold&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ATC&lt;/td&gt;&lt;td&gt;Responds on a slow phone&lt;/td&gt;&lt;td&gt;Defer non-critical scripts&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Price, variants, and the number the ad promised&lt;/h2&gt;&lt;p&gt;Price leaks are layout bugs with a finance costume. When the page showed £18 and the cart charged £48, the buyer was given two numbers. That is enough to leave.&lt;/p&gt;&lt;p&gt;Common Shopify causes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;From-price in the heading&lt;/strong&gt; while the selected variant is a larger size.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Selling plan badge&lt;/strong&gt; that does not match the selected purchase option.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Compare-at&lt;/strong&gt; that looks like a discount on a variant that is not discounted.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Bundle cards&lt;/strong&gt; that add line items the hero never showed.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Fix the default state so the first paint matches the ad. Then make variant changes update price, image, and availability in one pass. If that update needs section schema or a custom picker, that is theme work, not a new ad set.&lt;/p&gt;&lt;p&gt;Selling plans deserve their own pass. If you sell subscribe-and-save, the first paint should show the selected plan’s price and cadence, not a one-time price with a badge that looks like a discount on a different option. Buyers who tap through from an ad that said “£X a month” will treat any other number as bait. Get the selected selling plan, the price, and the badge from the same variant object.&lt;/p&gt;&lt;p&gt;Bundles fail in the opposite direction: the ad shows the set, the PDP adds a hero of SKU one, and the cart quietly adds SKU two. If the theme cannot render the bundle as one offer, do not run the bundle creative. Point the campaign at a template that matches the line items, or ship the template first.&lt;/p&gt;&lt;h2&gt;Trust signals that never appear on a phone&lt;/h2&gt;&lt;p&gt;Desktop reviews below the fold are merely annoying. On a phone they are invisible. Buyers who need a guarantee, a delivery window, or a returns line will not hunt through tabs while an ad still sits in recents.&lt;/p&gt;&lt;p&gt;Pull one proof into the buy box:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;First review or rating count&lt;/li&gt;&lt;li&gt;Shipping estimate or “order by” cutoff&lt;/li&gt;&lt;li&gt;Returns in one sentence&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Keep the long policy in an accordion. The first screen is for the decision, not the legal archive.&lt;/p&gt;&lt;h2&gt;Add-to-cart that works when you are not on office wifi&lt;/h2&gt;&lt;p&gt;A button that works on staging and fails under campaign traffic is still a PDP failure. Theme JS, reviews widgets, and inventory apps often bind to the same click. Under load they queue. The buyer taps twice, refreshes, or leaves.&lt;/p&gt;&lt;p&gt;Test on a throttled connection. If the click depends on an app, move that logic off the critical path or replace it with theme-native cart behaviour. This is the only place this article overlaps with apps, and the fix still lives in the theme: fewer scripts on the purchase click.&lt;/p&gt;&lt;p&gt;Do not A/B test headline copy while the button still fails on 4G. You will attribute the lift to words and ship the same dead click. Sequence is: media match, honest price, visible trust, working ATC. Copy tests come after those four are boring.&lt;/p&gt;&lt;h2&gt;When the page is ready for paid traffic&lt;/h2&gt;&lt;p&gt;Scale spend when unpaid traffic already adds to cart at a stable rate on this template, the five checks above pass on a phone, and you have placed a test order on the live theme.&lt;/p&gt;&lt;p&gt;Hold spend when the only sessions are paid, when session recordings still show hesitation at price or variants, or when the theme change is designed but not shipped. Launching ads against a page you plan to fix next week trains the platform on the broken version.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;A Shopify product page has a simple job: make the offer the ad already sold readable on a phone, at the real price, with enough trust to tap add-to-cart. Until that is true, extra budget buys more of the same bounce.&lt;/p&gt;&lt;p&gt;Audit the live PDP. Match the hero, tell the truth on price and variants, surface one trust line, and confirm the button under a poor connection. Then raise spend.&lt;/p&gt;&lt;p&gt;If the gaps are Liquid, schema, or selling-plan display your team cannot ship, start with &lt;a href=&quot;https://ocontis.studio/services/shopify-theme-development/&quot;&gt;Shopify theme development&lt;/a&gt;. Use a &lt;a href=&quot;https://ocontis.studio/services/shopify-stack-audit/&quot;&gt;stack audit&lt;/a&gt; only when the layout is clear and scripts on the click still fail.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Why Shopify Stores Can&#39;t Scale on a Bloated Tech Stack</title>
    <link href="https://ocontis.studio/blog/post/why-shopify-stores-cant-scale-on-a-bloated-tech-stack/" />
    <updated>2026-09-02T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/why-shopify-stores-cant-scale-on-a-bloated-tech-stack/</id>
    <content type="html">&lt;h1&gt;Why Shopify Stores Can&#39;t Scale on a Bloated Tech Stack&lt;/h1&gt;&lt;p&gt;Open a single paid order from last week. In the metafields you will often find three values for the same fact: an ERP status, a tax override, and a fulfilment flag. Two of them were written by apps you still pay for. The third still arrives from a webhook whose app you uninstalled months ago.&lt;/p&gt;&lt;p&gt;That order is the architecture. App count is a side effect.&lt;/p&gt;&lt;p&gt;Shopify stores stall when &lt;strong&gt;two systems claim the same field&lt;/strong&gt; and neither is documented as the owner. At 30 orders a day the conflict is a Tuesday spreadsheet. At 300 orders an hour the same conflict is oversells, queued confirmations, and a checkout that times out while Shopify’s own servers are fine.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;This article is about &lt;strong&gt;who is allowed to write&lt;/strong&gt;. Subscription overlap and unused seats belong in &lt;a href=&quot;https://ocontis.studio/blog/post/the-hidden-cost-of-running-a-shopify-store-when-12-apps-quietly-eat-your-margins/&quot;&gt;&lt;em&gt;The Hidden Cost of Running a Shopify Store When 12 Apps Quietly Eat Your Margins&lt;/em&gt;&lt;/a&gt;. Weekly export rituals belong in &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-operational-friction-when-simple-tasks-still-take-too-long/&quot;&gt;&lt;em&gt;How to Fix Shopify Operational Friction When Simple Tasks Still Take Too Long&lt;/em&gt;&lt;/a&gt;. Here the question is narrower: what happens to checkout, inventory, and fulfilment when request volume doubles.&lt;/p&gt;&lt;p&gt;If you cannot name one owner per domain, the next campaign is a load test you did not schedule.&lt;/p&gt;&lt;p&gt;Keep the map in the same place you keep the runbook for a sale: a shared doc with the owner’s name, the webhook URL, and the date you last confirmed a successful delivery. Screenshots of the apps screen go stale. Names and URLs do not, as long as someone updates them after every install.&lt;/p&gt;&lt;p&gt;When the map is already a guess, start with a &lt;a href=&quot;https://ocontis.studio/services/shopify-stack-audit/&quot;&gt;Shopify Stack Audit&lt;/a&gt;. The rest of this piece is the map you can start on your own.&lt;/p&gt;&lt;h2&gt;One order, three writers&lt;/h2&gt;&lt;p&gt;The failure is usually visible on the order object before it is visible in a dashboard.&lt;/p&gt;&lt;figure class=&quot;blog-diagram epmb-figure&quot; role=&quot;figure&quot; aria-labelledby=&quot;epmb-13-caption&quot; data-diagram-id=&quot;epmb-13&quot;&gt;
  &lt;p class=&quot;epmb-figure__summary visually-hidden&quot; id=&quot;epmb-13-summary&quot;&gt;Split ownership on a single order&lt;/p&gt;
  &lt;div class=&quot;epmb-figure__brand epmb-figure__brand--top-right&quot;&gt;
  &lt;img class=&quot;epmb-figure__logo&quot; src=&quot;/assets/favicons/safari-pinned-tab.svg&quot; alt=&quot;oContis Studio&quot; width=&quot;32&quot; height=&quot;32&quot; decoding=&quot;async&quot; /&gt;
&lt;/div&gt;
  &lt;div class=&quot;epmb-figure__content&quot;&gt;
    
    &lt;svg id=&quot;epmb-13&quot; width=&quot;100%&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; class=&quot;flowchart&quot; style=&quot;max-width: 1037.96875px;&quot; viewBox=&quot;-8 -50.1015625 1037.96875 321.46875&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot;&gt;&lt;style&gt;#epmb-13{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;fill:#fafae6;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#epmb-13 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#epmb-13 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#epmb-13 .error-icon{fill:#141414;}#epmb-13 .error-text{fill:#ebebeb;stroke:#ebebeb;}#epmb-13 .edge-thickness-normal{stroke-width:1px;}#epmb-13 .edge-thickness-thick{stroke-width:3.5px;}#epmb-13 .edge-pattern-solid{stroke-dasharray:0;}#epmb-13 .edge-thickness-invisible{stroke-width:0;fill:none;}#epmb-13 .edge-pattern-dashed{stroke-dasharray:3;}#epmb-13 .edge-pattern-dotted{stroke-dasharray:2;}#epmb-13 .marker{fill:#8a8a7a;stroke:#8a8a7a;}#epmb-13 .marker.cross{stroke:#8a8a7a;}#epmb-13 svg{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;}#epmb-13 p{margin:0;}#epmb-13 .label{font-family:&#39;Syne&#39;,system-ui,sans-serif;color:#fafae6;}#epmb-13 .cluster-label text{fill:#fafae6;}#epmb-13 .cluster-label span{color:#fafae6;}#epmb-13 .cluster-label span p{background-color:transparent;}#epmb-13 .label text,#epmb-13 span{fill:#fafae6;color:#fafae6;}#epmb-13 .node rect,#epmb-13 .node circle,#epmb-13 .node ellipse,#epmb-13 .node polygon,#epmb-13 .node path{fill:#141414;stroke:#db5461;stroke-width:1px;}#epmb-13 .rough-node .label text,#epmb-13 .node .label text,#epmb-13 .image-shape .label,#epmb-13 .icon-shape .label{text-anchor:middle;}#epmb-13 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#epmb-13 .rough-node .label,#epmb-13 .node .label,#epmb-13 .image-shape .label,#epmb-13 .icon-shape .label{text-align:center;}#epmb-13 .node.clickable{cursor:pointer;}#epmb-13 .root .anchor path{fill:#8a8a7a!important;stroke-width:0;stroke:#8a8a7a;}#epmb-13 .arrowheadPath{fill:#f1eff0;}#epmb-13 .edgePath .path{stroke:#8a8a7a;stroke-width:1px;}#epmb-13 .flowchart-link{stroke:#8a8a7a;fill:none;}#epmb-13 .edgeLabel{background-color:#141414;text-align:center;}#epmb-13 .edgeLabel p{background-color:#141414;}#epmb-13 .edgeLabel rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-13 .labelBkg{background-color:rgba(20, 20, 20, 0.5);}#epmb-13 .cluster rect{fill:#141414;stroke:hsl(0, 0%, 17.8431372549%);stroke-width:1px;}#epmb-13 .cluster text{fill:#fafae6;}#epmb-13 .cluster span{color:#fafae6;}#epmb-13 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:12px;background:#141414;border:1px solid hsl(0, 0%, 17.8431372549%);border-radius:2px;pointer-events:none;z-index:100;}#epmb-13 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fafae6;}#epmb-13 rect.text{fill:none;stroke-width:0;}#epmb-13 .icon-shape,#epmb-13 .image-shape{background-color:#141414;text-align:center;}#epmb-13 .icon-shape p,#epmb-13 .image-shape p{background-color:#141414;padding:2px;}#epmb-13 .icon-shape .label rect,#epmb-13 .image-shape .label rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-13 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#epmb-13 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#epmb-13 .node .neo-node{stroke:#db5461;}#epmb-13 [data-look=&quot;neo&quot;].node rect,#epmb-13 [data-look=&quot;neo&quot;].cluster rect,#epmb-13 [data-look=&quot;neo&quot;].node polygon{stroke:url(#epmb-13-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-13 [data-look=&quot;neo&quot;].swimlane.cluster rect{filter:none;}#epmb-13 [data-look=&quot;neo&quot;].node path{stroke:url(#epmb-13-gradient);stroke-width:1px;}#epmb-13 [data-look=&quot;neo&quot;].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-13 [data-look=&quot;neo&quot;].node .neo-line path{stroke:#db5461;filter:none;}#epmb-13 [data-look=&quot;neo&quot;].node circle{stroke:url(#epmb-13-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-13 [data-look=&quot;neo&quot;].node circle .state-start{fill:#000000;}#epmb-13 [data-look=&quot;neo&quot;].icon-shape .icon{fill:url(#epmb-13-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-13 [data-look=&quot;neo&quot;].icon-shape .icon-neo path{stroke:url(#epmb-13-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-13 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;epmb-13_flowchart-v2-pointEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 10 5 L 0 10 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-13_flowchart-v2-pointStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;4.5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 5 L 10 10 L 10 0 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-13_flowchart-v2-pointEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;11.5&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;10.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 11.5 7 L 0 14 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-13_flowchart-v2-pointStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;1&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;polygon points=&quot;0,7 11.5,14 11.5,0&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-13_flowchart-v2-circleEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;11&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-13_flowchart-v2-circleStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-1&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-13_flowchart-v2-circleEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refY=&quot;5&quot; refX=&quot;12.25&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-13_flowchart-v2-circleStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-2&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-13_flowchart-v2-crossEnd&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;12&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-13_flowchart-v2-crossStart&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;-1&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-13_flowchart-v2-crossEnd-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;17.7&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-13_flowchart-v2-crossStart-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;-3.5&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;g class=&quot;root&quot;&gt;&lt;g class=&quot;clusters&quot;/&gt;&lt;g class=&quot;edgePaths&quot;&gt;&lt;path d=&quot;M117.793,109.789L131.147,97.14C144.5,84.491,171.207,59.193,191.55,46.544C211.893,33.895,225.872,33.895,232.862,33.895L239.852,33.895&quot; id=&quot;epmb-13-L_CREATE_TAX_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_CREATE_TAX_0&quot; data-points=&quot;W3sieCI6MTE3Ljc5MzQ1OTk5MTg5MzA5LCJ5IjoxMDkuNzg5MDYyNX0seyJ4IjoxOTcuOTE0MDYyNSwieSI6MzMuODk0NTMxMjV9LHsieCI6MjQzLjg1MTU2MjUsInkiOjMzLjg5NDUzMTI1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-13_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M172.914,135.684L177.081,135.684C181.247,135.684,189.581,135.684,199.148,135.684C208.715,135.684,219.516,135.684,224.916,135.684L230.316,135.684&quot; id=&quot;epmb-13-L_CREATE_ERP_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_CREATE_ERP_0&quot; data-points=&quot;W3sieCI6MTcyLjkxNDA2MjUsInkiOjEzNS42ODM1OTM3NX0seyJ4IjoxOTcuOTE0MDYyNSwieSI6MTM1LjY4MzU5Mzc1fSx7IngiOjIzNC4zMTY0MDYyNSwieSI6MTM1LjY4MzU5Mzc1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-13_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M117.793,161.578L131.147,174.227C144.5,186.876,171.207,212.174,188.061,224.824C204.914,237.473,211.914,237.473,215.414,237.473L218.914,237.473&quot; id=&quot;epmb-13-L_CREATE_RET_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_CREATE_RET_0&quot; data-points=&quot;W3sieCI6MTE3Ljc5MzQ1OTk5MTg5MzA5LCJ5IjoxNjEuNTc4MTI1fSx7IngiOjE5Ny45MTQwNjI1LCJ5IjoyMzcuNDcyNjU2MjV9LHsieCI6MjIyLjkxNDA2MjUsInkiOjIzNy40NzI2NTYyNX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-13_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M444.742,33.895L452.398,33.895C460.055,33.895,475.367,33.895,496.493,46.006C517.618,58.118,544.557,82.341,558.026,94.453L571.496,106.565&quot; id=&quot;epmb-13-L_TAX_FIELD_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_TAX_FIELD_0&quot; data-points=&quot;W3sieCI6NDQ0Ljc0MjE4NzUsInkiOjMzLjg5NDUzMTI1fSx7IngiOjQ5MC42Nzk2ODc1LCJ5IjozMy44OTQ1MzEyNX0seyJ4Ijo1NzQuNDcwMDQ2MzU2OTI1LCJ5IjoxMDkuMjM5MDYyNX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-13_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M454.277,135.684L460.344,135.684C466.411,135.684,478.546,135.684,488.113,135.684C497.68,135.684,504.68,135.684,508.18,135.684L511.68,135.684&quot; id=&quot;epmb-13-L_ERP_FIELD_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_ERP_FIELD_0&quot; data-points=&quot;W3sieCI6NDU0LjI3NzM0Mzc1LCJ5IjoxMzUuNjgzNTkzNzV9LHsieCI6NDkwLjY3OTY4NzUsInkiOjEzNS42ODM1OTM3NX0seyJ4Ijo1MTUuNjc5Njg3NSwieSI6MTM1LjY4MzU5Mzc1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-13_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M465.68,237.473L469.846,237.473C474.013,237.473,482.346,237.473,499.982,225.361C517.618,213.249,544.557,189.026,558.026,176.914L571.496,164.803&quot; id=&quot;epmb-13-L_RET_FIELD_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_RET_FIELD_0&quot; data-points=&quot;W3sieCI6NDY1LjY3OTY4NzUsInkiOjIzNy40NzI2NTYyNX0seyJ4Ijo0OTAuNjc5Njg3NSwieSI6MjM3LjQ3MjY1NjI1fSx7IngiOjU3NC40NzAwNDYzNTY5MjUsInkiOjE2Mi4xMjgxMjV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-13_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M692.078,135.684L696.245,135.684C700.411,135.684,708.745,135.684,716.411,135.684C724.078,135.684,731.078,135.684,734.578,135.684L738.078,135.684&quot; id=&quot;epmb-13-L_FIELD_FAIL_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_FIELD_FAIL_0&quot; data-points=&quot;W3sieCI6NjkyLjA3ODEyNSwieSI6MTM1LjY4MzU5Mzc1fSx7IngiOjcxNy4wNzgxMjUsInkiOjEzNS42ODM1OTM3NX0seyJ4Ijo3NDIuMDc4MTI1LCJ5IjoxMzUuNjgzNTkzNzV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-13_flowchart-v2-pointEnd)&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabels&quot;&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_CREATE_TAX_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_CREATE_ERP_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_CREATE_RET_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_TAX_FIELD_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_ERP_FIELD_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_RET_FIELD_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_FIELD_FAIL_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;nodes&quot;&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-13-flowchart-CREATE-0&quot; data-look=&quot;classic&quot; transform=&quot;translate(90.45703125, 135.68359375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-82.45703125&quot; y=&quot;-25.89453125&quot; width=&quot;164.9140625&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Order&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; created&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-13-flowchart-TAX-1&quot; data-look=&quot;classic&quot; transform=&quot;translate(344.296875, 33.89453125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-100.4453125&quot; y=&quot;-25.89453125&quot; width=&quot;200.890625&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Tax&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; app&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; writes&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; VAT&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-13-flowchart-ERP-3&quot; data-look=&quot;classic&quot; transform=&quot;translate(344.296875, 135.68359375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-109.98046875&quot; y=&quot;-25.89453125&quot; width=&quot;219.9609375&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;ERP&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; app&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; writes&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; status&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-13-flowchart-RET-5&quot; data-look=&quot;classic&quot; transform=&quot;translate(344.296875, 237.47265625)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-121.3828125&quot; y=&quot;-25.89453125&quot; width=&quot;242.765625&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Orphan&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; webhook&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; retries&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-13-flowchart-FIELD-7&quot; data-look=&quot;classic&quot; transform=&quot;translate(603.87890625, 135.68359375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-88.19921875&quot; y=&quot;-26.44453125&quot; width=&quot;176.3984375&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Same&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; metafield&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;namespace&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-13-flowchart-FAIL-13&quot; data-look=&quot;classic&quot; transform=&quot;translate(855.375, 135.68359375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-113.296875&quot; y=&quot;-26.44453125&quot; width=&quot;226.59375&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Fulfilment&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; and&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; reports&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;disagree&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-13-drop-shadow&quot; height=&quot;130%&quot; width=&quot;130%&quot;&gt;&lt;fedropshadow dx=&quot;4&quot; dy=&quot;4&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-13-drop-shadow-small&quot; height=&quot;150%&quot; width=&quot;150%&quot;&gt;&lt;fedropshadow dx=&quot;2&quot; dy=&quot;2&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;linearGradient id=&quot;epmb-13-gradient&quot; gradientUnits=&quot;objectBoundingBox&quot; x1=&quot;0%&quot; y1=&quot;0%&quot; x2=&quot;100%&quot; y2=&quot;0%&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#db5461&quot; stop-opacity=&quot;1&quot;/&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;hsl(0, 0%, 20.1960784314%)&quot; stop-opacity=&quot;1&quot;/&gt;&lt;/linearGradient&gt;&lt;text text-anchor=&quot;middle&quot; x=&quot;510.984375&quot; y=&quot;-25&quot; class=&quot;flowchartTitleText&quot;&gt;Split ownership on a single order&lt;/text&gt;&lt;/svg&gt;
  &lt;/div&gt;
  
  &lt;figcaption class=&quot;epmb-figure__caption&quot; id=&quot;epmb-13-caption&quot;&gt;Split ownership on a single order&lt;/figcaption&gt;
&lt;/figure&gt;&lt;p&gt;Walk one order with these questions:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Which app wrote &lt;code&gt;order.metafields&lt;/code&gt; in the last 24 hours?&lt;/li&gt;&lt;li&gt;Which webhooks fired on &lt;code&gt;orders/create&lt;/code&gt; and &lt;code&gt;orders/paid&lt;/code&gt;?&lt;/li&gt;&lt;li&gt;Does any destination URL belong to an app that is no longer installed?&lt;/li&gt;&lt;li&gt;Who is allowed to change inventory on the variant: Shopify, the ERP, or a 3PL tool?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If two answers name two products, you have &lt;strong&gt;split ownership&lt;/strong&gt;. Scaling traffic makes both writers retry at once, with no extra owner in between.&lt;/p&gt;&lt;h2&gt;Why volume exposes the seams&lt;/h2&gt;&lt;p&gt;Low volume hides latency. A tax call that takes 800ms looks like a slow admin. The same call under a sale sits behind a queue, then Shopify’s rate limits, then a buyer-facing error.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Domain&lt;/th&gt;&lt;th&gt;Healthy ownership&lt;/th&gt;&lt;th&gt;What split ownership looks like&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Inventory&lt;/td&gt;&lt;td&gt;One system of record; others read&lt;/td&gt;&lt;td&gt;Oversells after every promo; two “available” counts&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tax&lt;/td&gt;&lt;td&gt;One calculator on checkout&lt;/td&gt;&lt;td&gt;Two tax apps, locale fights, refunds for wrong VAT&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Order status&lt;/td&gt;&lt;td&gt;Shopify plus one fulfilment owner&lt;/td&gt;&lt;td&gt;Three metafields, none matching the packing bench&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Customer tags&lt;/td&gt;&lt;td&gt;One lifecycle tool&lt;/td&gt;&lt;td&gt;Loyalty, reviews, and email all stamp overlapping tags&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-checkout-abandonment-when-your-funnel-looks-healthy/&quot;&gt;&lt;em&gt;How to Fix Shopify Checkout Abandonment When Your Funnel Looks Healthy&lt;/em&gt;&lt;/a&gt; covers buyer-facing checkout friction. Use that when the form itself fails. Use this article when the form is fine and the &lt;strong&gt;integrations on the path&lt;/strong&gt; are not.&lt;/p&gt;&lt;h2&gt;A dependency map you can finish this week&lt;/h2&gt;&lt;p&gt;You do not need a full rebuild to see the ceiling. You need a list the next person can read.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Export installed apps&lt;/strong&gt; with the job you think each one owns. One job per row. If two rows say “inventory,” mark the fight.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;List webhooks&lt;/strong&gt; in Shopify admin. Delete destinations for apps you do not recognise. Note retries on &lt;code&gt;orders/paid&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Pick five SKUs&lt;/strong&gt; that sell in bundles or subscriptions. Confirm which app decrements stock, and whether a second app writes a parallel count.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Time a blocking call&lt;/strong&gt; on the purchase path: tax, inventory check, custom script. If it must succeed before thank-you, it will fail in a spike.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Write the owner&lt;/strong&gt; next to each domain: inventory, tax, email, reviews, fulfilment. Anything without a name is a future incident.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The output is a one-page diagram, not a new app. Subtraction starts from that page.&lt;/p&gt;&lt;h2&gt;How to read Shopify webhooks without guessing&lt;/h2&gt;&lt;p&gt;Admin → Settings → Notifications → Webhooks is the fastest honesty check. You want three columns: event, destination, last delivery.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Orders/create and orders/paid&lt;/strong&gt; should hit systems that still exist. A 410 or repeated failure on a URL that includes an old app slug is an orphan. Delete it. It still counts against rate limits when Shopify retries.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Fulfillment events&lt;/strong&gt; should hit one packing or 3PL owner. Two destinations that both “create a shipment” are how customers get two tracking emails and one missing parcel.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Product and inventory webhooks&lt;/strong&gt; should flow one way. If Shopify notifies the ERP and the ERP writes available stock back into Shopify on a delay, a promo will sell units the warehouse already allocated. Pick a single system of record for on-hand quantity. The other system reads.&lt;/p&gt;&lt;p&gt;Write the last successful delivery time next to each row. A webhook that has not succeeded since the last theme deploy is a silent failure, not a spare integration.&lt;/p&gt;&lt;p&gt;This pass usually removes more risk than installing a monitoring app. You are deleting writers that nobody can name.&lt;/p&gt;&lt;p&gt;If Shopify’s webhook log shows retries in bursts at the same minute as a flash sale, treat that destination as blocking even when the app page still says connected. Retry storms are how a working integration becomes a checkout timeout. Move non-essential destinations off &lt;code&gt;orders/paid&lt;/code&gt; or delay them until after the thank-you page, where the buyer is no longer waiting on the round trip.&lt;/p&gt;&lt;h2&gt;Inventory is the first domain to settle&lt;/h2&gt;&lt;p&gt;Most “random oversells” are two available counts. Shopify has variant inventory. A 3PL or ERP has another. A bundle app may keep a third.&lt;/p&gt;&lt;p&gt;Settle it like this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Name the system that is allowed to decrement on sale.&lt;/li&gt;&lt;li&gt;Confirm bundles consume components in that same system, not in a parallel metafield.&lt;/li&gt;&lt;li&gt;Stop any second app from writing &lt;code&gt;inventory_quantity&lt;/code&gt; unless it is the designated owner.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Until that is true, every campaign is a coin flip on stock accuracy. The second writer is the constraint, even when paid traffic is cheap.&lt;/p&gt;&lt;h2&gt;What to subtract first&lt;/h2&gt;&lt;p&gt;The instinct after a failed promo is to install a “sync” layer. That layer becomes a fourth writer.&lt;/p&gt;&lt;p&gt;Subtract in this order:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Orphan webhooks and dead apps.&lt;/strong&gt; They still fire. They still collide.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Second tax, second inventory, second reviews tool.&lt;/strong&gt; Keep the one that actually owns production data. Pause the rest for a week and watch error rates, not feelings.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Scripts on the checkout path&lt;/strong&gt; that call a third party before the order is created. Move them after purchase where the law and the flow allow.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Undocumented metafield namespaces.&lt;/strong&gt; If two apps share a key, rename or retire one. Do not “merge in Sheets” as the standing process.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;A store with eight apps and one owner per domain will outlast a store with four apps that all write &lt;code&gt;custom.erp_status&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Hand the one-page map to the next person who will touch admin. If they cannot tell which app to leave alone during a sale, the document is not finished. Names, not tool logos, belong on that page.&lt;/p&gt;&lt;h2&gt;Why Plus is the wrong first lever&lt;/h2&gt;&lt;p&gt;Shopify Plus is the right plan when you need checkout UI extensions, Functions, expansion stores, or B2B pricing. It is the wrong first lever when the incident is two tax apps and a queued webhook.&lt;/p&gt;&lt;p&gt;The plan change leaves the extra writer in place and raises the monthly floor while the same retry storm runs. &lt;a href=&quot;https://ocontis.studio/blog/post/choosing-the-right-shopify-plan-a-practical-decision-framework/&quot;&gt;&lt;em&gt;Choosing the Right Shopify Plan: A Practical Decision Framework&lt;/em&gt;&lt;/a&gt; is the place to decide on Plus features. Come back here for the ownership map that Plus will inherit.&lt;/p&gt;&lt;h2&gt;When the map is bigger than the team&lt;/h2&gt;&lt;p&gt;Internal cleanup stalls for predictable reasons. The person who installed the app still defends it. The Tuesday spreadsheet feels cheaper than a cutover. Nobody wants to pull an integration during a sale.&lt;/p&gt;&lt;p&gt;The same team cannot map webhooks while packing orders and still finish before the next spike. The stall is missing hours, which an extra slide deck will not create.&lt;/p&gt;&lt;p&gt;A &lt;a href=&quot;https://ocontis.studio/services/shopify-stack-audit/&quot;&gt;Shopify Stack Audit&lt;/a&gt; is useful when you need an external list of writers, a cut sequence that starts on a quiet week rather than the Friday before a sale, and a partner who will own the remainder. Expect the map and the subtraction order rather than another middleware invoice.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Shopify stores cannot scale on a bloated stack because &lt;strong&gt;dependencies compound faster than features&lt;/strong&gt;. Count writers on each order field. App count will leave that blank.&lt;/p&gt;&lt;p&gt;Map one week of orders, webhooks, and owners. Delete the orphans. Give each domain a single system of record. Then decide whether Plus, a new theme, or a new app is even on the list.&lt;/p&gt;&lt;p&gt;If you cannot draw that path, or if removing an app still feels like defusing a bomb, the architecture is already the ceiling. Start with a &lt;a href=&quot;https://ocontis.studio/services/shopify-stack-audit/&quot;&gt;Shopify Stack Audit&lt;/a&gt; and get the writers on one page before the next traffic spike tests them for you.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>How to Keep the Shopify Claude Connector Away from Production Data</title>
    <link href="https://ocontis.studio/blog/post/how-to-keep-the-shopify-claude-connector-away-from-production-data/" />
    <updated>2026-08-31T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/how-to-keep-the-shopify-claude-connector-away-from-production-data/</id>
    <content type="html">&lt;h1&gt;How to Keep the Shopify Claude Connector Away from Production Data&lt;/h1&gt;&lt;p&gt;The official Shopify connector for Claude reads live orders, edits live prices, and writes live discount codes. There is no sandbox, no staging toggle, and no dry-run mode. Every approved write applies to the same storefront your customers see.&lt;/p&gt;&lt;p&gt;For operational Q&amp;amp;A that is fine. For write experiments, prompt iteration, or catalogue cleanup, live is the wrong environment.&lt;/p&gt;&lt;p&gt;Shopify does not ship a sandbox for the Claude connector. You build isolation yourself: a development store mirror, a scoped API token, or a custom MCP server that stands between Claude and your production admin.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;If you connected the official Shopify Claude connector expecting a safe space to test AI queries, you discovered there is no safe space. Read queries pull real customer data. Write confirmations push real changes. The connector treats every store like production because every store it connects to is production.&lt;/p&gt;&lt;p&gt;That model works for quick operational checks: yesterday&#39;s order count, which SKUs are low, whether a campaign code is active. The approach breaks down when you want to iterate on prompts, test bulk edits, or explore what Claude can do before trusting it with live inventory. If you are still deciding whether AI assistants add value to your workflow, see &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-sidekicks-continual-learning-flywheel-what-merchants-should-know/&quot;&gt;&lt;em&gt;Shopify Sidekick&#39;s Continual Learning Flywheel&lt;/em&gt;&lt;/a&gt; for a broader look at how Shopify is training these systems.&lt;/p&gt;&lt;p&gt;The existing &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-and-claude-connector-setup-benefits-and-risks-for-merchants/&quot;&gt;&lt;em&gt;Shopify Claude Connector: Setup, Permissions, and Risks&lt;/em&gt;&lt;/a&gt; covers installation and safe-use discipline. This article goes deeper: three architecture patterns that isolate AI experiments from production, when each pattern fits, and the trade-offs you accept in exchange for safety.&lt;/p&gt;&lt;h2&gt;The problem: no native sandbox&lt;/h2&gt;&lt;p&gt;Shopify&#39;s approach to AI connectors assumes merchants want immediate value. Connect, authenticate, query. The friction-free install means Claude is talking to live data within minutes.&lt;/p&gt;&lt;p&gt;That speed is a feature for mature operators who know exactly what to ask. It is a risk for teams still learning what AI can do with store access.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;What merchants expect&lt;/th&gt;&lt;th&gt;What the connector provides&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;A staging environment to test prompts&lt;/td&gt;&lt;td&gt;No staging mode. Queries hit production.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;A dry-run flag for write actions&lt;/td&gt;&lt;td&gt;No dry-run. Approved writes apply immediately.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Read-only mode for exploration&lt;/td&gt;&lt;td&gt;No toggle. You decline write confirmations manually.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Scoped access per collection or date range&lt;/td&gt;&lt;td&gt;Access is at the scope level, not at the data level.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Rollback for AI mistakes&lt;/td&gt;&lt;td&gt;No rollback. Restore from backup or reverse manually.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;The connector was designed for a different user: someone who trusts their prompts, reviews every confirmation, and treats Claude like a fast junior admin with production keys.&lt;/p&gt;&lt;p&gt;If you are still learning, or if your catalogue has enough data debt that AI answers might be unreliable, production is a dangerous classroom.&lt;/p&gt;&lt;h2&gt;Three patterns for production isolation&lt;/h2&gt;&lt;p&gt;Each pattern trades some convenience for safety. Pick the one that matches your technical capacity and risk tolerance.&lt;/p&gt;&lt;figure class=&quot;blog-diagram epmb-figure&quot; role=&quot;figure&quot; aria-labelledby=&quot;epmb-12-caption&quot; data-diagram-id=&quot;epmb-12&quot;&gt;
  &lt;p class=&quot;epmb-figure__summary visually-hidden&quot; id=&quot;epmb-12-summary&quot;&gt;Production isolation decision tree&lt;/p&gt;
  &lt;div class=&quot;epmb-figure__brand epmb-figure__brand--top-right&quot;&gt;
  &lt;img class=&quot;epmb-figure__logo&quot; src=&quot;/assets/favicons/safari-pinned-tab.svg&quot; alt=&quot;oContis Studio&quot; width=&quot;32&quot; height=&quot;32&quot; decoding=&quot;async&quot; /&gt;
&lt;/div&gt;
  &lt;div class=&quot;epmb-figure__content&quot;&gt;
    
    &lt;svg id=&quot;epmb-12&quot; width=&quot;100%&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; class=&quot;flowchart&quot; style=&quot;max-width: 896.8828125px;&quot; viewBox=&quot;-8 -50.1015625 896.8828125 522.371875&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot;&gt;&lt;style&gt;#epmb-12{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;fill:#fafae6;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#epmb-12 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#epmb-12 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#epmb-12 .error-icon{fill:#141414;}#epmb-12 .error-text{fill:#ebebeb;stroke:#ebebeb;}#epmb-12 .edge-thickness-normal{stroke-width:1px;}#epmb-12 .edge-thickness-thick{stroke-width:3.5px;}#epmb-12 .edge-pattern-solid{stroke-dasharray:0;}#epmb-12 .edge-thickness-invisible{stroke-width:0;fill:none;}#epmb-12 .edge-pattern-dashed{stroke-dasharray:3;}#epmb-12 .edge-pattern-dotted{stroke-dasharray:2;}#epmb-12 .marker{fill:#8a8a7a;stroke:#8a8a7a;}#epmb-12 .marker.cross{stroke:#8a8a7a;}#epmb-12 svg{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;}#epmb-12 p{margin:0;}#epmb-12 .label{font-family:&#39;Syne&#39;,system-ui,sans-serif;color:#fafae6;}#epmb-12 .cluster-label text{fill:#fafae6;}#epmb-12 .cluster-label span{color:#fafae6;}#epmb-12 .cluster-label span p{background-color:transparent;}#epmb-12 .label text,#epmb-12 span{fill:#fafae6;color:#fafae6;}#epmb-12 .node rect,#epmb-12 .node circle,#epmb-12 .node ellipse,#epmb-12 .node polygon,#epmb-12 .node path{fill:#141414;stroke:#db5461;stroke-width:1px;}#epmb-12 .rough-node .label text,#epmb-12 .node .label text,#epmb-12 .image-shape .label,#epmb-12 .icon-shape .label{text-anchor:middle;}#epmb-12 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#epmb-12 .rough-node .label,#epmb-12 .node .label,#epmb-12 .image-shape .label,#epmb-12 .icon-shape .label{text-align:center;}#epmb-12 .node.clickable{cursor:pointer;}#epmb-12 .root .anchor path{fill:#8a8a7a!important;stroke-width:0;stroke:#8a8a7a;}#epmb-12 .arrowheadPath{fill:#f1eff0;}#epmb-12 .edgePath .path{stroke:#8a8a7a;stroke-width:1px;}#epmb-12 .flowchart-link{stroke:#8a8a7a;fill:none;}#epmb-12 .edgeLabel{background-color:#141414;text-align:center;}#epmb-12 .edgeLabel p{background-color:#141414;}#epmb-12 .edgeLabel rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-12 .labelBkg{background-color:rgba(20, 20, 20, 0.5);}#epmb-12 .cluster rect{fill:#141414;stroke:hsl(0, 0%, 17.8431372549%);stroke-width:1px;}#epmb-12 .cluster text{fill:#fafae6;}#epmb-12 .cluster span{color:#fafae6;}#epmb-12 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:12px;background:#141414;border:1px solid hsl(0, 0%, 17.8431372549%);border-radius:2px;pointer-events:none;z-index:100;}#epmb-12 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fafae6;}#epmb-12 rect.text{fill:none;stroke-width:0;}#epmb-12 .icon-shape,#epmb-12 .image-shape{background-color:#141414;text-align:center;}#epmb-12 .icon-shape p,#epmb-12 .image-shape p{background-color:#141414;padding:2px;}#epmb-12 .icon-shape .label rect,#epmb-12 .image-shape .label rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-12 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#epmb-12 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#epmb-12 .node .neo-node{stroke:#db5461;}#epmb-12 [data-look=&quot;neo&quot;].node rect,#epmb-12 [data-look=&quot;neo&quot;].cluster rect,#epmb-12 [data-look=&quot;neo&quot;].node polygon{stroke:url(#epmb-12-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-12 [data-look=&quot;neo&quot;].swimlane.cluster rect{filter:none;}#epmb-12 [data-look=&quot;neo&quot;].node path{stroke:url(#epmb-12-gradient);stroke-width:1px;}#epmb-12 [data-look=&quot;neo&quot;].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-12 [data-look=&quot;neo&quot;].node .neo-line path{stroke:#db5461;filter:none;}#epmb-12 [data-look=&quot;neo&quot;].node circle{stroke:url(#epmb-12-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-12 [data-look=&quot;neo&quot;].node circle .state-start{fill:#000000;}#epmb-12 [data-look=&quot;neo&quot;].icon-shape .icon{fill:url(#epmb-12-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-12 [data-look=&quot;neo&quot;].icon-shape .icon-neo path{stroke:url(#epmb-12-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-12 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;epmb-12_flowchart-v2-pointEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 10 5 L 0 10 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-12_flowchart-v2-pointStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;4.5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 5 L 10 10 L 10 0 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-12_flowchart-v2-pointEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;11.5&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;10.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 11.5 7 L 0 14 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-12_flowchart-v2-pointStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;1&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;polygon points=&quot;0,7 11.5,14 11.5,0&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-12_flowchart-v2-circleEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;11&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-12_flowchart-v2-circleStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-1&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-12_flowchart-v2-circleEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refY=&quot;5&quot; refX=&quot;12.25&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-12_flowchart-v2-circleStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-2&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-12_flowchart-v2-crossEnd&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;12&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-12_flowchart-v2-crossStart&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;-1&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-12_flowchart-v2-crossEnd-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;17.7&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-12_flowchart-v2-crossStart-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;-3.5&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;g class=&quot;root&quot;&gt;&lt;g class=&quot;clusters&quot;/&gt;&lt;g class=&quot;edgePaths&quot;&gt;&lt;path d=&quot;M359.278,158.788L322.017,177.606C284.757,196.424,210.236,234.061,172.975,258.62C135.715,283.179,135.715,294.661,135.715,300.401L135.715,306.142&quot; id=&quot;epmb-12-L_Q_DEV_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_Q_DEV_0&quot; data-points=&quot;W3sieCI6MzU5LjI3NzY3OTg1NjUwNDEsInkiOjE1OC43ODc4MzYxMDY1MDQwNX0seyJ4IjoxMzUuNzE0ODQzNzUsInkiOjI3MS42OTc2NTYyNX0seyJ4IjoxMzUuNzE0ODQzNzUsInkiOjMxMC4xNDIxODc1MDAwMDAwM31d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-12_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M434.293,233.803L434.293,240.119C434.293,246.435,434.293,259.066,434.293,271.031C434.293,282.996,434.293,294.294,434.293,299.943L434.293,305.592&quot; id=&quot;epmb-12-L_Q_SCOPE_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_Q_SCOPE_0&quot; data-points=&quot;W3sieCI6NDM0LjI5Mjk2ODc1MDAwMDA2LCJ5IjoyMzMuODAzMTI1MDAwMDAwMDV9LHsieCI6NDM0LjI5Mjk2ODc1LCJ5IjoyNzEuNjk3NjU2MjV9LHsieCI6NDM0LjI5Mjk2ODc1LCJ5IjozMDkuNTkyMTg3NX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-12_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M508.291,159.805L543.764,178.454C579.236,197.102,650.18,234.4,685.653,258.79C721.125,283.179,721.125,294.661,721.125,300.401L721.125,306.142&quot; id=&quot;epmb-12-L_Q_MCP_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_Q_MCP_0&quot; data-points=&quot;W3sieCI6NTA4LjI5MTM3NjY1MjA4MzIsInkiOjE1OS44MDQ3MTcwOTc5MTY4Nn0seyJ4Ijo3MjEuMTI1LCJ5IjoyNzEuNjk3NjU2MjV9LHsieCI6NzIxLjEyNSwieSI6MzEwLjE0MjE4NzUwMDAwMDAzfV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-12_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M135.715,361.931L135.715,366.19C135.715,370.448,135.715,378.965,135.715,386.723C135.715,394.481,135.715,401.481,135.715,404.981L135.715,408.481&quot; id=&quot;epmb-12-L_DEV_D1_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_DEV_D1_0&quot; data-points=&quot;W3sieCI6MTM1LjcxNDg0Mzc1LCJ5IjozNjEuOTMxMjUwMDAwMDAwMDN9LHsieCI6MTM1LjcxNDg0Mzc1LCJ5IjozODcuNDgxMjUwMDAwMDAwMDV9LHsieCI6MTM1LjcxNDg0Mzc1LCJ5Ijo0MTIuNDgxMjUwMDAwMDAwMDV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-12_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M434.293,362.481L434.293,366.648C434.293,370.815,434.293,379.148,434.293,386.815C434.293,394.481,434.293,401.481,434.293,404.981L434.293,408.481&quot; id=&quot;epmb-12-L_SCOPE_S1_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_SCOPE_S1_0&quot; data-points=&quot;W3sieCI6NDM0LjI5Mjk2ODc1LCJ5IjozNjIuNDgxMjUwMDAwMDAwMDV9LHsieCI6NDM0LjI5Mjk2ODc1LCJ5IjozODcuNDgxMjUwMDAwMDAwMDV9LHsieCI6NDM0LjI5Mjk2ODc1LCJ5Ijo0MTIuNDgxMjUwMDAwMDAwMDV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-12_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M721.125,361.931L721.125,366.19C721.125,370.448,721.125,378.965,721.125,386.723C721.125,394.481,721.125,401.481,721.125,404.981L721.125,408.481&quot; id=&quot;epmb-12-L_MCP_M1_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_MCP_M1_0&quot; data-points=&quot;W3sieCI6NzIxLjEyNSwieSI6MzYxLjkzMTI1MDAwMDAwMDAzfSx7IngiOjcyMS4xMjUsInkiOjM4Ny40ODEyNTAwMDAwMDAwNX0seyJ4Ijo3MjEuMTI1LCJ5Ijo0MTIuNDgxMjUwMDAwMDAwMDV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-12_flowchart-v2-pointEnd)&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabels&quot;&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(135.71484375, 271.69765625)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q_DEV_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-22.26171875&quot; y=&quot;-18.1015625&quot; width=&quot;44.5234375&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;None&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(434.29296875, 271.69765625)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q_SCOPE_0&quot; transform=&quot;translate(0, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-23.15234375&quot; y=&quot;-18.1015625&quot; width=&quot;46.3046875&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Some&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(721.125, 271.69765625)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q_MCP_0&quot; transform=&quot;translate(-20.830078125, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-15.0859375&quot; y=&quot;-18.1015625&quot; width=&quot;71.83203125&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Full&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; control&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_DEV_D1_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_SCOPE_S1_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_MCP_M1_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;nodes&quot;&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-12-flowchart-Q-0&quot; data-look=&quot;classic&quot; transform=&quot;translate(434.29296875, 120.9015625)&quot;&gt;&lt;polygon points=&quot;112.9015625,0 225.803125,-112.9015625 112.9015625,-225.803125 0,-112.9015625&quot; class=&quot;label-container&quot; transform=&quot;translate(-112.4015625, 112.9015625)&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;How&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; much&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; engineering&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;can&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; you&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; invest?&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-12-flowchart-DEV-2&quot; data-look=&quot;classic&quot; transform=&quot;translate(135.71484375, 336.03671875000003)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-127.71484375&quot; y=&quot;-25.89453125&quot; width=&quot;255.4296875&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Development&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; store&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; mirror&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-12-flowchart-SCOPE-4&quot; data-look=&quot;classic&quot; transform=&quot;translate(434.29296875, 336.03671875000003)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-101.49609375&quot; y=&quot;-26.44453125&quot; width=&quot;202.9921875&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Scoped&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; API&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; token&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; +&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;read-only&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-12-flowchart-MCP-6&quot; data-look=&quot;classic&quot; transform=&quot;translate(721.125, 336.03671875000003)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-103.4453125&quot; y=&quot;-25.89453125&quot; width=&quot;206.890625&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Custom&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; MCP&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; server&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-12-flowchart-D1-8&quot; data-look=&quot;classic&quot; transform=&quot;translate(135.71484375, 438.37578125000005)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-121.625&quot; y=&quot;-25.89453125&quot; width=&quot;243.25&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Safe&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; writes,&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; manual&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; sync&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-12-flowchart-S1-10&quot; data-look=&quot;classic&quot; transform=&quot;translate(434.29296875, 438.37578125000005)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-126.953125&quot; y=&quot;-25.89453125&quot; width=&quot;253.90625&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Safe&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; reads,&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; blocked&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; writes&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-12-flowchart-M1-12&quot; data-look=&quot;classic&quot; transform=&quot;translate(721.125, 438.37578125000005)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-109.87890625&quot; y=&quot;-25.89453125&quot; width=&quot;219.7578125&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Full&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; control&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; over&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; both&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-12-drop-shadow&quot; height=&quot;130%&quot; width=&quot;130%&quot;&gt;&lt;fedropshadow dx=&quot;4&quot; dy=&quot;4&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-12-drop-shadow-small&quot; height=&quot;150%&quot; width=&quot;150%&quot;&gt;&lt;fedropshadow dx=&quot;2&quot; dy=&quot;2&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;linearGradient id=&quot;epmb-12-gradient&quot; gradientUnits=&quot;objectBoundingBox&quot; x1=&quot;0%&quot; y1=&quot;0%&quot; x2=&quot;100%&quot; y2=&quot;0%&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#db5461&quot; stop-opacity=&quot;1&quot;/&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;hsl(0, 0%, 20.1960784314%)&quot; stop-opacity=&quot;1&quot;/&gt;&lt;/linearGradient&gt;&lt;text text-anchor=&quot;middle&quot; x=&quot;440.44140625&quot; y=&quot;-25&quot; class=&quot;flowchartTitleText&quot;&gt;Production isolation decision tree&lt;/text&gt;&lt;/svg&gt;
  &lt;/div&gt;
  
  &lt;figcaption class=&quot;epmb-figure__caption&quot; id=&quot;epmb-12-caption&quot;&gt;Production isolation decision tree&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h3&gt;Pattern 1: Development store mirror&lt;/h3&gt;&lt;p&gt;A Shopify Partner development store is free, accepts the same connector install, and cannot harm live customers.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Create a development store from your Partner dashboard with the same plan features your production store uses.&lt;/li&gt;&lt;li&gt;Export products, collections, and metafields from production. Import into the dev store.&lt;/li&gt;&lt;li&gt;Generate sample orders if your queries involve order data. Apps like Order Generator or manual GraphQL mutations work.&lt;/li&gt;&lt;li&gt;Connect Claude to the dev store.&lt;/li&gt;&lt;li&gt;Run experiments, iterate prompts, and test bulk edits without risk to live customers.&lt;/li&gt;&lt;li&gt;When a prompt works reliably, reconnect Claude to production and repeat it with confidence.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Trade-offs:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The dev store drifts. Every product you add to production, every metafield you update, every collection you restructure needs a mirror update or your test environment stops matching reality. For stores with stable catalogues, the overhead is low. For stores running weekly SKU drops or seasonal rotations, the sync burden adds up.&lt;/p&gt;&lt;p&gt;This pattern is best for teams who want zero code and can tolerate manual sync windows.&lt;/p&gt;&lt;h3&gt;Pattern 2: Scoped API token with read-only access&lt;/h3&gt;&lt;p&gt;If you can issue a custom app token with limited scopes, you can give Claude read access without write risk.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Create a custom app in your Shopify admin (Settings → Apps and sales channels → Develop apps).&lt;/li&gt;&lt;li&gt;Grant only read scopes: &lt;code&gt;read_products&lt;/code&gt;, &lt;code&gt;read_orders&lt;/code&gt;, &lt;code&gt;read_customers&lt;/code&gt;, &lt;code&gt;read_inventory&lt;/code&gt;. Omit every write scope.&lt;/li&gt;&lt;li&gt;Generate an Admin API access token.&lt;/li&gt;&lt;li&gt;Use a local MCP client (Claude Desktop, Cursor, or a self-hosted setup) that accepts custom API tokens instead of the official connector.&lt;/li&gt;&lt;li&gt;Claude queries production data. Write actions fail because the token lacks permission.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Trade-offs:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The official Shopify connector does not accept arbitrary tokens. You need a client that supports custom Admin MCP configuration, which means Claude Desktop with MCP add-ons, Cursor with the Shopify AI Toolkit, or your own tooling. Expect initial setup time rather than a &amp;quot;connect and go&amp;quot; experience.&lt;/p&gt;&lt;p&gt;Technical teams who already use developer tooling and want production reads without production writes will find this pattern the best fit.&lt;/p&gt;&lt;h3&gt;Pattern 3: Custom MCP server&lt;/h3&gt;&lt;p&gt;The most flexible option is a server you control, where Claude talks to your code and your code decides what reaches Shopify.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Build an MCP server that exposes tools for the queries you want Claude to run: order summaries, inventory checks, product searches.&lt;/li&gt;&lt;li&gt;Behind each tool, call Shopify&#39;s Admin API with a token you control.&lt;/li&gt;&lt;li&gt;For writes, either block them entirely, route them to a dev store, or queue them for human approval before executing on production.&lt;/li&gt;&lt;li&gt;Run the server locally or on your own infrastructure. Point Claude at it instead of the official connector.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Trade-offs:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;You are writing and maintaining code. The MCP protocol is documented, but you are now responsible for authentication, error handling, rate limits, and keeping your tools in sync with Shopify&#39;s API changes. For teams with engineering capacity, this is the safest and most precise option. For teams without developers on staff, the maintenance burden is real.&lt;/p&gt;&lt;p&gt;This pattern is best for brands with retained technical partners or in-house developers who want full control over what AI can see and do.&lt;/p&gt;&lt;h2&gt;Choosing the right pattern&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Consideration&lt;/th&gt;&lt;th&gt;Dev store mirror&lt;/th&gt;&lt;th&gt;Scoped token&lt;/th&gt;&lt;th&gt;Custom MCP&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Engineering required&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;td&gt;Minimal (token setup)&lt;/td&gt;&lt;td&gt;Moderate to high&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Ongoing maintenance&lt;/td&gt;&lt;td&gt;Catalogue sync&lt;/td&gt;&lt;td&gt;Token rotation&lt;/td&gt;&lt;td&gt;Server and API changes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Read isolation&lt;/td&gt;&lt;td&gt;Yes (separate store)&lt;/td&gt;&lt;td&gt;No (reads production)&lt;/td&gt;&lt;td&gt;Configurable&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Write isolation&lt;/td&gt;&lt;td&gt;Yes (dev store only)&lt;/td&gt;&lt;td&gt;Yes (no write scopes)&lt;/td&gt;&lt;td&gt;Yes (you decide)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Data freshness&lt;/td&gt;&lt;td&gt;Manual sync lag&lt;/td&gt;&lt;td&gt;Live&lt;/td&gt;&lt;td&gt;Live&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Best for&lt;/td&gt;&lt;td&gt;Prompt iteration, training&lt;/td&gt;&lt;td&gt;Safe operational reads&lt;/td&gt;&lt;td&gt;Controlled automation&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Most brands start with the dev store mirror because it requires no code. Teams that outgrow the sync overhead move to scoped tokens for read-only production access. Custom MCP servers appear when automation needs become specific enough to justify the build.&lt;/p&gt;&lt;h2&gt;Implementation notes&lt;/h2&gt;&lt;h3&gt;Dev store mirror&lt;/h3&gt;&lt;p&gt;Keep a sync script or documented manual process. At minimum, update the dev store whenever you run a major catalogue change or before a testing session. Stale sample data leads to prompts that work in testing and fail in production.&lt;/p&gt;&lt;p&gt;Consider using Shopify&#39;s Matrixify app or GraphQL bulk exports to move products and metafields. For order data, generate enough samples to cover your common query patterns: recent orders, refunds, high-value orders, subscription renewals if relevant.&lt;/p&gt;&lt;h3&gt;Scoped token&lt;/h3&gt;&lt;p&gt;Store the token securely. Rotate it periodically. Document which scopes are granted so future audits know exactly what Claude could access.&lt;/p&gt;&lt;p&gt;If you later want write access, create a second app with write scopes and use it only for deliberate, supervised sessions. Keep the read-only token as your default.&lt;/p&gt;&lt;h3&gt;Custom MCP server&lt;/h3&gt;&lt;p&gt;Shopify&#39;s MCP documentation and the open-source Shopify Dev MCP in the AI Toolkit are starting points. You are not building from scratch. You are adapting existing patterns to your access control requirements.&lt;/p&gt;&lt;p&gt;Log what Claude asks for. When a query fails or returns unexpected results, the logs tell you whether the issue is your server, your token scopes, or the data itself.&lt;/p&gt;&lt;h2&gt;The limits of isolation&lt;/h2&gt;&lt;p&gt;Isolation patterns keep AI away from production data, but they leave the data itself unchanged.&lt;/p&gt;&lt;p&gt;If your catalogue has duplicate metafields, inconsistent variant titles, or app-driven conflicts, Claude will produce unreliable answers on the dev store too. The underlying problems described in &lt;a href=&quot;https://ocontis.studio/blog/post/the-hidden-cost-of-running-a-shopify-store-when-12-apps-quietly-eat-your-margins/&quot;&gt;&lt;em&gt;The Hidden Cost of Running a Shopify Store When 12 Apps Quietly Eat Your Margins&lt;/em&gt;&lt;/a&gt; show up whether AI queries production or staging. Stores with significant &lt;a href=&quot;https://ocontis.studio/blog/post/the-anatomy-of-a-high-performance-shopify-theme/&quot;&gt;&lt;em&gt;theme architecture debt&lt;/em&gt;&lt;/a&gt; or convoluted metafield structures need cleanup before AI can surface accurate summaries.&lt;/p&gt;&lt;p&gt;Sandboxing lets you experiment safely, but safe experiments can still produce wrong answers when the underlying data is messy. Data architecture work comes first if your priority is trustworthy AI answers.&lt;/p&gt;&lt;h2&gt;When to get help&lt;/h2&gt;&lt;p&gt;Consider bringing in Shopify development support when:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;You want a custom MCP server but lack engineering capacity&lt;/li&gt;&lt;li&gt;Your dev store sync process is taking more time than the AI experiments save&lt;/li&gt;&lt;li&gt;Catalogue debt means AI answers are unreliable even in staging&lt;/li&gt;&lt;li&gt;You need scoped automation that writes to production with human approval gates&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;These patterns are not difficult in isolation, but they compound with existing stack complexity. A &lt;a href=&quot;https://ocontis.studio/services/shopify-stack-audit/&quot;&gt;Shopify Stack Audit&lt;/a&gt; maps what needs fixing before you layer AI access on top.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;The Shopify Claude connector does not come with a sandbox because Shopify assumed merchants would treat it like a fast admin tool, not a development environment. For operational queries, that assumption holds. For write experiments, prompt iteration, or teams still learning what AI can do, production is the wrong place to learn.&lt;/p&gt;&lt;p&gt;Build your own isolation. A development store mirror costs nothing and requires no code. Scoped tokens give you live reads without write risk. Custom MCP servers give you full control at the cost of maintenance.&lt;/p&gt;&lt;p&gt;Start with the pattern that matches your technical capacity. Add complexity only when simpler options stop working. And before any of this, make sure the data AI will query is clean enough to produce answers worth trusting.&lt;/p&gt;&lt;p&gt;If your stack already has catalogue debt, metafield sprawl, or integration conflicts, fix those first. Sandboxing keeps AI safe. Clean architecture makes it useful.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;Book a stack assessment&lt;/a&gt; if you want to map both: what needs isolating and what needs rebuilding before AI can add value.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Shopify Additional Scripts Cutoff on 26 August 2026: What Happened and What to Do Now</title>
    <link href="https://ocontis.studio/blog/post/shopify-additional-scripts-cutoff-on-26-august-2026-what-happened-and-what-to-do-now/" />
    <updated>2026-08-30T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/shopify-additional-scripts-cutoff-on-26-august-2026-what-happened-and-what-to-do-now/</id>
    <content type="html">&lt;h1&gt;Shopify Additional Scripts Cutoff on 26 August 2026: What Happened and What to Do Now&lt;/h1&gt;&lt;p&gt;On 26 August 2026, Shopify auto-upgraded Thank you and Order status pages on every non-Plus store that had not upgraded manually. Anything in the Additional Scripts field stopped running. Google Ads, Meta, TikTok, GA4/GTM, and affiliate tags pasted there went silent, with no error message and no warning banner.&lt;/p&gt;&lt;p&gt;If you run a non-Plus Shopify store and your ad platforms show a sudden drop in purchase events this week, this is the likely cause. The fix ranges from a ten-minute pixel swap to a larger stack review, depending on what you had in that field and whether your tracking ever worked correctly in the first place.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;Shopify announced this deadline months ago. The Additional Scripts field has been view-only since August 2025, and the upgrade path through Customer Events has been available for over a year. Merchants who followed the prompts in Settings, Checkout, Configurations saw the notice and handled it.&lt;/p&gt;&lt;p&gt;The stores now in trouble are the ones where nobody clicked Upgrade, nobody checked if tracking still worked, and nobody realised the auto-upgrade was coming. That describes a lot of brands, especially those without a dedicated technical partner watching checkout settings.&lt;/p&gt;&lt;p&gt;This article explains what actually changed, how to check if you are affected, and what the fix path looks like depending on your stack. Everything here comes from public Shopify documentation and the observable behaviour of stores that went through the upgrade.&lt;/p&gt;&lt;p&gt;For Plus stores that went through this process a year earlier, the same lessons apply if you still have apps or scripts relying on deprecated checkout.liquid patterns. The &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-checkout-abandonment-when-your-funnel-looks-healthy/&quot;&gt;&lt;em&gt;checkout abandonment guide&lt;/em&gt;&lt;/a&gt; covers the diagnostic when conversions drop and funnel analytics look healthy.&lt;/p&gt;&lt;p&gt;If your tracking breakage sits alongside a broader stack of apps and integrations, the fix may connect to issues we cover in &lt;a href=&quot;https://ocontis.studio/blog/post/the-hidden-cost-of-running-a-shopify-store-when-12-apps-quietly-eat-your-margins/&quot;&gt;&lt;em&gt;the hidden cost when twelve apps eat margins&lt;/em&gt;&lt;/a&gt; and &lt;a href=&quot;https://ocontis.studio/blog/post/the-real-cost-of-running-a-shopify-store/&quot;&gt;&lt;em&gt;the real cost of running a Shopify store&lt;/em&gt;&lt;/a&gt;. Tracking is one part of the checkout and post-purchase surface; the rest of the stack matters when the fix expands beyond a pixel swap.&lt;/p&gt;&lt;h2&gt;What happened&lt;/h2&gt;&lt;p&gt;Shopify runs a timeline for deprecating legacy checkout customisations. For non-Plus stores, the Thank you and Order status pages were the only surfaces that ever supported Additional Scripts. The Information, Shipping, and Payment checkout steps were never customisable via Liquid on non-Plus plans.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Date&lt;/th&gt;&lt;th&gt;What changed&lt;/th&gt;&lt;th&gt;Who it affects&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;February 2025&lt;/td&gt;&lt;td&gt;Apps can no longer create script tags on Thank you or Order status pages&lt;/td&gt;&lt;td&gt;All plans&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;August 2025&lt;/td&gt;&lt;td&gt;Additional Scripts becomes view-only; Plus stores auto-upgraded&lt;/td&gt;&lt;td&gt;Plus stores&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;26 August 2026&lt;/td&gt;&lt;td&gt;Non-Plus stores auto-upgraded; Additional Scripts content removed&lt;/td&gt;&lt;td&gt;Basic, Shopify, Advanced&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;The replacement is the &lt;a href=&quot;https://shopify.dev/docs/apps/build/marketing-analytics/customer-events&quot;&gt;Web Pixels API&lt;/a&gt;, which Shopify calls Customer Events in the admin. This is a sandboxed environment where tracking scripts subscribe to standard events (&lt;code&gt;checkout_completed&lt;/code&gt;, &lt;code&gt;page_viewed&lt;/code&gt;, &lt;code&gt;add_to_cart&lt;/code&gt;, and others) rather than executing arbitrary JavaScript in the page.&lt;/p&gt;&lt;p&gt;Stores that upgraded before the cutoff kept their new pixel setup. Stores that did not upgrade had their Additional Scripts content removed with no migration. If you relied on that field for tracking, conversion events stopped firing the moment the auto-upgrade happened.&lt;/p&gt;&lt;p&gt;The upgrade cannot be reverted. Shopify&#39;s help documentation states this explicitly: stores that are auto-upgraded cannot return to the legacy pages.&lt;/p&gt;&lt;h2&gt;Who is affected&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Non-Plus stores with code in Additional Scripts.&lt;/strong&gt; If you ever pasted a Google Ads conversion tag, Meta pixel, TikTok pixel, affiliate snippet, or custom JavaScript into Settings, Checkout, Order processing, Additional Scripts, that code no longer runs.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Stores using app script tags on post-purchase pages.&lt;/strong&gt; Apps that injected tracking or UI via the &lt;code&gt;ScriptTag&lt;/code&gt; API with a display scope of &lt;code&gt;order_status&lt;/code&gt; or &lt;code&gt;all&lt;/code&gt; stopped working on these pages. Some apps updated to use Customer Events or Checkout UI Extensions. Others did not.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Stores that never checked whether tracking worked.&lt;/strong&gt; Shopify showed an upgrade notice in Settings, Checkout, Configurations for affected stores. If your team ignored that notice or assumed someone else handled it, the auto-upgrade applied.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Stores already on the new pages are fine.&lt;/strong&gt; If you manually upgraded at any point since the option appeared, your tracking should still work (assuming the migration was done correctly). Check Settings, Customer events to confirm your pixels are active.&lt;/p&gt;&lt;h2&gt;How to diagnose it&lt;/h2&gt;&lt;p&gt;The symptom is usually a drop in reported purchase conversions on one or more ad platforms while Shopify order volume stays the same. Here is the diagnostic sequence.&lt;/p&gt;&lt;h3&gt;Step 1: Check if you were using Additional Scripts&lt;/h3&gt;&lt;p&gt;Go to Settings, Checkout. Look for the Order processing section. If you see &amp;quot;Additional scripts&amp;quot; with code in it, and you are on a non-Plus plan, that code is no longer executing.&lt;/p&gt;&lt;p&gt;If you do not see the field at all, your store has already been upgraded and the legacy scripts are gone.&lt;/p&gt;&lt;h3&gt;Step 2: Check if Customer Events are active&lt;/h3&gt;&lt;p&gt;Go to Settings, Customer events. You should see a list of app pixels and custom pixels. Each one should show a status (Active, Inactive, or Error).&lt;/p&gt;&lt;p&gt;If you see no pixels listed, you have no tracking on the post-purchase flow. If you see pixels but they show errors, check the error messages for missing permissions or configuration issues.&lt;/p&gt;&lt;h3&gt;Step 3: Place a test order&lt;/h3&gt;&lt;p&gt;The only reliable way to know if tracking fires is to test it. Place a real order (you can refund it afterwards) and check your ad platforms for the corresponding event.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Google Ads:&lt;/strong&gt; In Conversions, Goals, Summary, look for recent conversion events. The event should appear within a few hours.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Meta Events Manager:&lt;/strong&gt; Check the Events tab for Purchase events. Use the Test Events tool to see real-time events from your browser.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;TikTok Events Manager:&lt;/strong&gt; Look for CompletePayment events in the event history.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;GA4:&lt;/strong&gt; In Admin, Data Streams, select your stream, then Realtime or DebugView if you have debug mode on.&lt;/p&gt;&lt;p&gt;If orders appear in Shopify but purchase events do not appear in your ad platforms, your tracking is broken.&lt;/p&gt;&lt;h3&gt;Step 4: Identify what was lost&lt;/h3&gt;&lt;p&gt;If you have access to old admin screenshots, backups, or documentation, find out what code was in the Additional Scripts field. Common contents:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Google Ads conversion tracking (&lt;code&gt;gtag(&#39;event&#39;, &#39;conversion&#39;, ...)&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Meta pixel purchase event (&lt;code&gt;fbq(&#39;track&#39;, &#39;Purchase&#39;, ...)&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;TikTok pixel (&lt;code&gt;ttq.track(&#39;CompletePayment&#39;, ...)&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Google Analytics 4 purchase event&lt;/li&gt;&lt;li&gt;Affiliate network postback scripts (Impact, ShareASale, AWIN, etc.)&lt;/li&gt;&lt;li&gt;Custom JavaScript for order confirmation logic&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The fix depends on what you need to restore.&lt;/p&gt;&lt;figure class=&quot;blog-diagram epmb-figure&quot; role=&quot;figure&quot; aria-labelledby=&quot;epmb-11-caption&quot; data-diagram-id=&quot;epmb-11&quot;&gt;
  &lt;p class=&quot;epmb-figure__summary visually-hidden&quot; id=&quot;epmb-11-summary&quot;&gt;Post-cutoff tracking diagnostic&lt;/p&gt;
  &lt;div class=&quot;epmb-figure__brand epmb-figure__brand--top-right&quot;&gt;
  &lt;img class=&quot;epmb-figure__logo&quot; src=&quot;/assets/favicons/safari-pinned-tab.svg&quot; alt=&quot;oContis Studio&quot; width=&quot;32&quot; height=&quot;32&quot; decoding=&quot;async&quot; /&gt;
&lt;/div&gt;
  &lt;div class=&quot;epmb-figure__content&quot;&gt;
    
    &lt;svg id=&quot;epmb-11&quot; width=&quot;100%&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; class=&quot;flowchart&quot; style=&quot;max-width: 1063.92890625px;&quot; viewBox=&quot;-8 -50.1015625 1063.92890625 871.2265625&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot;&gt;&lt;style&gt;#epmb-11{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;fill:#fafae6;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#epmb-11 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#epmb-11 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#epmb-11 .error-icon{fill:#141414;}#epmb-11 .error-text{fill:#ebebeb;stroke:#ebebeb;}#epmb-11 .edge-thickness-normal{stroke-width:1px;}#epmb-11 .edge-thickness-thick{stroke-width:3.5px;}#epmb-11 .edge-pattern-solid{stroke-dasharray:0;}#epmb-11 .edge-thickness-invisible{stroke-width:0;fill:none;}#epmb-11 .edge-pattern-dashed{stroke-dasharray:3;}#epmb-11 .edge-pattern-dotted{stroke-dasharray:2;}#epmb-11 .marker{fill:#8a8a7a;stroke:#8a8a7a;}#epmb-11 .marker.cross{stroke:#8a8a7a;}#epmb-11 svg{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;}#epmb-11 p{margin:0;}#epmb-11 .label{font-family:&#39;Syne&#39;,system-ui,sans-serif;color:#fafae6;}#epmb-11 .cluster-label text{fill:#fafae6;}#epmb-11 .cluster-label span{color:#fafae6;}#epmb-11 .cluster-label span p{background-color:transparent;}#epmb-11 .label text,#epmb-11 span{fill:#fafae6;color:#fafae6;}#epmb-11 .node rect,#epmb-11 .node circle,#epmb-11 .node ellipse,#epmb-11 .node polygon,#epmb-11 .node path{fill:#141414;stroke:#db5461;stroke-width:1px;}#epmb-11 .rough-node .label text,#epmb-11 .node .label text,#epmb-11 .image-shape .label,#epmb-11 .icon-shape .label{text-anchor:middle;}#epmb-11 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#epmb-11 .rough-node .label,#epmb-11 .node .label,#epmb-11 .image-shape .label,#epmb-11 .icon-shape .label{text-align:center;}#epmb-11 .node.clickable{cursor:pointer;}#epmb-11 .root .anchor path{fill:#8a8a7a!important;stroke-width:0;stroke:#8a8a7a;}#epmb-11 .arrowheadPath{fill:#f1eff0;}#epmb-11 .edgePath .path{stroke:#8a8a7a;stroke-width:1px;}#epmb-11 .flowchart-link{stroke:#8a8a7a;fill:none;}#epmb-11 .edgeLabel{background-color:#141414;text-align:center;}#epmb-11 .edgeLabel p{background-color:#141414;}#epmb-11 .edgeLabel rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-11 .labelBkg{background-color:rgba(20, 20, 20, 0.5);}#epmb-11 .cluster rect{fill:#141414;stroke:hsl(0, 0%, 17.8431372549%);stroke-width:1px;}#epmb-11 .cluster text{fill:#fafae6;}#epmb-11 .cluster span{color:#fafae6;}#epmb-11 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:12px;background:#141414;border:1px solid hsl(0, 0%, 17.8431372549%);border-radius:2px;pointer-events:none;z-index:100;}#epmb-11 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fafae6;}#epmb-11 rect.text{fill:none;stroke-width:0;}#epmb-11 .icon-shape,#epmb-11 .image-shape{background-color:#141414;text-align:center;}#epmb-11 .icon-shape p,#epmb-11 .image-shape p{background-color:#141414;padding:2px;}#epmb-11 .icon-shape .label rect,#epmb-11 .image-shape .label rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-11 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#epmb-11 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#epmb-11 .node .neo-node{stroke:#db5461;}#epmb-11 [data-look=&quot;neo&quot;].node rect,#epmb-11 [data-look=&quot;neo&quot;].cluster rect,#epmb-11 [data-look=&quot;neo&quot;].node polygon{stroke:url(#epmb-11-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-11 [data-look=&quot;neo&quot;].swimlane.cluster rect{filter:none;}#epmb-11 [data-look=&quot;neo&quot;].node path{stroke:url(#epmb-11-gradient);stroke-width:1px;}#epmb-11 [data-look=&quot;neo&quot;].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-11 [data-look=&quot;neo&quot;].node .neo-line path{stroke:#db5461;filter:none;}#epmb-11 [data-look=&quot;neo&quot;].node circle{stroke:url(#epmb-11-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-11 [data-look=&quot;neo&quot;].node circle .state-start{fill:#000000;}#epmb-11 [data-look=&quot;neo&quot;].icon-shape .icon{fill:url(#epmb-11-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-11 [data-look=&quot;neo&quot;].icon-shape .icon-neo path{stroke:url(#epmb-11-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-11 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;epmb-11_flowchart-v2-pointEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 10 5 L 0 10 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-11_flowchart-v2-pointStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;4.5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 5 L 10 10 L 10 0 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-11_flowchart-v2-pointEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;11.5&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;10.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 11.5 7 L 0 14 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-11_flowchart-v2-pointStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;1&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;polygon points=&quot;0,7 11.5,14 11.5,0&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-11_flowchart-v2-circleEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;11&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-11_flowchart-v2-circleStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-1&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-11_flowchart-v2-circleEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refY=&quot;5&quot; refX=&quot;12.25&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-11_flowchart-v2-circleStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-2&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-11_flowchart-v2-crossEnd&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;12&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-11_flowchart-v2-crossStart&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;-1&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-11_flowchart-v2-crossEnd-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;17.7&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-11_flowchart-v2-crossStart-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;-3.5&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;g class=&quot;root&quot;&gt;&lt;g class=&quot;clusters&quot;/&gt;&lt;g class=&quot;edgePaths&quot;&gt;&lt;path d=&quot;M425.238,60.889L425.238,65.056C425.238,69.222,425.238,77.556,425.238,85.222C425.238,92.889,425.238,99.889,425.238,103.389L425.238,106.889&quot; id=&quot;epmb-11-L_START_Q1_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_START_Q1_0&quot; data-points=&quot;W3sieCI6NDI1LjIzODI4MTI1LCJ5Ijo2MC44ODkwNjI0OTk5OTk5OTR9LHsieCI6NDI1LjIzODI4MTI1LCJ5Ijo4NS44ODkwNjI1fSx7IngiOjQyNS4yMzgyODEyNTAwMDAwNiwieSI6MTEwLjg4OTA2MjQ5OTk5OTk1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-11_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M344.888,282.975L310.204,302.774C275.52,322.573,206.153,362.171,171.469,403.656C136.785,445.142,136.785,488.514,136.785,510.2L136.785,531.886&quot; id=&quot;epmb-11-L_Q1_FIX1_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_Q1_FIX1_0&quot; data-points=&quot;W3sieCI6MzQ0Ljg4ODAwMDg2MTY1NTgsInkiOjI4Mi45NzQ3MTk2MTE2NTU3Nn0seyJ4IjoxMzYuNzg1MTU2MjUsInkiOjQwMS43Njk1MzEyNTAwMDAwNn0seyJ4IjoxMzYuNzg1MTU2MjUsInkiOjUzNS44ODU5Mzc1MDAwMDAxfV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-11_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M425.238,363.325L425.238,369.732C425.238,376.14,425.238,388.955,425.238,416.957C425.238,444.958,425.238,488.147,425.238,509.742L425.238,531.336&quot; id=&quot;epmb-11-L_Q1_FIX2_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_Q1_FIX2_0&quot; data-points=&quot;W3sieCI6NDI1LjIzODI4MTI1MDAwMDA2LCJ5IjozNjMuMzI1fSx7IngiOjQyNS4yMzgyODEyNSwieSI6NDAxLjc2OTUzMTI1MDAwMDA2fSx7IngiOjQyNS4yMzgyODEyNSwieSI6NTM1LjMzNTkzNzV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-11_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M504.903,283.66L538.59,303.345C572.276,323.03,639.65,362.4,673.336,387.825C707.023,413.251,707.023,424.733,707.023,430.473L707.023,436.214&quot; id=&quot;epmb-11-L_Q1_Q2_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_Q1_Q2_0&quot; data-points=&quot;W3sieCI6NTA0LjkwMzQxODIwMDQ3ODc3LCJ5IjoyODMuNjU5ODYzMDQ5NTIxMTZ9LHsieCI6NzA3LjAyMjY1NjI1LCJ5Ijo0MDEuNzY5NTMxMjUwMDAwMDZ9LHsieCI6NzA3LjAyMjY1NjI1LCJ5Ijo0NDAuMjE0MDYyNDk5OTk5OX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-11_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M648.135,625.56L633.113,641.69C618.09,657.82,588.045,690.081,573.022,711.86C557.999,733.64,557.999,744.938,557.999,750.587L557.999,756.236&quot; id=&quot;epmb-11-L_Q2_DONE_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_Q2_DONE_0&quot; data-points=&quot;W3sieCI6NjQ4LjEzNTMzNDYyMjY4NDQsInkiOjYyNS41NTk1NTMzNzI2ODQ1fSx7IngiOjU1Ny45OTkyMTg3NSwieSI6NzIyLjM0MTQwNjI1MDAwMDF9LHsieCI6NTU3Ljk5OTIxODc1LCJ5Ijo3NjAuMjM1OTM3NTAwMDAwMX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-11_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M765.91,625.56L780.933,641.69C795.955,657.82,826.001,690.081,841.023,711.86C856.046,733.64,856.046,744.938,856.046,750.587L856.046,756.236&quot; id=&quot;epmb-11-L_Q2_FIX3_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_Q2_FIX3_0&quot; data-points=&quot;W3sieCI6NzY1LjkwOTk3Nzg3NzMxNTcsInkiOjYyNS41NTk1NTMzNzI2ODQzfSx7IngiOjg1Ni4wNDYwOTM3NSwieSI6NzIyLjM0MTQwNjI1MDAwMDF9LHsieCI6ODU2LjA0NjA5Mzc1LCJ5Ijo3NjAuMjM1OTM3NTAwMDAwMX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-11_flowchart-v2-pointEnd)&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabels&quot;&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_START_Q1_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(136.78515625, 401.76953125000006)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q1_FIX1_0&quot; transform=&quot;translate(-40.033203125, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-12.86328125&quot; y=&quot;-18.1015625&quot; width=&quot;105.79296875&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;No&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; pixels&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; listed&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(425.23828125, 401.76953125000006)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q1_FIX2_0&quot; transform=&quot;translate(-62.857421875, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-23.359375&quot; y=&quot;-18.1015625&quot; width=&quot;172.43359375&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Pixels&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; listed&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; but&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; inactive&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(707.02265625, 401.76953125000006)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q1_Q2_0&quot; transform=&quot;translate(-55.431640625, 4.657031249999999)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-26.53515625&quot; y=&quot;-18.1015625&quot; width=&quot;163.93359375&quot; height=&quot;26.8890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Pixels&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; active,&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; still&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; no&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;events&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(557.99921875, 722.3414062500001)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q2_DONE_0&quot; transform=&quot;translate(-19.53125, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-26.49609375&quot; y=&quot;-18.1015625&quot; width=&quot;92.0546875&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Events&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; fire&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(856.04609375, 722.3414062500001)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q2_FIX3_0&quot; transform=&quot;translate(-27.494140625, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-26.49609375&quot; y=&quot;-18.1015625&quot; width=&quot;107.98046875&quot; height=&quot;25.7890625&quot;/&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Events&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; missing&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;nodes&quot;&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-11-flowchart-START-0&quot; data-look=&quot;classic&quot; transform=&quot;translate(425.23828125, 34.44453125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-121.5703125&quot; y=&quot;-26.44453125&quot; width=&quot;243.140625&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Purchase&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; events&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; missing&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;in&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; ad&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; platforms?&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-11-flowchart-Q1-1&quot; data-look=&quot;classic&quot; transform=&quot;translate(425.23828125, 237.10703124999998)&quot;&gt;&lt;polygon points=&quot;126.21796875,0 252.4359375,-126.21796875 126.21796875,-252.4359375 0,-126.21796875&quot; class=&quot;label-container&quot; transform=&quot;translate(-125.71796875, 126.21796875)&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Check&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Settings&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; →&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Customer&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;events&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-11-flowchart-FIX1-3&quot; data-look=&quot;classic&quot; transform=&quot;translate(136.78515625, 562.33046875)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-128.78515625&quot; y=&quot;-26.44453125&quot; width=&quot;257.5703125&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Install&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; native&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; channel&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; apps&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;or&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; add&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; custom&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; pixels&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-11-flowchart-FIX2-5&quot; data-look=&quot;classic&quot; transform=&quot;translate(425.23828125, 562.33046875)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-109.66796875&quot; y=&quot;-26.99453125&quot; width=&quot;219.3359375&quot; height=&quot;53.9890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.99453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Check&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; configuration,&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;permissions,&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; and&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; test&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;2.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;again&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-11-flowchart-Q2-7&quot; data-look=&quot;classic&quot; transform=&quot;translate(707.02265625, 562.33046875)&quot;&gt;&lt;polygon points=&quot;122.11640625,0 244.2328125,-122.11640625 122.11640625,-244.2328125 0,-122.11640625&quot; class=&quot;label-container&quot; transform=&quot;translate(-121.61640625, 122.11640625)&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Place&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; test&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; order,&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;check&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; platform&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; event&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; logs&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-11-flowchart-DONE-9&quot; data-look=&quot;classic&quot; transform=&quot;translate(557.99921875, 786.68046875)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-122.10546875&quot; y=&quot;-26.44453125&quot; width=&quot;244.2109375&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Tracking&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; is&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; working—&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;investigate&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; historical&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; gap&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-11-flowchart-FIX3-11&quot; data-look=&quot;classic&quot; transform=&quot;translate(856.04609375, 786.68046875)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-125.94140625&quot; y=&quot;-26.44453125&quot; width=&quot;251.8828125&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Debug&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; pixel&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; code,&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;check&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; event&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; subscriptions&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-11-drop-shadow&quot; height=&quot;130%&quot; width=&quot;130%&quot;&gt;&lt;fedropshadow dx=&quot;4&quot; dy=&quot;4&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-11-drop-shadow-small&quot; height=&quot;150%&quot; width=&quot;150%&quot;&gt;&lt;fedropshadow dx=&quot;2&quot; dy=&quot;2&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;linearGradient id=&quot;epmb-11-gradient&quot; gradientUnits=&quot;objectBoundingBox&quot; x1=&quot;0%&quot; y1=&quot;0%&quot; x2=&quot;100%&quot; y2=&quot;0%&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#db5461&quot; stop-opacity=&quot;1&quot;/&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;hsl(0, 0%, 20.1960784314%)&quot; stop-opacity=&quot;1&quot;/&gt;&lt;/linearGradient&gt;&lt;text text-anchor=&quot;middle&quot; x=&quot;523.964453125&quot; y=&quot;-25&quot; class=&quot;flowchartTitleText&quot;&gt;Post-cutoff tracking diagnostic&lt;/text&gt;&lt;/svg&gt;
  &lt;/div&gt;
  
  &lt;figcaption class=&quot;epmb-figure__caption&quot; id=&quot;epmb-11-caption&quot;&gt;Post-cutoff tracking diagnostic&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h2&gt;How to fix it&lt;/h2&gt;&lt;p&gt;The fix path depends on your stack complexity. For most stores, this is a ten-minute swap to native channel apps. For stores with custom conversion logic, deduplication requirements, or multiple tracking platforms, the work is larger.&lt;/p&gt;&lt;h3&gt;Path 1: Native channel apps (ten-minute swap)&lt;/h3&gt;&lt;p&gt;Shopify recommends native channel apps for major advertising platforms. These apps use the Web Pixels API correctly and stay updated when Shopify changes the event schema.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Google and YouTube channel:&lt;/strong&gt; Install from the App Store. Configure your Google Ads and Analytics accounts. The app handles purchase events automatically.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Meta (Facebook and Instagram) channel:&lt;/strong&gt; Install from the App Store. Connect your Meta Business account. The app uses the Conversions API for server-side tracking alongside browser events.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;TikTok channel:&lt;/strong&gt; Install from the App Store. Connect your TikTok Ads account.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;After installing, place a test order and confirm events appear in each platform. If you previously had manual pixel code, you may see duplicate events during the overlap period; the native apps handle deduplication when configured correctly.&lt;/p&gt;&lt;h3&gt;Path 2: Custom pixels for other platforms&lt;/h3&gt;&lt;p&gt;For affiliate networks, analytics platforms, or custom conversion logic, add a custom pixel in Settings, Customer events.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Go to Settings, Customer events, Add custom pixel.&lt;/li&gt;&lt;li&gt;Give the pixel a name (e.g., &amp;quot;Affiliate postback&amp;quot;).&lt;/li&gt;&lt;li&gt;Paste the JavaScript code that subscribes to the &lt;code&gt;checkout_completed&lt;/code&gt; event.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Custom pixels run in a sandboxed iframe. They can access standard Shopify analytics events but cannot access the DOM or run arbitrary scripts on the page. The event object includes order details like total price, line items, and customer email (if consented).&lt;/p&gt;&lt;p&gt;Example structure for a custom pixel:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;analytics.subscribe(&#39;checkout_completed&#39;, (event) =&amp;gt; {
  const checkout = event.data.checkout;
  // Send conversion data to your platform
  // checkout.totalPrice, checkout.order.id, etc.
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Shopify documents the available events and data in &lt;a href=&quot;https://shopify.dev/docs/api/web-pixels-api/standard-events&quot;&gt;Customer events reference&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Path 3: Server-side tracking for reliability&lt;/h3&gt;&lt;p&gt;If you need conversion data that survives ad blockers, use server-side tracking alongside browser pixels. The Meta Conversions API and Google Ads Enhanced Conversions both support server-to-server event transmission.&lt;/p&gt;&lt;p&gt;This typically involves:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;A Shopify app that listens to the &lt;code&gt;orders/paid&lt;/code&gt; webhook&lt;/li&gt;&lt;li&gt;Server-side code that sends the conversion event to the ad platform&#39;s API&lt;/li&gt;&lt;li&gt;Deduplication using the same event ID or order ID in both browser and server events&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Server-side tracking is more work to set up but more reliable for attribution. Many of the native channel apps already do this.&lt;/p&gt;&lt;h3&gt;When this becomes a stack problem&lt;/h3&gt;&lt;p&gt;The Additional Scripts cutoff is a symptom of a larger shift. Shopify is moving checkout customisation away from arbitrary JavaScript toward structured, sandboxed extensions. This follows the same architectural pattern as &lt;a href=&quot;https://ocontis.studio/blog/post/online-store-2-0-what-changed-and-why-it-matters/&quot;&gt;&lt;em&gt;Online Store 2.0&lt;/em&gt;&lt;/a&gt;, where Shopify deprecated older patterns in favour of sections, blocks, and metafields.&lt;/p&gt;&lt;p&gt;If your post-purchase flow involves:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Checkout UI extensions that display order details, upsells, or surveys&lt;/li&gt;&lt;li&gt;App integrations that depend on order data not available in standard events&lt;/li&gt;&lt;li&gt;Custom attribution models that need line-item or discount data&lt;/li&gt;&lt;li&gt;Multiple tracking platforms with conflicting deduplication logic&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Then you are looking at architecture work, not a quick swap. The native apps cover the common case; everything beyond that requires mapping which systems need which data and in what format. This is the same class of foundation work we cover in &lt;a href=&quot;https://ocontis.studio/blog/post/the-anatomy-of-a-high-performance-shopify-theme/&quot;&gt;&lt;em&gt;the anatomy of a high-performance Shopify theme&lt;/em&gt;&lt;/a&gt;, where checkout and storefront architecture affect what merchants can configure without code.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Scenario&lt;/th&gt;&lt;th&gt;Fix path&lt;/th&gt;&lt;th&gt;Effort&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Single ad platform (Google or Meta)&lt;/td&gt;&lt;td&gt;Install native channel app&lt;/td&gt;&lt;td&gt;Low: under one hour&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Multiple ad platforms&lt;/td&gt;&lt;td&gt;Install native apps, test each&lt;/td&gt;&lt;td&gt;Low to medium: a few hours&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Affiliate network postbacks&lt;/td&gt;&lt;td&gt;Add custom pixel with correct event data&lt;/td&gt;&lt;td&gt;Medium: half day to one day&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Server-side tracking required&lt;/td&gt;&lt;td&gt;App or custom integration for Conversions API&lt;/td&gt;&lt;td&gt;Medium to high: days&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Complex attribution or deduplication&lt;/td&gt;&lt;td&gt;Stack audit, then integration work&lt;/td&gt;&lt;td&gt;High: scoped project&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;When to get help&lt;/h2&gt;&lt;p&gt;Stay in-house when the fix is installing one or two native channel apps and confirming test orders appear in each platform. That is a settings task, not engineering.&lt;/p&gt;&lt;p&gt;Bring in technical help when:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;You have more than three platforms that need tracking on the post-purchase flow&lt;/li&gt;&lt;li&gt;Your tracking involves custom conversion values, line-item data, or discount attribution&lt;/li&gt;&lt;li&gt;You need server-side tracking and do not have the infrastructure for webhook handling&lt;/li&gt;&lt;li&gt;Apps on your store appear in the &amp;quot;Requires update by app developer&amp;quot; section of the upgrade report and the vendor has not shipped an update&lt;/li&gt;&lt;li&gt;Your attribution model depends on data that standard Customer Events do not expose&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;A &lt;a href=&quot;https://ocontis.studio/services/shopify-stack-audit/&quot;&gt;Shopify stack audit&lt;/a&gt; maps who owns what: which tracking belongs in native apps, which needs custom pixels, which needs server-side work, and which apps need replacing. For stores that had checkout UI or order-status customisations beyond tracking, the fix sits alongside &lt;a href=&quot;https://ocontis.studio/services/shopify-theme-development/&quot;&gt;theme development&lt;/a&gt; or app architecture work.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;The 26 August 2026 cutoff removed Additional Scripts from non-Plus stores and auto-upgraded the Thank you and Order status pages. If your tracking lived in that field, it stopped firing without an error message.&lt;/p&gt;&lt;p&gt;Check Settings, Customer events to see if you have active pixels. Place a test order and confirm purchase events appear in your ad platforms. For most stores, installing the native Google, Meta, and TikTok channel apps restores tracking in under an hour. For stores with affiliate networks, custom conversion logic, or server-side requirements, the work scales up from there.&lt;/p&gt;&lt;p&gt;If you are looking at multiple platforms, deduplication, or app dependencies that the upgrade broke, &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;book a stack assessment&lt;/a&gt; and I will map the fix path against your actual checkout and tracking setup.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Shopify WebMCP: What In-Browser AI Agents Can Do on Your Store</title>
    <link href="https://ocontis.studio/blog/post/shopify-webmcp-what-in-browser-ai-agents-can-do-on-your-store/" />
    <updated>2026-08-28T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/shopify-webmcp-what-in-browser-ai-agents-can-do-on-your-store/</id>
    <content type="html">&lt;h1&gt;Shopify WebMCP: What In-Browser AI Agents Can Do on Your Store&lt;/h1&gt;&lt;p&gt;View-source on a live Liquid store now loads a Shopify-hosted WebMCP script, and leadership asks whether ChatGPT can already fill the cart from a product page. Developers in the same week are asking whether legacy cart tools on &lt;code&gt;/api/mcp&lt;/code&gt; still answer after 31 August 2026, and whether policy questions survive the move to UCP MCP.&lt;/p&gt;&lt;p&gt;Those are different doors onto the same brand. &lt;strong&gt;Shopify WebMCP&lt;/strong&gt; is the in-tab door: the page registers catalogue, cart, checkout, and policy tools with the browser so an agent can call them instead of simulating clicks. Remote Storefront MCP, UCP catalog search, and the admin Claude connector stay on their own paths.&lt;/p&gt;&lt;p&gt;If you run an established Shopify catalogue, the useful work is naming which door you are looking at, then testing whether your theme and data can survive the in-tab one.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;Shopify documents &lt;a href=&quot;https://shopify.dev/docs/api/web-mcp&quot;&gt;WebMCP tools&lt;/a&gt; on every Liquid storefront and on the Hydrogen developer preview. There is nothing to install on hosted Liquid. An agent that supports the proposed &lt;a href=&quot;https://developer.chrome.com/docs/ai/webmcp&quot;&gt;WebMCP&lt;/a&gt; standard can search products, change the shopper&#39;s live cart, and take that shopper to checkout or order history, all in the tab they are looking at.&lt;/p&gt;&lt;p&gt;Agent support is currently limited to Chromium-based browsers, including Chrome origin-trial builds. The tools are live. Most shoppers still cannot call them. That gap is why a changelog line can read like a channel launch while the storefront still converts the way it did last month.&lt;/p&gt;&lt;p&gt;Community traffic this month sits on the remote side of MCP. Builders want a hard answer on deprecated &lt;code&gt;get_cart&lt;/code&gt; / &lt;code&gt;update_cart&lt;/code&gt; behaviour after 31 August, a policies and FAQ tool that exists on &lt;code&gt;/api/mcp&lt;/code&gt; and is still missing from &lt;code&gt;/api/ucp/mcp&lt;/code&gt;, and catalog payloads that return prices in minor units so models quote $600 for a $6 tee. Those tickets stay on the remote endpoints. WebMCP adds a browser-native way to do a subset of the same jobs while the shopper watches.&lt;/p&gt;&lt;p&gt;This article is the map we use when a merchant hears &amp;quot;MCP&amp;quot; and assumes one product. Adjacent admin chat belongs in &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-and-claude-connector-setup-benefits-and-risks-for-merchants/&quot;&gt;&lt;em&gt;Shopify Claude connector: setup, permissions, and risks&lt;/em&gt;&lt;/a&gt;. Off-site discovery belongs in &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-ai-product-discovery-ucp-catalog-and-data-readiness/&quot;&gt;&lt;em&gt;Shopify AI product discovery: UCP catalog and data readiness&lt;/em&gt;&lt;/a&gt;. This piece stays on the page in the tab.&lt;/p&gt;&lt;h2&gt;What changed&lt;/h2&gt;&lt;p&gt;Shopify registered a fixed tool set on Liquid storefronts. Independent researchers first noticed a script from &lt;code&gt;cdn.shopify.com/storefront/webmcp/&lt;/code&gt; on live brands, with the same tools on homepage, collection, and product templates. Shopify then documented the tools and the Hydrogen preview path. The public changelog is the source of truth for names and behaviour.&lt;/p&gt;&lt;p&gt;Catalogue tools (&lt;code&gt;search_catalog&lt;/code&gt;, &lt;code&gt;browse_store&lt;/code&gt;, &lt;code&gt;get_product&lt;/code&gt;, &lt;code&gt;show_variant&lt;/code&gt;) read product, collection, and search data through the Storefront API. Cart tools (&lt;code&gt;get_cart&lt;/code&gt;, &lt;code&gt;update_cart&lt;/code&gt;, &lt;code&gt;cancel_cart&lt;/code&gt;) call &lt;a href=&quot;https://shopify.dev/docs/api/storefront-events-and-actions&quot;&gt;standard storefront actions&lt;/a&gt;, the same &lt;code&gt;Shopify.actions&lt;/code&gt; surface apps use. If the theme opens a cart drawer on those actions, the agent triggers that drawer too. Checkout and account tools (&lt;code&gt;proceed_to_checkout&lt;/code&gt;, &lt;code&gt;manage_orders&lt;/code&gt;) navigate the live session. &lt;code&gt;search_shop_policies_and_faqs&lt;/code&gt; answers from the store&#39;s own policy and FAQ content.&lt;/p&gt;&lt;p&gt;&lt;code&gt;update_cart&lt;/code&gt; is allowed to refuse an ambiguous request and return options instead of guessing a line. &lt;code&gt;proceed_to_checkout&lt;/code&gt; checks that the cart is not empty. &lt;code&gt;manage_orders&lt;/code&gt; sends a logged-out shopper through login first. None of those tools charges a card. The shopper still finishes payment in checkout.&lt;/p&gt;&lt;p&gt;The same ten tools appear on every template. Page-scoped tools (a size-guide action only on PDP, a payment action only on checkout) are allowed by the WebMCP model. Shopify shipped one set everywhere so Liquid merchants did not have to configure anything. That is a sane day-one default. It also means a tool can be advertised on a template where the underlying UI never existed.&lt;/p&gt;&lt;p&gt;A name collision is already in the wild. &lt;a href=&quot;https://webmcp.dev/&quot;&gt;webmcp.dev&lt;/a&gt; is a third-party library with a corner widget and a token flow into Claude Desktop. Shopify&#39;s implementation is the proposed browser standard plus commerce tools. Do not paste that widget onto a theme and call the job done.&lt;/p&gt;&lt;h2&gt;Who is affected&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Hosted Liquid themes&lt;/strong&gt; already ship the script. Plus and non-Plus stores on Online Store 2.0 are in the same bucket. Vintage-era Liquid that still renders is still a Liquid storefront in Shopify&#39;s wording. You are affected even if marketing never asked for an AI channel.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Hydrogen and other headless&lt;/strong&gt; stacks are not. Shopify added WebMCP to the Hydrogen developer preview. Production headless remains a deploy you own: standard events and actions, then the preview, then a release. Until then, agents in the tab still scrape your React tree the hard way, and remote agents still hit MCP servers.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Custom cart and variant UI&lt;/strong&gt; is the practical failure mode. If add-to-cart is a private AJAX path that never calls &lt;code&gt;Shopify.actions&lt;/code&gt;, humans may still see a drawer while WebMCP cart tools miss the UI contract. If swatches paint a selected state without writing the product form&#39;s variant &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;show_variant&lt;/code&gt; will look decisive and still land the wrong SKU. That is the same isolation test we use in &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-theme-customisation-limits-when-your-store-leaves-the-supportable-path/&quot;&gt;&lt;em&gt;Shopify theme customisation limits&lt;/em&gt;&lt;/a&gt;: unpublished Dawn or Horizon, one Add to cart, compare the line.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Catalogue and policy owners&lt;/strong&gt; are affected even when the theme is clean. &lt;code&gt;search_catalog&lt;/code&gt; returns titles, prices, and availability the Storefront API already has. Thin descriptions, missing media, and empty policy pages become the agent&#39;s voice. That is the same data-readiness problem as UCP, now reachable from a shopper&#39;s own browser.&lt;/p&gt;&lt;h2&gt;What to do now&lt;/h2&gt;&lt;p&gt;Treat this as a storefront contract test, not a campaign.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Surface&lt;/th&gt;&lt;th&gt;Where it runs&lt;/th&gt;&lt;th&gt;Who it serves&lt;/th&gt;&lt;th&gt;What you actually control&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Shopify WebMCP&lt;/td&gt;&lt;td&gt;Shopper&#39;s browser tab on Liquid (Hydrogen preview)&lt;/td&gt;&lt;td&gt;An in-tab agent the shopper brought&lt;/td&gt;&lt;td&gt;Theme actions, variant wiring, policy copy, catalogue fields the Storefront API exposes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Storefront MCP (&lt;code&gt;/api/mcp&lt;/code&gt;)&lt;/td&gt;&lt;td&gt;Remote HTTP tools&lt;/td&gt;&lt;td&gt;Chat apps and custom agents that never load your theme&lt;/td&gt;&lt;td&gt;Migration off legacy cart tools, UCP capability declarations, payload shape&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;UCP catalog MCP&lt;/td&gt;&lt;td&gt;Shopify catalog endpoints&lt;/td&gt;&lt;td&gt;Agents discovering products on or off your domain&lt;/td&gt;&lt;td&gt;Feed-quality catalogue, markets, media, identifiers&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Claude connector&lt;/td&gt;&lt;td&gt;Merchant&#39;s Claude session + Shopify admin&lt;/td&gt;&lt;td&gt;Staff asking operational questions, sometimes writing live data&lt;/td&gt;&lt;td&gt;Install permissions, who may approve writes&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;1. Confirm which conversation you are in.&lt;/strong&gt; A developer counting down 31 August is on Storefront MCP. A founder who saw a LinkedIn post about agents shopping &amp;quot;directly&amp;quot; is usually describing WebMCP. A marketing lead asking why ChatGPT Shopping went quiet is on syndication and Global Catalog, which is the pattern in the UCP readiness post.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. Put standard storefront actions on the cart path.&lt;/strong&gt; Cart tools reuse the same actions apps use. Override &lt;code&gt;openCart&lt;/code&gt; and line updates so the drawer or cart page the shopper knows is the one the agent triggers. &lt;a href=&quot;https://ocontis.studio/blog/post/the-anatomy-of-a-high-performance-shopify-theme/&quot;&gt;&lt;em&gt;The anatomy of a high-performance Shopify theme&lt;/em&gt;&lt;/a&gt; is still the file-level standard: one owner for the cart UI, not a private fetch the theme forgot to document.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. Walk four templates with the same jobs.&lt;/strong&gt; Homepage, collection, product, cart. Search a real SKU. Ask for a colour or size and watch &lt;code&gt;show_variant&lt;/code&gt;. Add, change quantity, and empty the cart. Open policies. Proceed to checkout with a non-empty cart, then with an empty cart and confirm the tool refuses. Log where the UI and the tool disagree.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. Fix the strings the tools will speak.&lt;/strong&gt; Policy pages, shipping tables, and FAQ content feed &lt;code&gt;search_shop_policies_and_faqs&lt;/code&gt;. Remote builders already hit a gap: that tool exists on &lt;code&gt;/api/mcp&lt;/code&gt; and they cannot find an equivalent on &lt;code&gt;/api/ucp/mcp&lt;/code&gt; before the sunset. On WebMCP it is on the page. Empty policy HTML is an empty answer in both worlds.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5. Keep checkout human.&lt;/strong&gt; Watch &lt;code&gt;proceed_to_checkout&lt;/code&gt; land on the checkout you actually run, including any checkout UI extensions. &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-checkout-abandonment-when-your-funnel-looks-healthy/&quot;&gt;&lt;em&gt;Checkout abandonment when the funnel looks healthy&lt;/em&gt;&lt;/a&gt; still applies. An agent that can open checkout does not repair a broken shipping or payment step.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6. Decide Hydrogen on a release train.&lt;/strong&gt; If you are headless, WebMCP is a framework and actions project, not a CDN surprise. Scope it with the rest of standard events work rather than a one-line &amp;quot;enable AI&amp;quot; ticket.&lt;/p&gt;&lt;h2&gt;What this does not change&lt;/h2&gt;&lt;p&gt;Staff chat still needs the Claude connector&#39;s permission model. Off-site discovery still needs catalogue quality and UCP. Admin assistance still sits in Sidekick. Calling all of that &amp;quot;MCP&amp;quot; hides which team owns the next ticket.&lt;/p&gt;&lt;p&gt;Order source for an in-tab agent that used standard cart actions will often look like the shopper&#39;s own session. Plan for messier direct buckets before peak, rather than after the export looks wrong.&lt;/p&gt;&lt;p&gt;An agent that can call &lt;code&gt;search_catalog&lt;/code&gt; still lands the shopper on templates marketing cannot edit. Recover that path in the customisation-limits article before you brief a visual redesign so the agent has somewhere honest to navigate.&lt;/p&gt;&lt;p&gt;Chromium origin trials and a proposed spec (Shopify is in the room with Google and Microsoft) are the current client story. Build the contract. Leave traffic forecasts for when a stable client exists.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Shopify WebMCP puts structured storefront tools on Liquid pages so an in-tab agent can shop without scraping the DOM. The tools are already on hosted themes. Most buyers still cannot invoke them. The congestion is naming: WebMCP, Storefront MCP, UCP catalog, and admin connectors share an acronym and split across tab, remote API, and staff chat.&lt;/p&gt;&lt;p&gt;Test the contract you already own. Standard cart actions, honest variants, policy copy, and a checkout the shopper still confirms. Headless teams treat Hydrogen preview as a deploy. Ignore the third-party widget that borrowed the same name.&lt;/p&gt;&lt;p&gt;If you want that map against your theme and catalogue, book a &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;Shopify stack assessment&lt;/a&gt; with oContis Studio. &lt;a href=&quot;https://ocontis.studio/services/shopify-theme-development/&quot;&gt;Shopify theme development&lt;/a&gt; is the recovery pass when custom cart and variant code sits outside &lt;code&gt;Shopify.actions&lt;/code&gt; and agents will inherit the gap.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>How to Fix Shopify Accessibility Bugs That Block WCAG AA</title>
    <link href="https://ocontis.studio/blog/post/how-to-fix-shopify-accessibility-bugs-that-block-wcag-aa/" />
    <updated>2026-08-23T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/how-to-fix-shopify-accessibility-bugs-that-block-wcag-aa/</id>
    <content type="html">&lt;h1&gt;How to Fix Shopify Accessibility Bugs That Block WCAG AA&lt;/h1&gt;&lt;p&gt;Merchants keep asking whether a Shopify store can reach WCAG AA, usually after a scanner report, a demand letter, or a buyer who cannot finish the purchase path on a keyboard. Most storefronts can get close when you fix the HTML you own. Hosted checkout and new customer accounts stay on Shopify&#39;s side of the line.&lt;/p&gt;&lt;p&gt;The ten bugs below are the ones that show up again and again on theme audits: empty alt text, weak contrast, missing labels, vanished focus rings, hover-only menus, colour-only swatches, broken skip links, unnamed icon buttons, drawer focus traps, and silent cart or price updates.&lt;/p&gt;&lt;p&gt;Overlay widgets leave that source HTML unchanged. Theme Liquid, product content, and a ruthless app audit are what move a store toward WCAG AA.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;Shopify accessibility work fails when teams treat it as a plugin install. The community pattern is consistent: someone asks whether WCAG AA is even possible, someone else recommends an overlay after an ADA letter, and a third thread reports checkout or customer-account errors the merchant cannot edit.&lt;/p&gt;&lt;p&gt;This reflects patterns we see regularly across the Shopify merchant and developer community.&lt;/p&gt;&lt;p&gt;The useful split is ownership. You control theme templates, section settings, product media, and most Online Store 2.0 markup. Apps inject popups, reviews, chat, and filters that ignore keyboard and screen-reader contracts. Shopify hosts checkout and the new customer sign-in, and those surfaces can fail contrast or label checks you will never reach in &lt;code&gt;theme.liquid&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;This article is a fix path for the ten ecommerce accessibility bugs that actually block Shopify stores, plus a diagnose-before-you-remediate sequence so you stop paying for overlays that scanners still fail. For the conversion cost of inaccessible themes, see &lt;a href=&quot;https://ocontis.studio/blog/post/common-theme-mistakes-that-kill-conversion-rates/&quot;&gt;&lt;em&gt;Common Theme Mistakes That Kill Conversion Rates&lt;/em&gt;&lt;/a&gt;. Custom Liquid that has left the &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-theme-customisation-limits-when-your-store-leaves-the-supportable-path/&quot;&gt;&lt;em&gt;supportable path&lt;/em&gt;&lt;/a&gt; is where many keyboard and skip-link failures start. For how Liquid decides what the browser announces, see &lt;a href=&quot;https://ocontis.studio/blog/post/liquid-explained-for-store-owners-no-code-required/&quot;&gt;&lt;em&gt;Liquid Explained for Store Owners&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;What merchants are running into&lt;/h2&gt;&lt;p&gt;The first question is usually binary in the merchant&#39;s head: is Shopify accessible, or is the whole platform a liability. The operational question is narrower. Which failures sit in your theme and catalogue, which sit in apps, and which sit in Shopify-hosted HTML.&lt;/p&gt;&lt;p&gt;Merchants who try to &amp;quot;bring the shop up to WCAG AA&amp;quot; typically hit the same wall. Theme contrast and labels can be fixed in days. Then an audit flags hosted checkout contrast, missing icon roles, or the new customer account page, and there is no Liquid file to edit. Shopify publishes a checkout accessibility conformance report and still lists partial support on contrast and focus. That is a platform ticket, not a theme sprint.&lt;/p&gt;&lt;p&gt;A second cluster arrives as legal panic. Stores install AccessiBe-class widgets after a demand letter, then discover Lighthouse barely moves and screen readers still announce empty buttons. Overlays can offer user preferences. They do not write &lt;code&gt;alt&lt;/code&gt; on product media or give a hamburger button an accessible name.&lt;/p&gt;&lt;p&gt;A third cluster is app sprawl. Reviews, chat, upsell popups, and mega-menu apps inject the worst markup on the page: unlabelled close buttons, focus traps, and star ratings announced as &amp;quot;graphic graphic graphic&amp;quot;. That pattern sits beside the subscription pile we mapped in &lt;a href=&quot;https://ocontis.studio/blog/post/the-hidden-cost-of-running-a-shopify-store-when-12-apps-quietly-eat-your-margins/&quot;&gt;&lt;em&gt;The Hidden Cost of Running a Shopify Store When 12 Apps Quietly Eat Your Margins&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Why this happens&lt;/h2&gt;&lt;p&gt;Shopify ships no WCAG toggle. Theme Store review covers performance and code quality rather than accessibility certification. Dawn is a better baseline than most premiums, and a brand palette plus two app embeds will still recreate AA failures.&lt;/p&gt;&lt;p&gt;Themes also optimise for the visual editor. &lt;code&gt;outline: none&lt;/code&gt; on buttons looks clean in a desktop mock. Colour swatches built as clickable &lt;code&gt;div&lt;/code&gt;s look premium in a demo. Sticky headers look modern until they cover the focused link, which is a WCAG 2.2 failure (2.4.11 Focus Not Obscured).&lt;/p&gt;&lt;p&gt;Content defaults make it worse. If a merchant never fills product image alt text, Liquid outputs an empty &lt;code&gt;alt&lt;/code&gt; or a filename. Shopify will fall back to the product title in some contexts, which produces twenty identical announcements of &amp;quot;Navy Hoodie&amp;quot; on one product page.&lt;/p&gt;&lt;figure class=&quot;blog-diagram epmb-figure&quot; role=&quot;figure&quot; aria-labelledby=&quot;epmb-10-caption&quot; data-diagram-id=&quot;epmb-10&quot;&gt;
  &lt;p class=&quot;epmb-figure__summary visually-hidden&quot; id=&quot;epmb-10-summary&quot;&gt;Shopify accessibility ownership map&lt;/p&gt;
  &lt;div class=&quot;epmb-figure__brand epmb-figure__brand--top-right&quot;&gt;
  &lt;img class=&quot;epmb-figure__logo&quot; src=&quot;/assets/favicons/safari-pinned-tab.svg&quot; alt=&quot;oContis Studio&quot; width=&quot;32&quot; height=&quot;32&quot; decoding=&quot;async&quot; /&gt;
&lt;/div&gt;
  &lt;div class=&quot;epmb-figure__content&quot;&gt;
    
    &lt;svg id=&quot;epmb-10&quot; width=&quot;100%&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; class=&quot;flowchart&quot; style=&quot;max-width: 903.81640625px;&quot; viewBox=&quot;-8 -50.1015625 903.81640625 506.43437500000005&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot;&gt;&lt;style&gt;#epmb-10{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;fill:#fafae6;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#epmb-10 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#epmb-10 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#epmb-10 .error-icon{fill:#141414;}#epmb-10 .error-text{fill:#ebebeb;stroke:#ebebeb;}#epmb-10 .edge-thickness-normal{stroke-width:1px;}#epmb-10 .edge-thickness-thick{stroke-width:3.5px;}#epmb-10 .edge-pattern-solid{stroke-dasharray:0;}#epmb-10 .edge-thickness-invisible{stroke-width:0;fill:none;}#epmb-10 .edge-pattern-dashed{stroke-dasharray:3;}#epmb-10 .edge-pattern-dotted{stroke-dasharray:2;}#epmb-10 .marker{fill:#8a8a7a;stroke:#8a8a7a;}#epmb-10 .marker.cross{stroke:#8a8a7a;}#epmb-10 svg{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;}#epmb-10 p{margin:0;}#epmb-10 .label{font-family:&#39;Syne&#39;,system-ui,sans-serif;color:#fafae6;}#epmb-10 .cluster-label text{fill:#fafae6;}#epmb-10 .cluster-label span{color:#fafae6;}#epmb-10 .cluster-label span p{background-color:transparent;}#epmb-10 .label text,#epmb-10 span{fill:#fafae6;color:#fafae6;}#epmb-10 .node rect,#epmb-10 .node circle,#epmb-10 .node ellipse,#epmb-10 .node polygon,#epmb-10 .node path{fill:#141414;stroke:#db5461;stroke-width:1px;}#epmb-10 .rough-node .label text,#epmb-10 .node .label text,#epmb-10 .image-shape .label,#epmb-10 .icon-shape .label{text-anchor:middle;}#epmb-10 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#epmb-10 .rough-node .label,#epmb-10 .node .label,#epmb-10 .image-shape .label,#epmb-10 .icon-shape .label{text-align:center;}#epmb-10 .node.clickable{cursor:pointer;}#epmb-10 .root .anchor path{fill:#8a8a7a!important;stroke-width:0;stroke:#8a8a7a;}#epmb-10 .arrowheadPath{fill:#f1eff0;}#epmb-10 .edgePath .path{stroke:#8a8a7a;stroke-width:1px;}#epmb-10 .flowchart-link{stroke:#8a8a7a;fill:none;}#epmb-10 .edgeLabel{background-color:#141414;text-align:center;}#epmb-10 .edgeLabel p{background-color:#141414;}#epmb-10 .edgeLabel rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-10 .labelBkg{background-color:rgba(20, 20, 20, 0.5);}#epmb-10 .cluster rect{fill:#141414;stroke:hsl(0, 0%, 17.8431372549%);stroke-width:1px;}#epmb-10 .cluster text{fill:#fafae6;}#epmb-10 .cluster span{color:#fafae6;}#epmb-10 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:12px;background:#141414;border:1px solid hsl(0, 0%, 17.8431372549%);border-radius:2px;pointer-events:none;z-index:100;}#epmb-10 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fafae6;}#epmb-10 rect.text{fill:none;stroke-width:0;}#epmb-10 .icon-shape,#epmb-10 .image-shape{background-color:#141414;text-align:center;}#epmb-10 .icon-shape p,#epmb-10 .image-shape p{background-color:#141414;padding:2px;}#epmb-10 .icon-shape .label rect,#epmb-10 .image-shape .label rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-10 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#epmb-10 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#epmb-10 .node .neo-node{stroke:#db5461;}#epmb-10 [data-look=&quot;neo&quot;].node rect,#epmb-10 [data-look=&quot;neo&quot;].cluster rect,#epmb-10 [data-look=&quot;neo&quot;].node polygon{stroke:url(#epmb-10-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-10 [data-look=&quot;neo&quot;].swimlane.cluster rect{filter:none;}#epmb-10 [data-look=&quot;neo&quot;].node path{stroke:url(#epmb-10-gradient);stroke-width:1px;}#epmb-10 [data-look=&quot;neo&quot;].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-10 [data-look=&quot;neo&quot;].node .neo-line path{stroke:#db5461;filter:none;}#epmb-10 [data-look=&quot;neo&quot;].node circle{stroke:url(#epmb-10-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-10 [data-look=&quot;neo&quot;].node circle .state-start{fill:#000000;}#epmb-10 [data-look=&quot;neo&quot;].icon-shape .icon{fill:url(#epmb-10-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-10 [data-look=&quot;neo&quot;].icon-shape .icon-neo path{stroke:url(#epmb-10-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-10 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;epmb-10_flowchart-v2-pointEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 10 5 L 0 10 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-10_flowchart-v2-pointStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;4.5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 5 L 10 10 L 10 0 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-10_flowchart-v2-pointEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;11.5&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;10.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 11.5 7 L 0 14 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-10_flowchart-v2-pointStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;1&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;polygon points=&quot;0,7 11.5,14 11.5,0&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-10_flowchart-v2-circleEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;11&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-10_flowchart-v2-circleStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-1&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-10_flowchart-v2-circleEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refY=&quot;5&quot; refX=&quot;12.25&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-10_flowchart-v2-circleStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-2&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-10_flowchart-v2-crossEnd&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;12&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-10_flowchart-v2-crossStart&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;-1&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-10_flowchart-v2-crossEnd-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;17.7&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-10_flowchart-v2-crossStart-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;-3.5&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;g class=&quot;root&quot;&gt;&lt;g class=&quot;clusters&quot;/&gt;&lt;g class=&quot;edgePaths&quot;&gt;&lt;path d=&quot;M404.582,60.889L404.582,65.056C404.582,69.222,404.582,77.556,404.582,85.222C404.582,92.889,404.582,99.889,404.582,103.389L404.582,106.889&quot; id=&quot;epmb-10-L_SCAN_OWNER_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_SCAN_OWNER_0&quot; data-points=&quot;W3sieCI6NDA0LjU4MjAzMTI1LCJ5Ijo2MC44ODkwNjI0OTk5OTk5OTR9LHsieCI6NDA0LjU4MjAzMTI1LCJ5Ijo4NS44ODkwNjI1fSx7IngiOjQwNC41ODIwMzEyNTAwMDAwNiwieSI6MTEwLjg4OTA2MjUwMDAwMDE0fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-10_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M327.256,268.117L294.246,285.172C261.237,302.226,195.218,336.335,162.209,356.981C129.199,377.627,129.199,384.81,129.199,388.402L129.199,391.994&quot; id=&quot;epmb-10-L_OWNER_THEME_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_OWNER_THEME_0&quot; data-points=&quot;W3sieCI6MzI3LjI1NTYxMDk5ODcxNjQsInkiOjI2OC4xMTczMjk3NDg3MTY0fSx7IngiOjEyOS4xOTkyMTg3NSwieSI6MzcwLjQ0Mzc1fSx7IngiOjEyOS4xOTkyMTg3NSwieSI6Mzk1Ljk5Mzc1MDAwMDAwMDAzfV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-10_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M404.582,345.444L404.582,349.61C404.582,353.777,404.582,362.11,404.582,369.777C404.582,377.444,404.582,384.444,404.582,387.944L404.582,391.444&quot; id=&quot;epmb-10-L_OWNER_APPS_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_OWNER_APPS_0&quot; data-points=&quot;W3sieCI6NDA0LjU4MjAzMTI1LCJ5IjozNDUuNDQzNzUwMDAwMDAwMX0seyJ4Ijo0MDQuNTgyMDMxMjUsInkiOjM3MC40NDM3NX0seyJ4Ijo0MDQuNTgyMDMxMjUsInkiOjM5NS40NDM3NX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-10_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M482.704,267.322L516.995,284.509C551.286,301.696,619.867,336.07,654.158,356.757C688.449,377.444,688.449,384.444,688.449,387.944L688.449,391.444&quot; id=&quot;epmb-10-L_OWNER_HOSTED_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_OWNER_HOSTED_0&quot; data-points=&quot;W3sieCI6NDgyLjcwMzg1OTE0MjgzLCJ5IjoyNjcuMzIxOTIyMTA3MTd9LHsieCI6Njg4LjQ0OTIxODc1LCJ5IjozNzAuNDQzNzV9LHsieCI6Njg4LjQ0OTIxODc1LCJ5IjozOTUuNDQzNzV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-10_flowchart-v2-pointEnd)&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabels&quot;&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_SCAN_OWNER_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_OWNER_THEME_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_OWNER_APPS_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_OWNER_HOSTED_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;nodes&quot;&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-10-flowchart-SCAN-0&quot; data-look=&quot;classic&quot; transform=&quot;translate(404.58203125, 34.44453125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-113.43359375&quot; y=&quot;-26.44453125&quot; width=&quot;226.8671875&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;1&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; ·&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Keyboard&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; pass&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; plus&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;scan&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-10-flowchart-OWNER-1&quot; data-look=&quot;classic&quot; transform=&quot;translate(404.58203125, 228.16640625)&quot;&gt;&lt;polygon points=&quot;117.27734375,0 234.5546875,-117.27734375 117.27734375,-234.5546875 0,-117.27734375&quot; class=&quot;label-container&quot; transform=&quot;translate(-116.77734375, 117.27734375)&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;2&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; ·&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Who&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; owns&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; the&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; HTML?&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-10-flowchart-THEME-3&quot; data-look=&quot;classic&quot; transform=&quot;translate(129.19921875, 421.88828125000003)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-121.19921875&quot; y=&quot;-25.89453125&quot; width=&quot;242.3984375&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;3&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; ·&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Theme&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; and&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; catalogue&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-10-flowchart-APPS-5&quot; data-look=&quot;classic&quot; transform=&quot;translate(404.58203125, 421.88828125000003)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-104.18359375&quot; y=&quot;-26.44453125&quot; width=&quot;208.3671875&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;4&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; ·&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; App&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; embeds&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; and&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;popups&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-10-flowchart-HOSTED-7&quot; data-look=&quot;classic&quot; transform=&quot;translate(688.44921875, 421.88828125000003)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-129.68359375&quot; y=&quot;-26.44453125&quot; width=&quot;259.3671875&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;5&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; ·&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Checkout&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; and&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; customer&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;accounts&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-10-drop-shadow&quot; height=&quot;130%&quot; width=&quot;130%&quot;&gt;&lt;fedropshadow dx=&quot;4&quot; dy=&quot;4&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-10-drop-shadow-small&quot; height=&quot;150%&quot; width=&quot;150%&quot;&gt;&lt;fedropshadow dx=&quot;2&quot; dy=&quot;2&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;linearGradient id=&quot;epmb-10-gradient&quot; gradientUnits=&quot;objectBoundingBox&quot; x1=&quot;0%&quot; y1=&quot;0%&quot; x2=&quot;100%&quot; y2=&quot;0%&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#db5461&quot; stop-opacity=&quot;1&quot;/&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;hsl(0, 0%, 20.1960784314%)&quot; stop-opacity=&quot;1&quot;/&gt;&lt;/linearGradient&gt;&lt;text text-anchor=&quot;middle&quot; x=&quot;443.908203125&quot; y=&quot;-25&quot; class=&quot;flowchartTitleText&quot;&gt;Shopify accessibility ownership map&lt;/text&gt;&lt;/svg&gt;
  &lt;/div&gt;
  
  &lt;figcaption class=&quot;epmb-figure__caption&quot; id=&quot;epmb-10-caption&quot;&gt;Shopify accessibility ownership map&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h2&gt;How to diagnose it&lt;/h2&gt;&lt;p&gt;Run this sequence before you buy an app or rewrite the theme.&lt;/p&gt;&lt;p&gt;Start with a keyboard pass from the skip link through header, search, a collection filter, a product with variants, add to cart, the cart drawer, and customer login. Note every control that has no visible focus, every menu that opens only on hover, and every drawer you cannot close with Escape.&lt;/p&gt;&lt;p&gt;Follow that with a screen-reader sample on one homepage, one product, and the cart, listening for unnamed buttons, duplicate headings, and whether variant or price changes are announced. Then run axe DevTools or Lighthouse on those same URLs and treat the score as a defect list rather than a WCAG percentage.&lt;/p&gt;&lt;p&gt;Tag each defect as theme, content, app, or Shopify-hosted. Theme and catalogue issues belong in a merchant sprint, app defects need removal or a vendor ticket, and hosted defects need a Shopify report plus an accessibility statement that documents the gap. Finish by disabling app embeds one at a time on a duplicate theme, because many supposed theme traps disappear when the reviews or chat widget unloads.&lt;/p&gt;&lt;p&gt;If checkout abandonment already looks healthy in analytics while buyers stall, pair this pass with &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-checkout-abandonment-when-your-funnel-looks-healthy/&quot;&gt;&lt;em&gt;How to Fix Shopify Checkout Abandonment When Your Funnel Looks Healthy&lt;/em&gt;&lt;/a&gt;. Accessibility failures are one reason a clean funnel still drops people who never appear as a rage-click.&lt;/p&gt;&lt;h2&gt;How to fix it&lt;/h2&gt;&lt;p&gt;Fix at the source. Each bug below lists the owner, the failure, and the first remediations that hold up in audits.&lt;/p&gt;&lt;h3&gt;1. Missing or generic product image alt text&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Owner:&lt;/strong&gt; catalogue first, theme fallback second.&lt;/p&gt;&lt;p&gt;Shopify themes render &lt;code&gt;alt=&amp;quot;&amp;quot;&lt;/code&gt;. Empty media fields become empty attributes, which scanners flag on every product page. Filenames and repeated product titles are only slightly better.&lt;/p&gt;&lt;p&gt;Write alt that describes the visible product: material, colour, viewpoint. Use &lt;code&gt;alt=&amp;quot;&amp;quot;&lt;/code&gt; only for decorative images. Add a Liquid fallback such as &lt;code&gt;image.alt | default: product.title | escape&lt;/code&gt; so a blank field never ships empty. Then fix the catalogue for hero products, because a title fallback still fails when five images share one name.&lt;/p&gt;&lt;h3&gt;2. Insufficient colour contrast&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Owner:&lt;/strong&gt; theme settings and brand palette.&lt;/p&gt;&lt;p&gt;Sale prices, compare-at text, footer links, and placeholder search copy are the usual 1.4.3 failures. Brand accents chosen in isolation often fail 4.5:1 on white. Large text can pass at 3:1. Component borders and focus rings need 3:1 against adjacent colours (1.4.11).&lt;/p&gt;&lt;p&gt;Check every pair in the theme editor, not only the primary button. Hero text on product photography fails whenever the image is pale. Do not rely on an overlay to &amp;quot;boost contrast&amp;quot; for users who never open the widget.&lt;/p&gt;&lt;h3&gt;3. Missing form labels&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Owner:&lt;/strong&gt; theme forms, then apps.&lt;/p&gt;&lt;p&gt;Newsletter blocks, cart-attribute line-item properties, and review widgets often use placeholder-only fields. Placeholders disappear on input and fail as the accessible name. Associate a visible &lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt; with each control, or a persistent &lt;code&gt;aria-label&lt;/code&gt; when the design hides the label.&lt;/p&gt;&lt;p&gt;Checkout fields on hosted checkout are Shopify&#39;s. Cart attributes you add in Liquid are yours. Plus merchants who inject custom properties through scripts create the unlabelled inputs we see most often on cart audits.&lt;/p&gt;&lt;h3&gt;4. Hidden or missing focus indicators&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Owner:&lt;/strong&gt; theme CSS.&lt;/p&gt;&lt;p&gt;&lt;code&gt;outline: none&lt;/code&gt; without a replacement fails 2.4.7. Custom buttons, drawer triggers, and swatch radios are the usual casualties. Restore a focus ring with at least 3:1 contrast, and test it on both light and dark sections.&lt;/p&gt;&lt;p&gt;Sticky announcement bars and sticky headers must not cover the focused control (2.4.11). If the bar sits &lt;code&gt;position: sticky&lt;/code&gt;, give focused links enough offset, or collapse the bar when keyboard focus moves underneath it.&lt;/p&gt;&lt;h3&gt;5. Keyboard-inaccessible menus&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Owner:&lt;/strong&gt; theme header, or the mega-menu app you installed.&lt;/p&gt;&lt;p&gt;Hover-only dropdowns lock out keyboard and many touch users. The menu trigger needs a real button, &lt;code&gt;aria-expanded&lt;/code&gt;, and open/close on Enter or Space. Arrow keys inside the submenu are a usability win. Escape should close the menu and return focus to the trigger.&lt;/p&gt;&lt;p&gt;If you rebuilt a mega-menu in custom Liquid, you also inherited heading order, duplicate IDs, and skip-link targets. Duplicate header sections in the editor are an architecture smell, the same class of OS 2.0 drift we cover in &lt;a href=&quot;https://ocontis.studio/blog/post/online-store-2-0-what-changed-and-why-it-matters/&quot;&gt;&lt;em&gt;Online Store 2.0: What Changed and Why It Matters&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;6. Inaccessible variant swatches&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Owner:&lt;/strong&gt; theme product form.&lt;/p&gt;&lt;p&gt;Colour-only swatches fail two ways. Screen readers hear &amp;quot;button&amp;quot; with no name, and sold-out state is a grey wash with no text. Use radio inputs or buttons with an accessible name that includes colour and availability. Selected state needs more than a border colour change.&lt;/p&gt;&lt;p&gt;Custom metafield or metaobject swatches make this worse when the theme only knows Shopify&#39;s native colour option. If the picker shows a text label and no swatch, the accessibility fix and the merchandising fix are the same job: the theme must read your data model and still output a named, keyboard-operable control.&lt;/p&gt;&lt;h3&gt;7. Missing or broken skip navigation&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Owner:&lt;/strong&gt; theme layout.&lt;/p&gt;&lt;p&gt;A skip link should be the first focusable element and must become visible on focus. The target, usually &lt;code&gt;#MainContent&lt;/code&gt; or &lt;code&gt;#main-content&lt;/code&gt;, must exist, and activating the link must move keyboard focus, not only scroll the page. Put &lt;code&gt;tabindex=&amp;quot;-1&amp;quot;&lt;/code&gt; on the main landmark so programmatic focus lands there.&lt;/p&gt;&lt;p&gt;Many Shopify themes omit the link, hide it forever, or point at an ID the layout never renders after a section-group refactor.&lt;/p&gt;&lt;h3&gt;8. Icon-only buttons without accessible names&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Owner:&lt;/strong&gt; theme header and search, plus apps.&lt;/p&gt;&lt;p&gt;Cart, search, account, and hamburger controls are often SVGs inside a &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; with no text. Screen readers announce &amp;quot;button&amp;quot;. Add a visually hidden label or &lt;code&gt;aria-label&lt;/code&gt;, and hide the SVG with &lt;code&gt;aria-hidden=&amp;quot;true&amp;quot;&lt;/code&gt;. The mobile menu button also needs &lt;code&gt;aria-expanded&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;App chat bubbles repeat this failure in the corner of every page. If the vendor will not ship a name, the widget does not belong on a storefront you are trying to take to AA.&lt;/p&gt;&lt;h3&gt;9. Drawers, modals, and popups that trap or lose focus&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Owner:&lt;/strong&gt; theme cart drawer and quick view, then apps.&lt;/p&gt;&lt;p&gt;When a cart drawer or quick-view modal opens, focus should move inside it. Tab should cycle through the drawer controls, not the page behind. Escape and the close button should return focus to the trigger. Newsletter popups that appear after ten seconds without moving focus strand keyboard users on the page underneath.&lt;/p&gt;&lt;p&gt;Reviews lightboxes and chat windows are the frequent app offenders. Test them on a duplicate theme with embeds off, then on. If the trap only appears with the app, the fix is vendor pressure or removal, not more theme CSS.&lt;/p&gt;&lt;h3&gt;10. Dynamic updates that stay silent&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Owner:&lt;/strong&gt; theme JavaScript on product and cart.&lt;/p&gt;&lt;p&gt;Variant changes update price and availability in the DOM while screen readers stay on the old announcement. Add-to-cart success appears as a drawer animation with no live region. Wrap price and availability in an &lt;code&gt;aria-live=&amp;quot;polite&amp;quot;&lt;/code&gt; region. Announce cart additions with a short status message.&lt;/p&gt;&lt;p&gt;Sold-out variants should stay focusable and include the sold-out state in the accessible name. A disabled add-to-cart button with no text equivalent is a dead end for keyboard buyers, which is also a conversion bug.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Bug&lt;/th&gt;&lt;th&gt;Owner&lt;/th&gt;&lt;th&gt;First fix&lt;/th&gt;&lt;th&gt;Effort&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Empty or generic image alt&lt;/td&gt;&lt;td&gt;Catalogue + theme fallback&lt;/td&gt;&lt;td&gt;Fill media alt; Liquid &lt;code&gt;default&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Weak colour contrast&lt;/td&gt;&lt;td&gt;Theme settings&lt;/td&gt;&lt;td&gt;Retune sale, footer, and placeholder pairs&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Placeholder-only form labels&lt;/td&gt;&lt;td&gt;Theme + apps&lt;/td&gt;&lt;td&gt;Visible &lt;code&gt;label&lt;/code&gt; on every input&lt;/td&gt;&lt;td&gt;Low to medium&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Missing focus ring&lt;/td&gt;&lt;td&gt;Theme CSS&lt;/td&gt;&lt;td&gt;Replace &lt;code&gt;outline: none&lt;/code&gt;; check sticky headers&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Hover-only menus&lt;/td&gt;&lt;td&gt;Theme or mega-menu app&lt;/td&gt;&lt;td&gt;Button trigger, &lt;code&gt;aria-expanded&lt;/code&gt;, Escape&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Unnamed colour swatches&lt;/td&gt;&lt;td&gt;Product form&lt;/td&gt;&lt;td&gt;Named radios or buttons, including sold-out&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Broken skip link&lt;/td&gt;&lt;td&gt;Layout&lt;/td&gt;&lt;td&gt;Visible on focus; real main target&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Icon buttons with no name&lt;/td&gt;&lt;td&gt;Header + apps&lt;/td&gt;&lt;td&gt;&lt;code&gt;aria-label&lt;/code&gt; on cart, search, menu&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Drawer and popup focus traps&lt;/td&gt;&lt;td&gt;Theme + apps&lt;/td&gt;&lt;td&gt;Move focus in, return on close&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Silent price and cart updates&lt;/td&gt;&lt;td&gt;Theme JavaScript&lt;/td&gt;&lt;td&gt;Live regions on price, stock, and ATC&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Low-effort rows are content and CSS. Medium rows are component behaviour. None of them are solved by a storefront overlay.&lt;/p&gt;&lt;h2&gt;When to get help&lt;/h2&gt;&lt;p&gt;Stay in-house when the list is alt text, contrast tokens, skip links, and icon labels. Those are catalogue and CSS jobs, and they should be on every theme launch checklist.&lt;/p&gt;&lt;p&gt;Bring in engineering when the failures sit in a custom mega-menu, a metafield swatch picker, a cart drawer that fights app scripts, or a stack where three widgets reintroduce traps after every theme update. That is foundation work, the same class of theme architecture we describe in &lt;a href=&quot;https://ocontis.studio/blog/post/the-anatomy-of-a-high-performance-shopify-theme/&quot;&gt;&lt;em&gt;The Anatomy of a High-Performance Shopify Theme&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Do not hire anyone whose only deliverable is an overlay plus a PDF certificate. Ask for a keyboard test recording, an ownership map, and theme diffs. If checkout or new customer accounts fail contrast you cannot edit, document the gap and report it to Shopify. Pretending an overlay covers hosted HTML will not survive a manual audit.&lt;/p&gt;&lt;p&gt;For a structured pass across theme, apps, and checkout extensions, start with a &lt;a href=&quot;https://ocontis.studio/services/shopify-stack-audit/&quot;&gt;Shopify stack audit&lt;/a&gt; or &lt;a href=&quot;https://ocontis.studio/services/shopify-theme-development/&quot;&gt;theme development&lt;/a&gt; when the markup itself needs a rebuild.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Shopify accessibility is a storefront programme with a hard ownership line. You can fix the ten bugs that block most WCAG AA attempts on pages you render. You cannot make hosted checkout or new customer accounts perfect from &lt;code&gt;theme.liquid&lt;/code&gt;, and you should stop paying overlay apps to pretend otherwise.&lt;/p&gt;&lt;p&gt;Start with a keyboard pass, tag every defect by owner, and remediate theme and catalogue first. Remove or replace apps that inject unnamed controls. Document Shopify-hosted exceptions in an accessibility statement, and keep retesting after theme updates and seasonal popups.&lt;/p&gt;&lt;p&gt;If you want that ownership map written against your live theme and app list, &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;book a stack assessment&lt;/a&gt; and we will tell you which bugs you can close this sprint and which ones belong in a platform ticket.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Shopify Theme Customisation Limits: When Your Store Leaves the Supportable Path</title>
    <link href="https://ocontis.studio/blog/post/shopify-theme-customisation-limits-when-your-store-leaves-the-supportable-path/" />
    <updated>2026-08-16T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/shopify-theme-customisation-limits-when-your-store-leaves-the-supportable-path/</id>
    <content type="html">&lt;h1&gt;Shopify Theme Customisation Limits: When Your Store Leaves the Supportable Path&lt;/h1&gt;&lt;p&gt;Shopify merchants keep saying the same thing in different words: design got harder, features moved, and simple edits take more clicks. A header change that used to be one setting now needs a developer, and when the storefront misbehaves, Support replies that the theme is too customised to touch.&lt;/p&gt;&lt;p&gt;That complaint is real, and the usual explanation is incomplete. Shopify moved settings while it added surfaces, so the theme editor, section groups, and dynamic sources now expose more of the storefront than Vintage themes ever did. A large share of live catalogues have already stepped off that path with custom Liquid, leftover static section tags, and metafield workarounds.&lt;/p&gt;&lt;p&gt;Once you leave the &lt;strong&gt;supportable path&lt;/strong&gt;, the editor and Support stop being useful in the way the marketing site promised. The store still sells, yet every change costs more, and nobody can say which file is allowed to own the header.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;Online Store 2.0 was sold as merchant control: JSON templates, sections on every page, and layout edits without a developer on Slack. That model still holds when the theme uses section groups for chrome, JSON templates for page structure, and dynamic sources for product data. &lt;a href=&quot;https://ocontis.studio/blog/post/online-store-2-0-what-changed-and-why-it-matters/&quot;&gt;&lt;em&gt;Online Store 2.0: What Changed and Why It Matters&lt;/em&gt;&lt;/a&gt; is the architectural baseline.&lt;/p&gt;&lt;p&gt;The friction showing up in merchant and developer communities this month sits one layer further on. Teams rebuild a mega menu in Liquid, then see three Header entries in the theme editor. They try to connect &lt;code&gt;product.description&lt;/code&gt; to a Studio collapsible row and the picker offers Title, Content, and Add metafield. They stack homepage sections until the page feels busy, then ask whether the section counter itself is killing conversion.&lt;/p&gt;&lt;p&gt;The shared pattern on those storefronts is &lt;strong&gt;customisation that no longer matches the model Shopify will support&lt;/strong&gt;. The marketing team often grew while the editing surface stayed a one-person Liquid job, so campaign volume hits files that never declared the work as settings. Adjacent operational drag (exports, app hops, inventory clicks) belongs in &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-operational-friction-when-simple-tasks-still-take-too-long/&quot;&gt;&lt;em&gt;operational friction when simple tasks still take too long&lt;/em&gt;&lt;/a&gt;. This article stays on the storefront: how to tell you have left the supportable path, how to separate recovery from a visual redesign, and when Horizon or checkout catch-up is a later project.&lt;/p&gt;&lt;h2&gt;The common assumption&lt;/h2&gt;&lt;p&gt;The assumption is that Shopify redesigned the admin and the theme editor for someone else, and that everyday store design is now supposed to feel like a developer product.&lt;/p&gt;&lt;p&gt;That story is easy to believe. Product and inventory screens have gained steps, variant options take more clicks than they did a few years ago, and Sidekick and other admin AI tools fail to find settings that used to live in one obvious menu, so merchants conclude the interface got worse on purpose.&lt;/p&gt;&lt;p&gt;On the storefront side, the same assumption shows up as a support ticket: the layout file calls the header once, the rendered HTML contains three copies, and the theme editor lists three linked Header rows. Support confirms the theme is heavily customised and closes the case, which the merchant reads as Shopify walking away from its own theme system.&lt;/p&gt;&lt;p&gt;Ownership is the missing piece. Shopify will stand behind &lt;strong&gt;documented Online Store 2.0 behaviour&lt;/strong&gt;: section groups, declared schemas, and dynamic sources whose types match. A header rewritten outside &lt;code&gt;header-group.json&lt;/code&gt; is an engineering surface, and treating it as an editor bug wastes a week.&lt;/p&gt;&lt;h2&gt;Where Shopify theme customisation leaves the supportable path&lt;/h2&gt;&lt;h3&gt;Section groups and leftover static tags&lt;/h3&gt;&lt;p&gt;Modern themes render sitewide chrome with a &lt;strong&gt;section group&lt;/strong&gt;, using &lt;code&gt;{% sections &#39;header-group&#39; %}&lt;/code&gt; (plural) in the layout. The group file lists the announcement bar, header, and anything else that should appear on every template, up to 25 sections per group.&lt;/p&gt;&lt;p&gt;Older or heavily edited themes still use a static &lt;code&gt;{% section &#39;header&#39; %}&lt;/code&gt; tag. Shopify documents that you should avoid mixing static sections and section groups in the same layout. After a custom mega-menu rebuild, we often find both: a leftover static tag, a group file that still references &lt;code&gt;header&lt;/code&gt;, and sometimes a third copy of the markup sitting inside Custom CSS comments. View-source then looks like three headers. Shoppers may only see one, because two copies are commented or &lt;code&gt;disabled&lt;/code&gt;. The editor still shows three linked rows, and the HTML weight is real.&lt;/p&gt;&lt;p&gt;Support is right to step back. There is no settings toggle for &amp;quot;undo the last few header experiments.&amp;quot; Those extra header copies also create accessibility failures: duplicate landmarks, broken skip links, and keyboard traps in custom mega menus. &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-accessibility-bugs-that-block-wcag-aa/&quot;&gt;&lt;em&gt;How to Fix Shopify Accessibility Bugs That Block WCAG AA&lt;/em&gt;&lt;/a&gt; is the fix path once the markup is no longer a single documented section group.&lt;/p&gt;&lt;h3&gt;Dynamic sources that cannot see native fields&lt;/h3&gt;&lt;p&gt;Connect Dynamic Source is type-aware. A collapsible row setting that expects a metafield, or a text type that does not match product description HTML, will show &lt;strong&gt;No compatible fields&lt;/strong&gt; under Template → Product. Merchants follow the official click path, see Title and Content, and assume Studio is broken.&lt;/p&gt;&lt;p&gt;What usually happened is more specific. A metafield named something like &lt;code&gt;description&lt;/code&gt; already occupies the slot. The native &lt;code&gt;product.description&lt;/code&gt; stays hidden because the setting is already bound, or because the section schema never listed description as a compatible source. Preserving paragraph spacing and bold text then requires either a metafield that stores the same HTML, or Liquid that outputs &lt;code&gt;{{ product.description }}&lt;/code&gt; inside the row. That small Liquid change is exactly the moment the block leaves the no-code path.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://ocontis.studio/blog/post/liquid-explained-for-store-owners-no-code-required/&quot;&gt;&lt;em&gt;Liquid Explained for Store Owners&lt;/em&gt;&lt;/a&gt; is the right primer before anyone pastes a snippet they cannot later find.&lt;/p&gt;&lt;h3&gt;Section sprawl without a job per section&lt;/h3&gt;&lt;p&gt;Homepage anxiety is the third signal. Merchants add a banner, featured products, collections, a brand story, reviews, and two promotional modules, then ask whether &amp;quot;too many sections&amp;quot; hurt conversions. Shopify&#39;s ceiling is 25 sections per JSON template. Conversion trouble starts earlier, when several sections sell the same idea and mobile stacking turns a balanced desktop into a long scroll.&lt;/p&gt;&lt;p&gt;That is a merchandising and performance problem, covered in &lt;a href=&quot;https://ocontis.studio/blog/post/common-theme-mistakes-that-kill-conversion-rates/&quot;&gt;&lt;em&gt;common theme mistakes that kill conversion&lt;/em&gt;&lt;/a&gt;. It is also a customisation-limits problem: the editor makes adding a section cheap, and nothing in the UI asks whether the new block has a job the previous block already does.&lt;/p&gt;&lt;h3&gt;The team grew, then the platform moved&lt;/h3&gt;&lt;p&gt;Campaign volume goes up as the marketing team grows, while the number of people allowed to edit Liquid stays at one, or at zero once the last freelancer rotates off. Sequential developers make the same congestion in the files: one person rebuilt the mega menu, the next injected an app snippet into &lt;code&gt;theme.liquid&lt;/code&gt;, and a third added Custom CSS because the section setting was already doing something else. Nobody removed the previous layer.&lt;/p&gt;&lt;p&gt;Shoppers still see one header. The editor may list two. View-source still carries commented blocks and script tags for apps you no longer pay for. App sprawl adds a second owner on a different axis, which is the pattern in &lt;a href=&quot;https://ocontis.studio/blog/post/the-hidden-cost-of-running-a-shopify-store-when-12-apps-quietly-eat-your-margins/&quot;&gt;&lt;em&gt;app costs and audit steps&lt;/em&gt;&lt;/a&gt;. Marketing then buys a landing-page app because the theme editor is already a maze.&lt;/p&gt;&lt;p&gt;Checkout customisation now lives in UI extensions, Functions, branding APIs, and web pixels. Stores that still think in &lt;code&gt;checkout.liquid&lt;/code&gt; or Shopify Scripts cannot pick up the current editor. Horizon nested blocks and AI-assisted section generation assume a theme-block tree, not a collage of static tags and app embeds. You can keep a converting Dawn (or other OS 2.0) theme while you recover merchant control. Dropping Horizon onto those files still leaves marketing without nested blocks they can actually use. There is no automatic Dawn-to-Horizon migration, because the architectures do not translate.&lt;/p&gt;&lt;h2&gt;What we see on real builds&lt;/h2&gt;&lt;p&gt;On audits at oContis Studio, the storefronts that feel &amp;quot;too complicated to design&amp;quot; share a file-level pattern. The published theme still looks like Dawn, Studio, or a premium OS 2.0 theme in the admin. The layout and section JSON tell a different story.&lt;/p&gt;&lt;p&gt;We find custom mega menus wired through snippets that the header section no longer owns. We find &lt;code&gt;theme.liquid&lt;/code&gt; carrying logic that should live in a section. We find metafields created so the editor has something to connect, while the live product description sits unused. We find Custom CSS used as a junk drawer for markup people were afraid to delete.&lt;/p&gt;&lt;p&gt;None of that is visible in a theme demo: it appears after a year of campaign work, a marketplace feed, and successive header changes that never replaced the last version.&lt;/p&gt;&lt;p&gt;Our &lt;a href=&quot;https://ocontis.studio/projects/industry/beauty-and-skincare/&quot;&gt;beauty &amp;amp; skincare&lt;/a&gt; work with &lt;a href=&quot;https://ocontis.studio/projects/medik8/&quot;&gt;Medik8&lt;/a&gt; is the pattern we prefer: a Shopify 2.0 migration that keeps multi-store architecture on a section model the merchant team can still edit. &lt;a href=&quot;https://ocontis.studio/projects/kem-collection/&quot;&gt;Kem Collection&lt;/a&gt; needed a custom OS 2.0 theme for lookbook merchandising in &lt;a href=&quot;https://ocontis.studio/projects/industry/fashion-and-apparel/&quot;&gt;fashion &amp;amp; apparel&lt;/a&gt;, which only stays maintainable if the custom work is named, limited, and kept out of the layout file. Craft belongs in the theme you chose to own, named in a section or snippet the merchant team can still find.&lt;/p&gt;&lt;p&gt;For the structural standard we hold those builds to, see &lt;a href=&quot;https://ocontis.studio/blog/post/the-anatomy-of-a-high-performance-shopify-theme/&quot;&gt;&lt;em&gt;The Anatomy of a High-Performance Shopify Theme&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Wrong-variant carts are the sharp version of the same congestion. Visible swatches that are not wired to the product form&#39;s variant &lt;code&gt;id&lt;/code&gt; look fine in a screenshot and sell the wrong SKU. An unpublished Dawn or Horizon copy is the isolation test. If the default theme adds the right variant, the live theme’s customisation is the fault, and painting a new look on those swatches will ship the same bug.&lt;/p&gt;&lt;h2&gt;A better framing&lt;/h2&gt;&lt;p&gt;The useful question is whether the storefront is still on the &lt;strong&gt;supportable path&lt;/strong&gt;, or whether custom work has created a private theme that happens to run on Shopify.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Signal&lt;/th&gt;&lt;th&gt;Still on the supportable path&lt;/th&gt;&lt;th&gt;Left the supportable path&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Header and footer&lt;/td&gt;&lt;td&gt;One section group each, rendered with &lt;code&gt;{% sections %}&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Static tags, leftover group files, or markup in Custom CSS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Theme editor sidebar&lt;/td&gt;&lt;td&gt;One Header row, one Footer row, template sections below&lt;/td&gt;&lt;td&gt;Linked duplicate Header rows, sections you cannot delete&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Product content&lt;/td&gt;&lt;td&gt;Native fields or documented metafields via dynamic sources&lt;/td&gt;&lt;td&gt;Support-created metafields shadowing &lt;code&gt;product.description&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Homepage&lt;/td&gt;&lt;td&gt;Each section has one job; mobile order checked&lt;/td&gt;&lt;td&gt;Repeated promises, campaign leftovers, no owner for the stack&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Who can change it&lt;/td&gt;&lt;td&gt;Merchandising in the editor; developers for schema and Liquid&lt;/td&gt;&lt;td&gt;Every campaign is a developer ticket; Support declines the theme&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;The supportable path is narrower than &amp;quot;anything the theme editor can open.&amp;quot; It is the combination of JSON templates, section groups, declared schemas, and dynamic sources whose types match. Custom Liquid is allowed when it is an explicit exception with an owner, documented in a named snippet or section.&lt;/p&gt;&lt;p&gt;If you need faster page updates without reloading chrome, that is a separate, documented technique: &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-liquid-partials-swap-main-content-without-reloading-header-and-footer/&quot;&gt;&lt;em&gt;Shopify Liquid Partials&lt;/em&gt;&lt;/a&gt;. Partials still assume a clean header group, so a layout that renders the header three times stays broken.&lt;/p&gt;&lt;p&gt;Treat three jobs as three jobs. Teams collapse them into one word, redesign, and then wonder why the tickets never shrink.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Job&lt;/th&gt;&lt;th&gt;What the team asked for&lt;/th&gt;&lt;th&gt;What actually changes&lt;/th&gt;&lt;th&gt;When it is the right spend&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Visual redesign&lt;/td&gt;&lt;td&gt;A newer look&lt;/td&gt;&lt;td&gt;Type, colour, photography, component styling&lt;/td&gt;&lt;td&gt;Brand identity must change, and the section model underneath is already something marketing can edit&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Recover merchant control&lt;/td&gt;&lt;td&gt;Fewer developer tickets&lt;/td&gt;&lt;td&gt;JSON templates, honest schemas, metafields and metaobjects, leftover snippets removed&lt;/td&gt;&lt;td&gt;The store converts, the theme is already OS 2.0-shaped, and campaigns still require Liquid&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Architecture catch-up&lt;/td&gt;&lt;td&gt;Horizon, checkout extensions, Functions&lt;/td&gt;&lt;td&gt;A new theme-block or checkout model, with content migrated on purpose&lt;/td&gt;&lt;td&gt;Vintage templates, unsupported checkout customisation, or recovery still leaves merchandising in tickets&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Recovery is the default on established catalogues. Catch-up is a project with a cutover plan. Redesign is optional cosmetics once one of the other two has restored an editing surface. Spending the cosmetics budget first is how a congested theme gets a new coat of paint and the same Slack thread in November.&lt;/p&gt;&lt;h2&gt;What to do differently&lt;/h2&gt;&lt;p&gt;Start with four questions you can answer in a working session, before anyone opens Figma.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Who can change the next campaign without a developer?&lt;/strong&gt; If the answer is nobody, merchandising has already left the supportable path regardless of how the homepage looks.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Can marketing add a section on the product template, or only on the homepage?&lt;/strong&gt; Homepage-only flexibility is a Vintage leftover, even when the theme picker shows a modern name.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Does checkout customisation still assume a single Liquid file or Scripts?&lt;/strong&gt; If yes, that work has to move to extensions and Functions before you restyle the storefront.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;What would break if you installed an unpublished copy of Dawn or Horizon and clicked Add to cart on one product?&lt;/strong&gt; Use that as an isolation test, not as a live cutover.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;1. Map chrome before you edit it.&lt;/strong&gt; Open &lt;code&gt;layout/theme.liquid&lt;/code&gt; and list every &lt;code&gt;{% section %}&lt;/code&gt; and &lt;code&gt;{% sections %}&lt;/code&gt; tag. Confirm matching &lt;code&gt;header-group.json&lt;/code&gt; / &lt;code&gt;footer-group.json&lt;/code&gt; files. If you see both a static header tag and a header group, stop adding mega-menu Liquid until one owner remains.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. Treat duplicate editor rows as an extra render in the layout.&lt;/strong&gt; Hiding a second header with CSS leaves duplicate IDs and HTML weight in place. Find the extra render: commented markup, a disabled section in the group, or a static tag that should have been removed during an OS 2.0 migration.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. Match dynamic sources to setting types.&lt;/strong&gt; If Connect Dynamic Source hides description, check the block setting type and any existing metafield binding before you file a Studio bug. Decide whether native &lt;code&gt;product.description&lt;/code&gt; should win, then disconnect the shadow field.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. Give every homepage section a job.&lt;/strong&gt; On mobile, walk the first screen and the next two scrolls, then remove or merge sections that repeat the same promise so proof and products sit close to the first decision. The 25-section ceiling is a platform cap, so aim for one job per section well below that number.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5. Write down the exceptions.&lt;/strong&gt; Any Liquid that Support would refuse should live in a named snippet or section, with a one-line comment that says why the editor could not do it. Undocumented exceptions are how the next partner rebuilds the header again.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6. Choose recover, rebuild, or catch-up.&lt;/strong&gt; Recover when the theme is still an OS 2.0 theme with a few dirty files. Rebuild the architecture when the layout is a collage of static tags, app embeds, and Custom CSS, and merchandising has already lost the editor. Decide Horizon and checkout catch-up as a second phase: recover the current OS 2.0 theme so marketing can operate through peak, then rebuild onto nested blocks when you already need a new architecture and you can migrate content on purpose.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Shopify theme customisation limits are easy to misread as a redesign complaint. The practical limit is the gap between what the theme editor can own and what your files actually do. Section groups, dynamic sources, and JSON templates still give merchandising real control. Custom Liquid still has a place. The expensive storefront is the one that pretends to be both: a native theme in the sidebar, a private fork in the layout.&lt;/p&gt;&lt;p&gt;Horizon, checkout UI extensions, and admin AI become useful after that work, once the files can receive them. A new look on the same files leaves the ticket queue in place.&lt;/p&gt;&lt;p&gt;If your header shows up more than once in the editor, if Support has already declined the theme, or if connecting a product description now requires a metafield invented last week, you have left the supportable path. A &lt;a href=&quot;https://ocontis.studio/services/shopify-theme-development/&quot;&gt;Shopify theme development&lt;/a&gt; engagement at oContis Studio starts by mapping that path, then restoring a section model your team can edit without opening a ticket for every campaign.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Shopify Sidekick&#39;s Continual Learning Flywheel: What Merchants Should Know</title>
    <link href="https://ocontis.studio/blog/post/shopify-sidekicks-continual-learning-flywheel-what-merchants-should-know/" />
    <updated>2026-08-06T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/shopify-sidekicks-continual-learning-flywheel-what-merchants-should-know/</id>
    <content type="html">&lt;h1&gt;Shopify Sidekick&#39;s Continual Learning Flywheel: What Merchants Should Know&lt;/h1&gt;&lt;p&gt;Shopify published how Sidekick now learns from production every day: failed conversations become training signal, a specialised model beats the frontier baseline on quality, and serving cost drops sharply at scale. Because the loop retrains on real merchant traffic, Sidekick should keep improving on Admin GraphQL tasks in ways generic chat wrappers cannot match without their own production flywheel.&lt;/p&gt;&lt;p&gt;For established DTC brands, the practical question is simpler. Sidekick is becoming a durable admin layer on top of your store data, and that layer only works as well as the data underneath it. If that data is messy, duplicated across apps, or shaped by custom workflows Sidekick never sees, the flywheel improves Shopify&#39;s agent, not your foundation.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;In August 2026 Shopify Engineering described Sidekick&#39;s &lt;strong&gt;continual learning loop&lt;/strong&gt;: a daily pipeline that compresses production experience into model weights (&lt;a href=&quot;https://shopify.engineering/sidekicks-continual-learning-loop&quot;&gt;Sidekick&#39;s continual learning loop&lt;/a&gt;). The centrepiece is a &lt;strong&gt;GraphQL agent&lt;/strong&gt; that writes and runs Admin API queries when merchants ask operational questions, then turns results into plain-language answers.&lt;/p&gt;&lt;p&gt;We work with brands where admin already strains under app sprawl, legacy metafields, and one-off scripts. Sidekick adds a fast interpreter on top of that complexity, which makes stack clarity more valuable if your team is also experimenting with the &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-and-claude-connector-setup-benefits-and-risks-for-merchants/&quot;&gt;Shopify Claude connector&lt;/a&gt; or other AI tools that read the same catalogue.&lt;/p&gt;&lt;p&gt;This article translates Shopify&#39;s engineering flywheel into merchant decisions: what Sidekick is optimising for, what it will likely handle well, and where you still need audit, custom development, or integration work.&lt;/p&gt;&lt;p&gt;If you already connect external AI tools to admin, compare Sidekick&#39;s internal loop with the permission and write-risk model in our &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-and-claude-connector-setup-benefits-and-risks-for-merchants/&quot;&gt;Claude connector guide&lt;/a&gt;. Shopify is optimising Sidekick for Shopify-native GraphQL tasks at planetary scale. Your connectors and private apps still need their own scope reviews and rollback plans.&lt;/p&gt;&lt;h2&gt;What Shopify changed&lt;/h2&gt;&lt;p&gt;Shopify&#39;s post frames a problem most AI products hit after launch. Frontier models get you live quickly, but they do not learn from your production traffic automatically. Improvements pile up in prompts, retrieval snippets, routing rules, and harness code while the model weights stay fixed.&lt;/p&gt;&lt;p&gt;Their response is a &lt;strong&gt;flywheel&lt;/strong&gt; with five visible stages:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Define quality&lt;/strong&gt; with a rubric (completeness, execution, response quality, safety) and measure human agreement before trusting an automated judge.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Calibrate judges&lt;/strong&gt; with tools like DSPy so offline scoring tracks real merchant outcomes.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improve the harness&lt;/strong&gt; with autoresearch: propose prompt, tool, or orchestration edits, score them, keep winners.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Mine hard negatives&lt;/strong&gt; from anonymised traffic, repair failures with critic models and human annotation, then fine-tune and apply reinforcement learning.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Compress prompts&lt;/strong&gt; with gist tokens so long static system prompts stop taxing latency on every request.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The GraphQL agent is the worked example: up to &lt;strong&gt;2,000 requests per minute&lt;/strong&gt;, merchant questions translated into Admin GraphQL queries and back into readable summaries.&lt;/p&gt;&lt;figure class=&quot;blog-diagram epmb-figure&quot; role=&quot;figure&quot; aria-labelledby=&quot;epmb-9-caption&quot; data-diagram-id=&quot;epmb-9&quot;&gt;
  &lt;p class=&quot;epmb-figure__summary visually-hidden&quot; id=&quot;epmb-9-summary&quot;&gt;Sidekick flywheel (simplified)&lt;/p&gt;
  &lt;div class=&quot;epmb-figure__brand epmb-figure__brand--top-right&quot;&gt;
  &lt;img class=&quot;epmb-figure__logo&quot; src=&quot;/assets/favicons/safari-pinned-tab.svg&quot; alt=&quot;oContis Studio&quot; width=&quot;32&quot; height=&quot;32&quot; decoding=&quot;async&quot; /&gt;
&lt;/div&gt;
  &lt;div class=&quot;epmb-figure__content&quot;&gt;
    
    &lt;svg id=&quot;epmb-9&quot; width=&quot;100%&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; class=&quot;flowchart&quot; style=&quot;max-width: 614px;&quot; viewBox=&quot;-8 -50.1015625 614 529.446875&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot;&gt;&lt;style&gt;#epmb-9{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;fill:#fafae6;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#epmb-9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#epmb-9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#epmb-9 .error-icon{fill:#141414;}#epmb-9 .error-text{fill:#ebebeb;stroke:#ebebeb;}#epmb-9 .edge-thickness-normal{stroke-width:1px;}#epmb-9 .edge-thickness-thick{stroke-width:3.5px;}#epmb-9 .edge-pattern-solid{stroke-dasharray:0;}#epmb-9 .edge-thickness-invisible{stroke-width:0;fill:none;}#epmb-9 .edge-pattern-dashed{stroke-dasharray:3;}#epmb-9 .edge-pattern-dotted{stroke-dasharray:2;}#epmb-9 .marker{fill:#8a8a7a;stroke:#8a8a7a;}#epmb-9 .marker.cross{stroke:#8a8a7a;}#epmb-9 svg{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;}#epmb-9 p{margin:0;}#epmb-9 .label{font-family:&#39;Syne&#39;,system-ui,sans-serif;color:#fafae6;}#epmb-9 .cluster-label text{fill:#fafae6;}#epmb-9 .cluster-label span{color:#fafae6;}#epmb-9 .cluster-label span p{background-color:transparent;}#epmb-9 .label text,#epmb-9 span{fill:#fafae6;color:#fafae6;}#epmb-9 .node rect,#epmb-9 .node circle,#epmb-9 .node ellipse,#epmb-9 .node polygon,#epmb-9 .node path{fill:#141414;stroke:#db5461;stroke-width:1px;}#epmb-9 .rough-node .label text,#epmb-9 .node .label text,#epmb-9 .image-shape .label,#epmb-9 .icon-shape .label{text-anchor:middle;}#epmb-9 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#epmb-9 .rough-node .label,#epmb-9 .node .label,#epmb-9 .image-shape .label,#epmb-9 .icon-shape .label{text-align:center;}#epmb-9 .node.clickable{cursor:pointer;}#epmb-9 .root .anchor path{fill:#8a8a7a!important;stroke-width:0;stroke:#8a8a7a;}#epmb-9 .arrowheadPath{fill:#f1eff0;}#epmb-9 .edgePath .path{stroke:#8a8a7a;stroke-width:1px;}#epmb-9 .flowchart-link{stroke:#8a8a7a;fill:none;}#epmb-9 .edgeLabel{background-color:#141414;text-align:center;}#epmb-9 .edgeLabel p{background-color:#141414;}#epmb-9 .edgeLabel rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-9 .labelBkg{background-color:rgba(20, 20, 20, 0.5);}#epmb-9 .cluster rect{fill:#141414;stroke:hsl(0, 0%, 17.8431372549%);stroke-width:1px;}#epmb-9 .cluster text{fill:#fafae6;}#epmb-9 .cluster span{color:#fafae6;}#epmb-9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:12px;background:#141414;border:1px solid hsl(0, 0%, 17.8431372549%);border-radius:2px;pointer-events:none;z-index:100;}#epmb-9 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fafae6;}#epmb-9 rect.text{fill:none;stroke-width:0;}#epmb-9 .icon-shape,#epmb-9 .image-shape{background-color:#141414;text-align:center;}#epmb-9 .icon-shape p,#epmb-9 .image-shape p{background-color:#141414;padding:2px;}#epmb-9 .icon-shape .label rect,#epmb-9 .image-shape .label rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#epmb-9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#epmb-9 .node .neo-node{stroke:#db5461;}#epmb-9 [data-look=&quot;neo&quot;].node rect,#epmb-9 [data-look=&quot;neo&quot;].cluster rect,#epmb-9 [data-look=&quot;neo&quot;].node polygon{stroke:url(#epmb-9-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-9 [data-look=&quot;neo&quot;].swimlane.cluster rect{filter:none;}#epmb-9 [data-look=&quot;neo&quot;].node path{stroke:url(#epmb-9-gradient);stroke-width:1px;}#epmb-9 [data-look=&quot;neo&quot;].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-9 [data-look=&quot;neo&quot;].node .neo-line path{stroke:#db5461;filter:none;}#epmb-9 [data-look=&quot;neo&quot;].node circle{stroke:url(#epmb-9-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-9 [data-look=&quot;neo&quot;].node circle .state-start{fill:#000000;}#epmb-9 [data-look=&quot;neo&quot;].icon-shape .icon{fill:url(#epmb-9-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-9 [data-look=&quot;neo&quot;].icon-shape .icon-neo path{stroke:url(#epmb-9-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-9 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;epmb-9_flowchart-v2-pointEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 10 5 L 0 10 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-9_flowchart-v2-pointStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;4.5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 5 L 10 10 L 10 0 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-9_flowchart-v2-pointEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;11.5&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;10.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 11.5 7 L 0 14 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-9_flowchart-v2-pointStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 11.5 14&quot; refX=&quot;1&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11.5&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;polygon points=&quot;0,7 11.5,14 11.5,0&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-9_flowchart-v2-circleEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;11&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-9_flowchart-v2-circleStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-1&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-9_flowchart-v2-circleEnd-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refY=&quot;5&quot; refX=&quot;12.25&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-9_flowchart-v2-circleStart-margin&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-2&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;14&quot; markerHeight=&quot;14&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 0; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-9_flowchart-v2-crossEnd&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;12&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-9_flowchart-v2-crossStart&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;-1&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-9_flowchart-v2-crossEnd-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;17.7&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5;&quot;/&gt;&lt;/marker&gt;&lt;marker id=&quot;epmb-9_flowchart-v2-crossStart-margin&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 15 15&quot; refX=&quot;-3.5&quot; refY=&quot;7.5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 L 14,14 M 1,14 L 14,1&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2.5; stroke-dasharray: 1,0;&quot;/&gt;&lt;/marker&gt;&lt;g class=&quot;root&quot;&gt;&lt;g class=&quot;clusters&quot;/&gt;&lt;g class=&quot;edgePaths&quot;&gt;&lt;path d=&quot;M277.82,60.889L271.304,65.056C264.788,69.222,251.756,77.556,245.24,85.222C238.725,92.889,238.725,99.889,238.725,103.389L238.725,106.889&quot; id=&quot;epmb-9-L_TRAFFIC_JUDGE_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_TRAFFIC_JUDGE_0&quot; data-points=&quot;W3sieCI6Mjc3LjgxOTczNjEwNDMzNTMsInkiOjYwLjg4OTA2MjQ5OTk5OTk5NH0seyJ4IjoyMzguNzI0NjA5Mzc1LCJ5Ijo4NS44ODkwNjI1fSx7IngiOjIzOC43MjQ2MDkzNzUsInkiOjExMC44ODkwNjI1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-9_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M175.346,162.678L165.147,166.845C154.949,171.011,134.553,179.345,124.354,187.011C114.156,194.678,114.156,201.678,114.156,205.178L114.156,208.678&quot; id=&quot;epmb-9-L_JUDGE_HARNESS_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_JUDGE_HARNESS_0&quot; data-points=&quot;W3sieCI6MTc1LjM0NTcxMTk2OTQ1Mjc2LCJ5IjoxNjIuNjc4MTI1fSx7IngiOjExNC4xNTYyNSwieSI6MTg3LjY3ODEyNX0seyJ4IjoxMTQuMTU2MjUsInkiOjIxMi42NzgxMjV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-9_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M302.104,162.678L312.302,166.845C322.5,171.011,342.896,179.345,353.095,187.011C363.293,194.678,363.293,201.678,363.293,205.178L363.293,208.678&quot; id=&quot;epmb-9-L_JUDGE_HEAL_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_JUDGE_HEAL_0&quot; data-points=&quot;W3sieCI6MzAyLjEwMzUwNjc4MDU0NzI2LCJ5IjoxNjIuNjc4MTI1fSx7IngiOjM2My4yOTI5Njg3NSwieSI6MTg3LjY3ODEyNX0seyJ4IjozNjMuMjkyOTY4NzUsInkiOjIxMi42NzgxMjV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-9_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M363.293,265.567L363.293,269.734C363.293,273.901,363.293,282.234,363.293,289.901C363.293,297.567,363.293,304.567,363.293,308.067L363.293,311.567&quot; id=&quot;epmb-9-L_HEAL_TRAIN_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_HEAL_TRAIN_0&quot; data-points=&quot;W3sieCI6MzYzLjI5Mjk2ODc1LCJ5IjoyNjUuNTY3MTg3NX0seyJ4IjozNjMuMjkyOTY4NzUsInkiOjI5MC41NjcxODc1fSx7IngiOjM2My4yOTI5Njg3NSwieSI6MzE1LjU2NzE4NzV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-9_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M363.293,368.456L363.293,372.623C363.293,376.79,363.293,385.123,369.247,393.097C375.201,401.071,387.11,408.686,393.064,412.494L399.018,416.301&quot; id=&quot;epmb-9-L_TRAIN_SERVE_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_TRAIN_SERVE_0&quot; data-points=&quot;W3sieCI6MzYzLjI5Mjk2ODc1LCJ5IjozNjguNDU2MjV9LHsieCI6MzYzLjI5Mjk2ODc1LCJ5IjozOTMuNDU2MjQ5OTk5OTk5OTV9LHsieCI6NDAyLjM4ODA5NTQ3OTMzNTMzLCJ5Ijo0MTguNDU2MjQ5OTk5OTk5OTV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-9_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M485.096,418.456L491.612,414.29C498.128,410.123,511.16,401.79,517.676,389.049C524.191,376.308,524.191,359.16,524.191,342.012C524.191,324.864,524.191,307.715,524.191,290.567C524.191,273.419,524.191,256.271,524.191,239.123C524.191,221.974,524.191,204.826,524.191,187.77C524.191,170.713,524.191,153.748,524.191,136.784C524.191,119.819,524.191,102.854,508.233,90.367C492.275,77.88,460.358,69.871,444.399,65.867L428.441,61.863&quot; id=&quot;epmb-9-L_SERVE_TRAFFIC_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_SERVE_TRAFFIC_0&quot; data-points=&quot;W3sieCI6NDg1LjA5NjI3OTUyMDY2NDY3LCJ5Ijo0MTguNDU2MjQ5OTk5OTk5OTV9LHsieCI6NTI0LjE5MTQwNjI1LCJ5IjozOTMuNDU2MjQ5OTk5OTk5OTV9LHsieCI6NTI0LjE5MTQwNjI1LCJ5IjozNDIuMDExNzE4NzV9LHsieCI6NTI0LjE5MTQwNjI1LCJ5IjoyOTAuNTY3MTg3NX0seyJ4Ijo1MjQuMTkxNDA2MjUsInkiOjIzOS4xMjI2NTYyNX0seyJ4Ijo1MjQuMTkxNDA2MjUsInkiOjE4Ny42NzgxMjV9LHsieCI6NTI0LjE5MTQwNjI1LCJ5IjoxMzYuNzgzNTkzNzV9LHsieCI6NTI0LjE5MTQwNjI1LCJ5Ijo4NS44ODkwNjI1fSx7IngiOjQyNC41NjEwMDE4Mzk5MTAyNiwieSI6NjAuODg5MDYyNDk5OTk5OTk0fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-9_flowchart-v2-pointEnd)&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabels&quot;&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_TRAFFIC_JUDGE_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_JUDGE_HARNESS_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_JUDGE_HEAL_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_HEAL_TRAIN_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_TRAIN_SERVE_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_SERVE_TRAFFIC_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;text y=&quot;-10.1&quot; text-anchor=&quot;middle&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot; text-anchor=&quot;middle&quot;/&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;nodes&quot;&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-9-flowchart-TRAFFIC-0&quot; data-look=&quot;classic&quot; transform=&quot;translate(319.173828125, 34.44453125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-109.30078125&quot; y=&quot;-26.44453125&quot; width=&quot;218.6015625&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Production&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; merchant&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;conversations&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-9-flowchart-JUDGE-1&quot; data-look=&quot;classic&quot; transform=&quot;translate(238.724609375, 136.78359375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-122.21875&quot; y=&quot;-25.89453125&quot; width=&quot;244.4375&quot; height=&quot;51.7890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -10.89453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Calibrated&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; quality&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; judges&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-9-flowchart-HARNESS-3&quot; data-look=&quot;classic&quot; transform=&quot;translate(114.15625, 239.12265625)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-106.15625&quot; y=&quot;-26.44453125&quot; width=&quot;212.3125&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Prompt&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; and&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; harness&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;improvements&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-9-flowchart-HEAL-5&quot; data-look=&quot;classic&quot; transform=&quot;translate(363.29296875, 239.12265625)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-92.98046875&quot; y=&quot;-26.44453125&quot; width=&quot;185.9609375&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Self-healing&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; hard&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;negatives&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-9-flowchart-TRAIN-7&quot; data-look=&quot;classic&quot; transform=&quot;translate(363.29296875, 342.01171875)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-125.8984375&quot; y=&quot;-26.44453125&quot; width=&quot;251.796875&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Fine-tune&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; and&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; RL&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; on&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; store&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;tasks&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-9-flowchart-SERVE-9&quot; data-look=&quot;classic&quot; transform=&quot;translate(443.7421875, 444.90078124999997)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-107.12890625&quot; y=&quot;-26.44453125&quot; width=&quot;214.2578125&quot; height=&quot;52.8890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -11.44453125)&quot;&gt;&lt;rect/&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;stroke: none&quot;/&gt;&lt;text y=&quot;-10.1&quot; style=&quot;&quot;&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;-0.1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;Specialised&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; GraphQL&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;1em&quot; dy=&quot;1.1em&quot;&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt;agent&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-9-drop-shadow&quot; height=&quot;130%&quot; width=&quot;130%&quot;&gt;&lt;fedropshadow dx=&quot;4&quot; dy=&quot;4&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;defs&gt;&lt;filter id=&quot;epmb-9-drop-shadow-small&quot; height=&quot;150%&quot; width=&quot;150%&quot;&gt;&lt;fedropshadow dx=&quot;2&quot; dy=&quot;2&quot; stdDeviation=&quot;0&quot; flood-opacity=&quot;0.06&quot; flood-color=&quot;#000000&quot;/&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;linearGradient id=&quot;epmb-9-gradient&quot; gradientUnits=&quot;objectBoundingBox&quot; x1=&quot;0%&quot; y1=&quot;0%&quot; x2=&quot;100%&quot; y2=&quot;0%&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#db5461&quot; stop-opacity=&quot;1&quot;/&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;hsl(0, 0%, 20.1960784314%)&quot; stop-opacity=&quot;1&quot;/&gt;&lt;/linearGradient&gt;&lt;text text-anchor=&quot;middle&quot; x=&quot;299&quot; y=&quot;-25&quot; class=&quot;flowchartTitleText&quot;&gt;Sidekick flywheel (simplified)&lt;/text&gt;&lt;/svg&gt;
  &lt;/div&gt;
  
  &lt;figcaption class=&quot;epmb-figure__caption&quot; id=&quot;epmb-9-caption&quot;&gt;Sidekick flywheel (simplified)&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h2&gt;Who this affects&lt;/h2&gt;&lt;p&gt;Sidekick&#39;s loop is Shopify platform engineering. You do not run it inside your store. You still feel the effects if your team relies on Sidekick, or if Shopify rolls similar patterns into other admin assistants over time.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Merchant profile&lt;/th&gt;&lt;th&gt;Likely impact&lt;/th&gt;&lt;th&gt;What to watch&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Ops-led brands on standard catalogues&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Faster answers on inventory, orders, and product questions in admin&lt;/td&gt;&lt;td&gt;Permission scope, write actions, data cleanliness&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Plus brands with custom checkout or B2B logic&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Sidekick may answer standard Admin GraphQL tasks well while missing custom stack behaviour&lt;/td&gt;&lt;td&gt;Gap between Sidekick answers and how your stack actually fulfils orders&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Brands heavy on private apps and ERP sync&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;AI summaries may ignore integrations Sidekick cannot query&lt;/td&gt;&lt;td&gt;Structured reporting and stack documentation for the ops team&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Agencies and technical partners&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Admin GraphQL fluency becomes more valuable as Shopify trains agents on it&lt;/td&gt;&lt;td&gt;Schema design, metafield models, and maintainable integrations&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;If your catalogue pain already shows up in &lt;a href=&quot;https://ocontis.studio/blog/post/the-hidden-cost-of-running-a-shopify-store-when-12-apps-quietly-eat-your-margins/&quot;&gt;&lt;em&gt;The Hidden Cost of Running a Shopify Store When 12 Apps Quietly Eat Your Margins&lt;/em&gt;&lt;/a&gt;, Sidekick will surface those conflicts faster. It will not resolve them without foundation work.&lt;/p&gt;&lt;h2&gt;Hype vs reality for merchant teams&lt;/h2&gt;&lt;p&gt;Shopify reports impressive internal numbers: specialised model quality above a frontier baseline, roughly &lt;strong&gt;96% lower serving cost&lt;/strong&gt; on the GraphQL agent workload, &lt;strong&gt;19% faster time-to-first-token&lt;/strong&gt; and &lt;strong&gt;38% lower end-to-end latency&lt;/strong&gt; in a load test after gist compression, and meaningful GPU efficiency gains. Those figures describe Shopify&#39;s scale and infrastructure, not a guarantee your store&#39;s Sidekick experience mirrors a demo on a tidy sandbox.&lt;/p&gt;&lt;p&gt;What holds up on audits:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Production traffic is the curriculum.&lt;/strong&gt; Sidekick improves on real merchant phrasing, partial context, and tool failures. That favours common Admin questions when your store data matches Shopify&#39;s expectations.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;GraphQL is the interface.&lt;/strong&gt; Merchants who ask nuanced stock or order questions benefit when products, variants, and inventory locations are modelled consistently. Broken variant titles and duplicate metafields still produce confident-sounding wrong answers.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Continual learning is Shopify&#39;s moat, not yours.&lt;/strong&gt; Your custom apps, theme logic, and third-party middleware do not automatically enter Shopify&#39;s training loop unless they surface through paths Sidekick can observe.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Latency economics matter at Plus scale.&lt;/strong&gt; Shopify&#39;s gist compression story is a reminder that long static prompts tax every request. Merchants feel the upside as snappier admin answers, not as a reason to skip catalogue clean-up.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For AI catalog and discovery work on the storefront side, Shopify&#39;s separate push on UCP and catalogue readiness still matters. See &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-ai-product-discovery-ucp-catalog-and-data-readiness/&quot;&gt;Shopify AI product discovery and UCP catalog readiness&lt;/a&gt; for how structured product data feeds agentic commerce outside admin chat.&lt;/p&gt;&lt;h2&gt;What merchants should do now&lt;/h2&gt;&lt;h3&gt;Watch: treat Sidekick as a quality bar for admin data&lt;/h3&gt;&lt;p&gt;Use Sidekick questions as informal audits. Ask inventory, fulfilment, and product questions you already know the answer to. If Sidekick misreads stock or mislabels variants, fix the underlying catalogue and metafield model before expanding AI-assisted ops across the team.&lt;/p&gt;&lt;h3&gt;Watch: separate read queries from write risk&lt;/h3&gt;&lt;p&gt;Sidekick&#39;s engineering story focuses on answering questions via GraphQL. Any write path in admin AI, whether Sidekick, Claude, or a custom connector, still needs the same discipline: confirm scope, treat approvals like admin actions, and avoid broad permissions on production stores. The connector risks we outlined in &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-and-claude-connector-setup-benefits-and-risks-for-merchants/&quot;&gt;Shopify and Claude connector setup, benefits, and risks&lt;/a&gt; apply to any tool that can change live data.&lt;/p&gt;&lt;h3&gt;Act: document what AI cannot see&lt;/h3&gt;&lt;p&gt;List ERP rules, subscription logic, checkout extensions, and app middleware that shape fulfilment but sit outside standard Admin GraphQL answers. Your ops team needs a written map so nobody treats an AI summary as full stack truth.&lt;/p&gt;&lt;h3&gt;Act: invest where Sidekick stops&lt;/h3&gt;&lt;p&gt;When workflows depend on combined storefront search, metaobjects, or custom admin tools, you still need &lt;a href=&quot;https://ocontis.studio/services/shopify-app-development/&quot;&gt;Shopify custom app development&lt;/a&gt; and &lt;a href=&quot;https://ocontis.studio/services/&quot;&gt;Shopify development&lt;/a&gt; that matches how the business runs: private apps, UI extensions, integrations, and data architecture your team can extend. Sidekick compresses time on standard questions without replacing the maintainable foundation those workflows still need.&lt;/p&gt;&lt;h3&gt;Act: align your Admin GraphQL mental model&lt;/h3&gt;&lt;p&gt;Shopify&#39;s agent is trained on real merchant language mapped to Admin GraphQL execution. That rewards stores with predictable product and inventory models. If your team still thinks in CSV exports and app-specific dashboards, start small: pick three recurring ops questions, note which metafields and apps they touch, and compare Sidekick answers to your existing reports. Discrepancies usually point to data architecture work, not prompt tweaking.&lt;/p&gt;&lt;p&gt;Agencies and retained partners should expect more client questions about Sidekick accuracy on stock, tags, and fulfilment status. Document GraphQL-friendly catalogue conventions in theme and app handover notes so the next operator is not reverse-engineering variant logic from chat transcripts.&lt;/p&gt;&lt;h2&gt;What this does not change&lt;/h2&gt;&lt;p&gt;Sidekick&#39;s flywheel does not:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Fix theme performance or checkout customisation debt covered in &lt;a href=&quot;https://ocontis.studio/blog/post/the-anatomy-of-a-high-performance-shopify-theme/&quot;&gt;theme architecture&lt;/a&gt; and &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-shopify-checkout-abandonment-when-your-funnel-looks-healthy/&quot;&gt;checkout abandonment&lt;/a&gt; work.&lt;/li&gt;&lt;li&gt;Replace migration or replatforming decisions when Shopify is the wrong long-term fit for your catalogue model.&lt;/li&gt;&lt;li&gt;Remove the need for plan and platform economics reviews in &lt;a href=&quot;https://ocontis.studio/blog/post/choosing-the-right-shopify-plan-a-practical-decision-framework/&quot;&gt;choosing the right Shopify plan&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Shopify is building a self-improving admin assistant for millions of merchants. Your job remains making the store underneath it structurally honest: clean data, scoped permissions, and integrations that survive the next ops hire.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Sidekick&#39;s continual learning loop is Shopify betting that &lt;strong&gt;specialised, retrained models on real merchant traffic&lt;/strong&gt; beat frozen frontier APIs for admin GraphQL at scale. For established brands, that means Sidekick will likely keep improving on mainstream operational questions while your custom stack edges stay yours to document and build.&lt;/p&gt;&lt;p&gt;Start with data hygiene and permission discipline, then use Sidekick as a mirror on catalogue quality. When answers break where your business logic lives outside Admin GraphQL, that is a stack signal, not an AI failure. &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;Book a structured stack assessment&lt;/a&gt; if you want a plain-language map of what Sidekick can see today versus what your team actually runs in production.&lt;/p&gt;</content>
  </entry>
</feed>