<?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-08-06T10:00:00Z</updated>
  <id>https://ocontis.studio/</id>
  <author>
    <name>Octavian Contis</name>
    <email>hello@ocontis.studio</email>
  </author>
  <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>
  <entry>
    <title>How to Fix Shopify Operational Friction When Simple Tasks Still Take Too Long</title>
    <link href="https://ocontis.studio/blog/post/how-to-fix-shopify-operational-friction-when-simple-tasks-still-take-too-long/" />
    <updated>2026-08-05T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/how-to-fix-shopify-operational-friction-when-simple-tasks-still-take-too-long/</id>
    <content type="html">&lt;h1&gt;How to Fix Shopify Operational Friction When Simple Tasks Still Take Too Long&lt;/h1&gt;&lt;p&gt;Your team can run a successful Shopify store and still lose hours every week to tasks that feel embarrassingly manual. Update a bundle price. Exclude a digital SKU from a feed. Launch a segment-specific offer without breaking the default checkout flow. Each job sounds small. Together they become a hidden operations tax that never shows up on the apps line in your P&amp;amp;L.&lt;/p&gt;&lt;p&gt;The fix is rarely a better checklist or a motivational post about productivity. On established stores, persistent friction almost always traces to &lt;strong&gt;stack debt&lt;/strong&gt;: overlapping apps, unclear data ownership, brittle theme customisations, and integrations that were &amp;quot;good enough&amp;quot; at launch but never consolidated when revenue grew.&lt;/p&gt;&lt;p&gt;This reflects patterns we see regularly across the Shopify merchant and developer community: merchants asking which operational problem still feels too hard, and where hidden profit leaks hide in plain sight. This guide classifies those complaints by root cause, shows how to diagnose them without adding another subscription, and maps fix paths that restore control before you rebuild the whole stack.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;Shopify is built so merchants can run day-to-day commerce without a engineering team on call. That promise holds when the stack is coherent: one source of truth per domain, theme patterns merchants can extend, and integrations that sync data instead of exporting CSVs.&lt;/p&gt;&lt;p&gt;It breaks when growth outpaces architecture. A promotion app here, a feed tool there, a custom metafield convention nobody documented, and suddenly &amp;quot;change the sale end date&amp;quot; means Slack messages, two admin screens, and a spreadsheet nobody trusts.&lt;/p&gt;&lt;p&gt;We audit stores at the point where the decision maker feels constrained: they have budget, they have traffic, but every initiative waits on operational glue. The work in this article is the same structured diagnosis we use before recommending theme work, custom apps, or integration cleanup. You do not need to be at enterprise scale for these patterns to appear. They often start when the team grows past the founder who held the whole stack in their head, and nobody has written down which app owns which field.&lt;/p&gt;&lt;p&gt;If your friction is mostly storefront conversion symptoms, pair this with &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; and &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;. If the ceiling feels strategic rather than operational, see &lt;a href=&quot;https://ocontis.studio/blog/post/why-most-shopify-stores-dont-scale-past-50k-month/&quot;&gt;&lt;em&gt;why most stores plateau past $50k/month&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;What merchants are running into&lt;/h2&gt;&lt;p&gt;Forum and community threads often ask an open question: what operational problem still feels harder than it should be, or where is the biggest hidden profit leak? The answers cluster into a short list of &lt;strong&gt;repeatable rituals&lt;/strong&gt; rather than one exotic bug.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Catalog and merchandising rituals.&lt;/strong&gt; Launching a collection, retagging products for a campaign, or syncing variant data for a marketplace feed takes exports, manual edits, and re-imports. Merchants describe &amp;quot;being scared to touch&amp;quot; certain products because one wrong metafield breaks a feed or a bundle app. The fear is rational when nobody can trace which app reads which metafield, or when the theme hardcodes display rules that should live in structured data.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Order and fulfilment rituals.&lt;/strong&gt; Partial refunds, split shipments, B2B price lists, or warehouse exceptions require staff to edit orders by hand, duplicate records in an ERP, or maintain a shadow spreadsheet for what Shopify Payments and the 3PL disagree on. The pain spikes when peak season volume makes those exceptions daily instead of weekly, and the team responds by hiring temporary help to run the same broken path faster.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Reporting rituals.&lt;/strong&gt; Finance asks for contribution margin by SKU; marketing wants cohort performance; operations wants pick accuracy. Each team pulls a different export, and nobody&#39;s numbers match in the Monday meeting.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Promotion and lifecycle rituals.&lt;/strong&gt; A segment offer touches discounts, theme banners, email flows, and sometimes a third-party personalisation layer. Turning the campaign off is as risky as turning it on because ownership is scattered.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Customer service and post-purchase rituals.&lt;/strong&gt; Tracking updates, warranty registrations, and subscription changes pull staff into apps Shopify never shipped natively. Agents copy order numbers between tabs because the helpdesk integration only syncs part of the story.&lt;/p&gt;&lt;p&gt;These are not failures of effort. They are symptoms of &lt;strong&gt;fragmented ownership&lt;/strong&gt;: the same fact (inventory level, customer tag, sale price) living in two places, maintained by two teams, with no documented winner when they disagree.&lt;/p&gt;&lt;p&gt;On calls, merchants often describe the feeling as &amp;quot;Shopify should do this already.&amp;quot; Usually Shopify does support the outcome, but the stack routes the work through three tools and a person who remembers the exception rules from last Black Friday.&lt;/p&gt;&lt;h2&gt;Why this happens&lt;/h2&gt;&lt;h3&gt;1. Apps solved urgency, not architecture&lt;/h3&gt;&lt;p&gt;Most stacks accrete apps at the moment of pain. A feed fails, subscribe to a feed app. Email needs segmentation, add Klaviyo or similar. B2B quotes arrive, add a quoting tool. Each install is rational in isolation.&lt;/p&gt;&lt;p&gt;The compound effect is a &lt;strong&gt;graph of partial solutions&lt;/strong&gt;. No single app owns the merchant workflow end to end. Shopify admin becomes the hub where humans reconcile what automation should have synced. That is where &amp;quot;simple&amp;quot; tasks die: not in the button click, but in the five steps before and after it.&lt;/p&gt;&lt;h3&gt;2. Theme and data model debt&lt;/h3&gt;&lt;p&gt;Online Store 2.0 made sections flexible, but flexibility without guardrails creates &lt;strong&gt;undocumented logic&lt;/strong&gt;. Metafields power filters, badges, and feed rules, yet naming conventions live in one developer&#39;s head. Merchants edit content in sections that secretly depend on metaobject entries or app embeds.&lt;/p&gt;&lt;p&gt;When every campaign needs a developer to add a block or fix Liquid, operational friction shows up as marketing latency. The team buys another app instead of fixing the theme foundation, which repeats the cycle.&lt;/p&gt;&lt;h3&gt;3. Integrations that stop at &amp;quot;connected&amp;quot;&lt;/h3&gt;&lt;p&gt;&amp;quot;Connected&amp;quot; on a settings screen does not mean &lt;strong&gt;one system of record&lt;/strong&gt;. Inventory might sync hourly while orders push in real time. Tax might calculate in checkout while finance reports from a different engine. Integrations built as one-off projects rarely get the reconciliation rules, error alerts, and ownership model that production operations need.&lt;/p&gt;&lt;h3&gt;4. No stack owner after the launch agency left&lt;/h3&gt;&lt;p&gt;Many stores launch with an agency, then run for years without a technical partner who owns the whole picture. Internal teams become experts in workarounds. New hires learn the rituals instead of the architecture. Friction feels normal because nobody remembers the last time the task was actually simple.&lt;/p&gt;&lt;h3&gt;5. Profit leaks hide in labour, not line items&lt;/h3&gt;&lt;p&gt;Community discussions about &amp;quot;hidden profit leaks&amp;quot; often focus on ad spend or app fees. On operating stores, the larger leak is frequently &lt;strong&gt;fully loaded time&lt;/strong&gt;: senior people running junior workflows because the stack never absorbed the complexity. A founder reconciling bundles manually every Sunday is a margin problem even if ROAS looks fine. Pair operational review with &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; and, when app subscriptions are clearly stacking, &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;.&lt;/p&gt;&lt;figure class=&quot;blog-diagram epmb-figure&quot; role=&quot;figure&quot; aria-labelledby=&quot;epmb-8-caption&quot; data-diagram-id=&quot;epmb-8&quot;&gt;
  &lt;p class=&quot;epmb-figure__summary visually-hidden&quot; id=&quot;epmb-8-summary&quot;&gt;Shopify operational friction 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-8&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: 335.3203125px;&quot; viewBox=&quot;-8 -50.1015625 335.3203125 538.246875&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot;&gt;&lt;style&gt;#epmb-8{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-8 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#epmb-8 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#epmb-8 .error-icon{fill:#141414;}#epmb-8 .error-text{fill:#ebebeb;stroke:#ebebeb;}#epmb-8 .edge-thickness-normal{stroke-width:1px;}#epmb-8 .edge-thickness-thick{stroke-width:3.5px;}#epmb-8 .edge-pattern-solid{stroke-dasharray:0;}#epmb-8 .edge-thickness-invisible{stroke-width:0;fill:none;}#epmb-8 .edge-pattern-dashed{stroke-dasharray:3;}#epmb-8 .edge-pattern-dotted{stroke-dasharray:2;}#epmb-8 .marker{fill:#8a8a7a;stroke:#8a8a7a;}#epmb-8 .marker.cross{stroke:#8a8a7a;}#epmb-8 svg{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;}#epmb-8 p{margin:0;}#epmb-8 .label{font-family:&#39;Syne&#39;,system-ui,sans-serif;color:#fafae6;}#epmb-8 .cluster-label text{fill:#fafae6;}#epmb-8 .cluster-label span{color:#fafae6;}#epmb-8 .cluster-label span p{background-color:transparent;}#epmb-8 .label text,#epmb-8 span{fill:#fafae6;color:#fafae6;}#epmb-8 .node rect,#epmb-8 .node circle,#epmb-8 .node ellipse,#epmb-8 .node polygon,#epmb-8 .node path{fill:#141414;stroke:#db5461;stroke-width:1px;}#epmb-8 .rough-node .label text,#epmb-8 .node .label text,#epmb-8 .image-shape .label,#epmb-8 .icon-shape .label{text-anchor:middle;}#epmb-8 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#epmb-8 .rough-node .label,#epmb-8 .node .label,#epmb-8 .image-shape .label,#epmb-8 .icon-shape .label{text-align:center;}#epmb-8 .node.clickable{cursor:pointer;}#epmb-8 .root .anchor path{fill:#8a8a7a!important;stroke-width:0;stroke:#8a8a7a;}#epmb-8 .arrowheadPath{fill:#f1eff0;}#epmb-8 .edgePath .path{stroke:#8a8a7a;stroke-width:1px;}#epmb-8 .flowchart-link{stroke:#8a8a7a;fill:none;}#epmb-8 .edgeLabel{background-color:#141414;text-align:center;}#epmb-8 .edgeLabel p{background-color:#141414;}#epmb-8 .edgeLabel rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-8 .labelBkg{background-color:rgba(20, 20, 20, 0.5);}#epmb-8 .cluster rect{fill:#141414;stroke:hsl(0, 0%, 17.8431372549%);stroke-width:1px;}#epmb-8 .cluster text{fill:#fafae6;}#epmb-8 .cluster span{color:#fafae6;}#epmb-8 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-8 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fafae6;}#epmb-8 rect.text{fill:none;stroke-width:0;}#epmb-8 .icon-shape,#epmb-8 .image-shape{background-color:#141414;text-align:center;}#epmb-8 .icon-shape p,#epmb-8 .image-shape p{background-color:#141414;padding:2px;}#epmb-8 .icon-shape .label rect,#epmb-8 .image-shape .label rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-8 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#epmb-8 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#epmb-8 .node .neo-node{stroke:#db5461;}#epmb-8 [data-look=&quot;neo&quot;].node rect,#epmb-8 [data-look=&quot;neo&quot;].cluster rect,#epmb-8 [data-look=&quot;neo&quot;].node polygon{stroke:url(#epmb-8-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-8 [data-look=&quot;neo&quot;].swimlane.cluster rect{filter:none;}#epmb-8 [data-look=&quot;neo&quot;].node path{stroke:url(#epmb-8-gradient);stroke-width:1px;}#epmb-8 [data-look=&quot;neo&quot;].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-8 [data-look=&quot;neo&quot;].node .neo-line path{stroke:#db5461;filter:none;}#epmb-8 [data-look=&quot;neo&quot;].node circle{stroke:url(#epmb-8-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-8 [data-look=&quot;neo&quot;].node circle .state-start{fill:#000000;}#epmb-8 [data-look=&quot;neo&quot;].icon-shape .icon{fill:url(#epmb-8-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-8 [data-look=&quot;neo&quot;].icon-shape .icon-neo path{stroke:url(#epmb-8-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-8 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;epmb-8_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-8_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-8_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-8_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-8_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-8_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-8_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-8_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-8_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-8_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-8_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-8_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.773,61.989L131.773,66.156C131.773,70.322,131.773,78.656,131.773,86.322C131.773,93.989,131.773,100.989,131.773,104.489L131.773,107.989&quot; id=&quot;epmb-8-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;W3sieCI6MTMxLjc3MzQzNzUsInkiOjYxLjk4OTA2MjV9LHsieCI6MTMxLjc3MzQzNzUsInkiOjg2Ljk4OTA2MjV9LHsieCI6MTMxLjc3MzQzNzUsInkiOjExMS45ODkwNjI1MDAwMDAwMn1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-8_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M131.773,165.978L131.773,170.145C131.773,174.311,131.773,182.645,131.773,190.311C131.773,197.978,131.773,204.978,131.773,208.478L131.773,211.978&quot; id=&quot;epmb-8-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;W3sieCI6MTMxLjc3MzQzNzUsInkiOjE2NS45NzgxMjV9LHsieCI6MTMxLjc3MzQzNzUsInkiOjE5MC45NzgxMjV9LHsieCI6MTMxLjc3MzQzNzUsInkiOjIxNS45NzgxMjV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-8_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M131.773,269.967L131.773,274.134C131.773,278.301,131.773,286.634,131.773,294.301C131.773,301.967,131.773,308.967,131.773,312.467L131.773,315.967&quot; id=&quot;epmb-8-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;W3sieCI6MTMxLjc3MzQzNzUsInkiOjI2OS45NjcxODc1fSx7IngiOjEzMS43NzM0Mzc1LCJ5IjoyOTQuOTY3MTg3NX0seyJ4IjoxMzEuNzczNDM3NSwieSI6MzE5Ljk2NzE4NzV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-8_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M131.773,373.956L131.773,378.123C131.773,382.29,131.773,390.623,131.773,398.29C131.773,405.956,131.773,412.956,131.773,416.456L131.773,419.956&quot; id=&quot;epmb-8-L_S4_CALLOUT_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_S4_CALLOUT_0&quot; data-points=&quot;W3sieCI6MTMxLjc3MzQzNzUsInkiOjM3My45NTYyNTAwMDAwMDAwN30seyJ4IjoxMzEuNzczNDM3NSwieSI6Mzk4Ljk1NjI1fSx7IngiOjEzMS43NzM0Mzc1LCJ5Ijo0MjMuOTU2MjV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-8_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 class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_S4_CALLOUT_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-8-flowchart-S1-0&quot; data-look=&quot;classic&quot; transform=&quot;translate(131.7734375, 34.99453125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-123.7734375&quot; y=&quot;-26.99453125&quot; width=&quot;247.546875&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; Name&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; task&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;What&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; repeats&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; weekly&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;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;feels&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; slow?&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-8-flowchart-S2-1&quot; data-look=&quot;classic&quot; transform=&quot;translate(131.7734375, 138.98359375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-112.61328125&quot; y=&quot;-26.99453125&quot; width=&quot;225.2265625&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;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; Count&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; hops&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;Exports,&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; manual&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;edits&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; per&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; run&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-8-flowchart-S3-2&quot; data-look=&quot;classic&quot; transform=&quot;translate(131.7734375, 242.97265625)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-122.84765625&quot; y=&quot;-26.99453125&quot; width=&quot;245.6953125&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;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; Find&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; duplicate&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; owners&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;Two&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; systems&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; doing&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&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;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-8-flowchart-S4-3&quot; data-look=&quot;classic&quot; transform=&quot;translate(131.7734375, 346.96171875000005)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-119.2890625&quot; y=&quot;-26.99453125&quot; width=&quot;238.578125&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;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; Choose&lt;/tspan&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; path&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;Remove,&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; consolidate,&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;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;rebuild&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-8-flowchart-CALLOUT-9&quot; data-look=&quot;classic&quot; transform=&quot;translate(131.7734375, 452.05078125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-123.7421875&quot; y=&quot;-28.09453125&quot; width=&quot;247.484375&quot; height=&quot;56.1890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -13.09453125)&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;Before&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; adding&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; another&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;app:&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;Map&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 font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; owners&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; pause&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;3.2em&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;if&lt;/tspan&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; is&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; another&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;4.300000000000001em&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;subscription&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-8-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-8-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-8-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;159.66015625&quot; y=&quot;-25&quot; class=&quot;flowchartTitleText&quot;&gt;Shopify operational friction diagnostic&lt;/text&gt;&lt;/svg&gt;
  &lt;/div&gt;
  
  &lt;figcaption class=&quot;epmb-figure__caption&quot; id=&quot;epmb-8-caption&quot;&gt;Shopify operational friction diagnostic&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h2&gt;How to diagnose it&lt;/h2&gt;&lt;p&gt;Start with one painful task your team repeats at least weekly. Write the &lt;strong&gt;actual steps&lt;/strong&gt;, including exports, Slack approvals, and &amp;quot;ask Sarah&amp;quot; moments. If the honest path has more than three hops or two systems of record, you have friction worth fixing.&lt;/p&gt;&lt;p&gt;Use this classification to name the root cause:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Friction pattern&lt;/th&gt;&lt;th&gt;What it looks like&lt;/th&gt;&lt;th&gt;Likely root cause&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Spreadsheet glue&lt;/td&gt;&lt;td&gt;CSV export, edit, re-import; numbers only trusted after manual check&lt;/td&gt;&lt;td&gt;No sync rule or conflicting owners between Shopify and ERP/3PL&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;App hopscotch&lt;/td&gt;&lt;td&gt;Same field edited in two apps plus Shopify admin&lt;/td&gt;&lt;td&gt;Overlapping subscriptions; missing single source of truth&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Developer gate&lt;/td&gt;&lt;td&gt;Merchandising or promo change waits on a ticket&lt;/td&gt;&lt;td&gt;Theme architecture debt; sections or metafields not merchant-safe&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Report mismatch&lt;/td&gt;&lt;td&gt;Finance and marketing argue from different exports&lt;/td&gt;&lt;td&gt;Analytics sprawl; no defined reporting spine&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Launch fear&lt;/td&gt;&lt;td&gt;Team avoids campaigns because last one broke checkout or feeds&lt;/td&gt;&lt;td&gt;Untested interaction between discount, theme, and integration rules&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;Time-cost the ritual.&lt;/strong&gt; Estimate minutes per run times runs per month times fully loaded hourly cost. Compare that to the price of consolidation work or a structured audit. Merchants often find one weekly two-hour ritual costs more annually than a scoped integration fix.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Check duplicate owners.&lt;/strong&gt; For the data involved in the task, ask: if inventory, tax, customer tags, or prices disagree, which system wins? If the answer is &amp;quot;it depends who notices first,&amp;quot; you have an ownership problem, not a training problem.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Read the theme layer.&lt;/strong&gt; Open the template and sections involved. If the task touches Liquid conditions, app blocks, or metafields with no admin labels, the fix belongs in theme and data architecture, not another ops playbook.&lt;/p&gt;&lt;h3&gt;Worked example: campaign launch that takes a day&lt;/h3&gt;&lt;p&gt;A health brand wants a weekend offer for email subscribers only. The honest workflow: export tagged customers from the ESP, cross-check against a discount app, add a theme banner, verify the feed still shows correct compare-at prices, message fulfilment about a SKU that shares inventory with a bundle. One marketer, one ops lead, half a developer day.&lt;/p&gt;&lt;p&gt;Diagnosis: &lt;strong&gt;launch fear&lt;/strong&gt; plus &lt;strong&gt;app hopscotch&lt;/strong&gt;. Speeding up the marketer does not remove the hops. A documented launch surface (merchant-editable banner tied to a single discount definition), feed rules driven from labelled metafields, and a staging checklist before every major promo usually does. After consolidation, the same launch should be a configured workflow inside Shopify rather than a day-long rehearsal.&lt;/p&gt;&lt;h3&gt;Signals you are fixing the wrong layer&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Symptom&lt;/th&gt;&lt;th&gt;Wrong fix&lt;/th&gt;&lt;th&gt;Right layer&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Team asks for &quot;Shopify training&quot;&lt;/td&gt;&lt;td&gt;More admin workshops&lt;/td&gt;&lt;td&gt;Data ownership and theme guardrails&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Every feed error gets a new app&lt;/td&gt;&lt;td&gt;Another feed manager&lt;/td&gt;&lt;td&gt;Catalog source of truth and metafield rules&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Ops keeps a &quot;master spreadsheet&quot;&lt;/td&gt;&lt;td&gt;Better spreadsheet templates&lt;/td&gt;&lt;td&gt;Integration sync and exception handling&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Developers become campaign blockers&lt;/td&gt;&lt;td&gt;Hire more dev hours ad hoc&lt;/td&gt;&lt;td&gt;Section architecture and merchant-safe fields&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;How to fix it&lt;/h2&gt;&lt;p&gt;Fix paths depend on the root cause. Community threads often jump straight to app recommendations because apps are easy to name. On a live store, the durable fix starts with &lt;strong&gt;ownership&lt;/strong&gt;: one winner per data domain, one launch checklist, one reporting definition finance accepts.&lt;/p&gt;&lt;p&gt;Avoid the reflex to install the app mentioned in a community thread before you know which bucket you are in. Map the ritual first, then choose remove, consolidate, or rebuild.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Root cause&lt;/th&gt;&lt;th&gt;Fix path&lt;/th&gt;&lt;th&gt;Effort&lt;/th&gt;&lt;th&gt;What not to do&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Spreadsheet glue&lt;/td&gt;&lt;td&gt;Define one system of record; automate sync with error alerts; retire the export&lt;/td&gt;&lt;td&gt;Medium to high (integration)&lt;/td&gt;&lt;td&gt;Add a &quot;sync helper&quot; app without deleting the manual path&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;App hopscotch&lt;/td&gt;&lt;td&gt;Quarterly app audit; remove overlap; one owner per domain&lt;/td&gt;&lt;td&gt;Low to medium (process + cancel)&lt;/td&gt;&lt;td&gt;Subscribe to a dashboard that aggregates chaos&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Developer gate&lt;/td&gt;&lt;td&gt;Refactor theme sections; document metafields; merchant-safe campaign surfaces&lt;/td&gt;&lt;td&gt;Medium (theme architecture)&lt;/td&gt;&lt;td&gt;Buy a page builder that duplicates the same fragility&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Report mismatch&lt;/td&gt;&lt;td&gt;Pick a reporting spine; map metrics definitions; deprecate shadow exports&lt;/td&gt;&lt;td&gt;Low to medium (ops + data)&lt;/td&gt;&lt;td&gt;Blame the team for &quot;not using Shopify reports correctly&quot;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Launch fear&lt;/td&gt;&lt;td&gt;Staging checklist; document discount + theme + feed interactions; test rollback&lt;/td&gt;&lt;td&gt;Medium (process + QA)&lt;/td&gt;&lt;td&gt;Freeze campaigns indefinitely&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;Remove before you add.&lt;/strong&gt; The highest ROI move on many stores is cancelling one overlapping app and forcing the team to use the remaining owner for thirty days. If the workflow collapses, you learned where the real owner never existed. If it improves, you stopped paying twice.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Consolidate data before you customise UI.&lt;/strong&gt; Merchants feel friction in the admin UI, but the fix often lives in metafield definitions, metaobject models, and integration mappings. &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; made structured data a storefront concern; operations teams still underuse that layer for merchandising rules that should not live in spreadsheets.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Rebuild in the foundation when patches compound.&lt;/strong&gt; When partial navigation, custom checkout logic, or ERP rules fight each other, small fixes stop working. That is when theme development, private apps, or integration rebuilds belong on the roadmap as one programme, not five unrelated tickets. &lt;a href=&quot;https://ocontis.studio/blog/post/the-anatomy-of-a-high-performance-shopify-theme/&quot;&gt;&lt;em&gt;High-performance theme architecture&lt;/em&gt;&lt;/a&gt; is the reference for keeping merchant workflows maintainable as complexity grows.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Measure after fix.&lt;/strong&gt; Pick one metric: hours per week on the ritual, error rate on sync jobs, or time to launch a campaign. Operational friction fixes fail when nobody checks whether the ritual actually disappeared.&lt;/p&gt;&lt;h3&gt;Sequencing fixes without freezing the business&lt;/h3&gt;&lt;p&gt;You do not need a six-month freeze to reduce friction. A practical sequence we use on audits:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Week 1 to 2:&lt;/strong&gt; Inventory the weekly rituals and assign a single owner to document each path.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Week 3 to 4:&lt;/strong&gt; Cancel or downgrade one overlapping app with a written rollback plan.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Month 2:&lt;/strong&gt; Fix the highest-time ritual first (usually catalog or fulfilment sync), not the loudest complaint in Slack.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Month 3 onward:&lt;/strong&gt; Theme and data model work for merchant-safe launches, then integration hardening.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Trying to fix everything in parallel recreates the same chaos you are escaping. One domain at a time, with the team agreeing which system wins when data conflicts, beats a generic digital transformation deck.&lt;/p&gt;&lt;h2&gt;When to get help&lt;/h2&gt;&lt;p&gt;Bring in stack engineering when:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The same task touches &lt;strong&gt;three or more systems&lt;/strong&gt; and nobody can draw the data flow on one whiteboard&lt;/li&gt;&lt;li&gt;Every proposed fix adds &lt;strong&gt;another subscription&lt;/strong&gt; instead of removing hops&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Finance and operations&lt;/strong&gt; cannot agree on order or inventory numbers after repeated &amp;quot;process&amp;quot; fixes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Checkout, feeds, or B2B pricing&lt;/strong&gt; break when marketing runs a normal campaign&lt;/li&gt;&lt;li&gt;Internal capacity is consumed by &lt;strong&gt;workarounds&lt;/strong&gt;, and strategic projects (migration, new market, replatforming) stall&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;That is the entry point for a &lt;a href=&quot;https://ocontis.studio/services/shopify-stack-audit/&quot;&gt;Shopify stack audit&lt;/a&gt;: map owners, overlap, and a foundation-first roadmap. Integration and theme work should follow the diagnosis, not precede it.&lt;/p&gt;&lt;p&gt;On established DTC brands, the decision maker often arrives with a short list of initiatives (new market, subscription tier, B2B portal) and discovers each one waits on the same operational bottlenecks. Treating those bottlenecks as one architecture programme keeps the store maintainable while revenue grows, instead of shipping another workaround that becomes next year&#39;s ritual.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Operational friction on Shopify usually surfaces as a mystery feature gap when the real issue is stack debt: duplicate owners, ritualised workarounds, and tools that solved yesterday&#39;s urgency without a plan for today&#39;s volume.&lt;/p&gt;&lt;p&gt;Name one weekly ritual, count the hops, find who owns the data, and choose remove, consolidate, or rebuild before you add another app. That sequence restores control faster than any generic productivity advice, and it stops hidden profit leaks from masquerading as &amp;quot;just how Shopify works.&amp;quot; Stores that document the fix path after the first successful consolidation rarely slide back into the same ritual six months later, because ownership stays visible in admin instead of living in one person&#39;s inbox or a forgotten shared drive tab.&lt;/p&gt;&lt;p&gt;If simple tasks still take too long after an honest internal pass, &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;book a stack assessment&lt;/a&gt; or see our &lt;a href=&quot;https://ocontis.studio/services/integrations-and-system-optimisation/&quot;&gt;integrations and system optimisation&lt;/a&gt; capability. One partner mapping the whole architecture beats adding a fourth app to patch the symptom for another busy quarter.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Shopify Soft Navigation and the Web Pixel Gap</title>
    <link href="https://ocontis.studio/blog/post/shopify-soft-navigation-and-the-web-pixel-gap/" />
    <updated>2026-08-01T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/shopify-soft-navigation-and-the-web-pixel-gap/</id>
    <content type="html">&lt;h1&gt;Shopify Soft Navigation and the Web Pixel Gap&lt;/h1&gt;&lt;p&gt;Shopify&#39;s Liquid partials preview lets themes name server-rendered regions and swap them without reloading the document. We forked Horizon 4.1.3 on a preview store to explore that with &lt;code&gt;@shopify/partial-rendering&lt;/code&gt;: header, footer, and cart chrome stay in the DOM; only the main content region updates when a buyer navigates. The fork is &lt;a href=&quot;https://github.com/octipus/horizon-partials&quot;&gt;open source on GitHub&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The result feels closer to an app than a traditional storefront: View Transitions between collection and product pages, prefetch on hover and scroll so clicks often reuse warmed HTML, and no full reload on the happy path while server-rendered HTML stays the source of truth.&lt;/p&gt;&lt;p&gt;It also surfaces a problem full page loads hide: &lt;strong&gt;analytics and tracking were designed around document lifecycle, not region lifecycle.&lt;/strong&gt; Standard storefront events update after a swap. Web pixel customer events often do not. This article covers what we found building on the pattern in &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;, the workaround we prototyped, and why we think soft navigation should stay a lab experiment until Shopify owns measurement on partial routes.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;This work depends on Liquid July &#39;26, StorefrontRenderer, and the agentic editor preview. It is experimental. Do not treat the pixel bridge as a production default.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;Merchants evaluating partial-based soft navigation usually ask about speed first: less header flicker, fewer repeated script initialisations, smoother transitions between collection and product pages. We benchmarked that trade-off on the &lt;a href=&quot;https://liquid-july.myshopify.com/&quot;&gt;liquid-july preview store&lt;/a&gt; and found repeat navigation roughly &lt;strong&gt;24× faster&lt;/strong&gt; than full reloads, with a modest first-load cost from the extra runtime. That visible win aligns with the persistent shell 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;high-performance theme&lt;/em&gt;&lt;/a&gt; work.&lt;/p&gt;&lt;p&gt;The harder question arrives when marketing opens Meta Events Manager or GA4 and route-level counts stop matching server-side reality. Soft navigation updates the URL and &lt;code&gt;#MainContent&lt;/code&gt; correctly. &lt;code&gt;shopify:page:view&lt;/code&gt; fires in the standard-events inspector. App pixels in WPM sandboxes often never see &lt;code&gt;page_viewed&lt;/code&gt; for those in-theme routes.&lt;/p&gt;&lt;p&gt;That gap is separable from the navigation UX itself. Partials can feel fast and remain server-rendered while attribution silently drifts. This article maps the architecture, explains why two event buses exist, documents what we tried before reaching for platform internals, and states what we want from Shopify instead of permanent theme-side interception.&lt;/p&gt;&lt;p&gt;You can browse the behaviour on our &lt;a href=&quot;https://liquid-july.myshopify.com/&quot;&gt;liquid-july preview storefront&lt;/a&gt; (password: &lt;code&gt;ocontis&lt;/code&gt;). Clone or inspect the theme in the &lt;a href=&quot;https://github.com/octipus/horizon-partials&quot;&gt;horizon-partials repository&lt;/a&gt;. We also posted a shorter experiment summary on the &lt;a href=&quot;https://community.shopify.dev/t/a-liquid-partials-experiment/36515&quot;&gt;Shopify Developer Community forums&lt;/a&gt; for feedback from other theme builders.&lt;/p&gt;&lt;p&gt;If your stack already struggles with script churn in global chrome, read &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; before adding interceptors. Partials change where HTML lands; they do not reduce the cost of twelve competing analytics snippets in the header.&lt;/p&gt;&lt;h2&gt;Architecture overview&lt;/h2&gt;&lt;p&gt;At a high level, the theme splits the page into a &lt;strong&gt;persistent shell&lt;/strong&gt; and a &lt;strong&gt;swappable content region&lt;/strong&gt;. Platform scripts from &lt;code&gt;content_for_header&lt;/code&gt; initialise once per document. After that, soft navigation replaces only the content partial and runs a post-apply lifecycle. Analytics split across two buses; only one of them updates automatically on a region swap.&lt;/p&gt;&lt;figure class=&quot;blog-diagram epmb-figure&quot; role=&quot;figure&quot; aria-labelledby=&quot;epmb-7-summary&quot; data-diagram-id=&quot;epmb-7&quot;&gt;
  &lt;p class=&quot;epmb-figure__summary visually-hidden&quot; id=&quot;epmb-7-summary&quot;&gt;Mermaid diagram&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-7&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: 1529.25px;&quot; viewBox=&quot;-8 -16.1015625 1529.25 776.6359375000001&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot;&gt;&lt;style&gt;#epmb-7{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-7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#epmb-7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#epmb-7 .error-icon{fill:#141414;}#epmb-7 .error-text{fill:#ebebeb;stroke:#ebebeb;}#epmb-7 .edge-thickness-normal{stroke-width:1px;}#epmb-7 .edge-thickness-thick{stroke-width:3.5px;}#epmb-7 .edge-pattern-solid{stroke-dasharray:0;}#epmb-7 .edge-thickness-invisible{stroke-width:0;fill:none;}#epmb-7 .edge-pattern-dashed{stroke-dasharray:3;}#epmb-7 .edge-pattern-dotted{stroke-dasharray:2;}#epmb-7 .marker{fill:#8a8a7a;stroke:#8a8a7a;}#epmb-7 .marker.cross{stroke:#8a8a7a;}#epmb-7 svg{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;}#epmb-7 p{margin:0;}#epmb-7 .label{font-family:&#39;Syne&#39;,system-ui,sans-serif;color:#fafae6;}#epmb-7 .cluster-label text{fill:#fafae6;}#epmb-7 .cluster-label span{color:#fafae6;}#epmb-7 .cluster-label span p{background-color:transparent;}#epmb-7 .label text,#epmb-7 span{fill:#fafae6;color:#fafae6;}#epmb-7 .node rect,#epmb-7 .node circle,#epmb-7 .node ellipse,#epmb-7 .node polygon,#epmb-7 .node path{fill:#141414;stroke:#db5461;stroke-width:1px;}#epmb-7 .rough-node .label text,#epmb-7 .node .label text,#epmb-7 .image-shape .label,#epmb-7 .icon-shape .label{text-anchor:middle;}#epmb-7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#epmb-7 .rough-node .label,#epmb-7 .node .label,#epmb-7 .image-shape .label,#epmb-7 .icon-shape .label{text-align:center;}#epmb-7 .node.clickable{cursor:pointer;}#epmb-7 .root .anchor path{fill:#8a8a7a!important;stroke-width:0;stroke:#8a8a7a;}#epmb-7 .arrowheadPath{fill:#f1eff0;}#epmb-7 .edgePath .path{stroke:#8a8a7a;stroke-width:1px;}#epmb-7 .flowchart-link{stroke:#8a8a7a;fill:none;}#epmb-7 .edgeLabel{background-color:#141414;text-align:center;}#epmb-7 .edgeLabel p{background-color:#141414;}#epmb-7 .edgeLabel rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-7 .labelBkg{background-color:rgba(20, 20, 20, 0.5);}#epmb-7 .cluster rect{fill:#141414;stroke:hsl(0, 0%, 17.8431372549%);stroke-width:1px;}#epmb-7 .cluster text{fill:#fafae6;}#epmb-7 .cluster span{color:#fafae6;}#epmb-7 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-7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fafae6;}#epmb-7 rect.text{fill:none;stroke-width:0;}#epmb-7 .icon-shape,#epmb-7 .image-shape{background-color:#141414;text-align:center;}#epmb-7 .icon-shape p,#epmb-7 .image-shape p{background-color:#141414;padding:2px;}#epmb-7 .icon-shape .label rect,#epmb-7 .image-shape .label rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#epmb-7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#epmb-7 .node .neo-node{stroke:#db5461;}#epmb-7 [data-look=&quot;neo&quot;].node rect,#epmb-7 [data-look=&quot;neo&quot;].cluster rect,#epmb-7 [data-look=&quot;neo&quot;].node polygon{stroke:url(#epmb-7-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-7 [data-look=&quot;neo&quot;].swimlane.cluster rect{filter:none;}#epmb-7 [data-look=&quot;neo&quot;].node path{stroke:url(#epmb-7-gradient);stroke-width:1px;}#epmb-7 [data-look=&quot;neo&quot;].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-7 [data-look=&quot;neo&quot;].node .neo-line path{stroke:#db5461;filter:none;}#epmb-7 [data-look=&quot;neo&quot;].node circle{stroke:url(#epmb-7-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-7 [data-look=&quot;neo&quot;].node circle .state-start{fill:#000000;}#epmb-7 [data-look=&quot;neo&quot;].icon-shape .icon{fill:url(#epmb-7-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-7 [data-look=&quot;neo&quot;].icon-shape .icon-neo path{stroke:url(#epmb-7-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-7 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;epmb-7_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-7_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-7_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-7_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-7_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-7_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-7_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-7_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-7_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-7_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-7_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-7_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;cluster&quot; id=&quot;epmb-7-BRIDGE&quot; data-look=&quot;classic&quot;&gt;&lt;rect style=&quot;&quot; x=&quot;8&quot; y=&quot;365.56718749999993&quot; width=&quot;330.0234375&quot; height=&quot;232.97812500000003&quot;/&gt;&lt;g class=&quot;cluster-label&quot; transform=&quot;translate(71.28125, 365.56718749999993)&quot;&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;Experimental&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; bridge&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;cluster&quot; id=&quot;epmb-7-EVENTS&quot; data-look=&quot;classic&quot;&gt;&lt;rect style=&quot;&quot; x=&quot;80.6484375&quot; y=&quot;648.5453125&quot; width=&quot;784.654296875&quot; height=&quot;103.98906250000005&quot;/&gt;&lt;g class=&quot;cluster-label&quot; transform=&quot;translate(410.6865234375, 648.5453125)&quot;&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;Two&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; buses&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;cluster&quot; id=&quot;epmb-7-PLATFORM&quot; data-look=&quot;classic&quot;&gt;&lt;rect style=&quot;&quot; x=&quot;17.625&quot; y=&quot;8&quot; width=&quot;311.1015625&quot; height=&quot;102.8890625&quot;/&gt;&lt;g class=&quot;cluster-label&quot; transform=&quot;translate(61.03125, 8)&quot;&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;Platform&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; (once&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; per&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; document)&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;cluster&quot; id=&quot;epmb-7-NAV&quot; data-look=&quot;classic&quot;&gt;&lt;rect style=&quot;&quot; x=&quot;358.0234375&quot; y=&quot;8&quot; width=&quot;575.84375&quot; height=&quot;461.55625&quot;/&gt;&lt;g class=&quot;cluster-label&quot; transform=&quot;translate(590.296875, 8)&quot;&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;Soft&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; navigation&lt;/tspan&gt;&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;cluster&quot; id=&quot;epmb-7-LAYOUT&quot; data-look=&quot;classic&quot;&gt;&lt;rect style=&quot;&quot; x=&quot;953.8671875&quot; y=&quot;365.56718749999993&quot; width=&quot;547.171875&quot; height=&quot;103.98906249999999&quot;/&gt;&lt;g class=&quot;cluster-label&quot; transform=&quot;translate(1176.55078125, 365.56718749999993)&quot;&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;Theme&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; layout&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;edgePaths&quot;&gt;&lt;path d=&quot;M521.953,85.889L521.953,90.056C521.953,94.222,521.953,102.556,521.953,110.889C521.953,119.222,521.953,127.556,532.53,135.657C543.106,143.758,564.259,151.626,574.835,155.56L585.412,159.494&quot; id=&quot;epmb-7-L_PREFETCH_FETCH_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_PREFETCH_FETCH_0&quot; data-points=&quot;W3sieCI6NTIxLjk1MzEyNSwieSI6ODUuODg5MDYyNX0seyJ4Ijo1MjEuOTUzMTI1LCJ5IjoxMTAuODg5MDYyNX0seyJ4Ijo1MjEuOTUzMTI1LCJ5IjoxMzUuODg5MDYyNX0seyJ4Ijo1ODkuMTYwODkyMjg4MzU2OCwieSI6MTYwLjg4OTA2MjV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-7_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M795.594,85.339L795.594,89.597C795.594,93.856,795.594,102.372,795.594,110.797C795.594,119.222,795.594,127.556,785.017,135.657C774.441,143.758,753.288,151.626,742.711,155.56L732.135,159.494&quot; id=&quot;epmb-7-L_CLICK_FETCH_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_CLICK_FETCH_0&quot; data-points=&quot;W3sieCI6Nzk1LjU5Mzc1LCJ5Ijo4NS4zMzkwNjI1fSx7IngiOjc5NS41OTM3NSwieSI6MTEwLjg4OTA2MjV9LHsieCI6Nzk1LjU5Mzc1LCJ5IjoxMzUuODg5MDYyNX0seyJ4Ijo3MjguMzg1OTgyNzExNjQzMiwieSI6MTYwLjg4OTA2MjV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-7_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M658.773,212.678L658.773,216.845C658.773,221.011,658.773,229.345,658.773,237.011C658.773,244.678,658.773,251.678,658.773,255.178L658.773,258.678&quot; id=&quot;epmb-7-L_FETCH_VT_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_FETCH_VT_0&quot; data-points=&quot;W3sieCI6NjU4Ljc3MzQzNzUsInkiOjIxMi42NzgxMjV9LHsieCI6NjU4Ljc3MzQzNzUsInkiOjIzNy42NzgxMjV9LHsieCI6NjU4Ljc3MzQzNzUsInkiOjI2Mi42NzgxMjQ5OTk5OTk5N31d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-7_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M757.309,315.567L772.835,319.734C788.361,323.901,819.412,332.234,834.937,340.567C850.463,348.901,850.463,357.234,916.659,368.171C982.855,379.108,1115.246,392.649,1181.442,399.419L1247.638,406.189&quot; id=&quot;epmb-7-L_VT_CONTENT_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_VT_CONTENT_0&quot; data-points=&quot;W3sieCI6NzU3LjMwOTQyNTg3OTkwMTQsInkiOjMxNS41NjcxODc1fSx7IngiOjg1MC40NjI4OTA2MjUsInkiOjM0MC41NjcxODc1fSx7IngiOjg1MC40NjI4OTA2MjUsInkiOjM2NS41NjcxODc1fSx7IngiOjEyNTEuNjE3MTg3NSwieSI6NDA2LjU5NjQwODY0NzYzMDY1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-7_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M592.83,315.567L582.44,319.734C572.049,323.901,551.269,332.234,540.879,340.567C530.488,348.901,530.488,357.234,530.488,364.901C530.488,372.567,530.488,379.567,530.488,383.067L530.488,386.567&quot; id=&quot;epmb-7-L_VT_POST_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_VT_POST_0&quot; data-points=&quot;W3sieCI6NTkyLjgyOTc3NDY2Njc1NjUsInkiOjMxNS41NjcxODc1fSx7IngiOjUzMC40ODgyODEyNSwieSI6MzQwLjU2NzE4NzV9LHsieCI6NTMwLjQ4ODI4MTI1LCJ5IjozNjUuNTY3MTg3NX0seyJ4Ijo1MzAuNDg4MjgxMjUsInkiOjM5MC41NjcxODc1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-7_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M618.663,444.556L632.273,448.723C645.883,452.89,673.102,461.223,686.712,469.556C700.322,477.89,700.322,486.223,700.322,499.055C700.322,511.888,700.322,529.219,700.322,546.551C700.322,563.882,700.322,581.214,700.322,594.046C700.322,606.879,700.322,615.212,700.322,623.545C700.322,631.879,700.322,640.212,700.322,647.97C700.322,655.729,700.322,662.912,700.322,666.504L700.322,670.095&quot; id=&quot;epmb-7-L_POST_STD_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_POST_STD_0&quot; data-points=&quot;W3sieCI6NjE4LjY2MjcyMzYwNTg1NzQsInkiOjQ0NC41NTYyNTAwMDAwMDAwM30seyJ4Ijo3MDAuMzIyMjY1NjI1LCJ5Ijo0NjkuNTU2MjV9LHsieCI6NzAwLjMyMjI2NTYyNSwieSI6NDk0LjU1NjI1fSx7IngiOjcwMC4zMjIyNjU2MjUsInkiOjU0Ni41NTA3ODEyNX0seyJ4Ijo3MDAuMzIyMjY1NjI1LCJ5Ijo1OTguNTQ1MzEyNX0seyJ4Ijo3MDAuMzIyMjY1NjI1LCJ5Ijo2MjMuNTQ1MzEyNX0seyJ4Ijo3MDAuMzIyMjY1NjI1LCJ5Ijo2NDguNTQ1MzEyNX0seyJ4Ijo3MDAuMzIyMjY1NjI1LCJ5Ijo2NzQuMDk1MzEyNTAwMDAwMX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-7_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M526.071,444.556L525.389,448.723C524.708,452.89,523.344,461.223,522.662,469.556C521.98,477.89,521.98,486.223,521.98,499.055C521.98,511.888,521.98,529.219,521.98,546.551C521.98,563.882,521.98,581.214,521.98,594.046C521.98,606.879,521.98,615.212,521.98,623.545C521.98,631.879,521.98,640.212,505.514,648.388C489.047,656.563,456.114,664.581,439.647,668.59L423.18,672.599&quot; id=&quot;epmb-7-L_POST_PIX_0&quot; class=&quot;edge-thickness-normal edge-pattern-dotted 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_POST_PIX_0&quot; data-points=&quot;W3sieCI6NTI2LjA3MTE5MzQzNTU4OSwieSI6NDQ0LjU1NjI1MDAwMDAwMDAzfSx7IngiOjUyMS45ODA0Njg3NSwieSI6NDY5LjU1NjI1fSx7IngiOjUyMS45ODA0Njg3NSwieSI6NDk0LjU1NjI1fSx7IngiOjUyMS45ODA0Njg3NSwieSI6NTQ2LjU1MDc4MTI1fSx7IngiOjUyMS45ODA0Njg3NSwieSI6NTk4LjU0NTMxMjV9LHsieCI6NTIxLjk4MDQ2ODc1LCJ5Ijo2MjMuNTQ1MzEyNX0seyJ4Ijo1MjEuOTgwNDY4NzUsInkiOjY0OC41NDUzMTI1fSx7IngiOjQxOS4yOTM5ODIwNDAxNTk3LCJ5Ijo2NzMuNTQ1MzEyNX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-7_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M172.848,444.006L172.848,448.265C172.848,452.523,172.848,461.04,172.848,469.465C172.848,477.89,172.848,486.223,173.523,493.902C174.199,501.58,175.549,508.604,176.225,512.116L176.9,515.628&quot; id=&quot;epmb-7-L_CAP_REPLAY_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_CAP_REPLAY_0&quot; data-points=&quot;W3sieCI6MTcyLjg0NzY1NjI1LCJ5Ijo0NDQuMDA2MjV9LHsieCI6MTcyLjg0NzY1NjI1LCJ5Ijo0NjkuNTU2MjV9LHsieCI6MTcyLjg0NzY1NjI1LCJ5Ijo0OTQuNTU2MjV9LHsieCI6MTc3LjY1NTg1NDIyNzU1MTc0LCJ5Ijo1MTkuNTU2MjV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-7_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M182.848,573.545L182.848,577.712C182.848,581.879,182.848,590.212,182.848,598.545C182.848,606.879,182.848,615.212,182.848,623.545C182.848,631.879,182.848,640.212,192.294,648.29C201.741,656.369,220.634,664.192,230.081,668.103L239.527,672.015&quot; id=&quot;epmb-7-L_REPLAY_PIX_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_REPLAY_PIX_0&quot; data-points=&quot;W3sieCI6MTgyLjg0NzY1NjI1LCJ5Ijo1NzMuNTQ1MzEyNX0seyJ4IjoxODIuODQ3NjU2MjUsInkiOjU5OC41NDUzMTI1fSx7IngiOjE4Mi44NDc2NTYyNSwieSI6NjIzLjU0NTMxMjV9LHsieCI6MTgyLjg0NzY1NjI1LCJ5Ijo2NDguNTQ1MzEyNX0seyJ4IjoyNDMuMjIyOTM5ODU4NTUyNiwieSI6NjczLjU0NTMxMjV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-7_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M488.701,444.556L482.251,448.723C475.802,452.89,462.902,461.223,423.997,469.556C385.092,477.89,320.182,486.223,282.464,494.167C244.747,502.112,234.223,509.668,228.96,513.446L223.698,517.223&quot; id=&quot;epmb-7-L_POST_REPLAY_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_POST_REPLAY_0&quot; data-points=&quot;W3sieCI6NDg4LjcwMTM3MzEzNjExODk1LCJ5Ijo0NDQuNTU2MjUwMDAwMDAwMDN9LHsieCI6NDUwLjAwMTk1MzEyNSwieSI6NDY5LjU1NjI1fSx7IngiOjI1NS4yNzE0ODQzNzUsInkiOjQ5NC41NTYyNX0seyJ4IjoyMjAuNDQ4NjczOTgzMjgyMSwieSI6NTE5LjU1NjI1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-7_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M277.727,37.609Z&quot; id=&quot;epmb-7-L_CFH_PLATFORM_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_CFH_PLATFORM_0&quot; data-points=&quot;W3sieCI6MjczLjcyNjU2MjUsInkiOjM3LjYwODc1NDg1MDU2ODQ0NX0seyJ4IjoyOTcuMDU5ODk1ODMzMzMzMywieSI6MzN9LHsieCI6MzAyLjg5MzIyOTE2NjY2NjcsInkiOjMzfSx7IngiOjMwOC43MjY1NjI1LCJ5Ijo1OS40NDQ1MzEyNX0seyJ4IjozMDIuODkzMjI5MTY2NjY2NywieSI6ODUuODg5MDYyNX0seyJ4IjoyOTcuMDU5ODk1ODMzMzMzMywieSI6ODUuODg5MDYyNX0seyJ4IjoyNzMuNzI2NTYyNSwieSI6ODEuMjgwMzA3NjQ5NDMxNTV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-7_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_PREFETCH_FETCH_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_CLICK_FETCH_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_FETCH_VT_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_VT_CONTENT_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_VT_POST_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_POST_STD_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(521.98046875, 546.55078125)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_POST_PIX_0&quot; transform=&quot;translate(-67.767578125, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-17.86328125&quot; y=&quot;-18.1015625&quot; width=&quot;171.26171875&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;gap:&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; supported&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&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_CAP_REPLAY_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_REPLAY_PIX_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_POST_REPLAY_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_CFH_PLATFORM_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-7-flowchart-SHELL-0&quot; data-look=&quot;classic&quot; transform=&quot;translate(1095.2421875, 417.56171875)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-106.375&quot; y=&quot;-26.44453125&quot; width=&quot;212.75&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;Persistent&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; shell&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;header&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; footer&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; cart&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-7-flowchart-CONTENT-1&quot; data-look=&quot;classic&quot; transform=&quot;translate(1358.828125, 417.56171875)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-107.2109375&quot; y=&quot;-26.44453125&quot; width=&quot;214.421875&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;page-content&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; partial&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;swapped&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; soft&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; nav&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-7-flowchart-PREFETCH-2&quot; data-look=&quot;classic&quot; transform=&quot;translate(521.953125, 59.44453125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-128.90234375&quot; y=&quot;-26.44453125&quot; width=&quot;257.8046875&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;Prefetch&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; hover&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; focus&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;viewport&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-7-flowchart-CLICK-3&quot; data-look=&quot;classic&quot; transform=&quot;translate(795.59375, 59.44453125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-94.73828125&quot; y=&quot;-25.89453125&quot; width=&quot;189.4765625&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;In-scope&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; link&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; click&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-7-flowchart-FETCH-4&quot; data-look=&quot;classic&quot; transform=&quot;translate(658.7734375, 186.78359375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-107.6640625&quot; y=&quot;-25.89453125&quot; width=&quot;215.328125&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;partials.fetch&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; apply&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-7-flowchart-VT-5&quot; data-look=&quot;classic&quot; transform=&quot;translate(658.7734375, 289.12265625)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-111.80859375&quot; y=&quot;-26.44453125&quot; width=&quot;223.6171875&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;View&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Transition&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; (apply&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;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-7-flowchart-POST-6&quot; data-look=&quot;classic&quot; transform=&quot;translate(530.48828125, 417.56171875)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-128.95703125&quot; y=&quot;-26.99453125&quot; width=&quot;257.9140625&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;afterTransition&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; lifecycle&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;head&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; ·&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; scripts&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; events&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;·&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; menu&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; drawer&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-7-flowchart-CFH-15&quot; data-look=&quot;classic&quot; transform=&quot;translate(163.17578125, 59.44453125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-110.55078125&quot; y=&quot;-26.44453125&quot; width=&quot;221.1015625&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;content_for_header&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;Trekkie&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; WPM&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; 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-7-flowchart-STD-16&quot; data-look=&quot;classic&quot; transform=&quot;translate(700.322265625, 700.53984375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-129.98046875&quot; y=&quot;-26.44453125&quot; width=&quot;259.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;shopify:page:view&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;standard&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; 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-7-flowchart-PIX-17&quot; data-look=&quot;classic&quot; transform=&quot;translate(308.4150390625, 700.53984375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-129.3984375&quot; y=&quot;-26.99453125&quot; width=&quot;258.796875&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;page_viewed&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;collection_viewed&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;web&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; customer&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&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-7-flowchart-CAP-24&quot; data-look=&quot;classic&quot; transform=&quot;translate(172.84765625, 417.56171875)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-129.84765625&quot; y=&quot;-26.44453125&quot; width=&quot;259.6953125&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;WPM&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; init&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; capture&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; content_for_header&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-7-flowchart-REPLAY-25&quot; data-look=&quot;classic&quot; transform=&quot;translate(182.84765625, 546.55078125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-110.50390625&quot; y=&quot;-26.99453125&quot; width=&quot;221.0078125&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;partial-pixel-events.js&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;Trekkie&lt;/tspan&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; +&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; WPM&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;publish&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-7-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-7-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-7-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;/svg&gt;
  &lt;/div&gt;
  
  
&lt;/figure&gt;&lt;p&gt;The dashed path is the part we dislike: intercepting Web Pixels Manager before Shopify freezes the global, then manually publishing customer events after each navigation.&lt;/p&gt;&lt;h2&gt;How soft navigation works&lt;/h2&gt;&lt;p&gt;A custom element, &lt;code&gt;&amp;lt;partial-navigation&amp;gt;&lt;/code&gt;, listens for clicks on in-scope links (&lt;code&gt;data-partial-nav&lt;/code&gt; or anything inside a scoped header/footer container). It prevents the default navigation, pushes the URL with the History API, and fetches fresh server HTML for the &lt;code&gt;page-content&lt;/code&gt; partial in parallel with any missing template stylesheets.&lt;/p&gt;&lt;p&gt;Before the click, the theme tries to warm that fetch. Header nav links prefetch on connect. Visible product cards prefetch when they enter the viewport. Hover (debounced), pointerdown, and keyboard focus do the same. Results sit in a short-lived cache (24 entries, 30 seconds) so the navigation path often reuses prefetched HTML and parsed head metadata.&lt;/p&gt;&lt;p&gt;&lt;code&gt;partials.apply()&lt;/code&gt; swaps the region while preserving focus, form state, and scroll where possible. A View Transition wrapper adds polish when the merchant enables it. Transitions animate &lt;code&gt;[data-partial-page-root]&lt;/code&gt; inside &lt;code&gt;#MainContent&lt;/code&gt;, not the full &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; element, so the persistent header shell does not participate in the snapshot and layout stays stable. On &lt;code&gt;popstate&lt;/code&gt;, the same flow runs for back and forward.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Timing matters for transitions.&lt;/strong&gt; The View Transition snapshot captures DOM state during &lt;code&gt;partials.apply()&lt;/code&gt; only. Head sync, scroll reset, script re-exec, and analytics replay run in an &lt;code&gt;afterTransition&lt;/code&gt; callback so they do not change the DOM mid-animation. That keeps morph and slide transitions smooth while still doing full lifecycle work after the swap.&lt;/p&gt;&lt;p&gt;After every apply (post-transition), the theme syncs theme-owned head metadata (title, meta tags marked &lt;code&gt;data-partial-head-managed&lt;/code&gt;), re-executes section scripts, fires &lt;code&gt;shopify:section:load&lt;/code&gt;, updates nav &lt;code&gt;aria-current&lt;/code&gt; in the persistent header, closes the mobile menu drawer when it is still open, aligns cart badge counts, and dispatches standard page view events. Because the header is not re-fetched on navigation, shell UX must be updated in JavaScript: active link state and drawer visibility are two examples. Cart mutations are separate: &lt;code&gt;Shopify.actions&lt;/code&gt; emits &lt;code&gt;shopify:cart:lines-update&lt;/code&gt;, and the theme refreshes only the nested &lt;code&gt;header-cart&lt;/code&gt; partial.&lt;/p&gt;&lt;p&gt;Rapid clicks abort stale fetches via &lt;code&gt;AbortController&lt;/code&gt;. Duplicate navigations to the same URL share one in-flight promise. If a fetch fails, the theme falls back to a full page load rather than leaving the buyer on stale content.&lt;/p&gt;&lt;p&gt;None of that is exotic. It follows the partials model Shopify is previewing and aligns with Declarative Partial Updates thinking on the web platform: named regions, server HTML, client-side replacement without giving up Liquid as the source of truth.&lt;/p&gt;&lt;h3&gt;Persistent shell gotchas&lt;/h3&gt;&lt;p&gt;Keeping the header in the DOM is the point of partial navigation, but it creates UX work a full reload handles for free. Two examples from our Horizon fork:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Active nav state.&lt;/strong&gt; Liquid renders &lt;code&gt;aria-current=&amp;quot;page&amp;quot;&lt;/code&gt; on first paint. After a soft nav, the theme walks header links and updates &lt;code&gt;aria-current&lt;/code&gt; from &lt;code&gt;window.location&lt;/code&gt; without re-fetching header HTML (&lt;code&gt;syncHeaderNavActiveState()&lt;/code&gt; in &lt;code&gt;partial-page-lifecycle.js&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mobile menu drawer.&lt;/strong&gt; Tapping a nav link inside an open drawer navigates correctly, but the drawer element never unmounts. Without an explicit close after &lt;code&gt;partials.apply()&lt;/code&gt;, buyers arrive on the new page with the menu still covering the viewport. The lifecycle calls &lt;code&gt;header-drawer.close()&lt;/code&gt; when the drawer is open, using the same animation path as the close button.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Header height CSS variables are measured once at load and on resize, not on every partial apply. Re-measuring the header after each swap caused hero layout jumps when page transitions were enabled.&lt;/p&gt;&lt;h2&gt;Performance: baseline vs partials&lt;/h2&gt;&lt;p&gt;We measured buyer-perceived performance on &lt;strong&gt;1 August 2026&lt;/strong&gt; against the &lt;a href=&quot;https://github.com/octipus/horizon-partials&quot;&gt;horizon-partials&lt;/a&gt; repo on &lt;code&gt;liquid-july.myshopify.com&lt;/code&gt;, using &lt;code&gt;shopify theme dev&lt;/code&gt; locally. The focus is how long until content appears and how responsive navigation feels, not asset weight or bundle size alone.&lt;/p&gt;&lt;p&gt;Two commits were compared:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Label&lt;/th&gt;&lt;th&gt;Commit&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Baseline&lt;/td&gt;&lt;td&gt;&lt;code&gt;cdf8796&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Horizon 4.1.3 with standard full-page navigation&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Partials&lt;/td&gt;&lt;td&gt;&lt;code&gt;c058b73&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Same theme + Liquid partials, &lt;code&gt;&amp;lt;partial-navigation&amp;gt;&lt;/code&gt;, prefetch, view transitions&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;Navigation timing&lt;/strong&gt; measures click until &lt;code&gt;#MainContent&lt;/code&gt; shows the new product page. Baseline uses a full document navigation. Partials swap only the &lt;code&gt;page-content&lt;/code&gt; region while header, footer, and cart chrome stay mounted.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Summary.&lt;/strong&gt; Headline numbers from five runs per scenario (median reported):&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Metric&lt;/th&gt;&lt;th&gt;Baseline (full reload)&lt;/th&gt;&lt;th&gt;Partials (soft nav)&lt;/th&gt;&lt;th&gt;Change&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Route change: time to new content&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1,187 ms&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;49 ms&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;~24× faster (−96%)&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Route change: DOM ready (baseline only)&lt;/td&gt;&lt;td&gt;1,144 ms&lt;/td&gt;&lt;td&gt;n/a&lt;/td&gt;&lt;td&gt;n/a&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;First visit: Largest Contentful Paint&lt;/td&gt;&lt;td&gt;7,577 ms&lt;/td&gt;&lt;td&gt;8,891 ms&lt;/td&gt;&lt;td&gt;+1,315 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;First visit: First Contentful Paint&lt;/td&gt;&lt;td&gt;6,227 ms&lt;/td&gt;&lt;td&gt;6,716 ms&lt;/td&gt;&lt;td&gt;+489 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;First visit: Total Blocking Time&lt;/td&gt;&lt;td&gt;29 ms&lt;/td&gt;&lt;td&gt;114 ms&lt;/td&gt;&lt;td&gt;+85 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;First visit: Cumulative Layout Shift&lt;/td&gt;&lt;td&gt;0.00006&lt;/td&gt;&lt;td&gt;0.00006&lt;/td&gt;&lt;td&gt;No change&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;First visit: Lighthouse performance score&lt;/td&gt;&lt;td&gt;61&lt;/td&gt;&lt;td&gt;58&lt;/td&gt;&lt;td&gt;−3&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Partial updates trade a small first-load cost for dramatically faster in-store browsing. After the shell mounts, collection → product feels near-instant instead of waiting ~1.2 seconds per full reload.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;In-app navigation&lt;/strong&gt; is the primary shopper win: what buyers feel when clicking a product card or header link after the store is already open.&lt;/p&gt;&lt;figure class=&quot;blog-benchmark-bars&quot;&gt;&lt;div class=&quot;blog-benchmark-bars__list&quot; role=&quot;img&quot; aria-label=&quot;Baseline (full page reload) 1,187 ms versus Partials (page-content swap) 49 ms&quot;&gt;&lt;div class=&quot;blog-benchmark-bars__row&quot;&gt;&lt;span class=&quot;blog-benchmark-bars__label&quot;&gt;Baseline (full page reload)&lt;/span&gt; &lt;span class=&quot;blog-benchmark-bars__track&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;blog-benchmark-bars__fill blog-benchmark-bars__fill--baseline&quot; style=&quot;width: 100.00%&quot;&gt;&lt;/span&gt; &lt;/span&gt;&lt;span class=&quot;blog-benchmark-bars__value&quot;&gt;1,187 ms&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;blog-benchmark-bars__row&quot;&gt;&lt;span class=&quot;blog-benchmark-bars__label&quot;&gt;Partials (page-content swap)&lt;/span&gt; &lt;span class=&quot;blog-benchmark-bars__track&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;blog-benchmark-bars__fill blog-benchmark-bars__fill--partials&quot; style=&quot;width: 4.13%&quot;&gt;&lt;/span&gt; &lt;/span&gt;&lt;span class=&quot;blog-benchmark-bars__value&quot;&gt;49 ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;figcaption&gt;Median time until new product page content is visible in &lt;code&gt;#MainContent&lt;/code&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Run&lt;/th&gt;&lt;th&gt;Baseline&lt;/th&gt;&lt;th&gt;Partials&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1,249 ms&lt;/td&gt;&lt;td&gt;55 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;1,187 ms&lt;/td&gt;&lt;td&gt;49 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1,050 ms&lt;/td&gt;&lt;td&gt;46 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;1,120 ms&lt;/td&gt;&lt;td&gt;50 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;1,214 ms&lt;/td&gt;&lt;td&gt;45 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Median&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1,187 ms&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;49 ms&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Median &lt;strong&gt;~1.1 seconds saved per navigation&lt;/strong&gt;. Header, footer, cart drawer, and open UI state persist: no full chrome re-render or white flash.&lt;/p&gt;&lt;p&gt;On full reload, the browser re-fetches and re-parses the entire document. Median &lt;strong&gt;DOMContentLoaded&lt;/strong&gt; on the product page was &lt;strong&gt;~1,144 ms&lt;/strong&gt;, aligned with the navigation duration above. Every link click repeats that work even though most of the page (header, footer, scripts) is identical.&lt;/p&gt;&lt;p&gt;With partials, only &lt;code&gt;page-content&lt;/code&gt; is fetched and swapped. Measured end-to-end from click to visible product markup in &lt;code&gt;#MainContent&lt;/code&gt;: &lt;strong&gt;~49 ms median&lt;/strong&gt;. Prefetch on hover and viewport entry can make subsequent clicks feel even snappier; these numbers are cold-click measurements without relying on prefetch cache.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;First visit (cold load)&lt;/strong&gt; is the trade-off side. First impression when landing on &lt;code&gt;/collections/all&lt;/code&gt; with an empty cache, measured with Lighthouse Performance (mobile throttling simulation):&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Core Web Vital / metric&lt;/th&gt;&lt;th&gt;Baseline&lt;/th&gt;&lt;th&gt;Partials&lt;/th&gt;&lt;th&gt;Notes&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Performance score&lt;/td&gt;&lt;td&gt;61&lt;/td&gt;&lt;td&gt;58&lt;/td&gt;&lt;td&gt;Slight regression from partial-navigation modules&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;First Contentful Paint (FCP)&lt;/td&gt;&lt;td&gt;6.2 s&lt;/td&gt;&lt;td&gt;6.7 s&lt;/td&gt;&lt;td&gt;+0.5 s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Largest Contentful Paint (LCP)&lt;/td&gt;&lt;td&gt;7.6 s&lt;/td&gt;&lt;td&gt;8.9 s&lt;/td&gt;&lt;td&gt;+1.3 s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Total Blocking Time (TBT)&lt;/td&gt;&lt;td&gt;29 ms&lt;/td&gt;&lt;td&gt;114 ms&lt;/td&gt;&lt;td&gt;+85 ms main-thread blocking&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cumulative Layout Shift (CLS)&lt;/td&gt;&lt;td&gt;0.00006&lt;/td&gt;&lt;td&gt;0.00006&lt;/td&gt;&lt;td&gt;Identical: no layout instability added&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Speed Index&lt;/td&gt;&lt;td&gt;6.2 s&lt;/td&gt;&lt;td&gt;6.7 s&lt;/td&gt;&lt;td&gt;Tracks FCP closely on this page&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;The partials commit adds &lt;code&gt;partial-navigation.js&lt;/code&gt;, lifecycle sync, view transitions, and pixel bridge code. That extra JavaScript runs once on first load and shows up as slightly higher TBT and LCP. &lt;strong&gt;CLS is unchanged&lt;/strong&gt;, so the shell layout does not shift when partials are enabled.&lt;/p&gt;&lt;p&gt;These cold-load numbers are dominated by local dev-server latency and theme asset volume on a development store. Treat absolute seconds as directional, not production SLA. The &lt;strong&gt;relative&lt;/strong&gt; comparison on the same machine, same store, minutes apart is the meaningful signal: first load is modestly slower; repeat navigation is orders of magnitude faster.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Methodology.&lt;/strong&gt; We measured &lt;strong&gt;route change latency&lt;/strong&gt; (link activation until new markup appears in the main content area) and &lt;strong&gt;Core Web Vitals on first paint&lt;/strong&gt; (FCP, LCP, TBT, CLS via Lighthouse). We intentionally excluded transfer sizes and bundle analysis, Theme Editor / design mode (partials are disabled there by design), production CDN edge caching, and prefetch hit rate (the benchmark uses direct clicks; prefetch is a separate optimisation layer).&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Detection flag&lt;/th&gt;&lt;th&gt;Baseline&lt;/th&gt;&lt;th&gt;Partials&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;partial-navigation&amp;gt;&lt;/code&gt; present&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;Partial-nav links&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;40&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Navigation mode&lt;/td&gt;&lt;td&gt;Full document&lt;/td&gt;&lt;td&gt;Partial region swap&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;For browse-heavy DTC stores where shoppers open several products per session, the in-app navigation win dominates. If SEO landing pages are the primary entry and first-visit LCP is the constraint, defer or lazy-load partial modules on templates that never soft-navigate. Re-run on a production theme preview over HTTPS with CDN caching before treating Core Web Vitals as launch criteria.&lt;/p&gt;&lt;h2&gt;The two event buses&lt;/h2&gt;&lt;p&gt;We initially assumed dispatching &lt;code&gt;shopify:page:view&lt;/code&gt; after the content swap would be enough for downstream tracking. Standard storefront events are documented, inspectable with &lt;code&gt;shopify theme dev --standard-events-inspector&lt;/code&gt;, and exactly what themes should emit when the active page changes.&lt;/p&gt;&lt;p&gt;That covers apps and agents on the standard bus. It does not cover web pixels.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Layer&lt;/th&gt;&lt;th&gt;Examples&lt;/th&gt;&lt;th&gt;Listeners&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Standard storefront events&lt;/td&gt;&lt;td&gt;&lt;code&gt;shopify:page:view&lt;/code&gt;, &lt;code&gt;shopify:collection:view&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Apps, agents, standard-events inspector&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Web pixel customer events&lt;/td&gt;&lt;td&gt;&lt;code&gt;page_viewed&lt;/code&gt;, &lt;code&gt;collection_viewed&lt;/code&gt;, &lt;code&gt;product_viewed&lt;/code&gt;&lt;/td&gt;&lt;td&gt;All web pixels: custom and app (Meta, Google, Klaviyo, session replay, etc.)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;These are not the same pipe. &lt;code&gt;shopify:page:view&lt;/code&gt; after a swap shows in the inspector overlay. It does not automatically reach pixel sandboxes.&lt;/p&gt;&lt;p&gt;On a full page load, &lt;code&gt;content_for_header&lt;/code&gt; injects inline Trekkie bootstrap and loads Web Pixels Manager (WPM). That sets &lt;code&gt;ShopifyAnalytics.meta&lt;/code&gt;, calls &lt;code&gt;ShopifyAnalytics.lib.page()&lt;/code&gt; and &lt;code&gt;lib.track()&lt;/code&gt;, and initialises WPM once. Pixel iframes subscribe inside WPM and receive &lt;code&gt;page_viewed&lt;/code&gt; on first paint. The theme also dispatches &lt;code&gt;shopify:page:view&lt;/code&gt; from &lt;code&gt;page-view-event.js&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;On partial navigation, the URL and &lt;code&gt;#MainContent&lt;/code&gt; update, but WPM does not re-init. Trekkie&#39;s shim queue may still accept late &lt;code&gt;page&lt;/code&gt; and &lt;code&gt;track&lt;/code&gt; calls, yet that path feeds Monorail parity telemetry, not the WPM &lt;code&gt;publish()&lt;/code&gt; call that delivers to pixels.&lt;/p&gt;&lt;p&gt;We verified with headless browser probes: after soft nav, &lt;code&gt;ShopifyAnalytics.meta.page.pageType&lt;/code&gt; updated correctly and Trekkie shim pushes fired, but pixel sandbox &lt;code&gt;page_viewed&lt;/code&gt; did not appear the way it does on full load. If you debug pixels, remember sandbox logs show in the &lt;strong&gt;pixel iframe console&lt;/strong&gt;, not the top-level DevTools tab.&lt;/p&gt;&lt;h2&gt;What we tried first&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Trekkie replay from fetched HTML.&lt;/strong&gt; After each navigation we fetch the destination URL, parse inline scripts containing &lt;code&gt;var meta = …&lt;/code&gt; and &lt;code&gt;ShopifyAnalytics.lib.page(…)&lt;/code&gt; / &lt;code&gt;lib.track(…)&lt;/code&gt;, merge meta, and replay the calls Shopify would run on a full load. This updates analytics state and emits Monorail events. It does not publish &lt;code&gt;page_viewed&lt;/code&gt; to pixel sandboxes.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;Shopify.analytics.publish(&#39;page_viewed&#39;, …)&lt;/code&gt;.&lt;/strong&gt; On the storefront, &lt;code&gt;Shopify.analytics.publish&lt;/code&gt; is wired to &lt;code&gt;publishCustomEvent&lt;/code&gt; only. Standard event names return &lt;code&gt;false&lt;/code&gt;. Public docs do not describe a theme API for standard pixel events on soft nav.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Re-running &lt;code&gt;content_for_header&lt;/code&gt;.&lt;/strong&gt; Platform head scripts assume a once-per-document lifecycle. Re-executing them risks double pixel registration and fighting non-configurable globals. We scoped head sync to theme-owned nodes instead.&lt;/p&gt;&lt;h2&gt;Reverse-engineering WPM&lt;/h2&gt;&lt;p&gt;The useful detail came from reading the minified WPM bundle and the inline &lt;code&gt;wpmLoader&lt;/code&gt; in &lt;code&gt;content_for_header&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;On init, WPM returns an API with &lt;code&gt;publish&lt;/code&gt; (standard customer events) and &lt;code&gt;publishCustomEvent&lt;/code&gt;. The loader then assigns only the latter to the public surface:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;var api = window.webPixelsManager.init(config);
Shopify.analytics.publish = api.publishCustomEvent; // api.publish discarded
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The standard-event &lt;code&gt;publish&lt;/code&gt; that pixels need is thrown away. &lt;code&gt;window.webPixelsManager&lt;/code&gt; is defined with &lt;code&gt;configurable: false&lt;/code&gt;, so you cannot replace it after the fact.&lt;/p&gt;&lt;p&gt;Trekkie maps &lt;code&gt;page_rendered&lt;/code&gt; to &lt;code&gt;page_viewed&lt;/code&gt; for &lt;code&gt;Shopify.evids&lt;/code&gt;, but post-init &lt;code&gt;lib.page()&lt;/code&gt; goes through a shim handler that produces Monorail payloads, not &lt;code&gt;O.publish(&#39;page_viewed&#39;, …)&lt;/code&gt;. There is no documented hook for themes to emit customer events after a region swap.&lt;/p&gt;&lt;h2&gt;Our workaround (and why we dislike it)&lt;/h2&gt;&lt;p&gt;We needed WPM&#39;s &lt;code&gt;publish&lt;/code&gt; before the loader discards it. The only reliable hook we found runs &lt;strong&gt;before&lt;/strong&gt; &lt;code&gt;content_for_header&lt;/code&gt;:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;snippets/partial-wpm-init-capture.liquid&lt;/code&gt;&lt;/strong&gt; wraps &lt;code&gt;Object.defineProperty&lt;/code&gt;. When Shopify defines &lt;code&gt;window.webPixelsManager&lt;/code&gt;, we wrap &lt;code&gt;init&lt;/code&gt; and stash &lt;code&gt;api.publish&lt;/code&gt; as &lt;code&gt;window.__shopifyWpmPublish&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;assets/partial-pixel-events.js&lt;/code&gt;&lt;/strong&gt; runs after each partial apply: parse destination bootstrap from fetched HTML, replay Trekkie for parity, read &lt;code&gt;view-event-payload&lt;/code&gt; from &lt;code&gt;collection-component&lt;/code&gt; / &lt;code&gt;product-component&lt;/code&gt; in the swapped markup, call &lt;code&gt;__shopifyWpmPublish(&#39;page_viewed&#39;, …)&lt;/code&gt; and template events where applicable, and publish &lt;code&gt;horizon_partials:navigation&lt;/code&gt; as a custom event for debugging.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;In testing, standard pixel events fire after soft nav. Enable &lt;code&gt;localStorage.setItem(&#39;horizon-partials-pixel-debug&#39;, &#39;true&#39;)&lt;/code&gt; to see confirm logs in the main console.&lt;/p&gt;&lt;p&gt;We would not ship this approach on a merchant store without explicit measurement trade-offs. It intercepts a platform global, parses undocumented inline script shapes, and assumes WPM payload contracts stay stable. Shopify can change loader order, property descriptors, or Trekkie bootstrap overnight. One CDN deploy could silence every app pixel on soft nav for themes using this bridge, with no deprecation notice. We document it so teams understand the gap, not because we recommend copying it blindly.&lt;/p&gt;&lt;p&gt;Stores where &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 sprawl&lt;/em&gt;&lt;/a&gt; already complicates the header have enough fragile integration points without adding another one.&lt;/p&gt;&lt;h2&gt;What works without the bridge&lt;/h2&gt;&lt;p&gt;Standard storefront events are under theme control. Collection and product view events flow from &lt;code&gt;collection-component&lt;/code&gt; and &lt;code&gt;product-component&lt;/code&gt; built with &lt;code&gt;@shopify/events&lt;/code&gt;. Cart follows documented patterns. Lifecycle stays server-rendered. The gap is specific: &lt;strong&gt;customer events for web pixels on route changes that are not full document loads.&lt;/strong&gt;&lt;/p&gt;&lt;h2&gt;What we want from Shopify&lt;/h2&gt;&lt;p&gt;Partials are a developer preview. Soft navigation fits the platform direction. Tracking should not be an afterthought.&lt;/p&gt;&lt;p&gt;First-party support could take any of these shapes:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bridge standard storefront events to pixel sandboxes&lt;/strong&gt; when partial navigation occurs: &lt;code&gt;shopify:page:view&lt;/code&gt; → &lt;code&gt;page_viewed&lt;/code&gt;, template view events → &lt;code&gt;product_viewed&lt;/code&gt; / &lt;code&gt;collection_viewed&lt;/code&gt;, with correct payloads and consent checks.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Document a supported API&lt;/strong&gt; such as &lt;code&gt;Shopify.analytics.publishStandardEvent(name, data)&lt;/code&gt; callable after &lt;code&gt;partials.apply()&lt;/code&gt; without re-initing WPM.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Emit pixel events from StorefrontRenderer&lt;/strong&gt; when serving partial HTML responses.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Any of these removes the need for &lt;code&gt;Object.defineProperty&lt;/code&gt; interception and HTML script parsing in theme code.&lt;/p&gt;&lt;p&gt;Until then, teams choosing soft navigation should plan measurement explicitly: accept stale pixel counts on in-app routes, fall back to full navigation where attribution matters, or use custom events knowing app pixels will not see them unless they subscribe to custom names.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Liquid partials plus soft navigation deliver a credible app-like storefront while keeping Liquid as the source of truth for HTML. On our preview benchmarks, repeat route changes dropped from a &lt;strong&gt;1,187 ms&lt;/strong&gt; median full reload to &lt;strong&gt;49 ms&lt;/strong&gt; for a partial swap, with CLS unchanged and a modest first-load regression from the navigation runtime. Prefetch and post-transition lifecycle timing make the UX feel fast without sacrificing server-rendered correctness. Shell affordances (nav active state, mobile drawer close, stable header metrics) need explicit lifecycle hooks because the chrome never reloads. That combination is worth pursuing on the preview when browse flows matter more than cold-landing LCP alone.&lt;/p&gt;&lt;p&gt;The pixel gap is real, separable, and solvable at the platform layer. Our bridge proves events can fire after a region swap if you reach WPM&#39;s internal publish function. It also proves themes should not have to.&lt;/p&gt;&lt;p&gt;If you are experimenting with partials, use the standard-events inspector, switch DevTools to the pixel sandbox iframe when debugging web pixels, and treat any theme-side WPM intercept as temporary. Source and a live demo are in the &lt;a href=&quot;https://github.com/octipus/horizon-partials&quot;&gt;open-source horizon-partials repo&lt;/a&gt; and on the &lt;a href=&quot;https://liquid-july.myshopify.com/&quot;&gt;liquid-july preview store&lt;/a&gt; (password: &lt;code&gt;ocontis&lt;/code&gt;). Join the &lt;a href=&quot;https://community.shopify.dev/t/a-liquid-partials-experiment/36515&quot;&gt;Shopify Developer Community thread&lt;/a&gt; if you are building on partials and want to compare notes. For layout boundaries, partial strategy, and analytics ownership on an established store, see our &lt;a href=&quot;https://ocontis.studio/services/shopify-theme-development/&quot;&gt;Shopify theme development&lt;/a&gt; capability or &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;book a stack assessment&lt;/a&gt; to map preview features against what your stack can maintain and measure long term.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Experimental open-source fork of Horizon 4.1.3. Requires Liquid July &#39;26 feature preview.&lt;/em&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>BigCommerce Draft Order Fees and B2B ERP Workflows: When Platform Economics Push You to Shopify</title>
    <link href="https://ocontis.studio/blog/post/bigcommerce-draft-order-fees-and-b2b-erp-workflows-when-platform-economics-push-you-to-shopify/" />
    <updated>2026-07-31T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/bigcommerce-draft-order-fees-and-b2b-erp-workflows-when-platform-economics-push-you-to-shopify/</id>
    <content type="html">&lt;h1&gt;BigCommerce Draft Order Fees and B2B ERP Workflows: When Platform Economics Push You to Shopify&lt;/h1&gt;&lt;p&gt;A wholesale client called last week with a problem that had nothing to do with conversion rate or theme quality. They run most revenue through B2B accounts. Buyers pay by bank transfer. Sage holds inventory, invoicing, and finance. BigCommerce was the catalogue and order record.&lt;/p&gt;&lt;p&gt;For years, draft orders and manually logged POs did not attract the same platform charges as card checkout. Recently, BigCommerce started billing for those orders anyway, even though payment never touched BigCommerce and fulfilment logic lives in Sage.&lt;/p&gt;&lt;p&gt;On a growing B2B book, a single new fee line adds up fast. Treat it as a signal that &lt;strong&gt;platform economics no longer match how the business actually trades&lt;/strong&gt;.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;Established B2B brands choose BigCommerce for sensible reasons: structured catalogues, customer groups, and a middleweight platform that feels more controlled than open-source chaos. When the stack works, finance stays in Sage, sales stay in CRM, and the storefront captures what buyers need to see.&lt;/p&gt;&lt;p&gt;The break happens when the commerce platform starts charging like a payment processor for orders it never processed.&lt;/p&gt;&lt;p&gt;This article compares &lt;strong&gt;BigCommerce draft order and manual order billing&lt;/strong&gt; against &lt;strong&gt;Shopify&#39;s model for ERP-led B2B&lt;/strong&gt;, where bank transfer and purchase order workflows are common. It is for decision makers who need a clear total cost picture before a replatform, not a generic &amp;quot;Shopify wins&amp;quot; pitch.&lt;/p&gt;&lt;p&gt;If you are already mapping a move, start with &lt;a href=&quot;https://ocontis.studio/blog/post/migrating-from-bigcommerce-to-shopify/&quot;&gt;&lt;em&gt;Migrating from BigCommerce to Shopify&lt;/em&gt;&lt;/a&gt; and the &lt;a href=&quot;https://ocontis.studio/tools/migration-readiness-assessment/?platform=bigcommerce&quot;&gt;&lt;em&gt;Migration Readiness Assessment&lt;/em&gt;&lt;/a&gt;. For where platform fees sit in the wider stack, see &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;.&lt;/p&gt;&lt;h2&gt;What merchants are running into&lt;/h2&gt;&lt;p&gt;The pattern from recent audit and migration calls looks like this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;B2B-heavy order mix&lt;/strong&gt;, PO, net terms, and bank transfer dominate; card checkout is a minority&lt;/li&gt;&lt;li&gt;&lt;strong&gt;ERP owns truth&lt;/strong&gt;, Sage (or similar) runs stock, invoicing, and settlement&lt;/li&gt;&lt;li&gt;&lt;strong&gt;BigCommerce captures orders&lt;/strong&gt; via draft orders, admin entry, or buyer portals for visibility&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Payment happens offline&lt;/strong&gt;, finance matches bank credits in Sage, not through BigCommerce gateways&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New billing lines appear&lt;/strong&gt; on draft or manual orders that previously sat outside fee calculations&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Nobody replatformed for UX&lt;/strong&gt;, the trigger is margin leakage on orders the platform did not monetise&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Merchants feel mis-sold because the storefront still &amp;quot;works.&amp;quot; Buyers still browse. Ops still sync. The invoice changed underneath a stable workflow.&lt;/p&gt;&lt;p&gt;That frustration is rational. You are not failing at ecommerce. You are discovering that &lt;strong&gt;your commerce platform&#39;s pricing model assumes every order is a platform transaction&lt;/strong&gt;, even when your architecture deliberately routes money and fulfilment elsewhere.&lt;/p&gt;&lt;h2&gt;Why platform fee creep hits ERP-led B2B hardest&lt;/h2&gt;&lt;h3&gt;1. Draft orders are workflow, not checkout&lt;/h3&gt;&lt;p&gt;On B2B stacks, draft orders are often how account managers quote, how insides sales log phone orders, or how ERP-triggered demand becomes a visible order record for customer service. The cart and gateway may never run.&lt;/p&gt;&lt;p&gt;When those records incur per-order or GMV-tier charges, you pay for &lt;strong&gt;administrative capture&lt;/strong&gt; at the same rate as self-serve checkout. That punishes high-touch wholesale models.&lt;/p&gt;&lt;h3&gt;2. Sage outside the platform is the point&lt;/h3&gt;&lt;p&gt;Keeping Sage as system of record is a feature, not a workaround. Finance needs audit trails, stock reservations, and VAT logic that match how the business already runs. The storefront&#39;s job is to present catalogues, capture structured demand, and emit clean order data.&lt;/p&gt;&lt;p&gt;If BigCommerce charges as though it processed payment and fulfilment end to end, the bill disconnects from value delivered.&lt;/p&gt;&lt;h3&gt;3. Subscription price was never the full story&lt;/h3&gt;&lt;p&gt;Both platforms advertise monthly plans. B2B operators learn to model &lt;strong&gt;transaction fees, order volume tiers, app subscriptions, and agency reconciliation time&lt;/strong&gt;. A draft order fee is easy to miss until wholesale volume makes it visible.&lt;/p&gt;&lt;p&gt;The same lesson appears on Shopify stacks with app sprawl; see &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;. Here the leak is &lt;strong&gt;platform order accounting&lt;/strong&gt;, not an App Store invoice.&lt;/p&gt;&lt;h3&gt;4. Migration triggers are economic, not aesthetic&lt;/h3&gt;&lt;p&gt;Teams tolerate Stencil friction for years. They replatform when &lt;strong&gt;fee structure, B2B capability, or integration depth&lt;/strong&gt; blocks the next commercial plan. A sudden draft order charge is often the forcing function that makes a twelve-month Shopify model worth building.&lt;/p&gt;&lt;h2&gt;How Shopify fits ERP-led B2B (without pretending it is free)&lt;/h2&gt;&lt;p&gt;Shopify, especially Plus, carries real subscription cost. For this architecture the billing model is often &lt;strong&gt;more predictable&lt;/strong&gt; when you separate three cost layers:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Subscription&lt;/strong&gt;, plan or Plus contract&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Payment processing&lt;/strong&gt;, only on revenue that actually flows through Shopify Payments or a connected gateway&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Integration and ops&lt;/strong&gt;, Sage connector, middleware, and internal time&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;For bank transfer and PO workflows, orders can be created as draft orders or completed with manual payment methods, then marked paid when finance confirms settlement. Card transaction fees apply to card revenue, not to every order row sitting in admin for ERP sync.&lt;/p&gt;&lt;p&gt;Native &lt;strong&gt;Shopify B2B on Plus&lt;/strong&gt; adds company locations, catalog-specific pricing, payment terms, and buyer self-serve reordering when you want to grow beyond rep-entered drafts. Advanced and lower tiers can still run wholesale with apps and custom pricing, but Plus is the usual target for Sage-backed brands scaling account complexity.&lt;/p&gt;&lt;p&gt;Efficiency shows up in &lt;strong&gt;integration surface area&lt;/strong&gt;: more Sage connectors, mature middleware patterns, and admin APIs your agency pool already ships. That reduces the hidden cost of keeping two systems aligned.&lt;/p&gt;&lt;figure class=&quot;blog-diagram epmb-figure&quot; role=&quot;figure&quot; aria-labelledby=&quot;epmb-6-caption&quot; data-diagram-id=&quot;epmb-6&quot;&gt;
  &lt;p class=&quot;epmb-figure__summary visually-hidden&quot; id=&quot;epmb-6-summary&quot;&gt;B2B platform cost check&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-6&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: 780.193359375px;&quot; viewBox=&quot;-8 -50.1015625 780.193359375 1065.1703125&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot;&gt;&lt;style&gt;#epmb-6{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-6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#epmb-6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#epmb-6 .error-icon{fill:#141414;}#epmb-6 .error-text{fill:#ebebeb;stroke:#ebebeb;}#epmb-6 .edge-thickness-normal{stroke-width:1px;}#epmb-6 .edge-thickness-thick{stroke-width:3.5px;}#epmb-6 .edge-pattern-solid{stroke-dasharray:0;}#epmb-6 .edge-thickness-invisible{stroke-width:0;fill:none;}#epmb-6 .edge-pattern-dashed{stroke-dasharray:3;}#epmb-6 .edge-pattern-dotted{stroke-dasharray:2;}#epmb-6 .marker{fill:#8a8a7a;stroke:#8a8a7a;}#epmb-6 .marker.cross{stroke:#8a8a7a;}#epmb-6 svg{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;}#epmb-6 p{margin:0;}#epmb-6 .label{font-family:&#39;Syne&#39;,system-ui,sans-serif;color:#fafae6;}#epmb-6 .cluster-label text{fill:#fafae6;}#epmb-6 .cluster-label span{color:#fafae6;}#epmb-6 .cluster-label span p{background-color:transparent;}#epmb-6 .label text,#epmb-6 span{fill:#fafae6;color:#fafae6;}#epmb-6 .node rect,#epmb-6 .node circle,#epmb-6 .node ellipse,#epmb-6 .node polygon,#epmb-6 .node path{fill:#141414;stroke:#db5461;stroke-width:1px;}#epmb-6 .rough-node .label text,#epmb-6 .node .label text,#epmb-6 .image-shape .label,#epmb-6 .icon-shape .label{text-anchor:middle;}#epmb-6 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#epmb-6 .rough-node .label,#epmb-6 .node .label,#epmb-6 .image-shape .label,#epmb-6 .icon-shape .label{text-align:center;}#epmb-6 .node.clickable{cursor:pointer;}#epmb-6 .root .anchor path{fill:#8a8a7a!important;stroke-width:0;stroke:#8a8a7a;}#epmb-6 .arrowheadPath{fill:#f1eff0;}#epmb-6 .edgePath .path{stroke:#8a8a7a;stroke-width:1px;}#epmb-6 .flowchart-link{stroke:#8a8a7a;fill:none;}#epmb-6 .edgeLabel{background-color:#141414;text-align:center;}#epmb-6 .edgeLabel p{background-color:#141414;}#epmb-6 .edgeLabel rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-6 .labelBkg{background-color:rgba(20, 20, 20, 0.5);}#epmb-6 .cluster rect{fill:#141414;stroke:hsl(0, 0%, 17.8431372549%);stroke-width:1px;}#epmb-6 .cluster text{fill:#fafae6;}#epmb-6 .cluster span{color:#fafae6;}#epmb-6 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-6 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fafae6;}#epmb-6 rect.text{fill:none;stroke-width:0;}#epmb-6 .icon-shape,#epmb-6 .image-shape{background-color:#141414;text-align:center;}#epmb-6 .icon-shape p,#epmb-6 .image-shape p{background-color:#141414;padding:2px;}#epmb-6 .icon-shape .label rect,#epmb-6 .image-shape .label rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-6 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#epmb-6 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#epmb-6 .node .neo-node{stroke:#db5461;}#epmb-6 [data-look=&quot;neo&quot;].node rect,#epmb-6 [data-look=&quot;neo&quot;].cluster rect,#epmb-6 [data-look=&quot;neo&quot;].node polygon{stroke:url(#epmb-6-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-6 [data-look=&quot;neo&quot;].swimlane.cluster rect{filter:none;}#epmb-6 [data-look=&quot;neo&quot;].node path{stroke:url(#epmb-6-gradient);stroke-width:1px;}#epmb-6 [data-look=&quot;neo&quot;].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-6 [data-look=&quot;neo&quot;].node .neo-line path{stroke:#db5461;filter:none;}#epmb-6 [data-look=&quot;neo&quot;].node circle{stroke:url(#epmb-6-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-6 [data-look=&quot;neo&quot;].node circle .state-start{fill:#000000;}#epmb-6 [data-look=&quot;neo&quot;].icon-shape .icon{fill:url(#epmb-6-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-6 [data-look=&quot;neo&quot;].icon-shape .icon-neo path{stroke:url(#epmb-6-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-6 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;epmb-6_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-6_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-6_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-6_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-6_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-6_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-6_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-6_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-6_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-6_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-6_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-6_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;M428.352,46.389L428.268,50.472C428.185,54.556,428.018,62.722,427.935,70.306C427.852,77.889,427.852,84.889,427.852,88.389L427.852,91.889&quot; id=&quot;epmb-6-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;W3sieCI6NDI4LjM1MTU2MjQ5OTk5OTksInkiOjQ2LjM4OTA2MjUwMDAwMDAxfSx7IngiOjQyNy44NTE1NjI1LCJ5Ijo3MC44ODkwNjI1fSx7IngiOjQyNy44NTE1NjI1MDAwMDAwNiwieSI6OTUuODg5MDYyNX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-6_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M368.511,280.897L353.206,297.103C337.901,313.309,307.291,345.72,291.987,367.575C276.682,389.43,276.682,400.728,276.682,406.377L276.682,412.027&quot; id=&quot;epmb-6-L_Q1_MODEL_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_MODEL_0&quot; data-points=&quot;W3sieCI6MzY4LjUxMTAzNDU2MjY2NzY1LCJ5IjoyODAuODk2OTcyMDYyNjY3Nn0seyJ4IjoyNzYuNjgxNjQwNjI1LCJ5IjozNzguMTMyMDMxMjQ5OTk5OTV9LHsieCI6Mjc2LjY4MTY0MDYyNSwieSI6NDE2LjAyNjU2MjQ5OTk5OTk1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-6_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M487.192,280.897L502.497,297.103C517.802,313.309,548.412,345.72,563.717,367.667C579.021,389.614,579.021,401.095,579.021,406.836L579.021,412.577&quot; id=&quot;epmb-6-L_Q1_WATCH_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_WATCH_0&quot; data-points=&quot;W3sieCI6NDg3LjE5MjA5MDQzNzMzMjM1LCJ5IjoyODAuODk2OTcyMDYyNjY3NjZ9LHsieCI6NTc5LjAyMTQ4NDM3NSwieSI6Mzc4LjEzMjAzMTI0OTk5OTk1fSx7IngiOjU3OS4wMjE0ODQzNzUsInkiOjQxNi41NzY1NjI0OTk5OTk5N31d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-6_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M276.682,470.016L276.682,474.182C276.682,478.349,276.682,486.682,276.682,494.349C276.682,502.016,276.682,509.016,276.682,512.516L276.682,516.016&quot; id=&quot;epmb-6-L_MODEL_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_MODEL_Q2_0&quot; data-points=&quot;W3sieCI6Mjc2LjY4MTY0MDYyNSwieSI6NDcwLjAxNTYyNX0seyJ4IjoyNzYuNjgxNjQwNjI1LCJ5Ijo0OTUuMDE1NjI0OTk5OTk5OTR9LHsieCI6Mjc2LjY4MTY0MDYyNTAwMDE3LCJ5Ijo1MjAuMDE1NjI1MDAwMDAwMn1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-6_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M216.904,713.524L202.351,729.803C187.798,746.081,158.692,778.639,144.139,800.567C129.586,822.494,129.586,833.792,129.586,839.442L129.586,845.091&quot; id=&quot;epmb-6-L_Q2_MIGRATE_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_MIGRATE_0&quot; data-points=&quot;W3sieCI6MjE2LjkwNDE5NjAyODg3MTgsInkiOjcxMy41MjQxMTc5MDM4NzE5fSx7IngiOjEyOS41ODU5Mzc1LCJ5Ijo4MTEuMTk2MDkzNzV9LHsieCI6MTI5LjU4NTkzNzUsInkiOjg0OS4wOTA2MjV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-6_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M336.459,713.524L351.012,729.803C365.565,746.081,394.671,778.639,409.224,800.658C423.777,822.678,423.777,834.159,423.777,839.9L423.777,845.641&quot; id=&quot;epmb-6-L_Q2_RENEGOTIATE_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_RENEGOTIATE_0&quot; data-points=&quot;W3sieCI6MzM2LjQ1OTA4NTIyMTEyODEzLCJ5Ijo3MTMuNTI0MTE3OTAzODcxOH0seyJ4Ijo0MjMuNzc3MzQzNzUsInkiOjgxMS4xOTYwOTM3NX0seyJ4Ijo0MjMuNzc3MzQzNzUsInkiOjg0OS42NDA2MjV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-6_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M129.586,904.18L129.586,908.346C129.586,912.513,129.586,920.846,129.586,928.513C129.586,936.18,129.586,943.18,129.586,946.68L129.586,950.18&quot; id=&quot;epmb-6-L_MIGRATE_AUDIT_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_MIGRATE_AUDIT_0&quot; data-points=&quot;W3sieCI6MTI5LjU4NTkzNzUsInkiOjkwNC4xNzk2ODc1fSx7IngiOjEyOS41ODU5Mzc1LCJ5Ijo5MjkuMTc5Njg3NX0seyJ4IjoxMjkuNTg1OTM3NSwieSI6OTU0LjE3OTY4NzV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-6_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(276.681640625, 378.13203124999995)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q1_MODEL_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(579.021484375, 378.13203124999995)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q1_WATCH_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_MODEL_Q2_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(129.5859375, 811.19609375)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q2_MIGRATE_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(423.77734375, 811.19609375)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_Q2_RENEGOTIATE_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_MIGRATE_AUDIT_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-6-flowchart-START-0&quot; data-look=&quot;classic&quot; transform=&quot;translate(427.8515625, 26.94453125)&quot;&gt;&lt;g class=&quot;basic label-container outer-path&quot;&gt;&lt;path d=&quot;M-82.2876953125 -18.94453125 C-21.726741527802652 -18.94453125, 38.8342122568947 -18.94453125, 82.2876953125 -18.94453125 C82.2876953125 -18.94453125, 82.2876953125 -18.94453125, 82.2876953125 -18.94453125 C82.60710188245409 -18.934288502988746, 82.92650845240817 -18.92404575597749, 83.501475597119 -18.905607678752272 C83.80461007514293 -18.87636466022985, 84.10774455316687 -18.84712164170743, 84.71026819819343 -18.78899691031242 C85.11524177851253 -18.72352392246345, 85.52021535883162 -18.658050934614476, 85.9091059276403 -18.595178123340894 C86.22904820956398 -18.522153385310318, 86.54899049148769 -18.449128647279743, 87.09306250407941 -18.324947760807365 C87.48562477072775 -18.208437340667523, 87.8781870373761 -18.091926920527683, 88.2572727959803 -17.979416257235705 C88.53293151018914 -17.87797130224563, 88.80859022439799 -17.776526347255558, 89.39695281353121 -17.560003475690376 C89.69237643491397 -17.429228201934595, 89.98780005629672 -17.29845292817881, 90.50741936707944 -17.0684328732545 C90.72392292867578 -16.955483103846838, 90.94042649027212 -16.842533334439175, 91.5841093113621 -16.506724418975057 C91.99110090887118 -16.260003720816947, 92.39809250638025 -16.013283022658833, 92.6225982964489 -15.877186293376754 C93.0048160123428 -15.61056776070742, 93.3870337282367 -15.343949228038086, 93.61861894834493 -15.182405403653188 C93.98888077014959 -14.887131453844853, 94.35914259195425 -14.591857504036518, 94.56807840454576 -14.42523675351027 C94.86529400001415 -14.155313413599607, 95.16250959548253 -13.885390073688948, 95.46707513248747 -13.608791711343592 C95.67267623385602 -13.396491694016209, 95.87827733522457 -13.184191676688826, 96.31191496178073 -12.73642522495834 C96.50858717944008 -12.505402847129455, 96.70525939709943 -12.274380469300569, 97.09912626434942 -11.811722035369087 C97.3440743553159 -11.483513908704158, 97.58902244628239 -11.155305782039228, 97.82547422009499 -10.838481946330077 C98.0108945023922 -10.55362660040418, 98.19631478468942 -10.268771254478281, 98.48797410946614 -9.820704210126504 C98.67402027962868 -9.490360395785316, 98.86006644979123 -9.16001658144413, 99.08390357831163 -8.762571093789074 C99.25864810525917 -8.399710344648609, 99.4333926322067 -8.036849595508146, 99.61081382461754 -7.6684306932616675 C99.78325131484387 -7.242506758550545, 99.95568880507021 -6.816582823839423, 100.06653966115988 -6.5427790661424226 C100.16557036918904 -6.244514351959188, 100.26460107721819 -5.946249637775953, 100.44920841272344 -5.390241756418682 C100.51479476145367 -5.140132583406918, 100.58038111018392 -4.890023410395154, 100.75724761132582 -4.215554787114586 C100.82313833142076 -3.8772198654356567, 100.88902905151572 -3.5388849437567274, 100.98939145782579 -3.0235451989565796 C101.02488298434469 -2.748279927870671, 101.06037451086358 -2.473014656784763, 101.14468602336338 -1.8191112150276403 C101.17562254107189 -1.3372499802098967, 101.2065590587804 -0.8553887453921533, 101.2224931692582 -0.6072021129180204 C101.2224931692582 -0.34091099301927613, 101.2224931692582 -0.07461987312053187, 101.2224931692582 0.6072021129180158 C101.19990981223991 0.958956127435618, 101.17732645522162 1.31071014195322, 101.14468602336338 1.8191112150276274 C101.1067882144586 2.1130391371242263, 101.06889040555383 2.406967059220825, 100.98939145782579 3.0235451989565667 C100.92904730266534 3.333399681963794, 100.86870314750489 3.6432541649710206, 100.75724761132582 4.215554787114582 C100.64731518275504 4.634774782270912, 100.53738275418425 5.053994777427242, 100.44920841272344 5.3902417564186695 C100.30383514218643 5.828082885190962, 100.15846187164941 6.265924013963254, 100.06653966115988 6.542779066142409 C99.94204677747153 6.850278895758787, 99.8175538937832 7.157778725375165, 99.61081382461754 7.668430693261662 C99.48560571188628 7.928428018372546, 99.36039759915504 8.18842534348343, 99.08390357831163 8.76257109378907 C98.95998206297072 8.982606292690983, 98.83606054762983 9.202641491592896, 98.48797410946614 9.8207042101265 C98.28652862869693 10.130178564273711, 98.0850831479277 10.439652918420924, 97.825474220095 10.838481946330067 C97.59944328498791 11.141342807531768, 97.37341234988081 11.444203668733469, 97.09912626434942 11.811722035369083 C96.87439631246846 12.075702624344972, 96.6496663605875 12.33968321332086, 96.31191496178073 12.73642522495833 C96.11011923229647 12.944795883388338, 95.90832350281221 13.153166541818344, 95.46707513248747 13.608791711343587 C95.28600392051484 13.773235795175387, 95.10493270854222 13.937679879007186, 94.56807840454577 14.425236753510257 C94.24107435928663 14.686013777661326, 93.91407031402747 14.946790801812396, 93.61861894834493 15.182405403653187 C93.3845284054451 15.345696832763833, 93.15043786254526 15.508988261874482, 92.62259829644891 15.877186293376749 C92.37348298889805 16.028201456778135, 92.12436768134717 16.179216620179517, 91.58410931136211 16.506724418975054 C91.28140538707098 16.664644862386627, 90.97870146277982 16.822565305798197, 90.50741936707944 17.0684328732545 C90.1126062501698 17.243204928395397, 89.71779313326017 17.417976983536295, 89.39695281353121 17.560003475690376 C89.09408684732193 17.67146095091769, 88.79122088111266 17.782918426145006, 88.25727279598031 17.9794162572357 C87.92445345594211 18.07819529035467, 87.59163411590393 18.176974323473644, 87.09306250407943 18.32494776080736 C86.74984177257413 18.403285653048858, 86.40662104106883 18.481623545290358, 85.90910592764031 18.595178123340894 C85.46179865221325 18.66749529471221, 85.01449137678618 18.739812466083528, 84.71026819819345 18.788996910312417 C84.30118415387798 18.828460756071983, 83.89210010956253 18.867924601831554, 83.501475597119 18.905607678752272 C83.10042994012808 18.918468432383953, 82.69938428313716 18.93132918601564, 82.2876953125 18.94453125 C82.2876953125 18.94453125, 82.2876953125 18.94453125, 82.2876953125 18.94453125 C36.22994539801643 18.94453125, -9.82780451646714 18.94453125, -82.2876953125 18.94453125 C-82.58922271619689 18.93486185305093, -82.89075011989377 18.925192456101858, -83.50147559711898 18.905607678752272 C-83.94113717687553 18.863194054923568, -84.38079875663206 18.820780431094867, -84.71026819819343 18.788996910312417 C-85.09312730513426 18.727099219018942, -85.47598641207509 18.66520152772547, -85.9091059276403 18.595178123340894 C-86.30714724846524 18.504327789324964, -86.70518856929019 18.41347745530904, -87.09306250407941 18.324947760807365 C-87.35259336620952 18.247920363232446, -87.61212422833962 18.170892965657522, -88.25727279598028 17.979416257235712 C-88.49304112274902 17.892651333566295, -88.72880944951777 17.805886409896875, -89.39695281353121 17.560003475690376 C-89.79390843041911 17.384282999364103, -90.19086404730702 17.20856252303783, -90.50741936707944 17.068432873254505 C-90.80728195338223 16.911994754051488, -91.10714453968504 16.75555663484847, -91.5841093113621 16.50672441897506 C-91.8775521659351 16.328837636071285, -92.17099502050809 16.150950853167508, -92.6225982964489 15.877186293376761 C-92.90951343050384 15.677046716216008, -93.19642856455877 15.476907139055257, -93.61861894834492 15.18240540365319 C-93.90237817540456 14.956114971223284, -94.18613740246421 14.729824538793377, -94.56807840454576 14.425236753510271 C-94.82755708145683 14.189585084569206, -95.08703575836792 13.95393341562814, -95.46707513248745 13.608791711343597 C-95.68374830691286 13.385058869550912, -95.90042148133826 13.161326027758228, -96.31191496178073 12.736425224958337 C-96.60335935043366 12.394078062391094, -96.8948037390866 12.051730899823852, -97.09912626434942 11.811722035369089 C-97.34377947510802 11.483909021318578, -97.58843268586662 11.156096007268067, -97.82547422009499 10.838481946330079 C-98.07649852914415 10.452841198165382, -98.3275228381933 10.067200450000684, -98.48797410946612 9.820704210126515 C-98.70398567679375 9.437153798793238, -98.91999724412138 9.05360338745996, -99.08390357831163 8.762571093789076 C-99.1913306285568 8.539496525384337, -99.29875767880196 8.316421956979598, -99.61081382461754 7.668430693261669 C-99.76603836806552 7.285023069882759, -99.92126291151351 6.9016154465038495, -100.06653966115988 6.542779066142424 C-100.18566563240213 6.183990620906721, -100.30479160364439 5.825202175671018, -100.44920841272344 5.390241756418677 C-100.54213782009174 5.035861650263413, -100.63506722746004 4.6814815441081485, -100.75724761132582 4.215554787114589 C-100.80648363376683 3.9627382179170194, -100.85571965620785 3.70992164871945, -100.98939145782579 3.023545198956582 C-101.04219683181802 2.6139971458734066, -101.09500220581023 2.2044490927902314, -101.14468602336336 1.819111215027651 C-101.1697978507881 1.4279742329852816, -101.19490967821282 1.0368372509429125, -101.2224931692582 0.6072021129180227 C-101.2224931692582 0.2518590898727276, -101.2224931692582 -0.10348393317256754, -101.2224931692582 -0.6072021129180136 C-101.19566267380756 -1.0251087367477774, -101.16883217835694 -1.4430153605775413, -101.14468602336338 -1.819111215027625 C-101.1013386874073 -2.155304592803178, -101.05799135145125 -2.4914979705787315, -100.98939145782579 -3.023545198956573 C-100.90502698586049 -3.45673893206093, -100.82066251389519 -3.8899326651652864, -100.75724761132582 -4.21555478711458 C-100.66417026209953 -4.570499059692784, -100.57109291287323 -4.925443332270989, -100.44920841272344 -5.390241756418667 C-100.36352512341897 -5.648306172025516, -100.2778418341145 -5.906370587632366, -100.06653966115988 -6.5427790661424 C-99.89910228173599 -6.956352630500936, -99.73166490231209 -7.369926194859471, -99.61081382461754 -7.66843069326166 C-99.4398966626812 -8.023343837063857, -99.26897950074489 -8.378256980866054, -99.08390357831163 -8.762571093789068 C-98.91614115704422 -9.06045026053662, -98.7483787357768 -9.35832942728417, -98.48797410946614 -9.820704210126506 C-98.31201677557713 -10.091021926139932, -98.13605944168815 -10.36133964215336, -97.82547422009499 -10.838481946330072 C-97.60772105682538 -11.130251347390073, -97.38996789355578 -11.422020748450075, -97.09912626434942 -11.811722035369083 C-96.88568150395979 -12.062446396273675, -96.67223674357017 -12.313170757178266, -96.31191496178074 -12.736425224958328 C-96.07854013865648 -12.977403890263444, -95.84516531553221 -13.218382555568558, -95.46707513248747 -13.608791711343581 C-95.19342152101504 -13.85731668080504, -94.91976790954263 -14.1058416502665, -94.56807840454577 -14.425236753510253 C-94.34086813141116 -14.606430900015807, -94.11365785827655 -14.787625046521361, -93.61861894834493 -15.182405403653183 C-93.33803706953924 -15.378127176114264, -93.05745519073353 -15.573848948575344, -92.62259829644891 -15.877186293376747 C-92.28945597178573 -16.07913912834918, -91.95631364712254 -16.281091963321614, -91.58410931136211 -16.506724418975054 C-91.35625713114554 -16.625594755447754, -91.12840495092895 -16.744465091920457, -90.50741936707944 -17.0684328732545 C-90.27975505484355 -17.169213110859456, -90.05209074260766 -17.26999334846441, -89.39695281353121 -17.560003475690372 C-89.13133046629359 -17.65775495485988, -88.86570811905597 -17.755506434029385, -88.25727279598031 -17.9794162572357 C-88.01275283866522 -18.051988497055376, -87.76823288135013 -18.124560736875047, -87.09306250407944 -18.32494776080736 C-86.80523149440474 -18.390643310492738, -86.51740048473005 -18.456338860178114, -85.90910592764031 -18.595178123340894 C-85.60438470649645 -18.64444308722707, -85.29966348535258 -18.693708051113244, -84.71026819819345 -18.788996910312417 C-84.4622486564003 -18.81292305722206, -84.21422911460716 -18.836849204131706, -83.501475597119 -18.905607678752272 C-83.22303584741313 -18.914536699575244, -82.94459609770725 -18.923465720398216, -82.2876953125 -18.94453125 C-82.2876953125 -18.94453125, -82.2876953125 -18.94453125, -82.2876953125 -18.94453125&quot; stroke=&quot;none&quot; stroke-width=&quot;0&quot; fill=&quot;#141414&quot; style=&quot;&quot;/&gt;&lt;path d=&quot;M-82.2876953125 -18.94453125 C-42.34274249950694 -18.94453125, -2.3977896865138746 -18.94453125, 82.2876953125 -18.94453125 M-82.2876953125 -18.94453125 C-45.249278037010015 -18.94453125, -8.210860761520024 -18.94453125, 82.2876953125 -18.94453125 M82.2876953125 -18.94453125 C82.2876953125 -18.94453125, 82.2876953125 -18.94453125, 82.2876953125 -18.94453125 M82.2876953125 -18.94453125 C82.2876953125 -18.94453125, 82.2876953125 -18.94453125, 82.2876953125 -18.94453125 M82.2876953125 -18.94453125 C82.57866202486638 -18.93520051386676, 82.86962873723274 -18.92586977773352, 83.501475597119 -18.905607678752272 M82.2876953125 -18.94453125 C82.7692329486989 -18.92908927526325, 83.25077058489778 -18.913647300526502, 83.501475597119 -18.905607678752272 M83.501475597119 -18.905607678752272 C83.91170984422106 -18.866032874313202, 84.32194409132312 -18.826458069874132, 84.71026819819343 -18.78899691031242 M83.501475597119 -18.905607678752272 C83.85917807745383 -18.871100550674544, 84.21688055778867 -18.836593422596813, 84.71026819819343 -18.78899691031242 M84.71026819819343 -18.78899691031242 C85.13995220590431 -18.719528932194972, 85.5696362136152 -18.65006095407752, 85.9091059276403 -18.595178123340894 M84.71026819819343 -18.78899691031242 C84.96313255045551 -18.748115762831027, 85.21599690271759 -18.70723461534963, 85.9091059276403 -18.595178123340894 M85.9091059276403 -18.595178123340894 C86.36586762824335 -18.4909252458269, 86.82262932884639 -18.38667236831291, 87.09306250407941 -18.324947760807365 M85.9091059276403 -18.595178123340894 C86.22669122558096 -18.522691351523683, 86.54427652352165 -18.450204579706476, 87.09306250407941 -18.324947760807365 M87.09306250407941 -18.324947760807365 C87.34106710430886 -18.251341297261977, 87.58907170453831 -18.177734833716585, 88.2572727959803 -17.979416257235705 M87.09306250407941 -18.324947760807365 C87.41534227530653 -18.229296816388196, 87.73762204653364 -18.133645871969026, 88.2572727959803 -17.979416257235705 M88.2572727959803 -17.979416257235705 C88.58041292659321 -17.860497702095532, 88.90355305720612 -17.741579146955356, 89.39695281353121 -17.560003475690376 M88.2572727959803 -17.979416257235705 C88.6947281983287 -17.818428625378083, 89.13218360067712 -17.657440993520456, 89.39695281353121 -17.560003475690376 M89.39695281353121 -17.560003475690376 C89.66197260864004 -17.442687073928596, 89.92699240374888 -17.325370672166816, 90.50741936707944 -17.0684328732545 M89.39695281353121 -17.560003475690376 C89.70811999742084 -17.422258993828994, 90.01928718131045 -17.284514511967615, 90.50741936707944 -17.0684328732545 M90.50741936707944 -17.0684328732545 C90.83585521083187 -16.897088103942053, 91.1642910545843 -16.72574333462961, 91.5841093113621 -16.506724418975057 M90.50741936707944 -17.0684328732545 C90.83513340507432 -16.897464669543435, 91.16284744306918 -16.726496465832366, 91.5841093113621 -16.506724418975057 M91.5841093113621 -16.506724418975057 C91.83164233820172 -16.35666844343935, 92.07917536504134 -16.206612467903643, 92.6225982964489 -15.877186293376754 M91.5841093113621 -16.506724418975057 C91.99145716942864 -16.259787753573388, 92.3988050274952 -16.01285108817172, 92.6225982964489 -15.877186293376754 M92.6225982964489 -15.877186293376754 C93.01303819588037 -15.604832321404198, 93.40347809531185 -15.332478349431641, 93.61861894834493 -15.182405403653188 M92.6225982964489 -15.877186293376754 C92.87448190298298 -15.701483193324172, 93.12636550951704 -15.525780093271592, 93.61861894834493 -15.182405403653188 M93.61861894834493 -15.182405403653188 C93.97667503243811 -14.896865204861436, 94.33473111653129 -14.611325006069684, 94.56807840454576 -14.42523675351027 M93.61861894834493 -15.182405403653188 C93.91779405139327 -14.943821220355979, 94.21696915444163 -14.70523703705877, 94.56807840454576 -14.42523675351027 M94.56807840454576 -14.42523675351027 C94.88172116385518 -14.140394698038119, 95.1953639231646 -13.855552642565968, 95.46707513248747 -13.608791711343592 M94.56807840454576 -14.42523675351027 C94.7653529580316 -14.246077223633089, 94.96262751151744 -14.066917693755908, 95.46707513248747 -13.608791711343592 M95.46707513248747 -13.608791711343592 C95.72595685293412 -13.34147508039789, 95.98483857338077 -13.074158449452188, 96.31191496178073 -12.73642522495834 M95.46707513248747 -13.608791711343592 C95.65575970278755 -13.413959401217435, 95.84444427308763 -13.219127091091279, 96.31191496178073 -12.73642522495834 M96.31191496178073 -12.73642522495834 C96.50231115843853 -12.512775018513594, 96.69270735509632 -12.289124812068845, 97.09912626434942 -11.811722035369087 M96.31191496178073 -12.73642522495834 C96.54143355177922 -12.466819629168375, 96.7709521417777 -12.19721403337841, 97.09912626434942 -11.811722035369087 M97.09912626434942 -11.811722035369087 C97.32920637804727 -11.503435643743531, 97.55928649174511 -11.195149252117975, 97.82547422009499 -10.838481946330077 M97.09912626434942 -11.811722035369087 C97.2861433154351 -11.561136224518131, 97.47316036652077 -11.310550413667174, 97.82547422009499 -10.838481946330077 M97.82547422009499 -10.838481946330077 C97.97357853947567 -10.610953940183059, 98.12168285885635 -10.38342593403604, 98.48797410946614 -9.820704210126504 M97.82547422009499 -10.838481946330077 C98.08929924871343 -10.43317585543246, 98.35312427733187 -10.027869764534842, 98.48797410946614 -9.820704210126504 M98.48797410946614 -9.820704210126504 C98.62274147643076 -9.5814111034051, 98.7575088433954 -9.3421179966837, 99.08390357831163 -8.762571093789074 M98.48797410946614 -9.820704210126504 C98.70131984677231 -9.441887249940882, 98.91466558407848 -9.06307028975526, 99.08390357831163 -8.762571093789074 M99.08390357831163 -8.762571093789074 C99.20756048013496 -8.505794891319095, 99.33121738195828 -8.249018688849118, 99.61081382461754 -7.6684306932616675 M99.08390357831163 -8.762571093789074 C99.23227261639543 -8.454479611619218, 99.38064165447922 -8.146388129449365, 99.61081382461754 -7.6684306932616675 M99.61081382461754 -7.6684306932616675 C99.70501137259282 -7.435760928577031, 99.79920892056809 -7.2030911638923945, 100.06653966115988 -6.5427790661424226 M99.61081382461754 -7.6684306932616675 C99.76844719191692 -7.279073228398376, 99.92608055921629 -6.889715763535085, 100.06653966115988 -6.5427790661424226 M100.06653966115988 -6.5427790661424226 C100.18525039160843 -6.185241260017704, 100.30396112205699 -5.827703453892985, 100.44920841272344 -5.390241756418682 M100.06653966115988 -6.5427790661424226 C100.15279446026274 -6.282993354080546, 100.23904925936559 -6.023207642018669, 100.44920841272344 -5.390241756418682 M100.44920841272344 -5.390241756418682 C100.5546847894517 -4.988014618202988, 100.66016116617995 -4.585787479987294, 100.75724761132582 -4.215554787114586 M100.44920841272344 -5.390241756418682 C100.52947865032283 -5.084136551111163, 100.60974888792222 -4.778031345803643, 100.75724761132582 -4.215554787114586 M100.75724761132582 -4.215554787114586 C100.82732666447625 -3.8557136604003235, 100.89740571762665 -3.495872533686061, 100.98939145782579 -3.0235451989565796 M100.75724761132582 -4.215554787114586 C100.83967705130954 -3.7922970342665394, 100.92210649129325 -3.3690392814184933, 100.98939145782579 -3.0235451989565796 M100.98939145782579 -3.0235451989565796 C101.03341430056832 -2.682112723939051, 101.07743714331086 -2.340680248921523, 101.14468602336338 -1.8191112150276403 M100.98939145782579 -3.0235451989565796 C101.03081200975032 -2.7022955776431012, 101.07223256167484 -2.381045956329623, 101.14468602336338 -1.8191112150276403 M101.14468602336338 -1.8191112150276403 C101.16236272739748 -1.5437822813177582, 101.1800394314316 -1.268453347607876, 101.2224931692582 -0.6072021129180204 M101.14468602336338 -1.8191112150276403 C101.17250753231097 -1.3857687560509855, 101.20032904125857 -0.9524262970743308, 101.2224931692582 -0.6072021129180204 M101.2224931692582 -0.6072021129180204 C101.2224931692582 -0.12557558866346397, 101.2224931692582 0.35605093559109247, 101.2224931692582 0.6072021129180158 M101.2224931692582 -0.6072021129180204 C101.2224931692582 -0.33113112617484897, 101.2224931692582 -0.055060139431677535, 101.2224931692582 0.6072021129180158 M101.2224931692582 0.6072021129180158 C101.19404988257354 1.0502292620393752, 101.16560659588887 1.4932564111607345, 101.14468602336338 1.8191112150276274 M101.2224931692582 0.6072021129180158 C101.19951169846765 0.9651570707901324, 101.1765302276771 1.3231120286622489, 101.14468602336338 1.8191112150276274 M101.14468602336338 1.8191112150276274 C101.08727316736844 2.2643939886735605, 101.02986031137351 2.7096767623194933, 100.98939145782579 3.0235451989565667 M101.14468602336338 1.8191112150276274 C101.10024517293219 2.1637856751333686, 101.055804322501 2.50846013523911, 100.98939145782579 3.0235451989565667 M100.98939145782579 3.0235451989565667 C100.90948212970041 3.4338627100379617, 100.82957280157501 3.8441802211193568, 100.75724761132582 4.215554787114582 M100.98939145782579 3.0235451989565667 C100.91164321227932 3.422766007740224, 100.83389496673283 3.8219868165238813, 100.75724761132582 4.215554787114582 M100.75724761132582 4.215554787114582 C100.65382544851649 4.609948317355462, 100.55040328570716 5.004341847596342, 100.44920841272344 5.3902417564186695 M100.75724761132582 4.215554787114582 C100.67766551859685 4.519035797787303, 100.59808342586788 4.822516808460023, 100.44920841272344 5.3902417564186695 M100.44920841272344 5.3902417564186695 C100.34429021680853 5.706238646069971, 100.23937202089363 6.022235535721273, 100.06653966115988 6.542779066142409 M100.44920841272344 5.3902417564186695 C100.32699700750985 5.7583230371789025, 100.20478560229625 6.126404317939135, 100.06653966115988 6.542779066142409 M100.06653966115988 6.542779066142409 C99.9671998053637 6.7881504305644125, 99.86785994956753 7.033521794986416, 99.61081382461754 7.668430693261662 M100.06653966115988 6.542779066142409 C99.95199552489797 6.825705297269572, 99.83745138863604 7.108631528396734, 99.61081382461754 7.668430693261662 M99.61081382461754 7.668430693261662 C99.45545106628147 7.991044785176995, 99.30008830794542 8.313658877092328, 99.08390357831163 8.76257109378907 M99.61081382461754 7.668430693261662 C99.48545531733598 7.928740315874181, 99.36009681005443 8.1890499384867, 99.08390357831163 8.76257109378907 M99.08390357831163 8.76257109378907 C98.89549156401326 9.097115703961128, 98.70707954971488 9.431660314133184, 98.48797410946614 9.8207042101265 M99.08390357831163 8.76257109378907 C98.88345053236081 9.118495774946718, 98.68299748640997 9.474420456104365, 98.48797410946614 9.8207042101265 M98.48797410946614 9.8207042101265 C98.25443275701775 10.179486442121226, 98.02089140456937 10.538268674115953, 97.825474220095 10.838481946330067 M98.48797410946614 9.8207042101265 C98.2400724602439 10.201547714245484, 97.99217081102165 10.582391218364469, 97.825474220095 10.838481946330067 M97.825474220095 10.838481946330067 C97.67232778156047 11.043684222038776, 97.51918134302592 11.248886497747487, 97.09912626434942 11.811722035369083 M97.825474220095 10.838481946330067 C97.65778034428489 11.063176462689242, 97.49008646847479 11.287870979048419, 97.09912626434942 11.811722035369083 M97.09912626434942 11.811722035369083 C96.8925131466693 12.054421560015602, 96.68590002898918 12.297121084662118, 96.31191496178073 12.73642522495833 M97.09912626434942 11.811722035369083 C96.8011441105594 12.16174882887572, 96.50316195676939 12.511775622382356, 96.31191496178073 12.73642522495833 M96.31191496178073 12.73642522495833 C96.14053601446571 12.913388058534338, 95.96915706715069 13.090350892110346, 95.46707513248747 13.608791711343587 M96.31191496178073 12.73642522495833 C96.10897721805118 12.945975106857718, 95.90603947432162 13.155524988757108, 95.46707513248747 13.608791711343587 M95.46707513248747 13.608791711343587 C95.25065841082534 13.805335651884455, 95.03424168916321 14.001879592425322, 94.56807840454577 14.425236753510257 M95.46707513248747 13.608791711343587 C95.21884898500785 13.834224130780614, 94.97062283752823 14.059656550217639, 94.56807840454577 14.425236753510257 M94.56807840454577 14.425236753510257 C94.36737183057662 14.58529490522442, 94.16666525660746 14.74535305693858, 93.61861894834493 15.182405403653187 M94.56807840454577 14.425236753510257 C94.3127773675705 14.62883253665212, 94.05747633059522 14.832428319793982, 93.61861894834493 15.182405403653187 M93.61861894834493 15.182405403653187 C93.40665630357759 15.330261368927875, 93.19469365881025 15.478117334202565, 92.62259829644891 15.877186293376749 M93.61861894834493 15.182405403653187 C93.28637266509931 15.414166028135543, 92.95412638185367 15.645926652617899, 92.62259829644891 15.877186293376749 M92.62259829644891 15.877186293376749 C92.38924202812713 16.018648234587065, 92.15588575980534 16.16011017579738, 91.58410931136211 16.506724418975054 M92.62259829644891 15.877186293376749 C92.33708542205135 16.050265875696446, 92.05157254765378 16.22334545801614, 91.58410931136211 16.506724418975054 M91.58410931136211 16.506724418975054 C91.2319065739911 16.690468361464895, 90.87970383662008 16.87421230395473, 90.50741936707944 17.0684328732545 M91.58410931136211 16.506724418975054 C91.15729633280708 16.729392476500458, 90.73048335425204 16.952060534025858, 90.50741936707944 17.0684328732545 M90.50741936707944 17.0684328732545 C90.25999270113549 17.177961318616624, 90.01256603519153 17.287489763978744, 89.39695281353121 17.560003475690376 M90.50741936707944 17.0684328732545 C90.13244551246382 17.234422675488645, 89.7574716578482 17.400412477722792, 89.39695281353121 17.560003475690376 M89.39695281353121 17.560003475690376 C88.97209088994983 17.716356590948894, 88.54722896636844 17.872709706207417, 88.25727279598031 17.9794162572357 M89.39695281353121 17.560003475690376 C89.16262885562291 17.646236858267557, 88.9283048977146 17.732470240844734, 88.25727279598031 17.9794162572357 M88.25727279598031 17.9794162572357 C87.83130964664261 18.105839884032935, 87.4053464973049 18.23226351083017, 87.09306250407943 18.32494776080736 M88.25727279598031 17.9794162572357 C87.88448595513205 18.09005743480141, 87.51169911428377 18.200698612367116, 87.09306250407943 18.32494776080736 M87.09306250407943 18.32494776080736 C86.78093388547242 18.39618908117482, 86.4688052668654 18.467430401542284, 85.90910592764031 18.595178123340894 M87.09306250407943 18.32494776080736 C86.75088626290146 18.40304725494758, 86.40871002172351 18.481146749087802, 85.90910592764031 18.595178123340894 M85.90910592764031 18.595178123340894 C85.55855293776735 18.651852812164517, 85.20799994789436 18.70852750098814, 84.71026819819345 18.788996910312417 M85.90910592764031 18.595178123340894 C85.59138846657389 18.646544218510403, 85.27367100550747 18.697910313679913, 84.71026819819345 18.788996910312417 M84.71026819819345 18.788996910312417 C84.41067292154418 18.817898506334735, 84.11107764489489 18.846800102357058, 83.501475597119 18.905607678752272 M84.71026819819345 18.788996910312417 C84.45110790633095 18.81399779198254, 84.19194761446846 18.83899867365266, 83.501475597119 18.905607678752272 M83.501475597119 18.905607678752272 C83.10405133953157 18.91835230115371, 82.70662708194415 18.93109692355515, 82.2876953125 18.94453125 M83.501475597119 18.905607678752272 C83.1089446438956 18.918195382406996, 82.71641369067218 18.93078308606172, 82.2876953125 18.94453125 M82.2876953125 18.94453125 C82.2876953125 18.94453125, 82.2876953125 18.94453125, 82.2876953125 18.94453125 M82.2876953125 18.94453125 C82.2876953125 18.94453125, 82.2876953125 18.94453125, 82.2876953125 18.94453125 M82.2876953125 18.94453125 C45.02936513193816 18.94453125, 7.771034951376308 18.94453125, -82.2876953125 18.94453125 M82.2876953125 18.94453125 C33.179164485240975 18.94453125, -15.929366342018056 18.94453125, -82.2876953125 18.94453125 M-82.2876953125 18.94453125 C-82.64378612314836 18.933112110791225, -82.99987693379671 18.92169297158245, -83.50147559711898 18.905607678752272 M-82.2876953125 18.94453125 C-82.55966491357667 18.935809714250187, -82.83163451465333 18.927088178500373, -83.50147559711898 18.905607678752272 M-83.50147559711898 18.905607678752272 C-83.76580290489574 18.880108341271146, -84.03013021267247 18.85460900379002, -84.71026819819343 18.788996910312417 M-83.50147559711898 18.905607678752272 C-83.94252053126502 18.86306060438934, -84.38356546541107 18.82051353002641, -84.71026819819343 18.788996910312417 M-84.71026819819343 18.788996910312417 C-85.18771425282644 18.711807134848804, -85.66516030745944 18.634617359385196, -85.9091059276403 18.595178123340894 M-84.71026819819343 18.788996910312417 C-85.09948090975625 18.726072017496598, -85.48869362131907 18.66314712468078, -85.9091059276403 18.595178123340894 M-85.9091059276403 18.595178123340894 C-86.19386064749852 18.53018471673146, -86.47861536735674 18.465191310122027, -87.09306250407941 18.324947760807365 M-85.9091059276403 18.595178123340894 C-86.25501843072992 18.516225851800726, -86.60093093381955 18.437273580260555, -87.09306250407941 18.324947760807365 M-87.09306250407941 18.324947760807365 C-87.51761811486905 18.19894188406288, -87.94217372565869 18.07293600731839, -88.25727279598028 17.979416257235712 M-87.09306250407941 18.324947760807365 C-87.543295132081 18.191321080135786, -87.99352776008257 18.057694399464207, -88.25727279598028 17.979416257235712 M-88.25727279598028 17.979416257235712 C-88.5193933817533 17.88295345865511, -88.78151396752632 17.786490660074506, -89.39695281353121 17.560003475690376 M-88.25727279598028 17.979416257235712 C-88.65445218941318 17.833250568966342, -89.05163158284608 17.68708488069697, -89.39695281353121 17.560003475690376 M-89.39695281353121 17.560003475690376 C-89.77222967743366 17.393879540233403, -90.14750654133611 17.22775560477643, -90.50741936707944 17.068432873254505 M-89.39695281353121 17.560003475690376 C-89.74414852402673 17.406310233848835, -90.09134423452224 17.25261699200729, -90.50741936707944 17.068432873254505 M-90.50741936707944 17.068432873254505 C-90.93387771643339 16.845949825556158, -91.36033606578734 16.62346677785781, -91.5841093113621 16.50672441897506 M-90.50741936707944 17.068432873254505 C-90.88667933577068 16.870573190515888, -91.26593930446192 16.67271350777727, -91.5841093113621 16.50672441897506 M-91.5841093113621 16.50672441897506 C-91.81116987665747 16.369078969937007, -92.03823044195286 16.231433520898957, -92.6225982964489 15.877186293376761 M-91.5841093113621 16.50672441897506 C-91.82745479499386 16.3592069567407, -92.0708002786256 16.211689494506338, -92.6225982964489 15.877186293376761 M-92.6225982964489 15.877186293376761 C-92.90859501980346 15.677687359763235, -93.19459174315801 15.47818842614971, -93.61861894834492 15.18240540365319 M-92.6225982964489 15.877186293376761 C-92.88215716024733 15.69612926611309, -93.14171602404578 15.515072238849418, -93.61861894834492 15.18240540365319 M-93.61861894834492 15.18240540365319 C-93.9662874758412 14.905149004822974, -94.3139560033375 14.627892605992757, -94.56807840454576 14.425236753510271 M-93.61861894834492 15.18240540365319 C-93.89232017895952 14.964135955733681, -94.16602140957413 14.745866507814172, -94.56807840454576 14.425236753510271 M-94.56807840454576 14.425236753510271 C-94.78150179967346 14.231411272928883, -94.99492519480117 14.037585792347494, -95.46707513248745 13.608791711343597 M-94.56807840454576 14.425236753510271 C-94.8207266121093 14.195788336106325, -95.07337481967284 13.96633991870238, -95.46707513248745 13.608791711343597 M-95.46707513248745 13.608791711343597 C-95.79937518366961 13.26566462615644, -96.13167523485176 12.922537540969284, -96.31191496178073 12.736425224958337 M-95.46707513248745 13.608791711343597 C-95.75030022903357 13.31633854594685, -96.03352532557969 13.023885380550105, -96.31191496178073 12.736425224958337 M-96.31191496178073 12.736425224958337 C-96.48130876613199 12.537445623586825, -96.65070257048325 12.338466022215313, -97.09912626434942 11.811722035369089 M-96.31191496178073 12.736425224958337 C-96.51844347272159 12.493825084202019, -96.72497198366244 12.251224943445703, -97.09912626434942 11.811722035369089 M-97.09912626434942 11.811722035369089 C-97.38375817013957 11.430341212110347, -97.66839007592972 11.048960388851604, -97.82547422009499 10.838481946330079 M-97.09912626434942 11.811722035369089 C-97.27715088173561 11.573185266447886, -97.4551754991218 11.334648497526686, -97.82547422009499 10.838481946330079 M-97.82547422009499 10.838481946330079 C-98.08753205478499 10.435890739864558, -98.349589889475 10.033299533399035, -98.48797410946612 9.820704210126515 M-97.82547422009499 10.838481946330079 C-98.00779668032877 10.558385686975308, -98.19011914056256 10.278289427620537, -98.48797410946612 9.820704210126515 M-98.48797410946612 9.820704210126515 C-98.62181619110221 9.583054041201235, -98.7556582727383 9.345403872275956, -99.08390357831163 8.762571093789076 M-98.48797410946612 9.820704210126515 C-98.6876018713745 9.46624490435533, -98.88722963328286 9.111785598584147, -99.08390357831163 8.762571093789076 M-99.08390357831163 8.762571093789076 C-99.19854920122337 8.524507004789502, -99.3131948241351 8.286442915789927, -99.61081382461754 7.668430693261669 M-99.08390357831163 8.762571093789076 C-99.26020325363639 8.396481045768464, -99.43650292896115 8.030390997747855, -99.61081382461754 7.668430693261669 M-99.61081382461754 7.668430693261669 C-99.71025276922349 7.42281457756377, -99.80969171382944 7.177198461865871, -100.06653966115988 6.542779066142424 M-99.61081382461754 7.668430693261669 C-99.76056619502438 7.298539443091656, -99.91031856543121 6.928648192921642, -100.06653966115988 6.542779066142424 M-100.06653966115988 6.542779066142424 C-100.209582078314 6.111958096388339, -100.35262449546813 5.681137126634252, -100.44920841272344 5.390241756418677 M-100.06653966115988 6.542779066142424 C-100.15971744291791 6.26214243335067, -100.25289522467592 5.9815058005589155, -100.44920841272344 5.390241756418677 M-100.44920841272344 5.390241756418677 C-100.52639309172989 5.095903123315613, -100.60357777073632 4.801564490212549, -100.75724761132582 4.215554787114589 M-100.44920841272344 5.390241756418677 C-100.56592343576864 4.945156788936346, -100.68263845881384 4.500071821454016, -100.75724761132582 4.215554787114589 M-100.75724761132582 4.215554787114589 C-100.82968843467975 3.8435864695656226, -100.90212925803367 3.4716181520166565, -100.98939145782579 3.023545198956582 M-100.75724761132582 4.215554787114589 C-100.84168185645751 3.7820027835474197, -100.92611610158919 3.3484507799802508, -100.98939145782579 3.023545198956582 M-100.98939145782579 3.023545198956582 C-101.02097771619906 2.7785684164257787, -101.05256397457231 2.5335916338949755, -101.14468602336336 1.819111215027651 M-100.98939145782579 3.023545198956582 C-101.0227135337736 2.7651057580935228, -101.0560356097214 2.5066663172304637, -101.14468602336336 1.819111215027651 M-101.14468602336336 1.819111215027651 C-101.16677593185807 1.4750430595695072, -101.18886584035278 1.1309749041113635, -101.2224931692582 0.6072021129180227 M-101.14468602336336 1.819111215027651 C-101.16107811154058 1.5637912102122469, -101.17747019971777 1.308471205396843, -101.2224931692582 0.6072021129180227 M-101.2224931692582 0.6072021129180227 C-101.2224931692582 0.2898864376497997, -101.2224931692582 -0.027429237618423308, -101.2224931692582 -0.6072021129180136 M-101.2224931692582 0.6072021129180227 C-101.2224931692582 0.2649658791193916, -101.2224931692582 -0.07727035467923948, -101.2224931692582 -0.6072021129180136 M-101.2224931692582 -0.6072021129180136 C-101.1974683939123 -0.9969831885654659, -101.1724436185664 -1.386764264212918, -101.14468602336338 -1.819111215027625 M-101.2224931692582 -0.6072021129180136 C-101.19607372449603 -1.018706290480781, -101.16965427973386 -1.4302104680435483, -101.14468602336338 -1.819111215027625 M-101.14468602336338 -1.819111215027625 C-101.08900818535022 -2.2509375318249307, -101.03333034733707 -2.682763848622236, -100.98939145782579 -3.023545198956573 M-101.14468602336338 -1.819111215027625 C-101.10015164879047 -2.164511029908115, -101.05561727421757 -2.509910844788605, -100.98939145782579 -3.023545198956573 M-100.98939145782579 -3.023545198956573 C-100.92557014785085 -3.3512541370392532, -100.86174883787591 -3.678963075121934, -100.75724761132582 -4.21555478711458 M-100.98939145782579 -3.023545198956573 C-100.92121744899623 -3.3736043257144903, -100.85304344016667 -3.723663452472408, -100.75724761132582 -4.21555478711458 M-100.75724761132582 -4.21555478711458 C-100.67595301138596 -4.525566329987794, -100.59465841144608 -4.835577872861007, -100.44920841272344 -5.390241756418667 M-100.75724761132582 -4.21555478711458 C-100.68173662171878 -4.503510917156151, -100.60622563211173 -4.791467047197723, -100.44920841272344 -5.390241756418667 M-100.44920841272344 -5.390241756418667 C-100.357399537468 -5.6667554609302595, -100.26559066221256 -5.943269165441853, -100.06653966115988 -6.5427790661424 M-100.44920841272344 -5.390241756418667 C-100.36364491080471 -5.647945391505209, -100.27808140888597 -5.9056490265917505, -100.06653966115988 -6.5427790661424 M-100.06653966115988 -6.5427790661424 C-99.92024331469536 -6.904133870357214, -99.77394696823085 -7.265488674572026, -99.61081382461754 -7.66843069326166 M-100.06653966115988 -6.5427790661424 C-99.92624619469461 -6.889306640701253, -99.78595272822936 -7.235834215260106, -99.61081382461754 -7.66843069326166 M-99.61081382461754 -7.66843069326166 C-99.41925283710927 -8.06621118257111, -99.227691849601 -8.463991671880557, -99.08390357831163 -8.762571093789068 M-99.61081382461754 -7.66843069326166 C-99.50143124905661 -7.895565951826126, -99.39204867349568 -8.122701210390591, -99.08390357831163 -8.762571093789068 M-99.08390357831163 -8.762571093789068 C-98.941354292024 -9.015681786273236, -98.79880500573638 -9.268792478757403, -98.48797410946614 -9.820704210126506 M-99.08390357831163 -8.762571093789068 C-98.96075641916957 -8.98123134484787, -98.8376092600275 -9.19989159590667, -98.48797410946614 -9.820704210126506 M-98.48797410946614 -9.820704210126506 C-98.3065746008363 -10.09938256797041, -98.12517509220645 -10.378060925814317, -97.82547422009499 -10.838481946330072 M-98.48797410946614 -9.820704210126506 C-98.26597070866966 -10.161761050010062, -98.04396730787319 -10.502817889893617, -97.82547422009499 -10.838481946330072 M-97.82547422009499 -10.838481946330072 C-97.66258263379967 -11.056741832237007, -97.49969104750436 -11.275001718143942, -97.09912626434942 -11.811722035369083 M-97.82547422009499 -10.838481946330072 C-97.55281786425707 -11.203816623647873, -97.28016150841914 -11.569151300965673, -97.09912626434942 -11.811722035369083 M-97.09912626434942 -11.811722035369083 C-96.91356092797831 -12.02969763843735, -96.72799559160721 -12.247673241505614, -96.31191496178074 -12.736425224958328 M-97.09912626434942 -11.811722035369083 C-96.8059247898332 -12.156133170972366, -96.51272331531699 -12.500544306575648, -96.31191496178074 -12.736425224958328 M-96.31191496178074 -12.736425224958328 C-96.04713050440738 -13.009836916404577, -95.782346047034 -13.283248607850826, -95.46707513248747 -13.608791711343581 M-96.31191496178074 -12.736425224958328 C-96.05145921650617 -13.005367165768684, -95.79100347123162 -13.27430910657904, -95.46707513248747 -13.608791711343581 M-95.46707513248747 -13.608791711343581 C-95.17741390967826 -13.871854369882914, -94.88775268686908 -14.134917028422247, -94.56807840454577 -14.425236753510253 M-95.46707513248747 -13.608791711343581 C-95.26378178395309 -13.793417351635245, -95.06048843541873 -13.978042991926907, -94.56807840454577 -14.425236753510253 M-94.56807840454577 -14.425236753510253 C-94.31284561376471 -14.628778112128343, -94.05761282298364 -14.832319470746432, -93.61861894834493 -15.182405403653183 M-94.56807840454577 -14.425236753510253 C-94.18935438389612 -14.727259081708906, -93.81063036324646 -15.02928140990756, -93.61861894834493 -15.182405403653183 M-93.61861894834493 -15.182405403653183 C-93.33610693440268 -15.37947355483132, -93.05359492046044 -15.576541706009458, -92.62259829644891 -15.877186293376747 M-93.61861894834493 -15.182405403653183 C-93.31215957061336 -15.396178199146078, -93.0057001928818 -15.609950994638973, -92.62259829644891 -15.877186293376747 M-92.62259829644891 -15.877186293376747 C-92.40395007725142 -16.00973212877383, -92.18530185805392 -16.142277964170916, -91.58410931136211 -16.506724418975054 M-92.62259829644891 -15.877186293376747 C-92.40575210696728 -16.008639727770174, -92.18890591748564 -16.1400931621636, -91.58410931136211 -16.506724418975054 M-91.58410931136211 -16.506724418975054 C-91.32000906798298 -16.64450534678167, -91.05590882460383 -16.782286274588287, -90.50741936707944 -17.0684328732545 M-91.58410931136211 -16.506724418975054 C-91.23426937118927 -16.68923569168005, -90.88442943101643 -16.871746964385046, -90.50741936707944 -17.0684328732545 M-90.50741936707944 -17.0684328732545 C-90.16593040742268 -17.219599905784474, -89.82444144776592 -17.37076693831445, -89.39695281353121 -17.560003475690372 M-90.50741936707944 -17.0684328732545 C-90.23192446448161 -17.190386294368636, -89.95642956188378 -17.312339715482768, -89.39695281353121 -17.560003475690372 M-89.39695281353121 -17.560003475690372 C-88.95040409870413 -17.72433753059781, -88.50385538387704 -17.888671585505254, -88.25727279598031 -17.9794162572357 M-89.39695281353121 -17.560003475690372 C-89.12144879293785 -17.661391501999976, -88.84594477234451 -17.76277952830958, -88.25727279598031 -17.9794162572357 M-88.25727279598031 -17.9794162572357 C-88.02109407836373 -18.049512860896915, -87.78491536074716 -18.119609464558128, -87.09306250407944 -18.32494776080736 M-88.25727279598031 -17.9794162572357 C-87.89794104012807 -18.08606403620177, -87.53860928427585 -18.192711815167836, -87.09306250407944 -18.32494776080736 M-87.09306250407944 -18.32494776080736 C-86.64934664987891 -18.42622300901208, -86.20563079567837 -18.527498257216806, -85.90910592764031 -18.595178123340894 M-87.09306250407944 -18.32494776080736 C-86.7336638367951 -18.406978161319525, -86.37426516951076 -18.489008561831696, -85.90910592764031 -18.595178123340894 M-85.90910592764031 -18.595178123340894 C-85.43689763940858 -18.67152109735223, -84.96468935117686 -18.74786407136357, -84.71026819819345 -18.788996910312417 M-85.90910592764031 -18.595178123340894 C-85.53760142537536 -18.655240090206647, -85.1660969231104 -18.715302057072403, -84.71026819819345 -18.788996910312417 M-84.71026819819345 -18.788996910312417 C-84.37207965174224 -18.821621552657334, -84.03389110529102 -18.854246195002247, -83.501475597119 -18.905607678752272 M-84.71026819819345 -18.788996910312417 C-84.31924228841514 -18.82671870955127, -83.92821637863685 -18.86444050879012, -83.501475597119 -18.905607678752272 M-83.501475597119 -18.905607678752272 C-83.04962455133489 -18.92009766231586, -82.59777350555078 -18.93458764587945, -82.2876953125 -18.94453125 M-83.501475597119 -18.905607678752272 C-83.25184454279646 -18.913612860787026, -83.00221348847391 -18.921618042821777, -82.2876953125 -18.94453125 M-82.2876953125 -18.94453125 C-82.2876953125 -18.94453125, -82.2876953125 -18.94453125, -82.2876953125 -18.94453125 M-82.2876953125 -18.94453125 C-82.2876953125 -18.94453125, -82.2876953125 -18.94453125, -82.2876953125 -18.94453125&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, -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;ERP-led&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; B2B:&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Sage&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&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;finance&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; stock&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-6-flowchart-Q1-2&quot; data-look=&quot;classic&quot; transform=&quot;translate(427.8515625, 218.06328125)&quot;&gt;&lt;polygon points=&quot;122.17421875,0 244.3484375,-122.17421875 122.17421875,-244.3484375 0,-122.17421875&quot; class=&quot;label-container&quot; transform=&quot;translate(-121.67421875, 122.17421875)&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;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; platform&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; charge&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;for&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;draft&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; manual&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; orders?&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-6-flowchart-MODEL-4&quot; data-look=&quot;classic&quot; transform=&quot;translate(276.681640625, 443.02109375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-129.75390625&quot; y=&quot;-26.99453125&quot; width=&quot;259.5078125&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;Model&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; twelve-month&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; TCO&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;subscription&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; order&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 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;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;apps&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; ops&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-6-flowchart-WATCH-6&quot; data-look=&quot;classic&quot; transform=&quot;translate(579.021484375, 443.02109375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-122.5859375&quot; y=&quot;-26.44453125&quot; width=&quot;245.171875&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;Review&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; quarterly&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; anyway&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;fee&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; schedules&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;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-6-flowchart-Q2-8&quot; data-look=&quot;classic&quot; transform=&quot;translate(276.681640625, 646.65859375)&quot;&gt;&lt;polygon points=&quot;126.64296875,0 253.2859375,-126.64296875 126.64296875,-253.2859375 0,-126.64296875&quot; class=&quot;label-container&quot; transform=&quot;translate(-126.14296875, 126.64296875)&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;Do&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 font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; economics&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;B2B&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;roadmap&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; beat&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; staying&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; put?&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-6-flowchart-MIGRATE-10&quot; data-look=&quot;classic&quot; transform=&quot;translate(129.5859375, 876.63515625)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-115.8515625&quot; y=&quot;-27.54453125&quot; width=&quot;231.703125&quot; height=&quot;55.0890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -12.54453125)&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;Plan&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; BigCommerce&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;Shopify&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; migration&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;ERP&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; before&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;3.2em&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;polish&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-6-flowchart-RENEGOTIATE-12&quot; data-look=&quot;classic&quot; transform=&quot;translate(423.77734375, 876.63515625)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-128.33984375&quot; y=&quot;-26.99453125&quot; width=&quot;256.6796875&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;Renegotiate&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; BC&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; contract&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; reduce&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 font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; records&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&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;platform&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-6-flowchart-AUDIT-14&quot; data-look=&quot;classic&quot; transform=&quot;translate(129.5859375, 980.62421875)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-121.5859375&quot; y=&quot;-26.44453125&quot; width=&quot;243.171875&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;Stack&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; audit:&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Sage&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;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;catalogs,&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; payment&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; terms&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-6-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-6-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-6-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;382.0966796875&quot; y=&quot;-25&quot; class=&quot;flowchartTitleText&quot;&gt;B2B platform cost check&lt;/text&gt;&lt;/svg&gt;
  &lt;/div&gt;
  
  &lt;figcaption class=&quot;epmb-figure__caption&quot; id=&quot;epmb-6-caption&quot;&gt;B2B platform cost check&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h2&gt;Framework: compare what you actually pay for&lt;/h2&gt;&lt;p&gt;Use this matrix against your last twelve months of orders. Split &lt;strong&gt;card checkout&lt;/strong&gt;, &lt;strong&gt;draft or manual B2B&lt;/strong&gt;, and &lt;strong&gt;ERP-origin PO lines&lt;/strong&gt; before you trust a headline plan price.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Decision factor&lt;/th&gt;&lt;th&gt;BigCommerce (ERP-led B2B)&lt;/th&gt;&lt;th&gt;Shopify (ERP-led B2B)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Monthly platform fee&lt;/td&gt;&lt;td&gt;Plan tier based on GMV or order bands; verify what counts as billable orders&lt;/td&gt;&lt;td&gt;Plan or Plus contract; order count limits on lower tiers, soft caps on Plus&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Draft or manual orders&lt;/td&gt;&lt;td&gt;Merchants report new charges on admin and draft orders even without gateway capture&lt;/td&gt;&lt;td&gt;No card transaction fee; subscription applies. Manual payment methods supported&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Bank transfer / PO settlement&lt;/td&gt;&lt;td&gt;Order still lives in BC; fee treatment depends on current billing rules&lt;/td&gt;&lt;td&gt;Mark as paid offline; Sage settlement parallel to Shopify order record&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ERP sync (Sage)&lt;/td&gt;&lt;td&gt;Connectors exist; Script Manager customisations may need rewrites on exit&lt;/td&gt;&lt;td&gt;Strong connector and iPaaS market; webhook-first order export patterns&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Wholesale pricing and accounts&lt;/td&gt;&lt;td&gt;Customer groups and price lists&lt;/td&gt;&lt;td&gt;B2B companies, catalogs, payment terms on Plus; apps on lower plans&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Storefront agility&lt;/td&gt;&lt;td&gt;Stencil rebuilds slower for many agencies&lt;/td&gt;&lt;td&gt;OS 2.0 theme ecosystem; faster merchandising iteration&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Migration cost&lt;/td&gt;&lt;td&gt;N/A (incumbent)&lt;/td&gt;&lt;td&gt;Theme rebuild, redirects, ERP re-test: typically 12–18 weeks mid-market B2B&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Run the numbers twice: &lt;strong&gt;status quo with new BC fees&lt;/strong&gt; versus &lt;strong&gt;Shopify subscription plus migration plus connector&lt;/strong&gt;. Include internal ops hours. A platform that looks expensive on paper can be cheaper when it stops taxing orders that never used its payments stack.&lt;/p&gt;&lt;h2&gt;Recommendation by scenario&lt;/h2&gt;&lt;h3&gt;Scenario A: Majority bank transfer, Sage is truth, draft orders are daily workflow&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Likely move:&lt;/strong&gt; Evaluate Shopify Plus with B2B and a Sage integration partner. Prioritise order object mapping and payment terms before marketing features. If BC draft fees are material on hundreds of monthly lines, migration math often clears within the first year after build cost.&lt;/p&gt;&lt;h3&gt;Scenario B: Mixed B2B and DTC, card revenue growing&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Model both channels separately.&lt;/strong&gt; Card checkout fees apply on any platform. The argument for Shopify strengthens when B2B draft volume is large but DTC also needs modern checkout and Shop Pay. Plan tier choice matters; 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;.&lt;/p&gt;&lt;h3&gt;Scenario C: BigCommerce fees rose slightly but ERP sync is fragile&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Do not migrate to escape a line item if Sage sync is already broken.&lt;/strong&gt; Fix integration ownership first. Migration magnifies weak data models. A structured &lt;a href=&quot;https://ocontis.studio/services/shopify-stack-audit/&quot;&gt;&lt;em&gt;stack audit&lt;/em&gt;&lt;/a&gt; clarifies whether fees or architecture drive the pain.&lt;/p&gt;&lt;h3&gt;Scenario D: Contract lock-in and low IT capacity&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Renegotiate or reduce order creation in BC&lt;/strong&gt; (fewer duplicate draft rows, ERP as sole order origin with BC as read-only catalogue) until migration is funded. Anger is not a project plan.&lt;/p&gt;&lt;h2&gt;What Shopify does not magically fix&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Sage sync still needs design.&lt;/strong&gt; Shopify does not replace ERP; it replaces the customer-facing order layer.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Plus is a real commitment.&lt;/strong&gt; Budget contracted platform fees honestly.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;B2B complexity moves into catalogs and permissions.&lt;/strong&gt; Simpler than Stencil scripts, still a build.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;SEO and URL structure change.&lt;/strong&gt; Redirect planning is non-negotiable; the BigCommerce migration guide covers it.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Shopify wins on clarity and ecosystem for many ERP-led brands. It is not a free lunch.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;BigCommerce charging for draft orders on a Sage-led B2B stack is more than billing annoyance. It exposes a mismatch: you built a workflow where the platform records demand while finance settles elsewhere, and the platform now prices every record like a checkout transaction.&lt;/p&gt;&lt;p&gt;Shopify is often the more efficient home for that model when you need predictable separation between &lt;strong&gt;subscription&lt;/strong&gt;, &lt;strong&gt;payment processing&lt;/strong&gt;, and &lt;strong&gt;ERP integration&lt;/strong&gt;, especially at wholesale scale on Plus.&lt;/p&gt;&lt;p&gt;Before you replatform, model twelve months of true cost, validate Sage order mapping, and scope migration as an integration project with a storefront rebuild, not a theme refresh.&lt;/p&gt;&lt;p&gt;If you are weighing BigCommerce exit after fee changes on manual or draft orders, &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;book a discovery call&lt;/a&gt; or start with our &lt;a href=&quot;https://ocontis.studio/services/replatforming-and-migration/&quot;&gt;replatforming and migration services&lt;/a&gt;. We map Sage sync, B2B catalog rules, and fee impact before anyone touches Liquid.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Modern Customer Segmentation on Shopify: A Research Guide for DTC Brands</title>
    <link href="https://ocontis.studio/blog/post/modern-customer-segmentation-on-shopify-a-research-guide-for-dtc-brands/" />
    <updated>2026-07-27T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/modern-customer-segmentation-on-shopify-a-research-guide-for-dtc-brands/</id>
    <content type="html">&lt;h1&gt;Modern Customer Segmentation on Shopify: A Research Guide for DTC Brands&lt;/h1&gt;&lt;p&gt;Your ESP shows 42,000 &amp;quot;engaged&amp;quot; subscribers. Shopify Admin shows 38,200 customers with an order. Klaviyo lists eleven segments, Shopify has nine, and someone still exports CSVs tagged &lt;code&gt;VIP-2019&lt;/code&gt;. Everyone agrees segmentation matters. Few teams agree which list is true.&lt;/p&gt;&lt;p&gt;This guide maps &lt;strong&gt;modern customer segmentation techniques&lt;/strong&gt; for established Shopify brands: what each method is for, where the data should live, and how to keep segments maintainable as the stack grows. It is written for decision makers who need repeat revenue without another disconnected martech project.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;Segmentation sits underneath campaigns as &lt;strong&gt;data architecture with a commercial outcome&lt;/strong&gt;. When definitions stay aligned, merchandising, support, and lifecycle email pull from the same cohorts. When they drift, you personalise against stale tags while finance reports on a different customer count.&lt;/p&gt;&lt;p&gt;This reflects patterns we see regularly across the Shopify merchant and developer community: merchants asking which apps to trust, new stores with traffic but no clear buyer profile, and teams that bought personalisation before they agreed where customer truth lives. Forum threads rarely say &amp;quot;fix our segment model,&amp;quot; but the symptom shows up as app overload and flat retention.&lt;/p&gt;&lt;p&gt;If you already invest in retention, pair this guide with &lt;a href=&quot;https://ocontis.studio/blog/post/maximizing-customer-lifetime-value-on-shopify-plus/&quot;&gt;&lt;em&gt;Maximizing Customer Lifetime Value on Shopify Plus&lt;/em&gt;&lt;/a&gt; for outcome framing. Here we focus on &lt;strong&gt;techniques, Shopify surfaces, and stack boundaries&lt;/strong&gt;. For economics by cohort, use the &lt;a href=&quot;https://ocontis.studio/tools/unit-economics-simulator/&quot;&gt;&lt;em&gt;Unit Economics Simulator&lt;/em&gt;&lt;/a&gt; once segments are defined enough to compare groups.&lt;/p&gt;&lt;h2&gt;The decision merchants face&lt;/h2&gt;&lt;p&gt;Most scaling DTC brands hit the same fork:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Segment inside Shopify&lt;/strong&gt; using native segments, tags, Flow, and metafields.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Segment in the ESP/CDP&lt;/strong&gt; and treat Shopify as an order feed.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Hybrid&lt;/strong&gt; with Shopify owning commerce cohorts and marketing tools owning send logic.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Any of the three paths can work. The expensive mistake is &lt;strong&gt;rebuilding the same rules in every tool&lt;/strong&gt; without documenting ownership.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Technique&lt;/th&gt;&lt;th&gt;What it groups on&lt;/th&gt;&lt;th&gt;Best Shopify surface&lt;/th&gt;&lt;th&gt;Typical use&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;RFM&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Recency, frequency, monetary value&lt;/td&gt;&lt;td&gt;Shopify segments + export or metafields&lt;/td&gt;&lt;td&gt;Win-back, VIP treatment, budget allocation&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Lifecycle stage&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Prospect → first order → repeat → lapsed&lt;/td&gt;&lt;td&gt;Shopify segments, Flow triggers&lt;/td&gt;&lt;td&gt;Onboarding, replenishment, churn prevention&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Product affinity&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Category, collection, SKU patterns&lt;/td&gt;&lt;td&gt;Segments, line-item history, metafields&lt;/td&gt;&lt;td&gt;Cross-sell, bundles, category launches&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Acquisition cohort&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;First order date, channel, campaign&lt;/td&gt;&lt;td&gt;UTM discipline + customer metafields&lt;/td&gt;&lt;td&gt;CAC payback by cohort, creative testing&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Zero-party / declared&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Quiz answers, preferences, fit data&lt;/td&gt;&lt;td&gt;Customer metafields, metaobjects&lt;/td&gt;&lt;td&gt;Personalised PDPs, sampling, subscriptions&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;B2B / company&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Company, price list, role&lt;/td&gt;&lt;td&gt;Shopify B2B, company locations&lt;/td&gt;&lt;td&gt;Catalogue visibility, net terms, rep routing&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Predictive / lookalike&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Modelled LTV, churn risk, similarity&lt;/td&gt;&lt;td&gt;Ad platforms, CDP, external ML&lt;/td&gt;&lt;td&gt;Paid media, prospecting, budget shifts&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Shopify-native segmentation (start here)&lt;/h2&gt;&lt;p&gt;Shopify&#39;s &lt;strong&gt;customer segments&lt;/strong&gt; are dynamic groups defined by query conditions on customer facts: order counts, spend, location, subscription status, tags, and more. They are exposed in Admin, GraphQL (&lt;code&gt;segments&lt;/code&gt;, &lt;code&gt;segmentCreate&lt;/code&gt;), and power discounts, exports, and &lt;strong&gt;Shopify Flow&lt;/strong&gt; automations.&lt;/p&gt;&lt;p&gt;Practical native patterns we use on builds:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Lifecycle segments&lt;/strong&gt; with plain language names merchants understand: &lt;code&gt;First-time buyers (90 days)&lt;/code&gt;, &lt;code&gt;Repeat buyers (2+ orders)&lt;/code&gt;, &lt;code&gt;Lapsed (no order in 180 days)&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Operational segments&lt;/strong&gt; for support and fulfilment: high AOV, international, subscription active.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Commerce segments&lt;/strong&gt; tied to promotions: eligible for private sale, excluded from stackable codes.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Customer metafields&lt;/strong&gt; extend the model when segments need attributes Shopify queries do not express cleanly: loyalty tier, skin type, trade account type, consent granularity. Treat metafield definitions as part of your segmentation schema, not one-off admin entries.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Customer tags&lt;/strong&gt; still appear everywhere. Tags are fine for manual exceptions and migrations. They are a poor system of record at scale because nothing validates spelling, expiry, or meaning. Prefer segments and metafields for rules; use tags for human overrides. If you are still paying for apps whose only job is tag automation, see &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; before adding another layer.&lt;/p&gt;&lt;p&gt;On &lt;strong&gt;Shopify Plus&lt;/strong&gt;, segments integrate with broader automation, B2B, and checkout customisation. Plan selection still matters: some advanced workflows assume Plus capabilities. 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; before you design segment-driven checkout rules that assume Plus-only features.&lt;/p&gt;&lt;h2&gt;Stack-layer segmentation (ESP, loyalty, ads)&lt;/h2&gt;&lt;p&gt;Email and SMS platforms excel at &lt;strong&gt;send-time personalisation&lt;/strong&gt; and creative testing. Ad platforms excel at &lt;strong&gt;prospecting and lookalikes&lt;/strong&gt;. Neither should silently become your customer database of record unless you accept sync lag and duplicate logic.&lt;/p&gt;&lt;p&gt;A maintainable hybrid looks like this:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Shopify defines&lt;/strong&gt; order-based membership and discount eligibility.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Integrations sync&lt;/strong&gt; segment membership or key metafields on a schedule or webhook.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;ESP defines&lt;/strong&gt; campaign-specific splits that do not need to live in commerce core.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Documentation&lt;/strong&gt; records which system owns each segment name.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;When &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;twelve apps quietly eat margins&lt;/em&gt;&lt;/a&gt;, segmentation duplication is often the hidden cost: three tools each computing &amp;quot;VIP&amp;quot; differently, billing for the same insight.&lt;/p&gt;&lt;h2&gt;RFM: still the best first framework&lt;/h2&gt;&lt;p&gt;RFM remains the most defensible starting point for established DTC on Shopify because it uses order data you already trust.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Dimension&lt;/th&gt;&lt;th&gt;Question it answers&lt;/th&gt;&lt;th&gt;Starter threshold (example)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Recency&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;How recently did they buy?&lt;/td&gt;&lt;td&gt;Active: ≤90 days since last order; Lapsed: &amp;gt;180 days&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Frequency&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;How often do they return?&lt;/td&gt;&lt;td&gt;One-time: 1 order; Repeat: 2+ orders lifetime&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Monetary&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;How much have they spent?&lt;/td&gt;&lt;td&gt;Top quartile AOV or lifetime spend band per category&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;You do not need a data science team on day one. Start with &lt;strong&gt;three to five behavioural segments&lt;/strong&gt; every department can name in a meeting. Refine thresholds quarterly using contribution margin, not open rates alone.&lt;/p&gt;&lt;p&gt;Brands that stall near &lt;a href=&quot;https://ocontis.studio/blog/post/why-most-shopify-stores-dont-scale-past-50k-month/&quot;&gt;&lt;em&gt;the $50k/month plateau&lt;/em&gt;&lt;/a&gt; often discover their acquisition cohorts repurchase at wildly different rates. RFM makes that visible before you scale spend into the wrong group.&lt;/p&gt;&lt;h2&gt;Zero-party and enrichment (second layer)&lt;/h2&gt;&lt;p&gt;Quizzes, preference centres, and post-purchase surveys collect &lt;strong&gt;zero-party data&lt;/strong&gt; customers explicitly share. On Shopify, store answers in &lt;strong&gt;customer metafields&lt;/strong&gt; or linked &lt;strong&gt;metaobjects&lt;/strong&gt; so themes, Flow, and private apps read the same profile.&lt;/p&gt;&lt;p&gt;Use this layer when product fit drives conversion (beauty, apparel, supplements, configurable products). Skip leading with quizzes if operational segmentation (stock, shipping zones, B2B terms) is the actual bottleneck.&lt;/p&gt;&lt;p&gt;Enrichment from third-party databases belongs outside core Shopify unless you have compliance review and a clear use case. For most DTC merchants, &lt;strong&gt;order behaviour plus declared preferences&lt;/strong&gt; beats purchased demographic append.&lt;/p&gt;&lt;p&gt;Consent and marketing eligibility add another segmentation axis post-GDPR and CAN-SPAM enforcement. Email subscription status belongs in Shopify segment conditions; granular consent often lives in metafields synced from your ESP. Do not segment for SMS or email sends using tags someone toggled manually in 2022.&lt;/p&gt;&lt;h2&gt;Sync, drift, and operational hygiene&lt;/h2&gt;&lt;p&gt;Segments fail quietly. A nightly sync job stops, an app update renames a metafield, a migration imports customers without tags, and suddenly your &amp;quot;lapsed 180 days&amp;quot; cohort includes active subscribers. Treat segment health like uptime:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Log sync runs&lt;/strong&gt; between Shopify and ESP with row counts.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Alert on variance&lt;/strong&gt; when segment size moves more than an agreed threshold week over week.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Version segment definitions&lt;/strong&gt; in a shared doc or repo when queries get complex.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Name segments for humans&lt;/strong&gt;, not analysts (&lt;code&gt;Lapsed 180d&lt;/code&gt;, not &lt;code&gt;Segment_47_v3&lt;/code&gt;).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;When finance asks why retention spend rose while repeat rate flatlined, the first place we look is whether membership rules drifted since the last campaign went live. Operational segmentation is unglamorous and it saves quarrels between marketing and ops.&lt;/p&gt;&lt;h2&gt;Recommendation by scenario&lt;/h2&gt;&lt;h3&gt;Scenario A: Single-market DTC, one ESP, no B2B&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Do:&lt;/strong&gt; Lifecycle + RFM segments in Shopify; sync keys to ESP; three automated flows (welcome, post-purchase, win-back).&lt;br&gt;&lt;strong&gt;Avoid:&lt;/strong&gt; Ten micro-segments nobody maintains; duplicate VIP rules in two apps.&lt;/p&gt;&lt;h3&gt;Scenario B: Plus brand, subscriptions, multi-region&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Do:&lt;/strong&gt; Shopify segments for eligibility and Flow; metafields for subscription state; documented sync to ESP; segment-aware checkout only where Plus supports the rule.&lt;br&gt;&lt;strong&gt;Avoid:&lt;/strong&gt; Per-market segment copies that diverge when exchange rates or catalogs change.&lt;/p&gt;&lt;h3&gt;Scenario C: Heavy app stack, custom theme, integrations&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Do:&lt;/strong&gt; Stack audit first; map segment ownership; consolidate tags; API sync with monitoring.&lt;br&gt;&lt;strong&gt;Avoid:&lt;/strong&gt; New personalisation app before customer data model is agreed.&lt;/p&gt;&lt;h2&gt;Implementation order (foundation before campaigns)&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Agree definitions&lt;/strong&gt; in plain language (what makes someone &amp;quot;lapsed&amp;quot;?).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Pick system of record&lt;/strong&gt; for each segment family.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Implement in Shopify&lt;/strong&gt; segments + metafields where commerce needs them.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Sync outward&lt;/strong&gt; to ESP and ads with logged jobs or integration monitoring.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Measure cohort economics&lt;/strong&gt; alongside campaign CTR.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Review quarterly&lt;/strong&gt;; delete unused segments.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Segmentation should make &lt;strong&gt;merchant experience&lt;/strong&gt; easier: support sees the same cohort labels as marketing, and checkout rules match what the customer was promised on the PDP. That alignment is structural work that outlasts any single subject line test.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Modern customer segmentation on Shopify succeeds when &lt;strong&gt;disciplined data ownership&lt;/strong&gt; comes first: a small set of behavioural techniques, native segments and metafields for commerce truth, and marketing tools scoped to send-time personalisation.&lt;/p&gt;&lt;p&gt;Start with RFM and lifecycle bands before predictive hype. Document who owns each name. Kill duplicate VIP lists.&lt;/p&gt;&lt;p&gt;For integration design, metafield schema, and segment logic that must survive the next app install, see our &lt;a href=&quot;https://ocontis.studio/services/integrations-and-system-optimisation/&quot;&gt;Integrations and System Optimisation&lt;/a&gt; capability or &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;book a stack assessment&lt;/a&gt; to align segmentation with a foundation you can maintain.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Shopify Liquid Partials: Swap Main Content Without Reloading Header and Footer</title>
    <link href="https://ocontis.studio/blog/post/shopify-liquid-partials-swap-main-content-without-reloading-header-and-footer/" />
    <updated>2026-07-23T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/shopify-liquid-partials-swap-main-content-without-reloading-header-and-footer/</id>
    <content type="html">&lt;h1&gt;Shopify Liquid Partials: Swap Main Content Without Reloading Header and Footer&lt;/h1&gt;&lt;p&gt;Merchants feel it before developers name it. Every full page load re-renders the header, re-runs footer scripts, and re-initialises app snippets that live in global chrome. The product grid or policy page in the middle changes, but the browser still pays the cost of the whole document.&lt;/p&gt;&lt;p&gt;Shopify&#39;s &lt;strong&gt;Liquid July &#39;26 developer preview&lt;/strong&gt; adds &lt;strong&gt;&lt;code&gt;{% partial %}&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;@shopify/partial-rendering&lt;/code&gt;&lt;/strong&gt;. The use case we cared about first was not micro-updates for fun. It was &lt;strong&gt;persistent shell navigation&lt;/strong&gt;: header and footer load &lt;strong&gt;once per visit&lt;/strong&gt;, and in-theme links refresh &lt;strong&gt;only the main content&lt;/strong&gt; that actually changes.&lt;/p&gt;&lt;p&gt;That aligns with the browser&#39;s &lt;strong&gt;Declarative Partial Updates&lt;/strong&gt; direction (named server HTML regions, swapped in place). It is not a mandate to rebuild the theme as a JavaScript app. It is progressive enhancement on top of normal Liquid, the same foundation we argue for 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&lt;/em&gt;&lt;/a&gt; and &lt;a href=&quot;https://ocontis.studio/blog/post/the-anatomy-of-a-high-performance-shopify-theme/&quot;&gt;&lt;em&gt;high-performance theme&lt;/em&gt;&lt;/a&gt; work.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;For years, the honest answer to &amp;quot;can we keep the nav and only load new content?&amp;quot; on Shopify was a custom stack: intercept clicks, fetch HTML, guess which nodes to replace, and hope Section Rendering IDs still match after a merchant edits the theme. Every agency theme reinvents the same failure modes: double-fired analytics, cart counts that drift, focus lost after swap, and header scripts that assume a full &lt;code&gt;DOMContentLoaded&lt;/code&gt; on each URL.&lt;/p&gt;&lt;p&gt;The July &#39;26 &lt;strong&gt;&lt;code&gt;{% partial %}&lt;/code&gt;&lt;/strong&gt; preview does not magically implement routing. It does give you a &lt;strong&gt;stable name&lt;/strong&gt; for the main column in layout Liquid, and a supported &lt;strong&gt;&lt;code&gt;fetch&lt;/code&gt; / &lt;code&gt;apply&lt;/code&gt; / &lt;code&gt;refresh&lt;/code&gt;&lt;/strong&gt; path so the server returns HTML for that name only. That is the missing piece for &lt;strong&gt;shell navigation&lt;/strong&gt; if you are willing to own history, title updates, and accessibility yourself.&lt;/p&gt;&lt;p&gt;We implemented this on block-first skeleton theme work: &lt;strong&gt;&lt;code&gt;page-content&lt;/code&gt;&lt;/strong&gt; around &lt;code&gt;content_for_layout&lt;/code&gt;, header and footer groups untouched on in-theme link navigation, optional nested refresh for cart chrome when line items change. This article walks through that architecture first. Collection sort partials and multi-region fetches on a single template are the same tool with a smaller boundary, not the headline win.&lt;/p&gt;&lt;p&gt;If you are evaluating preview features for a live merchant roadmap, treat soft nav as &lt;strong&gt;enhancement&lt;/strong&gt;, not dependency. Checkout, account, and external links should remain full loads until you have fallbacks and monitoring in place.&lt;/p&gt;&lt;h2&gt;Why we wrapped only the main column&lt;/h2&gt;&lt;p&gt;Classic Shopify themes already separate layout from template output via &lt;code&gt;content_for_layout&lt;/code&gt;. Partials make that boundary &lt;strong&gt;addressable from JavaScript&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;On first load, the buyer gets a normal full HTML response: header group, &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;, footer group, analytics, cart bootstrap, the lot.&lt;/p&gt;&lt;p&gt;On subsequent in-theme navigation (when you opt in with soft nav):&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Header and footer &lt;strong&gt;stay in the DOM&lt;/strong&gt;. You do not fetch them again unless you choose to.&lt;/li&gt;&lt;li&gt;You &lt;strong&gt;&lt;code&gt;partials.fetch(&#39;page-content&#39;, { url })&lt;/code&gt;&lt;/strong&gt; for the destination URL.&lt;/li&gt;&lt;li&gt;You &lt;strong&gt;&lt;code&gt;partials.apply(update)&lt;/code&gt;&lt;/strong&gt; so only the named region inside &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; swaps.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Less flicker, less repeated work in global chrome, and fewer chances for app scripts in the header to fight each other on every click.&lt;/p&gt;&lt;p&gt;If your theme is already brittle under app load, read &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; before you add interceptors. Partials fix &lt;strong&gt;where&lt;/strong&gt; HTML lands; they do not fix &lt;strong&gt;how much&lt;/strong&gt; JavaScript you shipped in the shell.&lt;/p&gt;&lt;h2&gt;Layout shape on the preview&lt;/h2&gt;&lt;p&gt;The preview also ships &lt;strong&gt;&lt;code&gt;{% block %}&lt;/code&gt;&lt;/strong&gt; for block-first templates. For soft navigation, the important tag is &lt;strong&gt;&lt;code&gt;{% partial %}&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;In &lt;code&gt;layout/theme.liquid&lt;/code&gt;, the pattern we used looked conceptually like this:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-liquid&quot;&gt;&amp;lt;body&amp;gt;
  {% sections &#39;header-group&#39; %}

  &amp;lt;main id=&amp;quot;MainContent&amp;quot;&amp;gt;
    {% partial &#39;page-content&#39; %}
      {{ content_for_layout }}
    {% endpartial %}
  &amp;lt;/main&amp;gt;

  {% sections &#39;footer-group&#39; %}
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;page-content&lt;/code&gt; is the contract name. Liquid renders it on first paint. JavaScript uses the same string when the buyer follows an in-theme link.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Preview requirements:&lt;/strong&gt; enable &lt;strong&gt;Liquid July &#39;26&lt;/strong&gt; on a development store. Outside preview, Liquid may reject the tag. Always ship a fallback: unmodified links, full page loads, no dependency on soft nav for checkout or core paths.&lt;/p&gt;&lt;h2&gt;Soft navigation flow (what you still own)&lt;/h2&gt;&lt;p&gt;Shopify does &lt;strong&gt;not&lt;/strong&gt; ship automatic SPA-style link handling. Partials give you the &lt;strong&gt;swap mechanism&lt;/strong&gt;, not the &lt;strong&gt;router&lt;/strong&gt;. Our storefront flow:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Leave header and footer outside&lt;/strong&gt; the partial you replace on navigation.&lt;/li&gt;&lt;li&gt;Intercept same-origin in-theme links (we used a &lt;code&gt;data-partial-nav&lt;/code&gt; convention), &lt;strong&gt;&lt;code&gt;preventDefault&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;history.pushState&lt;/code&gt;&lt;/strong&gt; with the destination URL.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;partials.fetch(&#39;page-content&#39;, { url })&lt;/code&gt;&lt;/strong&gt; then &lt;strong&gt;&lt;code&gt;partials.apply(update)&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;On &lt;strong&gt;&lt;code&gt;popstate&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;partials.refresh(&#39;page-content&#39;)&lt;/code&gt;&lt;/strong&gt; so back and forward match &lt;code&gt;window.location&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;You still implement &lt;strong&gt;document title&lt;/strong&gt;, meta where relevant, analytics page views, focus management, and any &lt;strong&gt;active nav state&lt;/strong&gt; that must track the new URL (often a follow-up partial or a small DOM update, not a full header re-fetch).&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;First visit, no-JS buyers, and crawlers keep &lt;strong&gt;full document loads&lt;/strong&gt;. That is the line between soft nav and a fragile app shell.&lt;/p&gt;&lt;h2&gt;JavaScript: fetch, apply, and refresh&lt;/h2&gt;&lt;p&gt;&lt;code&gt;@shopify/partial-rendering&lt;/code&gt; centres on three calls for this pattern:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;API&lt;/th&gt;&lt;th&gt;Role in shell navigation&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;partials.fetch(&#39;page-content&#39;, { url })&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Request fresh main-column HTML for the destination URL. Build &lt;code&gt;url&lt;/code&gt; from &lt;code&gt;window.location&lt;/code&gt; or Liquid &lt;code&gt;routes&lt;/code&gt;, not hardcoded paths, so markets and locales keep working.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;partials.apply(update)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Replace the live &lt;code&gt;page-content&lt;/code&gt; region. Optional View Transitions wrapper where supported.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;partials.refresh(&#39;page-content&#39;)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Re-sync main content with the current URL after back/forward without rebuilding the request yourself.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Details that matter in production:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Pass &lt;strong&gt;&lt;code&gt;AbortSignal&lt;/code&gt;&lt;/strong&gt; so a slow click cannot overwrite a newer navigation.&lt;/li&gt;&lt;li&gt;Set &lt;strong&gt;&lt;code&gt;aria-busy&lt;/code&gt;&lt;/strong&gt; on &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; (or the partial root) while the fetch runs; use a &lt;strong&gt;live region&lt;/strong&gt; when the swap should be announced.&lt;/li&gt;&lt;li&gt;After &lt;strong&gt;&lt;code&gt;apply()&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;re-query nodes inside &lt;code&gt;page-content&lt;/code&gt;&lt;/strong&gt; before re-binding animations or listeners. The old subtree is gone.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;What we deliberately do not re-fetch on route change&lt;/h2&gt;&lt;p&gt;The wrong instinct is to request &lt;strong&gt;every&lt;/strong&gt; named region in the layout response on each navigation, including header cart markup. That recreates full reload costs in smaller pieces.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Persistent shell:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Header group, footer group, and global snippets: &lt;strong&gt;first load only&lt;/strong&gt; for route changes.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;page-content&lt;/code&gt;&lt;/strong&gt;: &lt;strong&gt;every soft navigation&lt;/strong&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Targeted exceptions&lt;/strong&gt; (same page or event-driven, not every link):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;A nested &lt;strong&gt;&lt;code&gt;header-cart&lt;/code&gt;&lt;/strong&gt; partial can refresh on &lt;strong&gt;&lt;code&gt;shopify:cart:lines-update&lt;/code&gt;&lt;/strong&gt; so the badge stays accurate without reloading the whole header or the main column.&lt;/li&gt;&lt;li&gt;Collection &lt;strong&gt;sort or filter&lt;/strong&gt; can fetch &lt;strong&gt;&lt;code&gt;product-grid&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;product-count&lt;/code&gt;&lt;/strong&gt;, and &lt;strong&gt;&lt;code&gt;toolbar&lt;/code&gt;&lt;/strong&gt; together on that template without touching layout chrome. That is the same partial machinery, different boundary.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Cart mutations stay on &lt;strong&gt;&lt;code&gt;Shopify.actions&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;shopify:cart:*&lt;/code&gt;&lt;/strong&gt; events. Partials re-render markup; they do not replace Shopify&#39;s event model. That separation matters on stores where &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&lt;/em&gt;&lt;/a&gt; already traces back to script churn in global chrome.&lt;/p&gt;&lt;p&gt;Keep &lt;strong&gt;&lt;code&gt;{% sections &#39;header-group&#39; %}&lt;/code&gt;&lt;/strong&gt; as a &lt;strong&gt;direct child of &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;&lt;/strong&gt; for theme editor discovery, not buried inside block wrappers that confuse the editor.&lt;/p&gt;&lt;h2&gt;Not partial hydration (and not a free Turbo clone)&lt;/h2&gt;&lt;p&gt;Developers often mislabel this as &lt;strong&gt;partial hydration&lt;/strong&gt;. That term usually means attaching JavaScript to islands while most HTML stays static. Here, the server still owns HTML generation; the client &lt;strong&gt;replaces a named region&lt;/strong&gt; with fresh server output. &lt;strong&gt;&lt;code&gt;apply()&lt;/code&gt;&lt;/strong&gt; preserves focus, selection, and form values where the runtime allows.&lt;/p&gt;&lt;p&gt;Lower-level &lt;strong&gt;Declarative Partial Updates&lt;/strong&gt; platform APIs (streaming markers, &lt;code&gt;&amp;lt;template for&amp;gt;&lt;/code&gt;, insertion APIs) sit underneath this story. For theme work, &lt;strong&gt;&lt;code&gt;@shopify/partial-rendering&lt;/code&gt;&lt;/strong&gt; is the practical layer.&lt;/p&gt;&lt;h2&gt;Theme editor: the sharp edge&lt;/h2&gt;&lt;p&gt;Partials are a &lt;strong&gt;storefront preview&lt;/strong&gt; feature. &lt;strong&gt;&lt;code&gt;request.design_mode&lt;/code&gt;&lt;/strong&gt; follows a different path. Unconditional partial wrappers can yield &lt;strong&gt;&lt;code&gt;Unknown tag &#39;partial&#39;&lt;/code&gt;&lt;/strong&gt; and break header group mounting in the theme editor.&lt;/p&gt;&lt;p&gt;What worked:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;{% if request.design_mode %}&lt;/code&gt;&lt;/strong&gt; branches: plain Liquid in the editor, partial wrappers on the storefront.&lt;/li&gt;&lt;li&gt;Disable soft-navigation scripts in design mode so they do not fight editor clicks.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If your team lives in the theme editor daily, budget time for this split before you promise merchants shell navigation on production timelines.&lt;/p&gt;&lt;h2&gt;Checklist before you ship shell navigation&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Name parity:&lt;/strong&gt; &lt;code&gt;{% partial &#39;page-content&#39; %}&lt;/code&gt; and &lt;code&gt;partials.fetch(&#39;page-content&#39;)&lt;/code&gt; must match exactly.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Chrome outside the partial:&lt;/strong&gt; header and footer are not in the region you replace on link navigation.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fallback:&lt;/strong&gt; failed fetch or missing runtime falls back to &lt;strong&gt;&lt;code&gt;window.location&lt;/code&gt;&lt;/strong&gt; or normal link behaviour.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Stale requests:&lt;/strong&gt; abort or ignore superseded fetches.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Loading and announcements:&lt;/strong&gt; &lt;code&gt;aria-busy&lt;/code&gt;, live regions where swaps are silent.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Editor vs storefront:&lt;/strong&gt; &lt;code&gt;request.design_mode&lt;/code&gt; branches for tags and nav scripts.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ownership:&lt;/strong&gt; title, analytics, focus, and nav active state have an explicit owner on each navigation.&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Liquid partials gave us a &lt;strong&gt;documented name&lt;/strong&gt; for the boundary merchants already imagine: global chrome stays put, the main column updates. That is the game-changing day-to-day story on heavy DTC themes, more than yet another Ajax patch for a sort dropdown.&lt;/p&gt;&lt;p&gt;Start on the preview with &lt;strong&gt;&lt;code&gt;page-content&lt;/code&gt;&lt;/strong&gt; and one class of in-theme links before you expand to collection partials or nested cart regions. If soft nav intersects checkout extensions, app conflicts, or a catalogue model that already fights &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-metaobject-filters-combined-with-storefront-search-on-shopify/&quot;&gt;&lt;em&gt;structured data and filters&lt;/em&gt;&lt;/a&gt;, scope it inside a broader theme roadmap.&lt;/p&gt;&lt;p&gt;For layout boundaries and partial strategy on an established store, see our &lt;a href=&quot;https://ocontis.studio/services/shopify-theme-development/&quot;&gt;Shopify theme development&lt;/a&gt; capability or &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;book a stack assessment&lt;/a&gt; to map preview features against what your stack can maintain long term.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Shopify AI Product Discovery: UCP Catalog and Data Readiness</title>
    <link href="https://ocontis.studio/blog/post/shopify-ai-product-discovery-ucp-catalog-and-data-readiness/" />
    <updated>2026-07-21T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/shopify-ai-product-discovery-ucp-catalog-and-data-readiness/</id>
    <content type="html">&lt;h1&gt;Shopify AI Product Discovery: UCP Catalog and Data Readiness&lt;/h1&gt;&lt;p&gt;Merchants are optimising blog keywords while buyers ask ChatGPT which serum to trust, and developers debug why UCP search returns SKUs without images. Those are the same underlying problem seen from two seats: &lt;strong&gt;product data that was good enough for a theme is not always good enough for machines.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Shopify now exposes multiple discovery layers at once: human storefronts, AI-oriented storefront routes, admin connectors, and UCP catalog endpoints for agents. The community chatter splits cleanly. Marketing forums ask how to rank in AI search. Developer forums ask how to edit UCP files, why filters misbehave, and why media arrays come back empty.&lt;/p&gt;&lt;p&gt;This article is a decision framework for established brands, not a protocol spec. It explains what each layer reads, what you can control from admin, and how to sequence fixes without duplicating the engineering deep dive in our &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-ucp-global-catalog-lessons-from-building-a-catalogue-explorer/&quot;&gt;UCP Global Catalog explorer write-up&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;If you run a Shopify store with real volume, you have probably felt two pulls at once. Leadership wants visibility in AI shopping experiences. Operations still fights variant sprawl, app-driven metafields, and channel rules nobody documented after the last agency handover.&lt;/p&gt;&lt;p&gt;Shopify&#39;s own early reporting on AI-referred sessions suggests higher intent and stronger conversion in some cohorts, which raises the stakes for catalogue quality. That stat is directional, not a promise that bolting on an AI app fixes margins. It does mean discovery surfaces will keep multiplying while your admin record stays the shared source of truth.&lt;/p&gt;&lt;p&gt;We synthesised recent merchant and developer community threads about AI readability checks, llms.txt customisation, UCP image gaps, and Storefront MCP filter behaviour. The pattern is consistent: people hunt for a toggle or API to &amp;quot;fix AI,&amp;quot; when the durable work is catalogue architecture and honest channel rules.&lt;/p&gt;&lt;h2&gt;Three discovery layers (and one checkout truth)&lt;/h2&gt;&lt;p&gt;Think in layers, not a single &amp;quot;AI SEO&amp;quot; checklist.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Layer&lt;/th&gt;&lt;th&gt;Who consumes it&lt;/th&gt;&lt;th&gt;What they need from your stack&lt;/th&gt;&lt;th&gt;Merchant control&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Storefront HTML + structured data&lt;/td&gt;&lt;td&gt;Search crawlers, AI browsers, some answer engines&lt;/td&gt;&lt;td&gt;Clear titles, variant facts, policies, extractable headings, accurate JSON-LD where implemented&lt;/td&gt;&lt;td&gt;Theme, content, PDP templates, app injections&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Platform routes (&lt;code&gt;/llms.txt&lt;/code&gt;, &lt;code&gt;/agents.md&lt;/code&gt;)&lt;/td&gt;&lt;td&gt;Agents and tools probing merchant policy&lt;/td&gt;&lt;td&gt;Accurate store summary, supported capabilities, contact paths&lt;/td&gt;&lt;td&gt;Limited customisation; legacy proxy hacks often break after Shopify serves routes natively&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;UCP catalog (Global + Storefront MCP)&lt;/td&gt;&lt;td&gt;Shopping agents via MCP tools&lt;/td&gt;&lt;td&gt;Clean product records, media, availability signals, stable identifiers&lt;/td&gt;&lt;td&gt;Indirect via catalogue, markets, channels, and checkout configuration&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Checkout&lt;/td&gt;&lt;td&gt;Buyers completing purchase&lt;/td&gt;&lt;td&gt;Authoritative price, discounts, buyer qualification, inventory commitment&lt;/td&gt;&lt;td&gt;Checkout customisation, Functions, B2B rules, payments stack&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;UCP documentation is explicit that catalog responses are informative, not contractual. Agents may quote a discovery price; checkout decides what actually applies. That separation is why teams should not treat MCP search as a shadow storefront with your theme&#39;s merchandising logic.&lt;/p&gt;&lt;h2&gt;What the community is asking (and what it really means)&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&amp;quot;Can AI actually read my store?&amp;quot;&lt;/strong&gt; Merchant-side checklists focus on raw HTML clarity, policy pages, and structured facts models can cite. Beautiful lifestyle photography does not help if variant titles repeat &amp;quot;Default Title&amp;quot; and shipping promises live only in a carousel footnote.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;quot;How do we optimise for AI search in 2026?&amp;quot;&lt;/strong&gt; Sensible answers in community threads mirror good SEO hygiene plus intent-led content: headings that state facts, FAQ blocks that answer real objections, and product copy that names size, material, and compatibility without fluff. Treat AI search as an extension of discoverability work, not a parallel stack you buy from a single app.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;quot;How do I edit the store UCP file?&amp;quot;&lt;/strong&gt; Builders expect an Admin API resource. In practice, influence flows through catalogue quality and Shopify-managed agentic surfaces, not hand-edited protocol files in admin. If your team needs programmatic control, scope a custom app or integration with clear boundaries rather than hunting for a hidden UCP textarea.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;quot;UCP missing images&amp;quot; and &amp;quot;search_catalog ignores filters&amp;quot;&lt;/strong&gt; These are builder-facing symptoms of the same merchant foundation. Partial payloads and weak filter behaviour show up when records are incomplete or when client assumptions outrun a young spec. Our explorer work documented pagination and diversification patterns for engineers; for merchants the takeaway is simpler: fix media and taxonomy at the source, then re-sample discovery.&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;Hype vs practical readiness&lt;/h2&gt;&lt;p&gt;AI storefront generators, Sidekick prompts, and connector hype fill the AI Build Your Business category. Some of it is useful for campaigns. None of it replaces catalogue discipline.&lt;/p&gt;&lt;p&gt;Connectors such as 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; accelerate admin questions but expose messy catalogues faster. Google-facing work still belongs in the lane described in &lt;a href=&quot;https://ocontis.studio/blog/post/google-ai-overviews-for-shopify-what-merchants-should-actually-optimise/&quot;&gt;Google AI Overviews for Shopify&lt;/a&gt;, especially Merchant Center feed integrity.&lt;/p&gt;&lt;p&gt;For UCP specifically, developer tooling moved quickly in 2026: legacy Storefront MCP names gave way to UCP-shaped catalog tools, and teams need pinned protocol versions in agent profiles. That churn is a reason to invest in &lt;strong&gt;data readiness&lt;/strong&gt; before you invest in bespoke agent UX.&lt;/p&gt;&lt;h2&gt;A prioritised readiness roadmap&lt;/h2&gt;&lt;p&gt;Use tiers so engineering and marketing stop talking past each other.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tier 1: Fix what every layer reads&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Audit variant completeness, option names, barcodes, and media on top sellers. Align returns, shipping, and subscription wording on PDPs and policy pages. Remove contradictory app injections that rewrite titles on collection pages but not checkout.&lt;/p&gt;&lt;p&gt;Cross-check theme performance patterns from &lt;a href=&quot;https://ocontis.studio/blog/post/the-anatomy-of-a-high-performance-shopify-theme/&quot;&gt;The Anatomy of a High-Performance Shopify Theme&lt;/a&gt; so you are not hiding critical facts behind slow sections or accordion-only content with no static fallback.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tier 2: Validate machine-readable surfaces&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Fetch your key PDPs as a bot would. Confirm JSON-LD and on-page facts match admin. Load &lt;code&gt;/llms.txt&lt;/code&gt; and &lt;code&gt;/agents.md&lt;/code&gt; on production and note what Shopify generates today; plan content changes in admin and theme where supported rather than reverse-proxy overrides that may stop working.&lt;/p&gt;&lt;p&gt;If you syndicate to Google, tie AI visibility work to feed health before you chase novel tactics.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tier 3: Sample agentic catalog behaviour&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;If you have engineering capacity, sample Global Catalog or Storefront MCP search for your brand and hero SKUs. Compare discovery titles, images, and availability signals to your storefront. Log gaps as catalogue tickets, not theme tickets.&lt;/p&gt;&lt;p&gt;Use the public &lt;a href=&quot;https://ocontis.studio/tools/ucp-catalogue-explorer/&quot;&gt;UCP Catalogue Explorer&lt;/a&gt; as a reference for what cross-merchant search returns, especially when leadership asks whether you &amp;quot;appear in AI shopping&amp;quot; without a defined test method.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tier 4: Agent experiences and checkout&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Only after Tier 1–3 stabilise should you fund custom agents, checkout MCP flows, or deep Sidekick extensions. Checkout MCP errors around buyer IP headers and cart creation are implementation details for partners; merchants should insist checkout extensions and Functions enforce price and eligibility regardless of what discovery quoted.&lt;/p&gt;&lt;h2&gt;When apps help vs when they add noise&lt;/h2&gt;&lt;p&gt;App stores market AI visibility, alt-text generators, and automatic FAQs. Some save time on repetitive media work. Others duplicate metafields or fight your theme&#39;s structured data.&lt;/p&gt;&lt;p&gt;If app sprawl already distorts catalogue truth, read &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;The Hidden Cost of Running a Shopify Store When 12 Apps Quietly Eat Your Margins&lt;/a&gt; before adding another AI layer. A structured &lt;a href=&quot;https://ocontis.studio/services/shopify-stack-audit/&quot;&gt;Shopify stack audit&lt;/a&gt; beats stacking discovery apps on a fragile foundation.&lt;/p&gt;&lt;h2&gt;Channel rules merchants forget until agents show up&lt;/h2&gt;&lt;p&gt;Storefront visibility and catalog eligibility diverge more often than teams admit. A product hidden from Online Store can still surface in feeds, B2B catalogues, or agentic channels depending on how publishing rules evolved across migrations.&lt;/p&gt;&lt;p&gt;Developer threads about password-protected storefronts and Storefront MCP access highlight a merchant blind spot: if buyers need a login to see pricing, agents may still receive partial discovery payloads that omit the context your theme enforced with JavaScript. Theme gating is not a substitute for explicit sales channel and market configuration.&lt;/p&gt;&lt;p&gt;For Plus and multi-catalog brands, split catalogues and company locations add another layer. When a B2B SKU appears in agent search but checkout rejects the buyer, the failure is usually segmentation logic, not &amp;quot;AI hallucination.&amp;quot; Document which catalog each hero product belongs to, which market prices apply, and which discounts require a logged-in customer tag before you brief an agency on agentic experiments.&lt;/p&gt;&lt;p&gt;Beauty and fashion brands we work with in &lt;a href=&quot;https://ocontis.studio/projects/industry/beauty-and-skincare/&quot;&gt;beauty and skincare&lt;/a&gt; often merchandised by collection metafields while agents read flat product graphs. Reconcile that mismatch early if conversational discovery becomes part of your growth plan.&lt;/p&gt;&lt;h2&gt;Working with your development partner&lt;/h2&gt;&lt;p&gt;Give partners a single source of truth document: top 50 SKUs, expected image coverage, canonical variant titles, and which surfaces must stay private. Ask them to log discovery samples alongside theme QA, the same way you would log Core Web Vitals after a release.&lt;/p&gt;&lt;p&gt;When scope includes custom apps, point engineers to Shopify&#39;s agentic documentation and require checkout tests for any flow that creates carts from MCP tools. Merchant stakeholders should sign off on copy that appears in generated llms routes even when marketing did not write it word for word.&lt;/p&gt;&lt;p&gt;If you need theme and integration work under one roof, review &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 services&lt;/a&gt; with a brief that lists discovery layers explicitly. That keeps admin connector experiments from racing ahead of catalogue fixes your ops team still owe.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;AI product discovery on Shopify is not one switch. It is HTML clarity, platform agent routes, optional admin connectors, and UCP catalog surfaces that all drink from the same admin catalogue. Merchants win when they sequence fixes: truthful product records first, machine-readable policies second, agent experiments last.&lt;/p&gt;&lt;p&gt;If you want help mapping how your brand appears across storefront, feeds, and catalog discovery, then turning that into a foundation-first roadmap, &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;book a stack assessment&lt;/a&gt; with oContis Studio. For hands-on Global Catalog behaviour, start with our &lt;a href=&quot;https://ocontis.studio/tools/ucp-catalogue-explorer/&quot;&gt;UCP catalogue explorer tool&lt;/a&gt; and the &lt;a href=&quot;https://ocontis.studio/blog/post/shopify-ucp-global-catalog-lessons-from-building-a-catalogue-explorer/&quot;&gt;engineering lessons post&lt;/a&gt; when your team is ready to go deeper.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Shopify and Claude Connector: Setup, Benefits, and Risks for Merchants</title>
    <link href="https://ocontis.studio/blog/post/shopify-and-claude-connector-setup-benefits-and-risks-for-merchants/" />
    <updated>2026-07-18T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/shopify-and-claude-connector-setup-benefits-and-risks-for-merchants/</id>
    <content type="html">&lt;h1&gt;Shopify and Claude Connector: Setup, Benefits, and Risks for Merchants&lt;/h1&gt;&lt;p&gt;Shopify now ships a native connector that lets Claude read your store and, with your approval, edit it. You can ask how many orders landed yesterday, which SKUs are low on stock, or whether a campaign SKU is priced correctly, and Claude pulls live answers instead of waiting for a CSV export.&lt;/p&gt;&lt;p&gt;That convenience comes with a trade most merchants have not had to manage before: an AI assistant with tool access to a &lt;strong&gt;production&lt;/strong&gt; Shopify admin, where mistakes on price, inventory, or discount codes can show up on the next page load.&lt;/p&gt;&lt;p&gt;The &lt;strong&gt;Shopify Claude connector&lt;/strong&gt; is Shopify&#39;s official chat integration that reads live store data (orders, products, inventory, analytics) and can take &lt;strong&gt;write actions you must approve&lt;/strong&gt;, with no staging sandbox. Set it up from Claude&#39;s Connectors directory, treat confirmations like admin approvals, and use the developer AI Toolkit instead when you need GraphQL or theme work, not operational Q&amp;amp;A.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;If you run an established Shopify brand, you have probably already pasted order screenshots into ChatGPT or Claude to sanity-check a spike, a stockout, or a refund pattern. The connector removes the manual export step by giving Claude structured access to Shopify data through &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; tools.&lt;/p&gt;&lt;p&gt;Shopify documents two broad ways to connect AI tools: the &lt;strong&gt;official Shopify app&lt;/strong&gt; installed from each AI platform&#39;s connector directory, and the &lt;strong&gt;CLI-based AI Toolkit&lt;/strong&gt; for developers building apps, themes, and integrations. Merchants evaluating &amp;quot;Claude + Shopify&amp;quot; almost always mean the first path. Engineering teams mean the second, or a custom Admin API MCP setup with scoped tokens.&lt;/p&gt;&lt;p&gt;The confusion matters. Install the developer Dev MCP server expecting operational insights and you will get excellent API schema answers but no live order count. Install the merchant connector expecting safe, scoped automation and you may discover permissions are broader than your ops team is comfortable with.&lt;/p&gt;&lt;p&gt;We see this pattern on audits: leadership enables AI access to move faster, while the underlying catalogue still has inconsistent variant titles, duplicate metafields, and app-driven data conflicts 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;. The connector does not fix that foundation. It exposes it to a fast, confident interpreter. If revenue is flat while admin experiments multiply, read &lt;a href=&quot;https://ocontis.studio/blog/post/why-most-shopify-stores-dont-scale-past-50k-month/&quot;&gt;Shopify ecommerce growth plateau causes and what to do next&lt;/a&gt; before adding more tools.&lt;/p&gt;&lt;h2&gt;Three ways &amp;quot;Shopify + Claude&amp;quot; shows up in practice&lt;/h2&gt;&lt;p&gt;Before setup steps, map which integration you actually need.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Integration&lt;/th&gt;&lt;th&gt;Who it is for&lt;/th&gt;&lt;th&gt;What Claude can access&lt;/th&gt;&lt;th&gt;Typical risk profile&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Official Shopify app for Claude&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Founders, heads of eCommerce, ops leads&lt;/td&gt;&lt;td&gt;Live orders, products, customers, inventory, analytics; selected write actions&lt;/td&gt;&lt;td&gt;Production write risk; coarse permissions&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Shopify AI Toolkit (Dev MCP)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Developers, agencies, technical partners&lt;/td&gt;&lt;td&gt;Shopify docs, Admin API schemas, Liquid/GraphQL validation&lt;/td&gt;&lt;td&gt;Low: no live merchant data by default&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Custom Admin MCP + API token&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Technical teams self-hosting tooling&lt;/td&gt;&lt;td&gt;Whatever Admin API scopes you grant the token&lt;/td&gt;&lt;td&gt;Token leakage; over-scoped write permissions&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Most decision makers reading this need row one. Your dev agency or retained Shopify partner needs row two for build work, and might use row three only with explicit scope design.&lt;/p&gt;&lt;h2&gt;How to set up the official Shopify Claude connector&lt;/h2&gt;&lt;p&gt;Shopify&#39;s help documentation directs merchants to use the &lt;strong&gt;official Shopify app for each AI tool&lt;/strong&gt; rather than improvised third-party bridges. For Claude, the flow lives in Anthropic&#39;s Connectors experience.&lt;/p&gt;&lt;h3&gt;Step 1: Add the connector in Claude&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;In Claude, open the &lt;strong&gt;Connectors&lt;/strong&gt; settings (or browse the &lt;a href=&quot;https://claude.ai/connectors&quot;&gt;Connectors directory&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;Find the official &lt;strong&gt;Shopify&lt;/strong&gt; connector and start the install flow.&lt;/li&gt;&lt;li&gt;Authenticate when redirected to Shopify admin.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Claude inherits permissions from the connected service the same way other connectors do: if a staff account cannot edit products in admin, that user cannot grant Claude product write access either.&lt;/p&gt;&lt;h3&gt;Step 2: Review and approve data access&lt;/h3&gt;&lt;p&gt;On Shopify&#39;s install screen, read the requested access level before you accept. Shopify groups access into read-only visibility and write access that lets the tool edit data on your behalf.&lt;/p&gt;&lt;p&gt;Shopify&#39;s documentation is explicit on a point many merchants miss: &lt;strong&gt;you cannot reduce the data access scope after approval without uninstalling the app entirely&lt;/strong&gt;. If the tool later requests elevated access for a specific task, you will be prompted again, but there is no granular &amp;quot;orders read-only, products read-only, never touch discounts&amp;quot; dial on the merchant connector in the way a custom API app allows.&lt;/p&gt;&lt;p&gt;Approve only what you are willing to live with across every future chat session that uses the connection.&lt;/p&gt;&lt;h3&gt;Step 3: Connect one store&lt;/h3&gt;&lt;p&gt;The official AI apps connect &lt;strong&gt;one Shopify store at a time&lt;/strong&gt;, even when stores sit under the same organisation. Multi-brand operators should decide which production store gets connected first, and whether that store&#39;s data should be visible to everyone with access to the Claude workspace.&lt;/p&gt;&lt;h3&gt;Step 4: Verify with read-only questions&lt;/h3&gt;&lt;p&gt;Before any write experiment, test queries that cannot change state:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&amp;quot;How many orders did we process in the last seven days, broken down by financial status?&amp;quot;&lt;/li&gt;&lt;li&gt;&amp;quot;Which products are below 10 units across all locations?&amp;quot;&lt;/li&gt;&lt;li&gt;&amp;quot;What was net sales last month according to Shopify analytics?&amp;quot;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If answers disagree with admin reports, treat that as a &lt;strong&gt;data mapping or filter problem&lt;/strong&gt;, not a reason to grant more access.&lt;/p&gt;&lt;h3&gt;Step 5: Treat write confirmations as production approvals&lt;/h3&gt;&lt;p&gt;When you ask Claude to update a price, adjust inventory, create a discount, or draft a new product, expect a confirmation step. That step is your control surface.&lt;/p&gt;&lt;p&gt;There is no dry-run mode on the live connector. Shopify&#39;s guidance places responsibility on merchants to review actions before confirming accuracy. Read the proposed change as if a junior operator submitted it: SKU, variant, market, currency, collection scope, and start/end dates for discounts.&lt;/p&gt;&lt;h2&gt;What the connector is genuinely good for&lt;/h2&gt;&lt;p&gt;Used with boundaries, the connector earns its place.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Faster operational questions.&lt;/strong&gt; Daily pulse checks on orders, fulfilment backlog, stockouts, and simple performance slices save time versus clicking through admin reports. For brands already paying the coordination tax of a bloated app stack, see &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 why admin time is a real line item.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Drafting and first-pass work.&lt;/strong&gt; Creating starter product copy, proposing discount structures, or generating filter tags for review fits the connector well when a human publishes the final version. Think draft, not deploy.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Executive summaries for internal conversations.&lt;/strong&gt; Founders and marketing leads can pull plain-language summaries to share with finance or agency partners, provided someone validates numbers before they enter a board deck.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Onboarding context for technical partners.&lt;/strong&gt; When you later brief a Shopify development partner, verified exports from structured questions beat anecdotal &amp;quot;the site feels slow on checkout&amp;quot; messages. The connector is a discovery accelerant, not a substitute for a proper &lt;a href=&quot;https://ocontis.studio/services/shopify-stack-audit/&quot;&gt;Shopify Stack Audit&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Where the benefits stop&lt;/h2&gt;&lt;p&gt;The connector is weaker than the launch marketing implies once you leave standard Admin objects.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Custom checkout and Shopify Plus extensions&lt;/strong&gt; do not surface through generic merchant tooling. If your differentiation lives in UI extensions, Functions, or bespoke line-item logic, Claude reasons about a simplified store that omits those rules.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;App-mediated data&lt;/strong&gt; often sits outside what a first-party connector sees cleanly. Subscription engines, loyalty layers, ERP sync fields, and metafield models built across multiple apps still require the integration map you would draw during an audit.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Strategic architecture work&lt;/strong&gt; remains human-led. Choosing whether to replace an app with a private app, restructure metaobjects, or rebuild variant logic for &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-metaobject-filters-combined-with-storefront-search-on-shopify/&quot;&gt;&lt;em&gt;metaobject filters and search&lt;/em&gt;&lt;/a&gt; is engineering judgement, not a chat prompt.&lt;/p&gt;&lt;figure class=&quot;blog-diagram epmb-figure&quot; role=&quot;figure&quot; aria-labelledby=&quot;epmb-5-caption&quot; data-diagram-id=&quot;epmb-5&quot;&gt;
  &lt;p class=&quot;epmb-figure__summary visually-hidden&quot; id=&quot;epmb-5-summary&quot;&gt;Shopify + Claude — safe adoption path&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-5&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: 839.19140625px;&quot; viewBox=&quot;-8 -50.1015625 839.19140625 763.1125&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot;&gt;&lt;style&gt;#epmb-5{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-5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#epmb-5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#epmb-5 .error-icon{fill:#141414;}#epmb-5 .error-text{fill:#ebebeb;stroke:#ebebeb;}#epmb-5 .edge-thickness-normal{stroke-width:1px;}#epmb-5 .edge-thickness-thick{stroke-width:3.5px;}#epmb-5 .edge-pattern-solid{stroke-dasharray:0;}#epmb-5 .edge-thickness-invisible{stroke-width:0;fill:none;}#epmb-5 .edge-pattern-dashed{stroke-dasharray:3;}#epmb-5 .edge-pattern-dotted{stroke-dasharray:2;}#epmb-5 .marker{fill:#8a8a7a;stroke:#8a8a7a;}#epmb-5 .marker.cross{stroke:#8a8a7a;}#epmb-5 svg{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;}#epmb-5 p{margin:0;}#epmb-5 .label{font-family:&#39;Syne&#39;,system-ui,sans-serif;color:#fafae6;}#epmb-5 .cluster-label text{fill:#fafae6;}#epmb-5 .cluster-label span{color:#fafae6;}#epmb-5 .cluster-label span p{background-color:transparent;}#epmb-5 .label text,#epmb-5 span{fill:#fafae6;color:#fafae6;}#epmb-5 .node rect,#epmb-5 .node circle,#epmb-5 .node ellipse,#epmb-5 .node polygon,#epmb-5 .node path{fill:#141414;stroke:#db5461;stroke-width:1px;}#epmb-5 .rough-node .label text,#epmb-5 .node .label text,#epmb-5 .image-shape .label,#epmb-5 .icon-shape .label{text-anchor:middle;}#epmb-5 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#epmb-5 .rough-node .label,#epmb-5 .node .label,#epmb-5 .image-shape .label,#epmb-5 .icon-shape .label{text-align:center;}#epmb-5 .node.clickable{cursor:pointer;}#epmb-5 .root .anchor path{fill:#8a8a7a!important;stroke-width:0;stroke:#8a8a7a;}#epmb-5 .arrowheadPath{fill:#f1eff0;}#epmb-5 .edgePath .path{stroke:#8a8a7a;stroke-width:1px;}#epmb-5 .flowchart-link{stroke:#8a8a7a;fill:none;}#epmb-5 .edgeLabel{background-color:#141414;text-align:center;}#epmb-5 .edgeLabel p{background-color:#141414;}#epmb-5 .edgeLabel rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-5 .labelBkg{background-color:rgba(20, 20, 20, 0.5);}#epmb-5 .cluster rect{fill:#141414;stroke:hsl(0, 0%, 17.8431372549%);stroke-width:1px;}#epmb-5 .cluster text{fill:#fafae6;}#epmb-5 .cluster span{color:#fafae6;}#epmb-5 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-5 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fafae6;}#epmb-5 rect.text{fill:none;stroke-width:0;}#epmb-5 .icon-shape,#epmb-5 .image-shape{background-color:#141414;text-align:center;}#epmb-5 .icon-shape p,#epmb-5 .image-shape p{background-color:#141414;padding:2px;}#epmb-5 .icon-shape .label rect,#epmb-5 .image-shape .label rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-5 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#epmb-5 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#epmb-5 .node .neo-node{stroke:#db5461;}#epmb-5 [data-look=&quot;neo&quot;].node rect,#epmb-5 [data-look=&quot;neo&quot;].cluster rect,#epmb-5 [data-look=&quot;neo&quot;].node polygon{stroke:url(#epmb-5-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-5 [data-look=&quot;neo&quot;].swimlane.cluster rect{filter:none;}#epmb-5 [data-look=&quot;neo&quot;].node path{stroke:url(#epmb-5-gradient);stroke-width:1px;}#epmb-5 [data-look=&quot;neo&quot;].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-5 [data-look=&quot;neo&quot;].node .neo-line path{stroke:#db5461;filter:none;}#epmb-5 [data-look=&quot;neo&quot;].node circle{stroke:url(#epmb-5-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-5 [data-look=&quot;neo&quot;].node circle .state-start{fill:#000000;}#epmb-5 [data-look=&quot;neo&quot;].icon-shape .icon{fill:url(#epmb-5-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-5 [data-look=&quot;neo&quot;].icon-shape .icon-neo path{stroke:url(#epmb-5-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-5 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;epmb-5_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-5_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-5_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-5_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-5_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-5_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-5_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-5_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-5_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-5_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-5_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-5_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;M321.72,113.701L290.836,128.896C259.953,144.091,198.185,174.481,167.302,195.325C136.418,216.169,136.418,227.467,136.418,233.117L136.418,238.766&quot; id=&quot;epmb-5-L_NEED_MC_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_NEED_MC_0&quot; data-points=&quot;W3sieCI6MzIxLjcyMDEyMTI5ODM5NDUzLCJ5IjoxMTMuNzAwNTkwMDQ4Mzk0NTN9LHsieCI6MTM2LjQxNzk2ODc1LCJ5IjoyMDQuODcxMDkzNzV9LHsieCI6MTM2LjQxNzk2ODc1LCJ5IjoyNDIuNzY1NjI1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-5_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M374.996,166.977L374.996,173.292C374.996,179.608,374.996,192.24,374.996,204.296C374.996,216.353,374.996,227.834,374.996,233.575L374.996,239.316&quot; id=&quot;epmb-5-L_NEED_DT_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_NEED_DT_0&quot; data-points=&quot;W3sieCI6Mzc0Ljk5NjA5Mzc1LCJ5IjoxNjYuOTc2NTYyNX0seyJ4IjozNzQuOTk2MDkzNzUsInkiOjIwNC44NzEwOTM3NX0seyJ4IjozNzQuOTk2MDkzNzUsInkiOjI0My4zMTU2MjV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-5_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M430.126,111.847L465.216,127.351C500.307,142.855,570.487,173.863,605.578,195.108C640.668,216.353,640.668,227.834,640.668,233.575L640.668,239.316&quot; id=&quot;epmb-5-L_NEED_CM_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_NEED_CM_0&quot; data-points=&quot;W3sieCI6NDMwLjEyNjA4Mjc4MTE3NDE1LCJ5IjoxMTEuODQ2NTczNDY4ODI1ODR9LHsieCI6NjQwLjY2Nzk2ODc1LCJ5IjoyMDQuODcxMDkzNzV9LHsieCI6NjQwLjY2Nzk2ODc1LCJ5IjoyNDMuMzE1NjI1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-5_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M136.418,295.655L136.418,299.821C136.418,303.988,136.418,312.321,136.418,319.988C136.418,327.655,136.418,334.655,136.418,338.155L136.418,341.655&quot; id=&quot;epmb-5-L_MC_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_MC_S1_0&quot; data-points=&quot;W3sieCI6MTM2LjQxNzk2ODc1LCJ5IjoyOTUuNjU0Njg3NX0seyJ4IjoxMzYuNDE3OTY4NzUsInkiOjMyMC42NTQ2ODc1fSx7IngiOjEzNi40MTc5Njg3NSwieSI6MzQ1LjY1NDY4NzV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-5_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M136.418,398.544L136.418,402.71C136.418,406.877,136.418,415.21,136.418,422.877C136.418,430.544,136.418,437.544,136.418,441.044L136.418,444.544&quot; id=&quot;epmb-5-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;W3sieCI6MTM2LjQxNzk2ODc1LCJ5IjozOTguNTQzNzUwMDAwMDAwMDV9LHsieCI6MTM2LjQxNzk2ODc1LCJ5Ijo0MjMuNTQzNzUwMDAwMDAwMDV9LHsieCI6MTM2LjQxNzk2ODc1LCJ5Ijo0NDguNTQzNzUwMDAwMDAwMDV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-5_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M136.418,500.333L136.418,504.499C136.418,508.666,136.418,516.999,136.418,524.666C136.418,532.333,136.418,539.333,136.418,542.833L136.418,546.333&quot; id=&quot;epmb-5-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;W3sieCI6MTM2LjQxNzk2ODc1LCJ5Ijo1MDAuMzMyODEyNTAwMDAwMDV9LHsieCI6MTM2LjQxNzk2ODc1LCJ5Ijo1MjUuMzMyODEyNX0seyJ4IjoxMzYuNDE3OTY4NzUsInkiOjU1MC4zMzI4MTI1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-5_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M136.418,602.122L136.418,606.289C136.418,610.455,136.418,618.789,136.418,626.455C136.418,634.122,136.418,641.122,136.418,644.622L136.418,648.122&quot; id=&quot;epmb-5-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;W3sieCI6MTM2LjQxNzk2ODc1LCJ5Ijo2MDIuMTIxODc1fSx7IngiOjEzNi40MTc5Njg3NSwieSI6NjI3LjEyMTg3NX0seyJ4IjoxMzYuNDE3OTY4NzUsInkiOjY1Mi4xMjE4NzV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-5_flowchart-v2-pointEnd)&quot;/&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabels&quot;&gt;&lt;g class=&quot;edgeLabel&quot; transform=&quot;translate(136.41796875, 204.87109375)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_NEED_MC_0&quot; transform=&quot;translate(-31.8046875, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-46.3984375&quot; y=&quot;-18.1015625&quot; width=&quot;156.40625&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;Operational&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Q&amp;amp;A&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(374.99609375, 204.87109375)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_NEED_DT_0&quot; transform=&quot;translate(-47.66015625, 5.20703125)&quot;&gt;&lt;g&gt;&lt;rect class=&quot;background&quot; style=&quot;&quot; x=&quot;-27.75390625&quot; y=&quot;-18.1015625&quot; width=&quot;150.828125&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;Theme&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; API&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;edgeLabel&quot; transform=&quot;translate(640.66796875, 204.87109375)&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_NEED_CM_0&quot; transform=&quot;translate(-37.22265625, 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;136.1875&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 font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; automation&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_MC_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_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-5-flowchart-NEED-0&quot; data-look=&quot;classic&quot; transform=&quot;translate(374.99609375, 87.48828125)&quot;&gt;&lt;polygon points=&quot;79.48828125,0 158.9765625,-79.48828125 79.48828125,-158.9765625 0,-79.48828125&quot; class=&quot;label-container&quot; transform=&quot;translate(-78.98828125, 79.48828125)&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;Primary&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&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-5-flowchart-MC-2&quot; data-look=&quot;classic&quot; transform=&quot;translate(136.41796875, 269.21015625)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-94.16796875&quot; y=&quot;-26.44453125&quot; width=&quot;188.3359375&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;Official&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;connector&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-5-flowchart-DT-4&quot; data-look=&quot;classic&quot; transform=&quot;translate(374.99609375, 269.21015625)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-94.41015625&quot; y=&quot;-25.89453125&quot; width=&quot;188.8203125&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;Shopify&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; AI&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; Toolkit&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-5-flowchart-CM-6&quot; data-look=&quot;classic&quot; transform=&quot;translate(640.66796875, 269.21015625)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-121.26171875&quot; y=&quot;-25.89453125&quot; width=&quot;242.5234375&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;Scoped&lt;/tspan&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; 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&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-5-flowchart-S1-8&quot; data-look=&quot;classic&quot; transform=&quot;translate(136.41796875, 372.09921875000003)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-95.19140625&quot; y=&quot;-26.44453125&quot; width=&quot;190.3828125&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; review&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&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-5-flowchart-S2-10&quot; data-look=&quot;classic&quot; transform=&quot;translate(136.41796875, 474.43828125000005)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-108.328125&quot; y=&quot;-25.89453125&quot; width=&quot;216.65625&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;Two&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; weeks&lt;/tspan&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-5-flowchart-S3-12&quot; data-look=&quot;classic&quot; transform=&quot;translate(136.41796875, 576.22734375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-128.41796875&quot; y=&quot;-25.89453125&quot; width=&quot;256.8359375&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;Confirm&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; write&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; action&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-5-flowchart-S4-14&quot; data-look=&quot;classic&quot; transform=&quot;translate(136.41796875, 678.56640625)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-102.23828125&quot; y=&quot;-26.44453125&quot; width=&quot;204.4765625&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;Quarterly&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; review&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;uninstall&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-5-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-5-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-5-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;411.595703125&quot; y=&quot;-25&quot; class=&quot;flowchartTitleText&quot;&gt;Shopify + Claude — safe adoption path&lt;/text&gt;&lt;/svg&gt;
  &lt;/div&gt;
  
  &lt;figcaption class=&quot;epmb-figure__caption&quot; id=&quot;epmb-5-caption&quot;&gt;Shopify + Claude — safe adoption path&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h2&gt;The dangers merchants should take seriously&lt;/h2&gt;&lt;p&gt;Community write-ups and Shopify&#39;s own documentation converge on the same risk themes. None of them mean &amp;quot;do not use it.&amp;quot; They mean &lt;strong&gt;use it with operating discipline&lt;/strong&gt;.&lt;/p&gt;&lt;h3&gt;1. Write access hits the live storefront&lt;/h3&gt;&lt;p&gt;Approved updates to price, inventory, or discounts apply to real customers. A misplaced decimal, a discount scoped to the wrong collection, or an inventory adjustment that ignores backorder rules creates incidents you would otherwise catch through manual admin habits.&lt;/p&gt;&lt;h3&gt;2. Permissions are coarse after install&lt;/h3&gt;&lt;p&gt;You choose an access tier at installation. Shopify states you cannot shrink that scope later without uninstalling. That is a different risk model from a custom app where you might grant &lt;code&gt;read_orders&lt;/code&gt; today and defer &lt;code&gt;write_products&lt;/code&gt; until a workflow is proven.&lt;/p&gt;&lt;h3&gt;3. Accuracy is your accountability&lt;/h3&gt;&lt;p&gt;AI assistants misread filters, confuse time zones, or summarise the wrong variant family while sounding certain. Shopify&#39;s merchant guidance makes review your responsibility before you confirm an action or share a number externally.&lt;/p&gt;&lt;h3&gt;4. Messy catalogues produce confident wrong answers&lt;/h3&gt;&lt;p&gt;If product titles, metafields, and collection rules are inconsistent, the connector exposes that mess to the model. The failure mode looks like a polished paragraph backed by partial data. Fixing catalogue architecture first yields better AI outcomes and better human outcomes. &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 about performance, but the same principle applies: structure before shortcuts.&lt;/p&gt;&lt;h3&gt;5. Data leaves Shopify&#39;s boundary&lt;/h3&gt;&lt;p&gt;When tool responses flow into Claude, they enter Anthropic&#39;s processing context under Anthropic&#39;s terms. For many DTC brands that is acceptable for operational metrics. For regulated categories, high-value B2B accounts, or strict GDPR programmes, that boundary deserves a deliberate decision before connect.&lt;/p&gt;&lt;h3&gt;6. Staff access multiplies exposure&lt;/h3&gt;&lt;p&gt;Anyone who can open the connected Claude workspace and ask operational questions effectively inherits the connector&#39;s reach, bounded by their Shopify staff permissions. Shared Claude seats without role discipline widen blast radius.&lt;/p&gt;&lt;h2&gt;A practical safe-use framework&lt;/h2&gt;&lt;p&gt;Treat the connector like a capable new hire with admin keys on day one.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Start read-only for two weeks.&lt;/strong&gt; Build trust in numeric answers against admin before enabling write tasks.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Keep hero SKUs off AI write experiments.&lt;/strong&gt; Test price and inventory mutations on low-traffic variants first.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Document three allowed use cases.&lt;/strong&gt; For example: daily order pulse, stockout watchlist, draft campaign copy. Decline everything else until data quality improves.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Pair AI summaries with a human sign-off ritual.&lt;/strong&gt; Finance and agency reporting still gets a second pair of eyes.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Schedule quarterly permission reviews.&lt;/strong&gt; Uninstall if the team stopped using it or if access is broader than current needs.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Route structural changes to Shopify development.&lt;/strong&gt; Rebuilds, checkout changes, integration cleanup, and migration work belong in scoped engineering, not chat improvisation.&lt;/p&gt;&lt;h2&gt;Developer path: Shopify AI Toolkit (when your team is building)&lt;/h2&gt;&lt;p&gt;If your goal is to build or fix the stack rather than ask operational questions, use Shopify&#39;s &lt;strong&gt;AI Toolkit&lt;/strong&gt; instead of the merchant connector.&lt;/p&gt;&lt;p&gt;For Claude Code, Shopify documents:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;claude plugin install shopify-ai-toolkit@claude-plugins-official
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Or add only the Dev MCP server:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;claude mcp add --transport stdio shopify-dev-mcp -- npx -y @shopify/dev-mcp@latest
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That path gives developers documentation search, GraphQL and Liquid validation, and CLI-backed workflows without handing a chat window broad merchant write tools to non-technical staff. It is the right default for agencies maintaining custom apps, checkout extensions, and theme architecture.&lt;/p&gt;&lt;h2&gt;When to get help instead&lt;/h2&gt;&lt;p&gt;Bring in senior Shopify development when:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Connector answers routinely conflict with admin reality, which usually signals integration or metafield debt&lt;/li&gt;&lt;li&gt;You need scoped automation across ERP, 3PL, or subscription platforms the connector cannot see&lt;/li&gt;&lt;li&gt;Leadership wants AI-assisted ops &lt;strong&gt;and&lt;/strong&gt; a structural rebuild of catalogue or checkout data&lt;/li&gt;&lt;li&gt;You are on Shopify Plus with Functions, UI extensions, or multi-market catalogues where standard tools flatten important nuance&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;A connector can speed up questions. It does not replace the ordered diagnosis we describe in discovery: theme, apps, data model, integrations, checkout.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;The Shopify + Claude connector is a real productivity lever for merchants who know what to ask and who enforce review discipline on every write confirmation. It is a poor substitute for catalogue hygiene, integration mapping, or checkout architecture work.&lt;/p&gt;&lt;p&gt;Install the official connector from Claude&#39;s directory, start with read-only operational queries, and treat write access as production admin access because that is what it is. Keep developer tooling separate for build work, and put structural fixes in a roadmap before you scale AI-driven changes across the catalogue.&lt;/p&gt;&lt;p&gt;If your store already feels locked by app sprawl, inconsistent data, or fragile customisations, &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;book a stack assessment&lt;/a&gt; or see &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/shopify-stack-audit/&quot;&gt;Shopify Stack Audit&lt;/a&gt;. We will map what AI can safely accelerate versus what needs a proper rebuild first.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Shopify UCP Global Catalog: Lessons From Building a Catalogue Explorer</title>
    <link href="https://ocontis.studio/blog/post/shopify-ucp-global-catalog-lessons-from-building-a-catalogue-explorer/" />
    <updated>2026-07-17T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/shopify-ucp-global-catalog-lessons-from-building-a-catalogue-explorer/</id>
    <content type="html">&lt;h1&gt;Shopify UCP Global Catalog: Lessons From Building a Catalogue Explorer&lt;/h1&gt;&lt;p&gt;Shopify&#39;s Global Catalog is no longer a slide in a keynote. It is a live MCP endpoint agents can query today, and the product records it returns are built from the same admin data merchants already maintain.&lt;/p&gt;&lt;p&gt;I spent several weeks building the &lt;a href=&quot;https://ocontis.studio/tools/ucp-catalogue-explorer/&quot;&gt;UCP Catalogue Explorer&lt;/a&gt;, a reference app that searches Global Catalog through the Universal Commerce Protocol, renders results on an infinite WebGL canvas, and stress-tests pagination, variant resolution, and data quality in the wild. The protocol docs describe the happy path. Production catalog search surfaces gaps in product architecture, channel visibility, and client-side discovery patterns that most merchants have not audited yet.&lt;/p&gt;&lt;p&gt;This article validates those findings against UCP specification text, Shopify&#39;s catalog documentation, and the explorer codebase. If you sell on Shopify, the practical question is not whether UCP exists. It is whether your catalog data and channel rules still make sense when discovery happens outside your theme.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;Agentic commerce runs on two layers: &lt;strong&gt;Catalog&lt;/strong&gt; for discovery and &lt;strong&gt;Checkout&lt;/strong&gt; for authoritative transactions. UCP defines how agents call both. Shopify co-developed the protocol with Google; Global Catalog implements &lt;code&gt;dev.ucp.shopping.catalog.search&lt;/code&gt; and &lt;code&gt;dev.ucp.shopping.catalog.lookup&lt;/code&gt; at &lt;code&gt;https://catalog.shopify.com/api/ucp/mcp&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Shopify&#39;s own guidance is explicit on a point many merchants miss: catalog responses reflect current terms but are &lt;strong&gt;not&lt;/strong&gt; binding commitments. The UCP catalog overview states that eligibility and policy enforcement &lt;strong&gt;must occur at checkout time&lt;/strong&gt; using binding transaction data. Agents can see a product. Checkout decides whether the price, discount, or buyer qualification actually applies.&lt;/p&gt;&lt;p&gt;That separation is why our explorer is useful as a diagnostic surface. It shows what discovery layers see before checkout guardrails run, similar to how 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; exposes messy admin data to AI interpreters without fixing the underlying catalogue.&lt;/p&gt;&lt;p&gt;Try the tool: &lt;a href=&quot;https://ucp-catalogue-explorer-o-contis-studio.vercel.app/&quot;&gt;Launch the UCP Catalogue Explorer&lt;/a&gt; (opens in a new tab). On-site overview: &lt;a href=&quot;https://ocontis.studio/tools/ucp-catalogue-explorer/&quot;&gt;/tools/ucp-catalogue-explorer/&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;What the explorer actually does&lt;/h2&gt;&lt;p&gt;The app is a Next.js reference implementation, not a production shopping agent. Each search runs server-side through UCP&#39;s &lt;code&gt;search_catalog&lt;/code&gt; with an agent profile, country context, and &lt;code&gt;available: true&lt;/code&gt; shipping filters. Product images render from merchant CDN URLs in the browser. Results are not cached, matching &lt;a href=&quot;https://shopify.dev/docs/agents/catalog&quot;&gt;Shopify catalog usage guidelines&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Results open on an infinite canvas. As you move through space, the client requests more inventory. That UX exposed pagination limits quickly, which drove most of the engineering work.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;UCP tool&lt;/th&gt;&lt;th&gt;Role in the explorer&lt;/th&gt;&lt;th&gt;Spec note&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;search_catalog&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Category search and diversified &quot;load more&quot; batches&lt;/td&gt;&lt;td&gt;Cursor pagination; limit is not guaranteed count&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;lookup_catalog&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Media enrichment when search payloads lack images&lt;/td&gt;&lt;td&gt;Up to 50 IDs (Global); client correlation via &lt;code&gt;inputs&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;get_product&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Product detail modal, variant expansion, option availability&lt;/td&gt;&lt;td&gt;&lt;code&gt;selected&lt;/code&gt; + &lt;code&gt;preferences&lt;/code&gt; for interactive narrowing&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Lesson 1: Product data architecture matters more than ever&lt;/h2&gt;&lt;p&gt;My first assumption was that Global Catalog would return neat, complete product cards. Often it does not. Search payloads frequently include a &lt;strong&gt;featured variant&lt;/strong&gt; and partial option context. Descriptions may be thin. Media arrays are sometimes empty until a follow-up lookup or &lt;code&gt;get_product&lt;/code&gt; call.&lt;/p&gt;&lt;p&gt;That behaviour matches the spec. UCP lookup returns one featured variant per product in batch responses. &lt;code&gt;get_product&lt;/code&gt; returns a subset of variants matching effective selections, not necessarily the full admin matrix. When selectable option values outnumber returned variants, the client must iterate.&lt;/p&gt;&lt;p&gt;Our catalog client detects that gap with &lt;code&gt;shouldExpandVariants()&lt;/code&gt; and fires parallel &lt;code&gt;get_product&lt;/code&gt; calls per option value, merging variant lists afterward. Without that expansion step, the modal showed a single SKU for products with six sizes or multiple denominations.&lt;/p&gt;&lt;h3&gt;Variants split across products&lt;/h3&gt;&lt;p&gt;We also saw catalog clustering effects: related SKUs appear as separate product entries or offers under Universal Product IDs rather than one clean parent product. That is tolerable for comparison shopping agents. It is painful for merchants who already struggle with duplicate listings, legacy splits, or marketplace-style variant rows in admin.&lt;/p&gt;&lt;p&gt;If your Shopify catalogue has:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;duplicate product records for colour or size splits,&lt;/li&gt;&lt;li&gt;incomplete option names,&lt;/li&gt;&lt;li&gt;missing GTINs or taxonomy categories,&lt;/li&gt;&lt;li&gt;thin descriptions copied from supplier feeds,&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;agents will inherit that mess. Shopify&#39;s catalog blog post is clear: clearer, more specific, current data makes matching easier. It does not guarantee ranking, but weak data is a structural disadvantage.&lt;/p&gt;&lt;p&gt;This connects directly to stack work we already do on audits: metaobject models, variant architecture, and PIM-like discipline inside Shopify admin. See &lt;a href=&quot;https://ocontis.studio/blog/post/how-to-fix-metaobject-filters-combined-with-storefront-search-on-shopify/&quot;&gt;&lt;em&gt;Fix Metaobject Filters and Storefront Search&lt;/em&gt;&lt;/a&gt; and &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; for related foundation patterns.&lt;/p&gt;&lt;h2&gt;Lesson 2: Storefront visibility and catalog eligibility diverge&lt;/h2&gt;&lt;p&gt;Shopify states eligible products can appear in Catalog by default, with merchant controls in &lt;strong&gt;Agentic&lt;/strong&gt; admin for which AI channels receive data. That is a different control plane from Online Store theme navigation or collection membership.&lt;/p&gt;&lt;p&gt;While testing searches across categories, we surfaced products that looked operationally internal: staff-style naming, aggressive price gaps, or positioning inconsistent with public merchandising. Some offers included checkout URLs. In other cases checkout guardrails blocked or adjusted the cart as expected.&lt;/p&gt;&lt;p&gt;Because catalog is provisional and checkout is authoritative, the risk pattern is not &amp;quot;agents bypass Shopify forever.&amp;quot; The risk is ** unintended discovery**: buyers or agents reaching SKUs you treated as operational, wholesale, or hidden from the storefront without reviewing Catalog eligibility holistically.&lt;/p&gt;&lt;p&gt;Merchants should audit product status and publishing rules, Agentic Storefronts channel toggles, discount architectures that assume a logged-in staff tag, and B2B or segmented catalogs that relied on theme gating alone. The same catalogue hygiene problems that drive &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 sprawl and margin erosion&lt;/em&gt;&lt;/a&gt; become visible faster when an agent reads your product graph directly.&lt;/p&gt;&lt;p&gt;I will expand this section with anonymised examples in an update once final test cases are documented. If you have seen similar patterns, treat Agentic admin as part of your channel mix, not an experimental sidebar.&lt;/p&gt;&lt;h2&gt;Lesson 3: UCP is early days for deep browse UX&lt;/h2&gt;&lt;p&gt;From a developer perspective, UCP catalog tooling is usable but young. Shopify renamed Storefront MCP tools to UCP shapes in Spring 2026 (&lt;code&gt;search_catalog&lt;/code&gt;, &lt;code&gt;lookup_catalog&lt;/code&gt;, &lt;code&gt;get_product&lt;/code&gt;), with legacy names deprecated until 15 June 2026. Forum threads document breaking changes mid-rollout with little notice, which is the normal cost of standing on a moving spec.&lt;/p&gt;&lt;p&gt;Documentation quality is improving, but edge behaviour still has to be discovered by building.&lt;/p&gt;&lt;h3&gt;Pagination became the bottleneck&lt;/h3&gt;&lt;p&gt;The UCP search spec defines opaque cursor pagination. &lt;code&gt;has_next_page&lt;/code&gt; is required; &lt;code&gt;limit&lt;/code&gt; may be clamped silently. That is fine for &amp;quot;next page&amp;quot; buttons. It is awkward for infinite spatial browse, where users expect a continuous stream of &lt;strong&gt;new&lt;/strong&gt; products.&lt;/p&gt;&lt;p&gt;In the explorer, cursor-only loading repeated inventory within a few batches. The codebase documents this directly: Global Catalog cursor pagination is treated as unreliable for deep scroll.&lt;/p&gt;&lt;p&gt;Our response was &lt;strong&gt;diversified search planning&lt;/strong&gt; rather than fighting the cursor forever.&lt;/p&gt;&lt;h3&gt;Hint harvesting and query diversification&lt;/h3&gt;&lt;p&gt;When a cursor stops yielding new product IDs, the client increments a &lt;code&gt;batch&lt;/code&gt; counter and calls &lt;code&gt;planDiversifiedSearch()&lt;/code&gt;:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Hint strategy (even batches):&lt;/strong&gt; harvest tokens from already-loaded product titles and seller names via &lt;code&gt;harvestSearchHints()&lt;/code&gt;, then append a rotating hint to the base query (&lt;code&gt;&amp;quot;running shoes Nike&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;running shoes Brooks&amp;quot;&lt;/code&gt;, etc.). Hints exclude words already in the original query to avoid noise.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Price band strategy (odd batches):&lt;/strong&gt; keep the original query but shift &lt;code&gt;filters.price&lt;/code&gt; through logarithmic bands (under $25, $25–$50, $50–$100, and so on).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Query reshape fallback:&lt;/strong&gt; if no hints exist yet, rotate token order, drop leading or trailing tokens, or isolate a single keyword from multi-word queries.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Each diversified batch also sets &lt;code&gt;context.intent&lt;/code&gt; to describe the exploration purpose, which UCP allows as a provisional buyer signal.&lt;/p&gt;&lt;p&gt;The infinite canvas tracks duplicate and empty batches, stops after configurable thresholds, and falls back from cursor mode to diversification when the same cursor appears twice. That combination turned a broken infinite scroll into a usable demo, at the cost of more API calls and more client complexity than the spec implies.&lt;/p&gt;&lt;p&gt;If you are designing agent browse UX, plan for &lt;strong&gt;discovery orchestration&lt;/strong&gt; on the client. Do not assume cursor pagination equals inexhaustible inventory.&lt;/p&gt;&lt;h3&gt;lookup_catalog and get_product rough edges&lt;/h3&gt;&lt;p&gt;Additional limits we hit in code:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;422 errors&lt;/strong&gt; on large &lt;code&gt;lookup_catalog&lt;/code&gt; batches, mitigated by batch sizes of 10 for media enrichment and 50 max otherwise.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Variant expansion&lt;/strong&gt; requiring multiple &lt;code&gt;get_product&lt;/code&gt; calls with &lt;code&gt;preferences&lt;/code&gt; ordering (size and denomination options relaxed last, matching UCP&#39;s &amp;quot;drop from end of preferences list&amp;quot; rule).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Rate limits (429)&lt;/strong&gt; surfaced to users because catalog results cannot be cached away.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;These are implementation realities, not spec violations. They do affect cost and latency models for agents.&lt;/p&gt;&lt;h2&gt;Current UCP catalog limitations worth planning for&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Area&lt;/th&gt;&lt;th&gt;Limitation&lt;/th&gt;&lt;th&gt;Practical impact&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Pagination&lt;/td&gt;&lt;td&gt;Cursor opaque; page size not guaranteed; overlap possible&lt;/td&gt;&lt;td&gt;Infinite browse needs diversification or filters, not cursors alone&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Lookup batch size&lt;/td&gt;&lt;td&gt;10 IDs (storefront), 50 IDs (global); larger batches may 422&lt;/td&gt;&lt;td&gt;Media enrichment and cart validation must chunk requests&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Variant detail&lt;/td&gt;&lt;td&gt;Search/listing payloads feature one variant; full matrix needs get_product&lt;/td&gt;&lt;td&gt;PDP-style agents need extra round trips per product&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Caching&lt;/td&gt;&lt;td&gt;Shopify forbids caching search results and reusing CDN images offline&lt;/td&gt;&lt;td&gt;Higher API volume; no CDN scrape shortcuts&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Personalisation&lt;/td&gt;&lt;td&gt;Buyer-linked personalised search marked &quot;coming soon&quot; in docs&lt;/td&gt;&lt;td&gt;Today’s results are context hints, not account-aware catalogues&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Spec churn&lt;/td&gt;&lt;td&gt;Tool renames and schema shifts during 2026 rollout&lt;/td&gt;&lt;td&gt;Budget maintenance time; pin UCP version in agent profiles&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Authority boundary&lt;/td&gt;&lt;td&gt;Catalog ≠ checkout for price, discounts, eligibility&lt;/td&gt;&lt;td&gt;Merchants must enforce commercial rules at checkout, not assume catalog hiding&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Community reports mirror this fragility. Shopify Developer Community threads from April 2026 document overnight &lt;code&gt;search_shop_catalog&lt;/code&gt; removals and mandatory migration to UCP tool names with wrapped &lt;code&gt;catalog&lt;/code&gt; arguments, so production agents need monitoring and pinned UCP versions in agent profiles rather than one-off integration sprints.&lt;/p&gt;&lt;h2&gt;What merchants should do now&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Open Agentic admin&lt;/strong&gt; and confirm which channels receive catalog data. Treat it like a sales channel audit, not a future feature.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Review product records&lt;/strong&gt; for duplicate splits, weak descriptions, missing media, and option naming. Agents amplify catalogue debt.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Map checkout guardrails&lt;/strong&gt; for staff, VIP, or wholesale pricing. If discovery can reach a SKU, assume an agent might try &lt;code&gt;checkout_url&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Developers:&lt;/strong&gt; implement chunked lookup, variant expansion, and diversified search if you need browse depth beyond the first page.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;For a structured pass across theme, apps, data model, and channels, 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-app-development/&quot;&gt;custom app development&lt;/a&gt; review rather than patching individual SKUs reactively.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Building the UCP Catalogue Explorer did not just produce a demo. It surfaced how agentic discovery stress-tests catalogue architecture that was originally designed for human theme navigation.&lt;/p&gt;&lt;p&gt;UCP gives developers a standard vocabulary. Shopify Global Catalog gives it real inventory. Neither removes the merchant obligation to maintain clean product data, explicit channel rules, and checkout enforcement for sensitive pricing.&lt;/p&gt;&lt;p&gt;The explorer is live for developers who want to reproduce the behaviour: &lt;a href=&quot;https://ucp-catalogue-explorer-o-contis-studio.vercel.app/&quot;&gt;UCP Catalogue Explorer&lt;/a&gt;. If you want help auditing how your stack appears to agents and what to fix first, &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;book a stack assessment&lt;/a&gt; with oContis Studio.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>How to Fix Shopify Markets Cache Issues When Products Disappear After a Catalog Split</title>
    <link href="https://ocontis.studio/blog/post/how-to-fix-shopify-markets-cache-issues-when-products-disappear-after-a-catalog-split/" />
    <updated>2026-07-17T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/how-to-fix-shopify-markets-cache-issues-when-products-disappear-after-a-catalog-split/</id>
    <content type="html">&lt;h1&gt;How to Fix Shopify Markets Cache Issues When Products Disappear After a Catalog Split&lt;/h1&gt;&lt;p&gt;You split your catalogue with Shopify Markets. Domestic buyers get one range and pricing. International visitors get another. The admin looks correct.&lt;/p&gt;&lt;p&gt;Then the storefront starts lying.&lt;/p&gt;&lt;p&gt;Old banner images reappear. Products you added after the split vanish from collection pages. Click through and you get a 404. Reload once and the product exists. Reload again and it is gone. Sometimes even password protection does not stick for your home market.&lt;/p&gt;&lt;p&gt;That pattern is terrifying because it feels random. It is usually not random. It is a &lt;strong&gt;catalog publishing gap&lt;/strong&gt;, an &lt;strong&gt;asset CDN cache&lt;/strong&gt;, or &lt;strong&gt;edge propagation lag&lt;/strong&gt; after a Markets configuration change, and the fix path is diagnosable once you stop treating it as a theme glitch.&lt;/p&gt;&lt;p&gt;This reflects patterns we see regularly across the Shopify merchant and developer community after international catalog splits: intermittent missing products, stale creative assets, and storefront state that does not match admin. The instinct is to rebuild the theme or uninstall apps. Frequently the faster path is verifying market catalog inclusion, Online Store publishing, and cache busting before opening a support ticket with the right evidence.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;Shopify Markets gives established brands a native way to sell multiple regions from one store: market-specific catalogs, variable pricing, subfolders or domains, and localized buyer experiences without spinning up separate shops.&lt;/p&gt;&lt;p&gt;The configuration step is deceptively simple. Pick regions, assign catalogs, set prices, publish. Merchants expect the storefront to reflect admin immediately.&lt;/p&gt;&lt;p&gt;Platform reality is more layered. Markets introduces &lt;strong&gt;buyer context&lt;/strong&gt;: the combination of market, catalog, sales channel publication, and routing that determines which products exist, at what price, on which URL, for which visitor. Products excluded from a market catalog are omitted from lists and return not-found when queried in that context, behaving like archived items even when they look fine in admin.&lt;/p&gt;&lt;p&gt;When you add &lt;strong&gt;edge caching&lt;/strong&gt; and &lt;strong&gt;CDN-backed assets&lt;/strong&gt; on top of that context switch, you get failure modes that look supernatural: password pages that sometimes do not apply, banners from last season, and SKUs that exist only on every other refresh.&lt;/p&gt;&lt;p&gt;We audit multi-market Shopify builds where the business trigger is growth into new regions, often on &lt;a href=&quot;https://ocontis.studio/blog/post/choosing-the-right-shopify-plan-a-practical-decision-framework/&quot;&gt;Shopify Plus&lt;/a&gt; or Advanced plans approaching Plus complexity. The Markets split goes live, trading looks fine for a week, then post-split product launches become unreliable. This guide walks through how to diagnose that pattern, what merchants miss in catalog versus channel publishing, how to bust asset cache safely, and when the right move is Shopify Support with evidence rather than another theme edit.&lt;/p&gt;&lt;p&gt;If your differentiation lives in theme architecture, pair this with &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; so you know whether the issue is Markets propagation or structural theme debt.&lt;/p&gt;&lt;h2&gt;What merchants are running into&lt;/h2&gt;&lt;p&gt;The community version of this problem follows a recognisable script.&lt;/p&gt;&lt;p&gt;A merchant enables Shopify Markets to separate a home country catalogue from international selling, often with variable pricing on selected SKUs. Subfolder or domain routing is configured. Existing products mostly behave. New products added &lt;strong&gt;after&lt;/strong&gt; the split are the troublemakers.&lt;/p&gt;&lt;p&gt;Reported symptoms cluster like this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Stale creative assets&lt;/strong&gt;, an old homepage banner displays even after replacement in admin&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Missing new products&lt;/strong&gt; on collection and search surfaces for the home market&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Intermittent product 404s&lt;/strong&gt;, the same handle works on one reload and fails on the next&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Inconsistent storefront state&lt;/strong&gt;, password protection or pre-split content occasionally appears for domestic visitors&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Apparent fix on refresh&lt;/strong&gt;, which pushes teams toward blaming the theme or a front-end app&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Merchants verify the obvious admin settings: products are active, not draft, in stock, assigned to shipping zones, synced to both catalogues. They clear browser cache, test multiple devices, make minor theme edits to force a refresh. Nothing stabilises.&lt;/p&gt;&lt;p&gt;The critical detail is &lt;strong&gt;intermittency tied to market context&lt;/strong&gt;. Issues often concentrate on the home market even when international configuration triggered the project. Products that existed before the split continue to work more reliably than net-new SKUs. That timing clue matters for diagnosis.&lt;/p&gt;&lt;h2&gt;Why this happens&lt;/h2&gt;&lt;h3&gt;1. Market catalog versus Online Store publishing&lt;/h3&gt;&lt;p&gt;Shopify separates &lt;strong&gt;where a product is allowed to sell&lt;/strong&gt; (market catalog and catalog publication rules) from &lt;strong&gt;whether it is syndicated to a sales channel&lt;/strong&gt; (Online Store, POS, or custom channels).&lt;/p&gt;&lt;p&gt;After a Markets split, merchants frequently confirm catalog membership in Markets admin but skip the equivalent publishing check for new products on the Online Store channel &lt;strong&gt;in the market context where buyers browse&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;A partial state is possible: product added to the market catalog, Online Store publication incomplete or applied before market association finished. Storefront behaviour in that state can flicker between visible and not-found because different requests hit different layers of the publishing graph.&lt;/p&gt;&lt;p&gt;Shopify&#39;s developer documentation is explicit that products excluded from a market catalog are omitted from buyer-facing queries in that context. Merchants experience that as 404s and empty collection slots, not as a polite admin warning.&lt;/p&gt;&lt;h3&gt;2. Products added after the split miss inherited workflow&lt;/h3&gt;&lt;p&gt;The split event becomes a &lt;strong&gt;process breakpoint&lt;/strong&gt;. Pre-split products went through an older publish path. Post-split products need the same market catalog assignment &lt;strong&gt;and&lt;/strong&gt; channel publication discipline, but teams often assume &amp;quot;active in admin&amp;quot; is enough.&lt;/p&gt;&lt;p&gt;If your merchandising workflow is &amp;quot;create product, assign collection, done,&amp;quot; Markets adds silent gates. Without a checklist, every launch after the split carries intermittent visibility risk.&lt;/p&gt;&lt;h3&gt;3. Asset CDN cache is separate from catalog sync&lt;/h3&gt;&lt;p&gt;Replacing a banner image by overwriting the same file in admin often leaves the old URL cached at the CDN edge. Visitors keep seeing the previous creative even when product data is correct.&lt;/p&gt;&lt;p&gt;That explains why &lt;strong&gt;stale banners coexist with missing new products&lt;/strong&gt;. Two different cache layers: asset delivery versus catalog routing. Fixing one does not fix the other.&lt;/p&gt;&lt;h3&gt;4. Edge cache propagation after major Markets changes&lt;/h3&gt;&lt;p&gt;When merchants report password protection failing intermittently or pre-split storefront content appearing for the home market, that is not a Liquid bug. It suggests &lt;strong&gt;stale edge pages&lt;/strong&gt; served for a region while backend catalog state has moved on.&lt;/p&gt;&lt;p&gt;Propagation delays are more common immediately after enabling Markets, changing subfolder structure, or rebalancing catalogs across regions. They should converge. If they do not after verified publishing fixes, platform intervention is reasonable.&lt;/p&gt;&lt;h3&gt;5. Localization apps and legacy theme patterns&lt;/h3&gt;&lt;p&gt;Apps that manipulate currency, geolocation, or swatches on the front end can conflict with native Markets routing if they pre-date the Markets configuration. A single front-end product app may not break the whole store, but it can amplify intermittent URL or context resolution issues.&lt;/p&gt;&lt;p&gt;Custom theme code that still reads &lt;code&gt;cart.currency&lt;/code&gt; or hardcoded country lists instead of Shopify&#39;s localization and routes objects is a recurring audit finding. &lt;a href=&quot;https://ocontis.studio/blog/post/online-store-2-0-what-changed-and-why-it-matters/&quot;&gt;Online Store 2.0&lt;/a&gt; reduced some of that debt, but Markets migrations often expose shortcuts that survived earlier replatforms.&lt;/p&gt;&lt;h3&gt;6. Why reload roulette misleads your team&lt;/h3&gt;&lt;p&gt;Intermittent success trains the wrong mental model. Someone refreshes until the product appears, declares victory, and ships more SKUs into the same broken pipeline.&lt;/p&gt;&lt;p&gt;Reload variance usually means &lt;strong&gt;multiple cache or context paths&lt;/strong&gt;, not that the underlying issue healed itself. Treat every flicker as data for diagnosis, not as proof the store is fine.&lt;/p&gt;&lt;p&gt;On Plus and Advanced builds with multiple catalogs, price lists, and B2B company locations in play, the publishing graph gets wider fast. A product can pass one availability check in admin while still failing another on the storefront, which is why we document both legacy and new SKUs side by side before changing theme code.&lt;/p&gt;&lt;figure class=&quot;blog-diagram epmb-figure&quot; role=&quot;figure&quot; aria-labelledby=&quot;epmb-4-caption&quot; data-diagram-id=&quot;epmb-4&quot;&gt;
  &lt;p class=&quot;epmb-figure__summary visually-hidden&quot; id=&quot;epmb-4-summary&quot;&gt;Shopify Markets cache audit&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-4&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: 352.41796875px;&quot; viewBox=&quot;-8 -50.1015625 352.41796875 633.4359374999999&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot;&gt;&lt;style&gt;#epmb-4{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-4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#epmb-4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#epmb-4 .error-icon{fill:#141414;}#epmb-4 .error-text{fill:#ebebeb;stroke:#ebebeb;}#epmb-4 .edge-thickness-normal{stroke-width:1px;}#epmb-4 .edge-thickness-thick{stroke-width:3.5px;}#epmb-4 .edge-pattern-solid{stroke-dasharray:0;}#epmb-4 .edge-thickness-invisible{stroke-width:0;fill:none;}#epmb-4 .edge-pattern-dashed{stroke-dasharray:3;}#epmb-4 .edge-pattern-dotted{stroke-dasharray:2;}#epmb-4 .marker{fill:#8a8a7a;stroke:#8a8a7a;}#epmb-4 .marker.cross{stroke:#8a8a7a;}#epmb-4 svg{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;}#epmb-4 p{margin:0;}#epmb-4 .label{font-family:&#39;Syne&#39;,system-ui,sans-serif;color:#fafae6;}#epmb-4 .cluster-label text{fill:#fafae6;}#epmb-4 .cluster-label span{color:#fafae6;}#epmb-4 .cluster-label span p{background-color:transparent;}#epmb-4 .label text,#epmb-4 span{fill:#fafae6;color:#fafae6;}#epmb-4 .node rect,#epmb-4 .node circle,#epmb-4 .node ellipse,#epmb-4 .node polygon,#epmb-4 .node path{fill:#141414;stroke:#db5461;stroke-width:1px;}#epmb-4 .rough-node .label text,#epmb-4 .node .label text,#epmb-4 .image-shape .label,#epmb-4 .icon-shape .label{text-anchor:middle;}#epmb-4 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#epmb-4 .rough-node .label,#epmb-4 .node .label,#epmb-4 .image-shape .label,#epmb-4 .icon-shape .label{text-align:center;}#epmb-4 .node.clickable{cursor:pointer;}#epmb-4 .root .anchor path{fill:#8a8a7a!important;stroke-width:0;stroke:#8a8a7a;}#epmb-4 .arrowheadPath{fill:#f1eff0;}#epmb-4 .edgePath .path{stroke:#8a8a7a;stroke-width:1px;}#epmb-4 .flowchart-link{stroke:#8a8a7a;fill:none;}#epmb-4 .edgeLabel{background-color:#141414;text-align:center;}#epmb-4 .edgeLabel p{background-color:#141414;}#epmb-4 .edgeLabel rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-4 .labelBkg{background-color:rgba(20, 20, 20, 0.5);}#epmb-4 .cluster rect{fill:#141414;stroke:hsl(0, 0%, 17.8431372549%);stroke-width:1px;}#epmb-4 .cluster text{fill:#fafae6;}#epmb-4 .cluster span{color:#fafae6;}#epmb-4 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-4 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fafae6;}#epmb-4 rect.text{fill:none;stroke-width:0;}#epmb-4 .icon-shape,#epmb-4 .image-shape{background-color:#141414;text-align:center;}#epmb-4 .icon-shape p,#epmb-4 .image-shape p{background-color:#141414;padding:2px;}#epmb-4 .icon-shape .label rect,#epmb-4 .image-shape .label rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-4 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#epmb-4 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#epmb-4 .node .neo-node{stroke:#db5461;}#epmb-4 [data-look=&quot;neo&quot;].node rect,#epmb-4 [data-look=&quot;neo&quot;].cluster rect,#epmb-4 [data-look=&quot;neo&quot;].node polygon{stroke:url(#epmb-4-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-4 [data-look=&quot;neo&quot;].swimlane.cluster rect{filter:none;}#epmb-4 [data-look=&quot;neo&quot;].node path{stroke:url(#epmb-4-gradient);stroke-width:1px;}#epmb-4 [data-look=&quot;neo&quot;].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-4 [data-look=&quot;neo&quot;].node .neo-line path{stroke:#db5461;filter:none;}#epmb-4 [data-look=&quot;neo&quot;].node circle{stroke:url(#epmb-4-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-4 [data-look=&quot;neo&quot;].node circle .state-start{fill:#000000;}#epmb-4 [data-look=&quot;neo&quot;].icon-shape .icon{fill:url(#epmb-4-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-4 [data-look=&quot;neo&quot;].icon-shape .icon-neo path{stroke:url(#epmb-4-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-4 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;epmb-4_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-4_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-4_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-4_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-4_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-4_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-4_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-4_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-4_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-4_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-4_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-4_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;M137.473,60.889L137.473,65.056C137.473,69.222,137.473,77.556,137.473,85.222C137.473,92.889,137.473,99.889,137.473,103.389L137.473,106.889&quot; id=&quot;epmb-4-L_HOOK_PUB_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_HOOK_PUB_0&quot; data-points=&quot;W3sieCI6MTM3LjQ3MjY1NjI1LCJ5Ijo2MC44ODkwNjI0OTk5OTk5OTR9LHsieCI6MTM3LjQ3MjY1NjI1LCJ5Ijo4NS44ODkwNjI1fSx7IngiOjEzNy40NzI2NTYyNSwieSI6MTEwLjg4OTA2MjUwMDAwMDAxfV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-4_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M137.473,163.778L137.473,167.945C137.473,172.111,137.473,180.445,137.473,188.111C137.473,195.778,137.473,202.778,137.473,206.278L137.473,209.778&quot; id=&quot;epmb-4-L_PUB_POST_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_PUB_POST_0&quot; data-points=&quot;W3sieCI6MTM3LjQ3MjY1NjI1LCJ5IjoxNjMuNzc4MTI1MDAwMDAwMDJ9LHsieCI6MTM3LjQ3MjY1NjI1LCJ5IjoxODguNzc4MTI1fSx7IngiOjEzNy40NzI2NTYyNSwieSI6MjEzLjc3ODEyNX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-4_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M137.473,266.667L137.473,270.834C137.473,275.001,137.473,283.334,137.473,291.001C137.473,298.667,137.473,305.667,137.473,309.167L137.473,312.667&quot; id=&quot;epmb-4-L_POST_CDN_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_POST_CDN_0&quot; data-points=&quot;W3sieCI6MTM3LjQ3MjY1NjI1LCJ5IjoyNjYuNjY3MTg3NX0seyJ4IjoxMzcuNDcyNjU2MjUsInkiOjI5MS42NjcxODc0OTk5OTk5NX0seyJ4IjoxMzcuNDcyNjU2MjUsInkiOjMxNi42NjcxODc0OTk5OTk5NX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-4_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M137.473,369.556L137.473,373.723C137.473,377.89,137.473,386.223,137.473,393.89C137.473,401.556,137.473,408.556,137.473,412.056L137.473,415.556&quot; id=&quot;epmb-4-L_CDN_TEST_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_CDN_TEST_0&quot; data-points=&quot;W3sieCI6MTM3LjQ3MjY1NjI1LCJ5IjozNjkuNTU2MjV9LHsieCI6MTM3LjQ3MjY1NjI1LCJ5IjozOTQuNTU2MjV9LHsieCI6MTM3LjQ3MjY1NjI1LCJ5Ijo0MTkuNTU2MjV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-4_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M137.473,472.445L137.473,476.612C137.473,480.779,137.473,489.112,137.473,496.779C137.473,504.445,137.473,511.445,137.473,514.945L137.473,518.445&quot; id=&quot;epmb-4-L_TEST_SUPPORT_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_TEST_SUPPORT_0&quot; data-points=&quot;W3sieCI6MTM3LjQ3MjY1NjI1LCJ5Ijo0NzIuNDQ1MzEyNX0seyJ4IjoxMzcuNDcyNjU2MjUsInkiOjQ5Ny40NDUzMTI1fSx7IngiOjEzNy40NzI2NTYyNSwieSI6NTIyLjQ0NTMxMjV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-4_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_HOOK_PUB_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_PUB_POST_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_POST_CDN_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_CDN_TEST_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_TEST_SUPPORT_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-4-flowchart-HOOK-0&quot; data-look=&quot;classic&quot; transform=&quot;translate(137.47265625, 34.44453125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-118.12890625&quot; y=&quot;-26.44453125&quot; width=&quot;236.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;Admin&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; looks&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; correct&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;storefront&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; intermittent?&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-4-flowchart-PUB-2&quot; data-look=&quot;classic&quot; transform=&quot;translate(137.47265625, 137.33359375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-129.47265625&quot; y=&quot;-26.44453125&quot; width=&quot;258.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;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; Market&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; catalog&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; Online&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;Store&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; publish&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-4-flowchart-POST-4&quot; data-look=&quot;classic&quot; transform=&quot;translate(137.47265625, 240.22265625)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-117.19921875&quot; y=&quot;-26.44453125&quot; width=&quot;234.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;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; Post-split&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; SKUs&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&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;both&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; checks&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-4-flowchart-CDN-6&quot; data-look=&quot;classic&quot; transform=&quot;translate(137.47265625, 343.11171874999997)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-122.640625&quot; y=&quot;-26.44453125&quot; width=&quot;245.28125&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; Bust&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; asset&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; CDN&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 font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; a&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;new&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; filename&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-4-flowchart-TEST-8&quot; data-look=&quot;classic&quot; transform=&quot;translate(137.47265625, 446.00078125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-121.97265625&quot; y=&quot;-26.44453125&quot; width=&quot;243.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;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; Same&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; product&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; URL&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;Wi-Fi&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; cellular&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-4-flowchart-SUPPORT-10&quot; data-look=&quot;classic&quot; transform=&quot;translate(137.47265625, 548.88984375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-121.07421875&quot; y=&quot;-26.44453125&quot; width=&quot;242.1484375&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; Escalate&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 font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; URLs,&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;market,&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; timestamps&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-4-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-4-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-4-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;168.208984375&quot; y=&quot;-25&quot; class=&quot;flowchartTitleText&quot;&gt;Shopify Markets cache audit&lt;/text&gt;&lt;/svg&gt;
  &lt;/div&gt;
  
  &lt;figcaption class=&quot;epmb-figure__caption&quot; id=&quot;epmb-4-caption&quot;&gt;Shopify Markets cache audit&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h2&gt;How to diagnose it&lt;/h2&gt;&lt;p&gt;Work top-down. Confirm buyer context before opening the theme.&lt;/p&gt;&lt;h3&gt;Step 1: Reproduce with market and network discipline&lt;/h3&gt;&lt;p&gt;Pick one failing product handle and one healthy pre-split product handle. Test both on the &lt;strong&gt;home market URL&lt;/strong&gt; your domestic buyers use (subfolder, domain, or default).&lt;/p&gt;&lt;p&gt;Load both URLs twice from office Wi-Fi, then twice from cellular without clearing cache between attempts. Note whether failure is synchronized across networks or device-specific.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Observation&lt;/th&gt;&lt;th&gt;Likely layer&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Different results on Wi-Fi vs cellular at the same time&lt;/td&gt;&lt;td&gt;Platform propagation or regional edge cache&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Same missing product on all networks, consistently&lt;/td&gt;&lt;td&gt;Catalog or publishing misconfiguration&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Only new post-split SKUs fail&lt;/td&gt;&lt;td&gt;Post-split workflow gap&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Stale banner but products correct&lt;/td&gt;&lt;td&gt;Asset CDN cache&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Password page or old homepage intermittently&lt;/td&gt;&lt;td&gt;Edge cache serving pre-split pages&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3&gt;Step 2: Verify market catalog inclusion&lt;/h3&gt;&lt;p&gt;In Markets admin, open the affected market&#39;s catalog. Confirm the product is &lt;strong&gt;included&lt;/strong&gt;, not excluded, and that any catalog rules or exclusions you set during the split did not silently omit new tags or product types.&lt;/p&gt;&lt;p&gt;For multi-catalog setups, check that the product sits in the catalog actually linked to the market your testers browse, not only a parent or secondary catalog used for pricing experiments.&lt;/p&gt;&lt;h3&gt;Step 3: Verify Online Store channel publication&lt;/h3&gt;&lt;p&gt;Open the product in admin and inspect &lt;strong&gt;Sales channels and apps&lt;/strong&gt;. Confirm Online Store publication is active. If your workflow uses market-managed availability, re-check that the product is published in the Online Store context for the market where it fails.&lt;/p&gt;&lt;p&gt;This is the step teams skip because the product already appears in admin search. Admin visibility is not storefront visibility in a market context.&lt;/p&gt;&lt;h3&gt;Step 4: Compare pre-split versus post-split products&lt;/h3&gt;&lt;p&gt;Export a small comparison sheet: five working legacy SKUs and five failing new SKUs. Diff catalog assignment, channel publication, tags, templates, and inventory locations. The delta usually reveals a missing publish action or a collection rule that treats new products differently.&lt;/p&gt;&lt;h3&gt;Step 5: Isolate front-end apps and custom market code&lt;/h3&gt;&lt;p&gt;Temporarily disable non-essential localization or currency front-end apps and retest one failing handle. Review theme snippets that build product URLs, market switchers, or hreflang links. If you maintain custom Liquid for Markets, read &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; and audit against Shopify&#39;s localization objects rather than assumptions from pre-Markets builds.&lt;/p&gt;&lt;h3&gt;Step 6: Document before escalating&lt;/h3&gt;&lt;p&gt;Capture screen recordings showing two reloads with opposite outcomes on the same URL, plus admin screenshots proving catalog and channel state. Note market, timezone, and exact timestamps. Support resolves intermittent 404s faster with that bundle than with a general &amp;quot;Markets broke my site&amp;quot; message.&lt;/p&gt;&lt;h2&gt;How to fix it&lt;/h2&gt;&lt;h3&gt;Fix A: Complete the publishing path for post-split products&lt;/h3&gt;&lt;p&gt;For each affected SKU:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Confirm inclusion in the correct &lt;strong&gt;market catalog&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Publish to &lt;strong&gt;Online Store&lt;/strong&gt; for that market context&lt;/li&gt;&lt;li&gt;Re-save the product to trigger propagation if admin already looked correct&lt;/li&gt;&lt;li&gt;Re-test from two networks after five minutes, then again after thirty&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Bake this into merchandising SOP so launches after the split cannot skip market steps. One checklist beats heroic refreshes.&lt;/p&gt;&lt;h3&gt;Fix B: Bust asset CDN cache with new filenames&lt;/h3&gt;&lt;p&gt;For stale banners or section images:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Download the current asset&lt;/li&gt;&lt;li&gt;Re-upload with a &lt;strong&gt;new filename&lt;/strong&gt; (for example &lt;code&gt;hero-summer-v2.jpg&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Point the theme section at the new file URL&lt;/li&gt;&lt;li&gt;Verify on cellular without hard refresh tricks&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Do not rely on overwriting the same filename alone.&lt;/p&gt;&lt;h3&gt;Fix C: Reduce theme and app conflicts&lt;/h3&gt;&lt;p&gt;If isolation testing implicates a front-end app, configure it for native Markets or remove it until catalog behaviour is stable. Replace hardcoded country or currency switches with Shopify&#39;s supported localization patterns from your &lt;a href=&quot;https://ocontis.studio/blog/post/the-anatomy-of-a-high-performance-shopify-theme/&quot;&gt;theme architecture&lt;/a&gt; baseline.&lt;/p&gt;&lt;h3&gt;Fix D: Escalate to Shopify Support with edge-cache evidence&lt;/h3&gt;&lt;p&gt;Open a ticket when publishing is verified and intermittency persists across networks. Lead with:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Product URLs that 404 intermittently&lt;/li&gt;&lt;li&gt;Proof that password protection or pre-split content sometimes appears&lt;/li&gt;&lt;li&gt;Market region affected (especially home market)&lt;/li&gt;&lt;li&gt;Timestamps and screenshots from simultaneous network tests&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;That evidence set signals &lt;strong&gt;stale regional edge cache&lt;/strong&gt; and requests targeted cache invalidation rather than generic troubleshooting loops.&lt;/p&gt;&lt;h3&gt;Fix E: Structural review when Markets exposed deeper debt&lt;/h3&gt;&lt;p&gt;If catalog fixes stabilise some SKUs but metafield-driven merchandising, app-sourced inventory, or ERP-synced titles still disagree with admin, you are past a cache issue. The Markets split surfaced &lt;a href=&quot;https://ocontis.studio/services/integrations-and-system-optimisation/&quot;&gt;integration and data architecture debt&lt;/a&gt; similar to what we map 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;a href=&quot;https://ocontis.studio/services/shopify-stack-audit/&quot;&gt;Schedule a stack audit&lt;/a&gt; before adding more markets or channels.&lt;/p&gt;&lt;p&gt;For teams still running legacy multi-currency snippets or pre-OS 2.0 section architecture, Markets is often the first time those shortcuts fail under real buyer context. &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; focuses on conversion, but the same lesson applies here: invisible theme debt becomes visible the moment you add regional routing and catalog rules on top.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Symptom&lt;/th&gt;&lt;th&gt;First fix to try&lt;/th&gt;&lt;th&gt;Effort&lt;/th&gt;&lt;th&gt;When it is enough&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;New products missing after split&lt;/td&gt;&lt;td&gt;Market catalog + Online Store publish checklist&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;Publishing gap was the only issue&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Old banner despite new upload&lt;/td&gt;&lt;td&gt;Re-upload asset under new filename&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;Creative cache only; catalog stable&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;404 flicker on reload&lt;/td&gt;&lt;td&gt;Cross-network test, then Support with timestamps&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;td&gt;Edge propagation; needs platform purge&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Password page intermittently absent&lt;/td&gt;&lt;td&gt;Support escalation with regional evidence&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;td&gt;Stale edge pages; not theme password setting&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Issues only with one app enabled&lt;/td&gt;&lt;td&gt;Disable localization app; fix market routing code&lt;/td&gt;&lt;td&gt;Medium–High&lt;/td&gt;&lt;td&gt;Conflict isolated to app or custom snippet&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Admin and storefront never agree&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://ocontis.studio/services/shopify-stack-audit/&quot;&gt;Stack audit&lt;/a&gt; or &lt;a href=&quot;https://ocontis.studio/services/integrations-and-system-optimisation/&quot;&gt;integrations review&lt;/a&gt;: apps, metafields, ERP sync map&lt;/td&gt;&lt;td&gt;High&lt;/td&gt;&lt;td&gt;Data model debt beyond Markets config&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;Bring in senior Shopify development when:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;You have verified catalog and channel publishing, busted asset CDN cache, and intermittent 404s still block launches&lt;/li&gt;&lt;li&gt;Multiple markets, B2B catalogs, and ERP-fed availability rules interact and admin screens no longer match how buyers experience the store&lt;/li&gt;&lt;li&gt;Custom theme market routing, hreflang, or collection filtering was built pre-Markets and needs &lt;a href=&quot;https://ocontis.studio/services/shopify-theme-development/&quot;&gt;refactoring to supported APIs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Leadership wants to open more regions while product data quality across apps is already inconsistent&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;A Markets configuration fix can stabilise visibility quickly. It does not replace ordered diagnosis across theme, apps, data model, integrations, and checkout when the underlying stack was fragile before the split.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Shopify Markets cache issues feel chaotic because they stack &lt;strong&gt;catalog context&lt;/strong&gt;, &lt;strong&gt;channel publishing&lt;/strong&gt;, &lt;strong&gt;asset CDN&lt;/strong&gt;, and &lt;strong&gt;edge propagation&lt;/strong&gt; into one storefront experience. The merchant who refreshes until a product appears is treating a systems problem like a browser glitch.&lt;/p&gt;&lt;p&gt;Start with the six-check audit grid: market catalog, Online Store publish, post-split workflow, asset filename bust, cross-network testing, and support-ready evidence. Most missing-product reports after a catalog split resolve when publishing discipline catches up to the new market graph. Stale banners and password-page flicker point at CDN and edge layers that need filename changes or platform cache invalidation, not a theme reinstall.&lt;/p&gt;&lt;p&gt;If your store already runs a bloated app stack or inconsistent catalogue data, Markets will amplify that mess in every new region. &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;Book a stack assessment&lt;/a&gt; or see &lt;a href=&quot;https://ocontis.studio/services/shopify-stack-audit/&quot;&gt;Shopify Stack Audit&lt;/a&gt;. We will map what is a Markets propagation fix versus what needs structural rebuild before you scale internationally.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Shopify Payments Reserves: Does Upgrading to Plus Change Anything?</title>
    <link href="https://ocontis.studio/blog/post/shopify-payments-reserves-does-upgrading-to-plus-change-anything/" />
    <updated>2026-07-14T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/shopify-payments-reserves-does-upgrading-to-plus-change-anything/</id>
    <content type="html">&lt;h1&gt;Shopify Payments Reserves: Does Upgrading to Plus Change Anything?&lt;/h1&gt;&lt;p&gt;A merchant meets every early-release condition Shopify quoted. Chargeback rate drops to zero. Processing continues without interruption. Weeks pass, then months, and roughly $12,000 to $14,000 in sales sits in reserve while support confirms there are no visible blockers on the file.&lt;/p&gt;&lt;p&gt;The question that follows is predictable: would &lt;strong&gt;Shopify Plus&lt;/strong&gt; have prevented this, or at least got someone on the phone who could move the case?&lt;/p&gt;&lt;p&gt;The direct answer is no. Plus does not buy you a different Credit Risk outcome. It might buy you slightly better routing for general support, but reserve decisions sit in a separate queue with its own rules. Treating Plus as a payments-risk escape hatch is an expensive misunderstanding of what the plan actually controls.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;Shopify Payments reserves are a cash-flow event, not a billing inconvenience. When Shopify&#39;s Credit Risk team applies a hold, a slice of every eligible transaction is retained before payout. For growing brands, that can mean five figures locked up while fulfilment, payroll, and ad spend still need funding.&lt;/p&gt;&lt;p&gt;Community threads on this topic tend to cluster around two questions: how long release actually takes after you meet the stated conditions, and whether upgrading to Plus changes access to the teams that decide. This article separates &lt;strong&gt;plan benefits&lt;/strong&gt; from &lt;strong&gt;payments risk policy&lt;/strong&gt;, then gives a practical playbook for merchants already inside a reserve review.&lt;/p&gt;&lt;p&gt;If you are evaluating Plus for other reasons, pair this with &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;. For where reserves fit inside broader store economics, see &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;.&lt;/p&gt;&lt;h2&gt;What changed&lt;/h2&gt;&lt;p&gt;Shopify Payments reserves are not new, but merchant forum volume around them has spiked where three patterns overlap:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Card-testing or dispute spikes&lt;/strong&gt; trigger a percentage hold (commonly cited around 30% in recent cases).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Early-release criteria&lt;/strong&gt; are communicated verbally or in support tickets: sub-1% chargeback rate for 30 consecutive days, continued Shopify Payments processing.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Credit Risk escalation&lt;/strong&gt; moves the case out of front-line support, often with limited merchant-facing updates.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;None of this is tied to a single July 2026 changelog entry. It is ongoing platform policy surfacing under stress: higher dispute rates industry-wide, faster-scaling DTC brands, and merchants discovering that meeting written conditions does not map cleanly to calendar release dates.&lt;/p&gt;&lt;h2&gt;Who is affected&lt;/h2&gt;&lt;p&gt;Reserves can land on any Shopify Payments merchant, from standard plans through Plus. Typical trigger profiles include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Sudden chargeback clusters after promotional spikes or fulfilment delays&lt;/li&gt;&lt;li&gt;Card-testing attacks that produce dispute windows before fraud filters catch up&lt;/li&gt;&lt;li&gt;New or rapidly scaling stores with thin processing history&lt;/li&gt;&lt;li&gt;Categories with historically higher dispute rates&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Plus merchants are not exempt. Enterprise checkout customisation and higher API limits do not rewrite payments risk scoring. If your business is considering Plus for checkout extensibility or multi-store architecture, that decision still stands on its own merits, as we outline in &lt;a href=&quot;https://ocontis.studio/blog/post/maximizing-customer-lifetime-value-on-shopify-plus/&quot;&gt;&lt;em&gt;Maximizing Customer Lifetime Value on Shopify Plus&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Factor&lt;/th&gt;&lt;th&gt;Standard / Advanced plans&lt;/th&gt;&lt;th&gt;Shopify Plus&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Reserve application&lt;/td&gt;&lt;td&gt;Yes, based on risk signals&lt;/td&gt;&lt;td&gt;Yes, same risk framework&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Credit Risk decision authority&lt;/td&gt;&lt;td&gt;Trust Platform team&lt;/td&gt;&lt;td&gt;Same team, not plan-tiered&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Support escalation paths&lt;/td&gt;&lt;td&gt;Standard support tiers&lt;/td&gt;&lt;td&gt;Often faster for ops issues; limited on risk holds&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Merchant Success Manager&lt;/td&gt;&lt;td&gt;Not included&lt;/td&gt;&lt;td&gt;Included for many accounts, reduced for some&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Practical leverage on reserve release&lt;/td&gt;&lt;td&gt;Evidence-led escalation&lt;/td&gt;&lt;td&gt;Same; plan upgrade alone is weak leverage&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;When Plus still makes sense&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Checkout, automation, international architecture&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;What to do now&lt;/h2&gt;&lt;h3&gt;Before a reserve is applied&lt;/h3&gt;&lt;p&gt;Merchants with ad-driven growth should treat dispute rate as a &lt;strong&gt;contribution margin&lt;/strong&gt; input, not a payments footnote. A store can look healthy on ROAS while disputes erode net margin, as we cover 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;. Practical prevention includes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Tight AVS/CVV settings and fraud filters aligned to your average order value&lt;/li&gt;&lt;li&gt;Clear delivery timelines on product pages and post-purchase emails&lt;/li&gt;&lt;li&gt;Proactive refund policies on high-risk SKUs before disputes file&lt;/li&gt;&lt;li&gt;Monitoring dispute rate weekly, not monthly, during campaign spikes&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;When a reserve is active&lt;/h3&gt;&lt;p&gt;If Shopify has already applied a hold, optimise for &lt;strong&gt;documented continuity&lt;/strong&gt; rather than platform hopping.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Week 1: Build your evidence pack&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Export transactions from &lt;strong&gt;Finances → Payouts → Transactions&lt;/strong&gt;. Reserve holds and partial releases appear as typed line items. Calculate:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Total held to date (not just the admin banner figure)&lt;/li&gt;&lt;li&gt;Disputes per 30-day window versus total charges&lt;/li&gt;&lt;li&gt;Chargeback rate for the last three rolling 30-day periods&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Attach the maths to every support touchpoint. &amp;quot;Under 1%&amp;quot; is weaker than &amp;quot;4 disputes on 1,240 charges = 0.32% for the period ending 15 May.&amp;quot;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Week 2–4: Escalation hygiene&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Request the &lt;strong&gt;escalation case ID&lt;/strong&gt; and ask support to confirm in writing:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Which early-release criterion, if any, remains unmet&lt;/li&gt;&lt;li&gt;Whether the Credit Risk file shows activity since escalation&lt;/li&gt;&lt;li&gt;Expected review cadence, even if Shopify cannot commit to a date&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If no criterion is named, that becomes your follow-up lever: conditions met on a specific date, no outstanding documents, no stated blocker.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Ongoing: Cash-flow bridge&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Model the reserve as a &lt;strong&gt;working capital line item&lt;/strong&gt; inside your unit economics. If $12,000 to $14,000 is held at 30% of processing, you need a bridge for inventory and ads until release. Use our &lt;a href=&quot;https://ocontis.studio/tools/unit-economics-simulator/&quot;&gt;&lt;em&gt;Unit Economics Simulator&lt;/em&gt;&lt;/a&gt; to stress-test payout timing against CAC payback.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Phase&lt;/th&gt;&lt;th&gt;Merchant action&lt;/th&gt;&lt;th&gt;What to avoid&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Immediate&lt;/td&gt;&lt;td&gt;Export transaction evidence; confirm hold total&lt;/td&gt;&lt;td&gt;Switching gateways reactively&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Days 7–30&lt;/td&gt;&lt;td&gt;Weekly escalation with case ID and dispute maths&lt;/td&gt;&lt;td&gt;Assuming meeting conditions guarantees release date&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Days 30–60&lt;/td&gt;&lt;td&gt;Ask which criterion is still unmet; request written confirmation&lt;/td&gt;&lt;td&gt;Upgrading to Plus solely to unblock Credit Risk&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Parallel&lt;/td&gt;&lt;td&gt;Bridge cash flow; reduce dispute risk on new orders&lt;/td&gt;&lt;td&gt;Pausing all marketing without modelling LTV impact&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Release&lt;/td&gt;&lt;td&gt;Verify partial releases in exports; reconcile payouts&lt;/td&gt;&lt;td&gt;Treating admin UI as sole source of truth&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3&gt;When to consider Plus anyway&lt;/h3&gt;&lt;p&gt;Upgrade to Plus when operational scale justifies the subscription: checkout extensibility, complex B2B flows, multi-store governance, or automation that removes manual ops cost. Do &lt;strong&gt;not&lt;/strong&gt; upgrade because a reserve case feels stuck. Several experienced Plus merchants report that Credit Risk timelines felt identical before and after upgrade.&lt;/p&gt;&lt;p&gt;If you need a platform-wide view of what Shopify can and cannot control, &lt;a href=&quot;https://ocontis.studio/blog/post/what-is-shopify-features-limitations-and-use-cases/&quot;&gt;&lt;em&gt;What Is Shopify? Features, Limitations, and Use Cases&lt;/em&gt;&lt;/a&gt; covers the boundary between commerce software and payments policy.&lt;/p&gt;&lt;h2&gt;What merchants are running into&lt;/h2&gt;&lt;p&gt;Forum threads on reserves share a recognizable shape. A merchant experiences a short dispute spike, often linked to card testing or a fulfilment bottleneck during a sale. Shopify Payments applies a percentage hold. Support outlines early-release conditions. The merchant hits those conditions within weeks.&lt;/p&gt;&lt;p&gt;Then the timeline goes quiet.&lt;/p&gt;&lt;p&gt;Front-line advisors confirm the case escalated to Credit Risk. Some report being told there are no missing documents and no visible blockers. Others hear that the file shows little activity since escalation. Meanwhile the held balance keeps growing because processing never stopped, which is usually required to qualify for release.&lt;/p&gt;&lt;p&gt;The cash-flow pressure is real. Inventory purchase orders do not pause. Payroll does not pause. Meta and Google invoices still arrive. Merchants start exploring two escape hatches: switching payment providers, or upgrading to Plus to reach a more senior contact. Both are understandable. Neither is a reliable fix for an active reserve review.&lt;/p&gt;&lt;h2&gt;The Plus misconception&lt;/h2&gt;&lt;p&gt;Plus is often mentally filed under &amp;quot;priority support.&amp;quot; That framing is only half true.&lt;/p&gt;&lt;p&gt;For operational problems, Plus can help: theme conflicts, checkout extension behaviour, API limits, launch support during BFCM, multi-store configuration. Those issues route through merchant success and platform teams with clearer escalation paths than a standard plan ticket queue.&lt;/p&gt;&lt;p&gt;Payments reserves route differently. Credit Risk evaluates processing history, dispute trajectories, refund rates, and category risk. The team does not treat Plus subscription revenue as a reason to release held funds faster. Merchants who upgraded during an active hold frequently report the same wait time, the same opaque queue, and the same advice to keep processing and wait.&lt;/p&gt;&lt;p&gt;There is a second cost to the misconception. Plus pricing is meaningful. If a merchant upgrades expecting reserve relief and does not get it, they have added fixed overhead while working capital is already constrained. The subscription delta might have funded inventory bridge financing or dispute prevention tooling with clearer ROI.&lt;/p&gt;&lt;p&gt;Merchant Success Manager coverage has also changed over time. Some Plus accounts that previously had named contacts now rely on pooled success resources. That further weakens the idea that Plus buys a single accountable person who can &amp;quot;push Risk.&amp;quot;&lt;/p&gt;&lt;p&gt;Use Plus when the storefront and operations need what Plus sells. Do not use it as a Credit Risk workaround.&lt;/p&gt;&lt;h2&gt;How reserve maths affects operations&lt;/h2&gt;&lt;p&gt;A 30% reserve on growing volume compounds quietly. If you process $40,000 in eligible sales during a month, roughly $12,000 may never reach your bank account on the normal payout cycle. If processing continues at the same pace while the hold stays in place, the retained balance climbs even as dispute rates fall.&lt;/p&gt;&lt;p&gt;That creates three operational distortions:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Ad spend decisions get conservative.&lt;/strong&gt; Merchants pause campaigns because cash on hand no longer matches dashboard revenue. Sometimes that is prudent. Sometimes it starves acquisition right when dispute rates have already normalised, lengthening recovery.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Inventory timing slips.&lt;/strong&gt; Brands that reorder on payout cadence miss buy windows. Stockouts then create a second dispute wave from late deliveries, which can extend the risk review.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Founder time shifts to support tickets.&lt;/strong&gt; Hours that should go to merchandising or retention flow into Shopify support chats, bank conversations, and spreadsheet reconciliation.&lt;/p&gt;&lt;p&gt;Modelling the reserve explicitly helps. Take trailing 30-day Shopify Payments volume, multiply by the hold percentage, and subtract expected payouts. That single figure belongs in your weekly finance review beside ad spend and COGS. Treat it like a line of credit you did not choose, with no published interest rate but real operational cost.&lt;/p&gt;&lt;h2&gt;Recommendation by scenario&lt;/h2&gt;&lt;h3&gt;Scenario A: Dispute spike just happened, no reserve yet&lt;/h3&gt;&lt;p&gt;You are inside the danger window. Pull dispute and refund reports immediately. Tighten fraud settings for 14 days. Email customers on delayed SKUs before chargebacks file. Document everything.&lt;/p&gt;&lt;p&gt;If Shopify contacts you proactively, respond same day with fulfilment timelines and fraud mitigation steps. Early cooperation does not guarantee avoidance, but silence rarely helps.&lt;/p&gt;&lt;h3&gt;Scenario B: Reserve active, conditions met, no release date&lt;/h3&gt;&lt;p&gt;This is the pattern dominating community discussion. Your playbook is evidence and escalation hygiene, not plan changes.&lt;/p&gt;&lt;p&gt;Keep processing on Shopify Payments if continuity is part of your release criteria. Export transactions weekly. Attach dispute calculations to every follow-up. Request case IDs. Ask which criterion remains unmet.&lt;/p&gt;&lt;p&gt;If support cannot name one, escalate calmly with a written summary: conditions met on date X, chargeback rate Y%, no outstanding documents, hold balance Z. Repeat on a steady cadence. Avoid daily emotional tickets that bury the factual record.&lt;/p&gt;&lt;p&gt;Bridge cash through line of credit, founder loan, or slowed discretionary spend. Do not fund the bridge by upgrading to Plus unless you already needed Plus for separate reasons.&lt;/p&gt;&lt;h3&gt;Scenario C: Evaluating Plus while reserve-free&lt;/h3&gt;&lt;p&gt;Good timing for a clean decision. Score Plus on checkout needs, automation, international store architecture, and B2B requirements. Run the plan comparison 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; without factoring hypothetical reserve support.&lt;/p&gt;&lt;p&gt;Build dispute prevention into the Plus business case instead: checkout validation, clearer delivery promises, post-purchase tracking, and fraud rules tuned to your AOV. That protects the payments profile that keeps you out of Scenario B.&lt;/p&gt;&lt;h2&gt;When to get help&lt;/h2&gt;&lt;p&gt;Most reserve cases are merchant-led escalations with Shopify support. External help still matters at inflection points.&lt;/p&gt;&lt;p&gt;Bring in finance or fractional CFO support when held balances affect covenant ratios, supplier terms, or payroll timing. They can model bridge scenarios faster than a founder juggling support tickets.&lt;/p&gt;&lt;p&gt;Bring in technical help when disputes trace to checkout UX, misleading shipping promises, or subscription billing confusion. Those are fixable product problems. On recent audits we have tied dispute clusters to ambiguous delivery date copy and missing order tracking on the thank-you page. Fixing the storefront reduces future risk more than chasing release dates.&lt;/p&gt;&lt;p&gt;Bring in legal or payments counsel only for edge cases: suspected erroneous dispute classification, repeated holds after clean processing history, or gateway switch contracts with exit fees. Most merchants never need this layer.&lt;/p&gt;&lt;p&gt;Agency support is useful when the bottleneck is operational bandwidth: someone to build the evidence pack, reconcile Finances exports, and keep a ticket log while you run the business. That is different from expecting an agency to override Shopify Credit Risk.&lt;/p&gt;&lt;h2&gt;What this does not change&lt;/h2&gt;&lt;p&gt;A reserve review does not automatically mean Shopify doubts your business model. It means the payments risk system flagged patterns that warrant retained funds. Meeting quoted conditions is necessary but not sufficient for immediate release, because Credit Risk also weighs category history, refund behaviour, fulfilment signals, and macro dispute trends.&lt;/p&gt;&lt;p&gt;Plus also does not replace:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Third-party fraud tooling where your catalogue needs it&lt;/li&gt;&lt;li&gt;Clear customer communication that prevents disputes&lt;/li&gt;&lt;li&gt;Finance planning that treats payout timing as variable&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Merchant Success Managers can advocate internally for operational issues, but they cannot commit Credit Risk outcomes. That separation is deliberate.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Shopify Payments reserves hurt when they arrive unexpectedly and hurt more when merchants assume Plus is a fast-track out. The plan tier controls checkout power, automation headroom, and support routing for day-to-day operations. Reserve release stays inside Credit Risk policy, and the merchants who navigate it well bring data, case IDs, and patient escalation rather than a subscription upgrade receipt.&lt;/p&gt;&lt;p&gt;If you are weighing Plus, decide on architecture and margin leverage. If you are inside a hold, document dispute rates, track held balances in exports, and keep processing consistent while you push for written answers on what the review is still waiting for.&lt;/p&gt;&lt;p&gt;For Plus checkout architecture beyond plan selection, see &lt;a href=&quot;https://ocontis.studio/services/shopify-ui-extensions-and-functions/&quot;&gt;Shopify UI extensions and Functions&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>How to Fix Metaobject Filters Combined with Storefront Search on Shopify</title>
    <link href="https://ocontis.studio/blog/post/how-to-fix-metaobject-filters-combined-with-storefront-search-on-shopify/" />
    <updated>2026-07-12T16:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/how-to-fix-metaobject-filters-combined-with-storefront-search-on-shopify/</id>
    <content type="html">&lt;h1&gt;How to Fix Metaobject Filters Combined with Storefront Search on Shopify&lt;/h1&gt;&lt;p&gt;You built the data model correctly. Products reference metaobjects. The filter link works. Search works. Combine them and the grid goes empty.&lt;/p&gt;&lt;p&gt;That pattern is showing up more often as merchants move from tag-based catalogue logic to &lt;strong&gt;metaobject-backed filters&lt;/strong&gt;, especially on parts catalogues, compatibility matrices, and series-driven product lines. The frustration is not that filtering is impossible. It is that &lt;strong&gt;independent queries succeed while combined queries fail&lt;/strong&gt;, which makes the bug feel random until you understand how storefront search intersects with metafield filters.&lt;/p&gt;&lt;p&gt;When metaobject filters and storefront search break together, Shopify is applying &lt;strong&gt;AND&lt;/strong&gt; logic across two indexing paths. Confirm filter-only and search-only on the same SKU, then fix URL encoding (&lt;code&gt;filter.p.m.{namespace}.{key}&lt;/code&gt; + &lt;code&gt;q=&lt;/code&gt;), storefront filtering on the metafield definition, and product-level vs variant-level search matches before you rewrite the theme.&lt;/p&gt;&lt;h2&gt;How to fix metaobject filters with storefront search&lt;/h2&gt;&lt;p&gt;Work through this checklist on one product that fails the combined query:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Filter-only test:&lt;/strong&gt; open the metaobject filter URL without &lt;code&gt;q=&lt;/code&gt; and confirm the product appears.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Search-only test:&lt;/strong&gt; search the product title on &lt;code&gt;/search&lt;/code&gt; without filters and confirm it appears.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Combined URL audit:&lt;/strong&gt; encode the metaobject GID, keep &lt;code&gt;type=product&lt;/code&gt;, and match namespace/key to the filter-enabled metafield definition.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Field-level match:&lt;/strong&gt; if the term lives on variant SKU or barcode, try scoped queries (&lt;code&gt;variants.sku:…&lt;/code&gt;) and align catalogue data to product-level titles where filters expect product matches.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Reference integrity:&lt;/strong&gt; verify every SKU in the filtered set has a valid metaobject reference after imports or bulk edits.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Escalate with evidence&lt;/strong&gt; when isolated tests pass but combined queries still return zero across multiple products.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This article explains what merchants and developers are running into, why combined metaobject filter + search queries break, and a diagnostic sequence you can run before rewriting the theme or abandoning metaobjects entirely.&lt;/p&gt;&lt;p&gt;This reflects patterns we see regularly across the Shopify merchant and developer community, especially on stores that moved from tag-driven templates to structured metaobject catalogues without revisiting discovery URLs.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;Storefront discovery on Shopify is really two systems wearing one URL.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Search&lt;/strong&gt; (&lt;code&gt;q=&lt;/code&gt;) matches text across product and variant fields according to Shopify&#39;s search rules. &lt;strong&gt;Filters&lt;/strong&gt; (&lt;code&gt;filter.p.m...&lt;/code&gt; or collection filters) narrow results by structured product attributes, including metafield and metaobject references when filtering is enabled on the definition.&lt;/p&gt;&lt;p&gt;When you append a metaobject filter to a search results page, Shopify must return products that satisfy &lt;strong&gt;both&lt;/strong&gt; constraints. That sounds obvious, but the failure mode is subtle: each constraint works in isolation, so teams assume the theme is broken or the metaobject is misconfigured globally. Often the issue is &lt;strong&gt;intersection logic&lt;/strong&gt;, &lt;strong&gt;field-level matching&lt;/strong&gt;, or &lt;strong&gt;URL construction&lt;/strong&gt;, not the metaobject content itself.&lt;/p&gt;&lt;p&gt;If you are investing in custom data for catalogue scale, read this alongside &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; and &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;. When catalogue complexity coincides with flat revenue, see &lt;a href=&quot;https://ocontis.studio/blog/post/why-most-shopify-stores-dont-scale-past-50k-month/&quot;&gt;what to do if your Shopify revenue is plateauing&lt;/a&gt; for structural causes beyond the theme layer.&lt;/p&gt;&lt;h2&gt;What merchants are running into&lt;/h2&gt;&lt;p&gt;Three signals recur in merchant and developer discussions.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Signal 1, Split behaviour on the same product.&lt;/strong&gt; A product appears when you search its title. It appears when you apply the metaobject filter alone. Append the same search term with the filter active and the result set is empty.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Signal 2, Wildcard search &amp;quot;fixes&amp;quot; it.&lt;/strong&gt; Using a broad search token or wildcard-style query returns filtered products, while a literal search term does not, even when that term is in the product title. That usually points to how strict text matching interacts with filter intersection, not to missing product data.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Signal 3, Architecture momentum without filter planning.&lt;/strong&gt; Teams adopt metaobjects to escape tag-if spaghetti on product pages: one metaobject entry for &amp;quot;series&amp;quot; or &amp;quot;model&amp;quot; content, referenced across dozens of SKUs. PDP rendering works. Then filters are wired by appending GIDs to search URLs, without validating combined queries across the catalogue.&lt;/p&gt;&lt;p&gt;The underlying goal is legitimate: &lt;strong&gt;content belongs in data, not in Liquid branches&lt;/strong&gt;. Metaobjects are the right long-term home for shared series content and structured attributes. Filter + search bugs appear when discovery URLs are treated as an implementation detail rather than part of the data model.&lt;/p&gt;&lt;h2&gt;Why this happens&lt;/h2&gt;&lt;h3&gt;Intersection, not addition&lt;/h3&gt;&lt;p&gt;Combined storefront queries use &lt;strong&gt;AND&lt;/strong&gt; logic. A product must:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Match the active metaobject filter (via the enabled metafield reference)&lt;/li&gt;&lt;li&gt;Match the search query under Shopify search rules&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;If either condition fails at index level, the product disappears, even when each condition passed in isolation in your manual tests.&lt;/p&gt;&lt;h3&gt;Product-level vs variant-level search&lt;/h3&gt;&lt;p&gt;Search terms that match &lt;strong&gt;variant SKU or barcode&lt;/strong&gt; may succeed in search-only mode but behave differently when filters are applied, depending on query format. Shopify staff often suggest field-scoped tests:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;variants.sku:YOUR-SKU&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;variants.barcode:YOUR-BARCODE&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If scoped queries behave differently from plain &lt;code&gt;q=YOUR-SKU&lt;/code&gt;, your UI may be sending search terms the index treats as product-level text, while the visible &amp;quot;match&amp;quot; you expect lives on the variant.&lt;/p&gt;&lt;h3&gt;Metaobject list references vs single references&lt;/h3&gt;&lt;p&gt;Catalogue filters commonly use &lt;strong&gt;list.metaobject_reference&lt;/strong&gt; metafields (for example &lt;code&gt;custom.models&lt;/code&gt; pointing to multiple compatible models). Filter parameters must reference the correct GID format and namespace/key pair:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;filter.p.m.custom.models=gid://shopify/Metaobject/{id}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;URL encoding matters. Parameter order is usually tolerant, but reproducing exact URLs when debugging avoids false negatives.&lt;/p&gt;&lt;h3&gt;Filter-enabled definitions&lt;/h3&gt;&lt;p&gt;A metaobject entry can exist, products can reference it for PDP content, and the filter can still fail if &lt;strong&gt;storefront filtering&lt;/strong&gt; was not enabled on the metafield definition, or if products were bulk-imported before definitions were finalised. Search-only success + filter-only success with combined failure sometimes traces back to partial catalogue population, not platform bug.&lt;/p&gt;&lt;h3&gt;Theme vs platform boundaries&lt;/h3&gt;&lt;p&gt;Themes generate filter links and search forms. The &lt;strong&gt;index and query engine&lt;/strong&gt; are platform-side. Before rewriting section logic, confirm the raw URL reproduces the issue outside the theme, paste the combined query directly into the browser on &lt;code&gt;/search&lt;/code&gt;.&lt;/p&gt;&lt;h2&gt;How to diagnose it&lt;/h2&gt;&lt;p&gt;Work through this sequence on one known product that fails the combined query.&lt;/p&gt;&lt;h3&gt;Step 1 : Establish the baseline product&lt;/h3&gt;&lt;p&gt;Pick a product ID you expect to match. Confirm:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Title contains your test term (or variant SKU is known)&lt;/li&gt;&lt;li&gt;Metaobject reference metafield is populated&lt;/li&gt;&lt;li&gt;Metaobject entry is published and valid&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Step 2 : Run three URL tests&lt;/h3&gt;&lt;p&gt;Replace placeholders with your store domain and values:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Test&lt;/th&gt;&lt;th&gt;URL pattern&lt;/th&gt;&lt;th&gt;Expected if healthy&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Search only&lt;/td&gt;&lt;td&gt;&lt;code&gt;/search?type=product&amp;amp;q=YOUR_TERM&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Target product appears&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Filter only&lt;/td&gt;&lt;td&gt;&lt;code&gt;/search?type=product&amp;amp;filter.p.m.custom.models=ENCODED_GID&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Target product appears&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Combined&lt;/td&gt;&lt;td&gt;&lt;code&gt;/search?type=product&amp;amp;q=YOUR_TERM&amp;amp;filter.p.m.custom.models=ENCODED_GID&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Target product appears, if not, bug confirmed&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3&gt;Step 3 : Swap the search term type&lt;/h3&gt;&lt;p&gt;If combined fails but filter-only works:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Retry with a &lt;strong&gt;title word&lt;/strong&gt; you know appears in the product name&lt;/li&gt;&lt;li&gt;Retry with &lt;strong&gt;field-scoped variant queries&lt;/strong&gt; if the term is SKU/barcode&lt;/li&gt;&lt;li&gt;Retry with a &lt;strong&gt;broader query&lt;/strong&gt; to see if intersection is filtering everything out&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Document which case returns results. That tells you whether to fix data, URL parameters, or escalate platform-side.&lt;/p&gt;&lt;h3&gt;Step 4 : Compare collection filters vs search filters&lt;/h3&gt;&lt;p&gt;Many themes implement filters on &lt;strong&gt;collection pages&lt;/strong&gt; (&lt;code&gt;/collections/handle?filter.p.m...&lt;/code&gt;) separately from &lt;strong&gt;search results&lt;/strong&gt; (&lt;code&gt;/search?type=product&amp;amp;filter.p.m...&amp;amp;q=&lt;/code&gt;). Behaviour can diverge:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Collection filters may use native Shopify filter UI with encoded state&lt;/li&gt;&lt;li&gt;Search filters may be custom-built anchor tags from metaobject menus&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If collection + filter works but search + filter + term fails, compare URL encoding side by side. Copy the filter parameter verbatim from a working collection URL into a search URL before changing metafield definitions.&lt;/p&gt;&lt;h3&gt;Step 5 : Validate metafield definition settings&lt;/h3&gt;&lt;p&gt;In &lt;strong&gt;Settings → Custom data → Products&lt;/strong&gt;, open the referencing metafield:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Storefront filtering enabled&lt;/li&gt;&lt;li&gt;Correct namespace and key (matches your &lt;code&gt;filter.p.m&lt;/code&gt; segment)&lt;/li&gt;&lt;li&gt;Type matches usage (single vs list metaobject reference)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Step 6 : Audit reference integrity&lt;/h3&gt;&lt;p&gt;Export or spot-check products in the filtered set. Missing references, stale GIDs after metaobject duplication, or mixed manual/imported data often cause &amp;quot;works for some SKUs, fails for others&amp;quot; reports.&lt;/p&gt;&lt;p&gt;After bulk edits, allow time for storefront indexing before declaring combined queries broken. A filter that works for Monday&#39;s import batch may still fail for products updated Tuesday if references were not normalised to the same metaobject entry IDs. Retest combined URLs on a sample of five products across different model families, not just the one SKU that prompted the support ticket. Spread tests across brands or collections if your catalogue is segmented that way.&lt;/p&gt;&lt;h2&gt;How to fix it&lt;/h2&gt;&lt;h3&gt;Fix 1 : Align search UI with indexed fields&lt;/h3&gt;&lt;p&gt;If shoppers search by SKU but the theme sends a plain &lt;code&gt;q=&lt;/code&gt; parameter, add UX that maps SKU-shaped input to field-scoped search where appropriate, or surface SKU matches through predictive search apps that handle variant indexing explicitly.&lt;/p&gt;&lt;p&gt;Do not assume visible title text and search index behaviour are identical.&lt;/p&gt;&lt;h3&gt;Fix 2 : Normalise filter URL generation in the theme&lt;/h3&gt;&lt;p&gt;Centralise filter link building in one Liquid snippet or JavaScript module:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Always URL-encode GIDs&lt;/li&gt;&lt;li&gt;Use metafield namespace/key from settings, not hardcoded guesses&lt;/li&gt;&lt;li&gt;Preserve existing &lt;code&gt;q&lt;/code&gt; when toggling filters (and vice versa)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;On builds where we implement compatibility catalogues, we store the metaobject GID map in theme settings or a metaobject-powered menu so merchandisers cannot link stale IDs.&lt;/p&gt;&lt;h3&gt;Fix 3 : Split discovery paths when intersection is unreliable&lt;/h3&gt;&lt;p&gt;If a platform edge case blocks combined queries for your use case, architect &lt;strong&gt;two intentional paths&lt;/strong&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Browse by model&lt;/strong&gt;, collection or search with filter only, no text term&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Text search&lt;/strong&gt;, search without metaobject filter, then narrow in UI client-side for small result sets&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This is a workaround, not ideal, but preferable to a broken primary UX while awaiting platform fixes or support confirmation.&lt;/p&gt;&lt;h3&gt;Fix 4 : Right-size the data model before filters&lt;/h3&gt;&lt;p&gt;If you are early in metaobject adoption, design for filters from day one:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Need&lt;/th&gt;&lt;th&gt;Prefer&lt;/th&gt;&lt;th&gt;Avoid&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Shared series copy on PDP&lt;/td&gt;&lt;td&gt;Metaobject reference&lt;/td&gt;&lt;td&gt;50 duplicate metafield pastes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Filterable model/compatibility&lt;/td&gt;&lt;td&gt;List metaobject reference + filter-enabled definition&lt;/td&gt;&lt;td&gt;Tag-if chains in product templates&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Merchant-editable unique copy&lt;/td&gt;&lt;td&gt;Product metafields&lt;/td&gt;&lt;td&gt;Metaobject per SKU&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;The three-level pattern, tag-if for tiny catalogues, product metafields for unique content, metaobjects for shared structured data, keeps PDPs maintainable &lt;strong&gt;and&lt;/strong&gt; makes filter facets predictable.&lt;/p&gt;&lt;h3&gt;Fix 6 : Design metaobjects for discovery from the start&lt;/h3&gt;&lt;p&gt;Merchants often adopt metaobjects to solve &lt;strong&gt;product page content&lt;/strong&gt; first: one &amp;quot;Model&amp;quot; or &amp;quot;Series&amp;quot; entry, referenced across many SKUs, rendered in a section without tag branching. That is the right instinct. The mistake is stopping there, publishing PDP content while filter URLs are still an afterthought.&lt;/p&gt;&lt;p&gt;When planning a metaobject definition, decide upfront:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Will this metaobject power &lt;strong&gt;storefront filters&lt;/strong&gt; as well as PDP modules?&lt;/li&gt;&lt;li&gt;Is the product-side field a &lt;strong&gt;single&lt;/strong&gt; or &lt;strong&gt;list&lt;/strong&gt; reference?&lt;/li&gt;&lt;li&gt;Who maintains the GID map when entries are added, renamed, or deprecated?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If the answer to filtering is yes, enable storefront filtering on the product metafield definition before bulk-importing catalogue data. Retrofitting filter settings onto 2,000 products costs more than enabling the flag on day one.&lt;/p&gt;&lt;p&gt;For list references (multiple models per product), confirm your theme filter UI sends &lt;strong&gt;one GID per active filter state&lt;/strong&gt;, not comma-separated labels or display names. Filters address metaobject identity, not human-readable copy.&lt;/p&gt;&lt;h2&gt;Metaobjects, Liquid, and where filters sit in the stack&lt;/h2&gt;&lt;p&gt;It helps to separate three layers merchants conflate:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Layer 1, Admin data.&lt;/strong&gt; Metaobject definitions, entries, and product metafield references. This is where filtering is enabled and where reference integrity matters.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Layer 2, Theme rendering.&lt;/strong&gt; Liquid reads &lt;code&gt;product.metafields.custom.{key}.value&lt;/code&gt; for PDP sections, collection cards, and filter chips. Use &lt;code&gt;metafield_tag&lt;/code&gt; for rich text, printing raw &lt;code&gt;.value&lt;/code&gt; on rich text fields surfaces JSON in HTML, a common &amp;quot;my metaobject looks broken&amp;quot; report unrelated to search.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Layer 3, Storefront query URLs.&lt;/strong&gt; &lt;code&gt;/search&lt;/code&gt; and collection pages accept filter parameters independent of how well your Liquid renders metaobject content. A beautiful PDP proves Layer 2. Combined filter + search tests prove Layer 3.&lt;/p&gt;&lt;p&gt;Teams that succeed with metaobject catalogues treat all three layers as one &lt;strong&gt;Storefront Architecture&lt;/strong&gt; deliverable. Teams that struggle often nail Layer 2, skip Layer 3 until launch, then firefight empty grids under paid traffic.&lt;/p&gt;&lt;p&gt;If you are comparing tag-based shortcuts with structured data, &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 how navigation and merchandising structure affect discovery, metaobject filters are part of that same system, not a separate plugin concern.&lt;/p&gt;&lt;h2&gt;Worked example: parts catalogue mental model&lt;/h2&gt;&lt;p&gt;Imagine a spare parts store where each product fits multiple equipment models. Merchants store models as &lt;strong&gt;list.metaobject_reference&lt;/strong&gt; on products. PDPs show compatible model names from the metaobject. Filter chips append &lt;code&gt;filter.p.m.custom.models={gid}&lt;/code&gt; to search.&lt;/p&gt;&lt;p&gt;Shoppers search by part number in the title, &lt;code&gt;Diaphragm (15225488)&lt;/code&gt;. Search-only works. Filter-only for that model GID works. Combined fails.&lt;/p&gt;&lt;p&gt;Your diagnosis matrix says the product satisfies both constraints in admin, so you test:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Title word &lt;code&gt;diaphragm&lt;/code&gt; instead of numeric string, same failure → unlikely variant-only matching&lt;/li&gt;&lt;li&gt;Filter-only with adjacent model GID, works → filter index healthy&lt;/li&gt;&lt;li&gt;Combined with alternate product in same model family, fails consistently → intersection bug or platform edge case, not one bad SKU&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;That evidence is what you hand to support or a partner, not a screenshot of an empty grid.&lt;/p&gt;&lt;h2&gt;Performance and preview caveats&lt;/h2&gt;&lt;p&gt;Filter debugging often happens in the theme editor or preview URLs. Remember that &lt;strong&gt;Theme Editor preview and live storefront caching&lt;/strong&gt; can diverge, CSS and asset pipelines behave differently under &lt;code&gt;compiled_assets&lt;/code&gt; CDN paths. If filters look broken only in preview, validate on the published theme URL before changing data models.&lt;/p&gt;&lt;p&gt;Performance-wise, heavy metaobject loops on collection pages interact with filter UX. Keep filter chip counts reasonable, avoid N+1 Liquid patterns when reading metaobject fields on large grids, and lazy-load PDP metaobject modules below the fold. &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; remains the baseline for keeping structured data from slowing the storefront once filters go live.&lt;/p&gt;&lt;h3&gt;Fix 5 : Platform support with reproduction evidence&lt;/h3&gt;&lt;p&gt;When isolated tests prove combined queries fail consistently, open a partner or Shopify developer support thread with:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Exact reproduction URLs (search-only, filter-only, combined)&lt;/li&gt;&lt;li&gt;Product ID and metaobject GID&lt;/li&gt;&lt;li&gt;Metafield definition screenshots (filtering enabled)&lt;/li&gt;&lt;li&gt;Confirmation that title-level terms fail, not only SKU&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Vague &amp;quot;filters broken&amp;quot; reports slow resolution. URL matrices speed it up.&lt;/p&gt;&lt;h2&gt;When to get help&lt;/h2&gt;&lt;p&gt;Bring in a storefront architect when:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Metaobjects power &lt;strong&gt;both&lt;/strong&gt; PDP modules and discovery filters across 100+ SKUs&lt;/li&gt;&lt;li&gt;Multiple metafield namespaces interact (model, series, material) and filter URLs multiply&lt;/li&gt;&lt;li&gt;Theme editor preview and live storefront diverge while you are debugging filter behaviour&lt;/li&gt;&lt;li&gt;You are migrating from tag-based filters and need a cutover plan without SEO URL chaos&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;On catalogue-heavy work, from &lt;a href=&quot;https://ocontis.studio/projects/industry/auto-moto/&quot;&gt;auto/moto parts&lt;/a&gt; compatibility to &lt;a href=&quot;https://ocontis.studio/projects/industry/fashion-and-apparel/&quot;&gt;fashion&lt;/a&gt; series merchandising, filter and search behaviour should be tested in the same sprint as PDP metaobject templates, not weeks later.&lt;/p&gt;&lt;p&gt;Bulk imports and ERP syncs often populate metaobject references overnight while filter URLs go untested until marketing launches a &amp;quot;shop by model&amp;quot; campaign. Schedule a combined-query smoke test whenever reference fields change at scale, not only when PDP templates deploy.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Metaobject filters combined with storefront search fail in a specific, diagnosable way: &lt;strong&gt;each query path works alone, intersection fails&lt;/strong&gt;. This should not push you back to tag-if templates or away from structured data. It should push you to treat discovery URLs as part of your &lt;strong&gt;Storefront Architecture&lt;/strong&gt;, alongside metafield definitions, reference integrity, and search field strategy.&lt;/p&gt;&lt;p&gt;Run the three-URL test matrix on one product. Fix URL generation and field-scoped search before rewriting the catalogue. Enable filtering on definitions early. And if combined queries still fail with clean evidence, escalate with reproduction links rather than guessing in Liquid.&lt;/p&gt;&lt;p&gt;The stores that get metaobjects right treat filters as &lt;strong&gt;catalogue infrastructure&lt;/strong&gt;, not a theme ticket you open after launch. That mindset shift is what separates a PDP that renders beautifully from a discovery experience shoppers can actually navigate.&lt;/p&gt;&lt;p&gt;If combined queries still fail after a clean fix pass, &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;book a stack assessment&lt;/a&gt; or see &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/shopify-theme-development/&quot;&gt;Shopify theme development&lt;/a&gt; for storefront architecture work.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>How to Fix Shopify Checkout Abandonment When Your Funnel Looks Healthy</title>
    <link href="https://ocontis.studio/blog/post/how-to-fix-shopify-checkout-abandonment-when-your-funnel-looks-healthy/" />
    <updated>2026-07-11T14:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/how-to-fix-shopify-checkout-abandonment-when-your-funnel-looks-healthy/</id>
    <content type="html">&lt;h1&gt;How to Fix Shopify Checkout Abandonment When Your Funnel Looks Healthy&lt;/h1&gt;&lt;p&gt;Your Meta ads are working. Click-through rate is strong. Cost per click is under control. People land, browse, add to cart, and start checkout.&lt;/p&gt;&lt;p&gt;Then nothing.&lt;/p&gt;&lt;p&gt;Zero purchases. Support confirms no failed payments. Shipping is free. Reviews are live. You have rebuilt the cart twice and stripped out anything that looked like friction.&lt;/p&gt;&lt;p&gt;Your &lt;strong&gt;funnel&lt;/strong&gt; is often working fine. The useful question is &lt;strong&gt;where buyers stop trusting the last step&lt;/strong&gt;, and whether you are measuring that step with enough granularity to fix it.&lt;/p&gt;&lt;p&gt;This reflects patterns we see regularly across the Shopify merchant community: solid ad metrics, healthy add-to-cart rates, double-digit checkout initiations, and complete silence on completed orders. The instinct is to blame the product, the price, or the creative. Frequently the leak is narrower: hosted checkout presentation, first-screen hesitation, or payment-step friction you cannot see from Czechia on a US-only store.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;Checkout abandonment on Shopify is usually discussed as a single metric. That flattening hides the diagnosis.&lt;/p&gt;&lt;p&gt;A merchant with thirty add to carts, nineteen checkout starts, and zero purchases is not failing at awareness. They are failing, or more precisely, &lt;strong&gt;buyers are stopping, somewhere inside Shopify hosted checkout&lt;/strong&gt;. That is a different fix path from low traffic, weak creative, or a broken add-to-cart button.&lt;/p&gt;&lt;p&gt;We audit storefronts where conversion work starts on the product page because that is where theme debt lives. But when &lt;strong&gt;checkout-start rate&lt;/strong&gt; is already high, continuing to redesign the homepage is expensive procrastination. The work moves to abandoned checkout records, checkout branding, first-screen copy, and payment presentation on the device your traffic actually uses.&lt;/p&gt;&lt;p&gt;This guide walks through a practitioner diagnostic for the specific pattern: &lt;strong&gt;strong funnel metrics through checkout initiation, zero completed purchases&lt;/strong&gt;. It covers how to bucket abandonment, what each bucket implies, which fixes merchants overlook on standard Shopify plans, and when the data says you still need more traffic before drawing conclusions.&lt;/p&gt;&lt;p&gt;If you are scaling paid acquisition on a &lt;a href=&quot;https://ocontis.studio/blog/post/the-anatomy-of-a-high-performance-shopify-theme/&quot;&gt;high-performance Shopify theme&lt;/a&gt; and completion rate is stuck, start here before you cut price or pause ads. For broader context on where hidden costs erode margin while top-of-funnel looks fine, see &lt;a href=&quot;https://ocontis.studio/blog/post/the-real-cost-of-running-a-shopify-store/&quot;&gt;the real cost of running a Shopify store&lt;/a&gt;. If revenue is flat even after checkout fixes, read &lt;a href=&quot;https://ocontis.studio/blog/post/why-most-shopify-stores-dont-scale-past-50k-month/&quot;&gt;Shopify ecommerce growth plateau causes and what to do&lt;/a&gt;. Plan tier shapes checkout branding on standard plans and when &lt;a href=&quot;https://ocontis.studio/services/shopify-ui-extensions-and-functions/&quot;&gt;checkout extensibility&lt;/a&gt; requires Plus: 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;.&lt;/p&gt;&lt;h2&gt;What merchants are running into&lt;/h2&gt;&lt;p&gt;The community version of this problem follows a recognisable script.&lt;/p&gt;&lt;p&gt;A single-product store runs cold US traffic from short-form video ads. The offer is a kitchen gadget or impulse-friendly physical product priced in the mid-range, often $45–$60 with free US shipping. Round one surfaces a Markets misconfiguration: cart API errors for US visitors because the US market was not enabled. That gets fixed.&lt;/p&gt;&lt;p&gt;Round two shows encouraging funnel shape:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Landing page views in the low hundreds from modest ad spend&lt;/li&gt;&lt;li&gt;Add-to-cart rate above ten percent&lt;/li&gt;&lt;li&gt;Checkout-start rate above fifty percent of carts&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Zero completed purchases&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The merchant has already verified Shopify Payments, removed shipping surprises, imported social proof, tested discount codes, and rebuilt cart UX, sometimes removing express checkout buttons from a custom cart page to reduce clutter. Shopify Support reports no declined cards. Session recordings show people clicking checkout, then going dark, often because analytics tools cannot record hosted checkout on every plan.&lt;/p&gt;&lt;p&gt;When abandoned checkout data is finally opened, a sharper picture appears. Of nineteen checkout initiations, sixteen buyers left &lt;strong&gt;before entering contact details&lt;/strong&gt;. Three entered shipping and billing information, reached the payment page, and abandoned there. Two problems, not one.&lt;/p&gt;&lt;p&gt;That split matters. Merchants who treat “checkout abandonment” as a single blob chase payment gateway ghosts while ignoring first-screen trust gaps, or vice versa.&lt;/p&gt;&lt;h2&gt;Why this happens&lt;/h2&gt;&lt;h3&gt;1. The funnel metric mirage&lt;/h3&gt;&lt;p&gt;Add-to-cart rate and checkout-start rate are &lt;strong&gt;intent signals&lt;/strong&gt;, not revenue signals. On cold traffic, they can look healthy while completion rate stays near zero because the buyer never committed money.&lt;/p&gt;&lt;p&gt;Impulse categories from video ads convert when friction is low &lt;strong&gt;and&lt;/strong&gt; when the final step still feels like the same brand promise. A polished advertorial and product page followed by a generic, unbranded checkout is a common break point, especially for first-time visitors who have no relationship with the store.&lt;/p&gt;&lt;h3&gt;2. First-screen abandonment (the silent majority)&lt;/h3&gt;&lt;p&gt;When most checkout sessions end before contact entry, suspect:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Visual discontinuity&lt;/strong&gt;, default checkout styling, missing logo, colours that do not match the storefront&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Total shock on step one&lt;/strong&gt;, tax, shipping language, or subtotal presentation that differs from the product page promise&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Discount code field anxiety&lt;/strong&gt;, buyers pause because they think they are missing a coupon&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ad-to-offer mismatch&lt;/strong&gt;, creative promise does not match what checkout displays&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Mobile layout friction&lt;/strong&gt;, fields, keyboards, or scrolling that feel heavier than expected&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This is not a payments bug. It is a &lt;strong&gt;confidence bug at the threshold of identity disclosure&lt;/strong&gt;.&lt;/p&gt;&lt;h3&gt;3. Payment-step abandonment (the smaller but scarier bucket)&lt;/h3&gt;&lt;p&gt;When buyers enter contact, shipping, and billing but stop at payment, investigate:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Payment methods not rendering as expected on target devices&lt;/li&gt;&lt;li&gt;Wallet buttons buried below fold on mobile&lt;/li&gt;&lt;li&gt;Business name or descriptor on card statements that feels unfamiliar&lt;/li&gt;&lt;li&gt;Final total differing from mental model built on the product page&lt;/li&gt;&lt;li&gt;Residual distrust on unknown brands at full price&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Merchants outside the target market often cannot reproduce this without a US browser, US IP, and US payment instrument. “No failed payments in admin” confirms the gateway did not reject transactions. It does not prove buyers saw a trustworthy payment screen.&lt;/p&gt;&lt;h3&gt;4. Sample size versus signal&lt;/h3&gt;&lt;p&gt;With twelve checkout starts, some commentators will say the dataset is too small. That is partially true for statistical certainty. It is &lt;strong&gt;not&lt;/strong&gt; an excuse to ignore a 0% completion rate when checkout starts are in double digits on verified tracking. The correct response is to isolate the last mile with bucket analysis and a real-market test, not to scale spend hoping noise resolves itself.&lt;/p&gt;&lt;h3&gt;5. Mechanical issues you must still rule out first&lt;/h3&gt;&lt;p&gt;Before psychological fixes, confirm:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Markets and shipping zones match the traffic you are buying&lt;/li&gt;&lt;li&gt;Cart/add API returns success for target-country sessions&lt;/li&gt;&lt;li&gt;No script conflicts (analytics, clarity, custom pixels) breaking cart after install&lt;/li&gt;&lt;li&gt;Test mode off, payouts active, and payment methods enabled for the buyer’s country&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;One merchant’s round-one 422 errors were real. Fixing Markets was necessary, but it did not explain zero purchases after the fix when ATC and checkout starts accumulated cleanly.&lt;/p&gt;&lt;h2&gt;How to diagnose it&lt;/h2&gt;&lt;p&gt;Use a fixed sequence. Do not skip steps because creative feels strong.&lt;/p&gt;&lt;figure class=&quot;blog-diagram epmb-figure&quot; role=&quot;figure&quot; aria-labelledby=&quot;epmb-2-caption&quot; data-diagram-id=&quot;epmb-2&quot;&gt;
  &lt;p class=&quot;epmb-figure__summary visually-hidden&quot; id=&quot;epmb-2-summary&quot;&gt;Checkout abandonment 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-2&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: 872.8515625px;&quot; viewBox=&quot;-8 -50.1015625 872.8515625 622.2796874999999&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot;&gt;&lt;style&gt;#epmb-2{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-2 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#epmb-2 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#epmb-2 .error-icon{fill:#141414;}#epmb-2 .error-text{fill:#ebebeb;stroke:#ebebeb;}#epmb-2 .edge-thickness-normal{stroke-width:1px;}#epmb-2 .edge-thickness-thick{stroke-width:3.5px;}#epmb-2 .edge-pattern-solid{stroke-dasharray:0;}#epmb-2 .edge-thickness-invisible{stroke-width:0;fill:none;}#epmb-2 .edge-pattern-dashed{stroke-dasharray:3;}#epmb-2 .edge-pattern-dotted{stroke-dasharray:2;}#epmb-2 .marker{fill:#8a8a7a;stroke:#8a8a7a;}#epmb-2 .marker.cross{stroke:#8a8a7a;}#epmb-2 svg{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;}#epmb-2 p{margin:0;}#epmb-2 .label{font-family:&#39;Syne&#39;,system-ui,sans-serif;color:#fafae6;}#epmb-2 .cluster-label text{fill:#fafae6;}#epmb-2 .cluster-label span{color:#fafae6;}#epmb-2 .cluster-label span p{background-color:transparent;}#epmb-2 .label text,#epmb-2 span{fill:#fafae6;color:#fafae6;}#epmb-2 .node rect,#epmb-2 .node circle,#epmb-2 .node ellipse,#epmb-2 .node polygon,#epmb-2 .node path{fill:#141414;stroke:#db5461;stroke-width:1px;}#epmb-2 .rough-node .label text,#epmb-2 .node .label text,#epmb-2 .image-shape .label,#epmb-2 .icon-shape .label{text-anchor:middle;}#epmb-2 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#epmb-2 .rough-node .label,#epmb-2 .node .label,#epmb-2 .image-shape .label,#epmb-2 .icon-shape .label{text-align:center;}#epmb-2 .node.clickable{cursor:pointer;}#epmb-2 .root .anchor path{fill:#8a8a7a!important;stroke-width:0;stroke:#8a8a7a;}#epmb-2 .arrowheadPath{fill:#f1eff0;}#epmb-2 .edgePath .path{stroke:#8a8a7a;stroke-width:1px;}#epmb-2 .flowchart-link{stroke:#8a8a7a;fill:none;}#epmb-2 .edgeLabel{background-color:#141414;text-align:center;}#epmb-2 .edgeLabel p{background-color:#141414;}#epmb-2 .edgeLabel rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-2 .labelBkg{background-color:rgba(20, 20, 20, 0.5);}#epmb-2 .cluster rect{fill:#141414;stroke:hsl(0, 0%, 17.8431372549%);stroke-width:1px;}#epmb-2 .cluster text{fill:#fafae6;}#epmb-2 .cluster span{color:#fafae6;}#epmb-2 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-2 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fafae6;}#epmb-2 rect.text{fill:none;stroke-width:0;}#epmb-2 .icon-shape,#epmb-2 .image-shape{background-color:#141414;text-align:center;}#epmb-2 .icon-shape p,#epmb-2 .image-shape p{background-color:#141414;padding:2px;}#epmb-2 .icon-shape .label rect,#epmb-2 .image-shape .label rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-2 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#epmb-2 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#epmb-2 .node .neo-node{stroke:#db5461;}#epmb-2 [data-look=&quot;neo&quot;].node rect,#epmb-2 [data-look=&quot;neo&quot;].cluster rect,#epmb-2 [data-look=&quot;neo&quot;].node polygon{stroke:url(#epmb-2-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-2 [data-look=&quot;neo&quot;].swimlane.cluster rect{filter:none;}#epmb-2 [data-look=&quot;neo&quot;].node path{stroke:url(#epmb-2-gradient);stroke-width:1px;}#epmb-2 [data-look=&quot;neo&quot;].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-2 [data-look=&quot;neo&quot;].node .neo-line path{stroke:#db5461;filter:none;}#epmb-2 [data-look=&quot;neo&quot;].node circle{stroke:url(#epmb-2-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-2 [data-look=&quot;neo&quot;].node circle .state-start{fill:#000000;}#epmb-2 [data-look=&quot;neo&quot;].icon-shape .icon{fill:url(#epmb-2-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-2 [data-look=&quot;neo&quot;].icon-shape .icon-neo path{stroke:url(#epmb-2-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-2 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;epmb-2_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-2_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-2_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-2_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-2_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-2_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-2_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-2_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-2_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-2_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-2_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-2_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;M403.211,63.089L403.211,67.256C403.211,71.422,403.211,79.756,403.211,87.422C403.211,95.089,403.211,102.089,403.211,105.589L403.211,109.089&quot; id=&quot;epmb-2-L_SIGNAL_BUCKET_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_SIGNAL_BUCKET_0&quot; data-points=&quot;W3sieCI6NDAzLjIxMDkzNzUsInkiOjYzLjA4OTA2MjV9LHsieCI6NDAzLjIxMDkzNzUsInkiOjg4LjA4OTA2MjV9LHsieCI6NDAzLjIxMDkzNzUwMDAwMDA2LCJ5IjoxMTMuMDg5MDYyNTAwMDAwMDR9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-2_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M322.688,276.777L288.63,294.364C254.573,311.951,186.458,347.126,152.401,368.304C118.344,389.483,118.344,396.667,118.344,400.258L118.344,403.85&quot; id=&quot;epmb-2-L_BUCKET_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_BUCKET_A_0&quot; data-points=&quot;W3sieCI6MzIyLjY4NzY4OTE5MjcwMjQ2LCJ5IjoyNzYuNzc2NzUxNjkyNzAyNH0seyJ4IjoxMTguMzQzNzUsInkiOjM4Mi4zfSx7IngiOjExOC4zNDM3NSwieSI6NDA3Ljg1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-2_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M403.211,357.3L403.211,361.467C403.211,365.633,403.211,373.967,403.211,381.725C403.211,389.483,403.211,396.667,403.211,400.258L403.211,403.85&quot; id=&quot;epmb-2-L_BUCKET_B_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_BUCKET_B_0&quot; data-points=&quot;W3sieCI6NDAzLjIxMDkzNzUsInkiOjM1Ny4zMDAwMDAwMDAwMDAxfSx7IngiOjQwMy4yMTA5Mzc1LCJ5IjozODIuM30seyJ4Ijo0MDMuMjEwOTM3NSwieSI6NDA3Ljg1fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-2_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M483.992,276.519L518.456,294.149C552.919,311.779,621.846,347.04,656.31,368.17C690.773,389.3,690.773,396.3,690.773,399.8L690.773,403.3&quot; id=&quot;epmb-2-L_BUCKET_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_BUCKET_C_0&quot; data-points=&quot;W3sieCI6NDgzLjk5MjAzMTA3NDQ3NzcsInkiOjI3Ni41MTg5MDY0MjU1MjI0fSx7IngiOjY5MC43NzM0Mzc1LCJ5IjozODIuM30seyJ4Ijo2OTAuNzczNDM3NSwieSI6NDA3LjN9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-2_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M118.344,460.739L118.344,464.997C118.344,469.256,118.344,477.772,145.669,486.965C172.994,496.158,227.644,506.028,254.969,510.962L282.294,515.897&quot; id=&quot;epmb-2-L_A_TEST_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_A_TEST_0&quot; data-points=&quot;W3sieCI6MTE4LjM0Mzc1LCJ5Ijo0NjAuNzM5MDYyNTAwMDAwMDV9LHsieCI6MTE4LjM0Mzc1LCJ5Ijo0ODYuMjg5MDYyNX0seyJ4IjoyODYuMjMwNDY4NzUsInkiOjUxNi42MDc5NDA2NTg1OTU3fV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-2_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M403.211,460.739L403.211,464.997C403.211,469.256,403.211,477.772,403.211,485.531C403.211,493.289,403.211,500.289,403.211,503.789L403.211,507.289&quot; id=&quot;epmb-2-L_B_TEST_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_B_TEST_0&quot; data-points=&quot;W3sieCI6NDAzLjIxMDkzNzUsInkiOjQ2MC43MzkwNjI1MDAwMDAwNX0seyJ4Ijo0MDMuMjEwOTM3NSwieSI6NDg2LjI4OTA2MjV9LHsieCI6NDAzLjIxMDkzNzUsInkiOjUxMS4yODkwNjI0OTk5OTk5NH1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-2_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M690.773,461.289L690.773,465.456C690.773,469.622,690.773,477.956,662.999,487.091C635.225,496.227,579.677,506.164,551.903,511.133L524.129,516.102&quot; id=&quot;epmb-2-L_C_TEST_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_TEST_0&quot; data-points=&quot;W3sieCI6NjkwLjc3MzQzNzUsInkiOjQ2MS4yODkwNjI1MDAwMDAwNn0seyJ4Ijo2OTAuNzczNDM3NSwieSI6NDg2LjI4OTA2MjV9LHsieCI6NTIwLjE5MTQwNjI1LCJ5Ijo1MTYuODA1OTUwNjEwNjg1OH1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-2_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_SIGNAL_BUCKET_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_BUCKET_A_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_BUCKET_B_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_BUCKET_C_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_A_TEST_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_B_TEST_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_C_TEST_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-2-flowchart-SIGNAL-0&quot; data-look=&quot;classic&quot; transform=&quot;translate(403.2109375, 35.54453125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-127.9921875&quot; y=&quot;-27.54453125&quot; width=&quot;255.984375&quot; height=&quot;55.0890625&quot;/&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(0, -12.54453125)&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;Strong&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; 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 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;checkout&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; starts&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;Zero&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; purchases&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; last-mile&lt;/tspan&gt;&lt;/tspan&gt;&lt;tspan class=&quot;text-outer-tspan row&quot; x=&quot;0&quot; y=&quot;3.2em&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;problem&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-2-flowchart-BUCKET-2&quot; data-look=&quot;classic&quot; transform=&quot;translate(403.2109375, 235.19453125)&quot;&gt;&lt;polygon points=&quot;122.10546875,0 244.2109375,-122.10546875 122.10546875,-244.2109375 0,-122.10546875&quot; class=&quot;label-container&quot; transform=&quot;translate(-121.60546875, 122.10546875)&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;Where&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; did&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; stop?&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-2-flowchart-A-4&quot; data-look=&quot;classic&quot; transform=&quot;translate(118.34375, 434.29453125000003)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-110.34375&quot; y=&quot;-26.44453125&quot; width=&quot;220.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;A&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; No&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; contact&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;Audit&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; step&lt;/tspan&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&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;epmb-2-flowchart-B-6&quot; data-look=&quot;classic&quot; transform=&quot;translate(403.2109375, 434.29453125000003)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-124.5234375&quot; y=&quot;-26.44453125&quot; width=&quot;249.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;B&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; Mid-form&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;Totals&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; delivery&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; clarity&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-2-flowchart-C-8&quot; data-look=&quot;classic&quot; transform=&quot;translate(690.7734375, 434.29453125000003)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-113.0390625&quot; y=&quot;-26.99453125&quot; width=&quot;226.078125&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;C&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; Payment&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; page&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;Methods,&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; wallets,&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; final&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;total&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-2-flowchart-TEST-10&quot; data-look=&quot;classic&quot; transform=&quot;translate(403.2109375, 537.73359375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-116.98046875&quot; y=&quot;-26.44453125&quot; width=&quot;233.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;Full-price&lt;/tspan&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; test&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&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;target&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; market&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-2-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-2-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-2-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;428.42578125&quot; y=&quot;-25&quot; class=&quot;flowchartTitleText&quot;&gt;Checkout abandonment diagnostic&lt;/text&gt;&lt;/svg&gt;
  &lt;/div&gt;
  
  &lt;figcaption class=&quot;epmb-figure__caption&quot; id=&quot;epmb-2-caption&quot;&gt;Checkout abandonment diagnostic&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h3&gt;Step 1 : Confirm the funnel shape&lt;/h3&gt;&lt;p&gt;Pull seven days of data aligned to the same traffic source and landing page:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Sessions or landing page views&lt;/li&gt;&lt;li&gt;Add to carts&lt;/li&gt;&lt;li&gt;Checkout initiated&lt;/li&gt;&lt;li&gt;Purchases&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Calculate ATC rate and checkout-start rate as a share of carts, not sessions. Compare to your category baseline, not a generic ecommerce average. Short-form video traffic to a single-product page will differ from email or brand search.&lt;/p&gt;&lt;p&gt;If both ATC and checkout-start rates are healthy, &lt;strong&gt;stop optimising the ad hook for now&lt;/strong&gt;. Move downstream.&lt;/p&gt;&lt;h3&gt;Step 2 : Bucket abandoned checkouts&lt;/h3&gt;&lt;p&gt;In Shopify Admin, open abandoned checkouts for the same window. Classify each record:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Bucket&lt;/th&gt;&lt;th&gt;What happened&lt;/th&gt;&lt;th&gt;Likely cause family&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;A, Bounced at door&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Opened checkout, no contact entered&lt;/td&gt;&lt;td&gt;Trust, branding, first-screen total, offer mismatch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;B, Stopped mid-form&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Contact or address partially entered&lt;/td&gt;&lt;td&gt;Field friction, shipping surprise, delivery timeline doubt&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;C, Payment page exit&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Full details entered, no purchase&lt;/td&gt;&lt;td&gt;Payment presentation, price justification, wallet UX, cold-brand scepticism&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Count each bucket. If bucket A dominates, as in the nineteen-checkout example, payment gateway debugging is the wrong first move.&lt;/p&gt;&lt;h3&gt;Step 3 : Reconcile storefront and checkout brand&lt;/h3&gt;&lt;p&gt;Walk the journey on a mid-tier mobile device on Wi‑Fi and throttled 4G:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ad landing page → product → cart → checkout step one&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Ask: would a first-time buyer believe this is the same store?&lt;/p&gt;&lt;p&gt;On standard Shopify plans, &lt;strong&gt;checkout branding is configurable&lt;/strong&gt;. Logo, brand colours, and background should match the storefront. Default blue checkout on a bespoke DTC site is a conversion tax on cold traffic.&lt;/p&gt;&lt;h3&gt;Step 4 : Run one controlled variable test&lt;/h3&gt;&lt;p&gt;Merchants often change five things between rounds and learn nothing. Pick one lever:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Restore express checkout on cart for a single ad set&lt;/li&gt;&lt;li&gt;Align checkout branding only&lt;/li&gt;&lt;li&gt;Remove or de-emphasise discount code field on step one&lt;/li&gt;&lt;li&gt;Test full price versus one explicit offer on the landing page&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Hold creative, audience, and landing destination constant for at least forty-eight hours or until you have ten new checkout starts, whichever comes first.&lt;/p&gt;&lt;h3&gt;Step 5 : Validate with a real buyer test at full price&lt;/h3&gt;&lt;p&gt;A 99% discount code proves mechanics. It does not prove willingness to pay $54.99 from a Reels impulse click.&lt;/p&gt;&lt;p&gt;Recruit a buyer in the target market. Ask them to complete the journey on mobile at &lt;strong&gt;full price&lt;/strong&gt;, narrating anything that feels off: business name, delivery dates, tax line, payment buttons, statement descriptor. Screen recordings from the buyer beat guessing from admin.&lt;/p&gt;&lt;h2&gt;How to fix it&lt;/h2&gt;&lt;p&gt;Fixes follow buckets. Work top down.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Bucket&lt;/th&gt;&lt;th&gt;Symptom&lt;/th&gt;&lt;th&gt;First fixes to apply&lt;/th&gt;&lt;th&gt;What to measure next&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;A, Bounced at door&lt;/td&gt;&lt;td&gt;Checkout opened, no contact entered&lt;/td&gt;&lt;td&gt;Checkout branding (logo, colours), align totals with PDP, clarify free shipping before checkout, reduce coupon-field prominence&lt;/td&gt;&lt;td&gt;Share of checkouts with contact entered&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;B, Stopped mid-form&lt;/td&gt;&lt;td&gt;Partial address or shipping step exit&lt;/td&gt;&lt;td&gt;Delivery date copy, market restrictions, phone field requirement, unexpected tax lines&lt;/td&gt;&lt;td&gt;Shipping step completion rate&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;C, Payment page exit&lt;/td&gt;&lt;td&gt;Full details, no purchase&lt;/td&gt;&lt;td&gt;Wallet visibility on mobile, payment method order, statement descriptor clarity, price anchoring on PDP&lt;/td&gt;&lt;td&gt;Completed orders per payment page session&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mechanical&lt;/td&gt;&lt;td&gt;ATC or checkout errors in console&lt;/td&gt;&lt;td&gt;Markets config, script conflicts, cart API 422/503, disable duplicate tracking snippets&lt;/td&gt;&lt;td&gt;Successful cart/add for target geo&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3&gt;Fix checkout branding first when bucket A dominates&lt;/h3&gt;&lt;p&gt;This is the fastest win merchants miss. Cold traffic does not forgive a storefront-to-checkout identity break.&lt;/p&gt;&lt;p&gt;Configure logo, colours, and background in checkout settings until step one feels continuous with the product page. Re-run the mobile walkthrough. If you would hesitate, so will buyers.&lt;/p&gt;&lt;h3&gt;Align promise, price, and total before checkout&lt;/h3&gt;&lt;p&gt;Review advertorial claims against product page price, bundle framing, and checkout subtotal. Cold traffic punishes mismatch at money time.&lt;/p&gt;&lt;p&gt;If you tested a steep discount internally and reverted, ensure no leftover messaging suggests a lower price exists elsewhere. Confusion reads as distrust.&lt;/p&gt;&lt;h3&gt;Treat express checkout as a test lever, not a religion&lt;/h3&gt;&lt;p&gt;Removing Shop Pay, Apple Pay, and PayPal from a &lt;strong&gt;custom cart&lt;/strong&gt; may simplify UX, but mobile impulse buyers often complete faster with wallets visible early.&lt;/p&gt;&lt;p&gt;If wallets remain on hosted checkout only, measure whether buyers ever reach them. On some themes, cart simplification helps; on short-form cold traffic, it hurts. Let data from one controlled ad set decide.&lt;/p&gt;&lt;h3&gt;Use session replay where you can, and accept where you cannot&lt;/h3&gt;&lt;p&gt;Tools like Microsoft Clarity help on storefront and cart pages. Hosted checkout visibility varies by plan and tooling, which creates blind spots exactly where completion happens. When recordings stop at checkout, &lt;strong&gt;abandoned checkout rows in admin become your session replay&lt;/strong&gt;. Treat each record as a partial recording: timestamp, device, recovery URL, and how far the buyer progressed.&lt;/p&gt;&lt;p&gt;Merchants who wait for perfect analytics coverage before fixing checkout branding often burn ad spend in the gap. Imperfect data plus bucket counts still beats guessing.&lt;/p&gt;&lt;h3&gt;Document each round so you do not re-debug the same ghost&lt;/h3&gt;&lt;p&gt;Round-based troubleshooting, fix Markets, rebuild cart, strip wallets, add reviews, fails when outcomes are not logged against a baseline. Keep a simple run log: date range, traffic source, landing URL, ATC count, checkout starts, purchases, and the one variable you changed. Without that, you cannot know whether checkout branding moved contact-entry rate or whether you just had a quieter traffic week.&lt;/p&gt;&lt;p&gt;This discipline matters more on single-product stores where sample sizes stay small for weeks. You are not looking for statistical certainty on day five. You are looking for &lt;strong&gt;directional movement in bucket B and C&lt;/strong&gt; after a specific fix.&lt;/p&gt;&lt;h3&gt;Use abandonment emails for recovery, not diagnosis&lt;/h3&gt;&lt;p&gt;Email sequences for abandoned checkout are worth running. They do not replace bucket analysis. Recovery captures buyers who already trusted you enough to enter email. They do not fix first-screen branding gaps blocking the majority. Sequence copy should mirror the same totals and delivery promises you fixed on checkout step one, otherwise you are recovering people into the same broken experience.&lt;/p&gt;&lt;h3&gt;Know when price is the product problem&lt;/h3&gt;&lt;p&gt;Honest community feedback on impulse gadgets often lands on &lt;strong&gt;price perception versus alternatives&lt;/strong&gt;. That is a positioning and offer architecture problem, not a checkout bug.&lt;/p&gt;&lt;p&gt;If bucket C persists after branding and payment presentation fixes, model contribution margin at realistic conversion rates using a &lt;a href=&quot;https://ocontis.studio/tools/unit-economics-simulator/&quot;&gt;unit economics framework&lt;/a&gt; before slashing price. You can hit attractive ROAS on paper and still lose money, especially when variable costs and returns are ignored. We have written about that gap between ad efficiency and profit in &lt;a href=&quot;https://ocontis.studio/blog/post/why-your-shopify-store-can-hit-4x-roas-and-still-lose-money/&quot;&gt;why strong ROAS still loses money&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;When to get help&lt;/h2&gt;&lt;p&gt;Escalate when:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;You have &lt;strong&gt;bucketed data&lt;/strong&gt; and completed the branding plus full-price market test&lt;/li&gt;&lt;li&gt;Checkout-start volume is meaningful on paid traffic but completion stays flat&lt;/li&gt;&lt;li&gt;Fixes require coordinated changes across theme cart, checkout settings, apps, and analytics&lt;/li&gt;&lt;li&gt;You suspect app or script conflicts but cannot isolate them without a staging environment&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Do not escalate solely because purchases are zero on fifty sessions. That is still early. Do escalate when nineteen people start checkout and zero pay, after you have ruled out Markets errors and payment failure logs.&lt;/p&gt;&lt;p&gt;For theme-level issues earlier in the journey, JavaScript weight, section sprawl, mobile CTA placement, pair this checkout work with a theme conversion audit. &lt;a href=&quot;https://ocontis.studio/blog/post/common-theme-mistakes-that-kill-conversion-rates/&quot;&gt;Common theme mistakes that kill conversion&lt;/a&gt; covers the upstream layer.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Strong add-to-cart and checkout-start metrics with zero purchases feel maddening because every generic playbook says “fix your ads” or “lower your price.” Often the ads are doing their job. Buyers are signalling intent right until money moves.&lt;/p&gt;&lt;p&gt;Split abandonment into buckets. Fix checkout branding when most sessions die before contact entry. Treat payment-step exits as trust and presentation problems, not invisible gateway failures. Validate at full price in the target market on mobile.&lt;/p&gt;&lt;p&gt;The merchants who escape this loop stop treating checkout as a black box because hosted checkout is inconvenient to record. They read abandoned checkout rows, change one variable, and measure contact-entry rate, not just ROAS.&lt;/p&gt;&lt;p&gt;When structural checkout changes are needed on Plus, see &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 stack assessment&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>The Hidden Cost of Running a Shopify Store: When 12 Apps Quietly Eat Your Margins</title>
    <link href="https://ocontis.studio/blog/post/the-hidden-cost-of-running-a-shopify-store-when-12-apps-quietly-eat-your-margins/" />
    <updated>2026-07-11T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/the-hidden-cost-of-running-a-shopify-store-when-12-apps-quietly-eat-your-margins/</id>
    <content type="html">&lt;h1&gt;The Hidden Cost of Running a Shopify Store: When 12 Apps Quietly Eat Your Margins&lt;/h1&gt;&lt;p&gt;Launch week is loud. Theme choices, photography, checkout polish, first campaigns. Everyone watches the storefront.&lt;/p&gt;&lt;p&gt;Six months later, the loudest frustration is quieter and more expensive. Inventory does not match the warehouse. Tax figures disagree with accounting. Returns workflows fight your email platform. Analytics dashboards contradict Shopify admin. Nobody can say which system owns the truth.&lt;/p&gt;&lt;p&gt;The store did not fail at build. It failed at &lt;strong&gt;operational architecture&lt;/strong&gt;, a dozen apps each doing one job, none accountable for the whole.&lt;/p&gt;&lt;p&gt;You clearly need apps on Shopify. The question worth asking is whether your &lt;strong&gt;backend stack costs more than your theme&lt;/strong&gt;, and whether twelve subscriptions are quietly eating the margin your ads and merchandising are supposed to protect.&lt;/p&gt;&lt;h2&gt;Shopify app cost factors to include in your audit&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Shopify app cost factors&lt;/strong&gt; include subscription fees, usage tiers, duplicate tools, theme script weight, and staff time reconciling conflicting data. Run a quarterly audit: list every app, calculate true monthly cost, remove overlap, and assign one system of record per domain (inventory, tax, email, analytics).&lt;/p&gt;&lt;p&gt;Merchants often count only App Store invoices. A fuller picture includes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Monthly and annual subscriptions&lt;/strong&gt; per app, including tier jumps as order volume grows&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Usage-based fees&lt;/strong&gt; (SMS, reviews, returns, personalisation) that scale with GMV&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Agency and internal time&lt;/strong&gt; spent fixing sync errors, exports, and dashboard disagreements&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Performance tax:&lt;/strong&gt; extra JavaScript from overlapping apps that hurts conversion even when the theme is lean&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Opportunity cost:&lt;/strong&gt; margin you lose when finance cannot trust a single revenue or inventory figure&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If revenue is flat while the stack keeps growing, read &lt;a href=&quot;https://ocontis.studio/blog/post/why-most-shopify-stores-dont-scale-past-50k-month/&quot;&gt;Shopify ecommerce growth plateau causes and what to do next&lt;/a&gt; before you install another point solution.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;Merchants budget for Shopify plans, payment fees, and theme work. Few budget for &lt;strong&gt;app compound cost&lt;/strong&gt;: the monthly subscriptions, usage overages, agency hours spent reconciling data, and the margin leakage that never appears on a single invoice.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Start with the pillar:&lt;/strong&gt; &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; maps total cost of ownership across plans, payments, development, and constraints. &lt;strong&gt;This article goes deeper on one slice&lt;/strong&gt; merchants feel most acutely after launch: &lt;strong&gt;app bloat and operational complexity&lt;/strong&gt;. You get a &lt;strong&gt;quarterly audit framework&lt;/strong&gt;, a &lt;strong&gt;one source of truth stack&lt;/strong&gt; model, and clear signs that your backend is costing more than your frontend.&lt;/p&gt;&lt;p&gt;If you are scaling paid acquisition, pair this with &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; and our &lt;a href=&quot;https://ocontis.studio/tools/unit-economics-simulator/&quot;&gt;&lt;em&gt;Unit Economics Simulator&lt;/em&gt;&lt;/a&gt;, app overhead belongs in contribution margin, not just in the finance spreadsheet.&lt;/p&gt;&lt;h2&gt;What merchants are running into after launch&lt;/h2&gt;&lt;p&gt;The frustration pattern is consistent across audits. The storefront converts. Operations do not scale cleanly.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Inventory drift&lt;/strong&gt;, Shopify stock, warehouse WMS, and marketplace feeds show different numbers by Thursday&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Tax and accounting mismatch&lt;/strong&gt;, Avalara, Shopify Tax, or manual spreadsheets disagree with Xero or QuickBooks&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Returns in one place, customers in another&lt;/strong&gt;, loop platforms, helpdesk, and ESP each hold partial order history&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Email and SMS silos&lt;/strong&gt;, Klaviyo, Postscript, and Shopify Email overlapping with conflicting attribution&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Analytics sprawl&lt;/strong&gt;, Triple Whale, Northbeam, GA4, and Shopify reports telling different stories about the same campaign&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Nobody owns the map&lt;/strong&gt;, apps installed by a freelancer, an agency, and a founder over eighteen months; no documented stack&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;These are not theme problems. They are &lt;strong&gt;stack problems&lt;/strong&gt;. Merchants still pour budget into redesigns and CRO tests while the backend charges rent on every order.&lt;/p&gt;&lt;h2&gt;Why twelve apps happen, and why they stay&lt;/h2&gt;&lt;p&gt;Shopify&#39;s core platform is deliberately narrow. It handles catalogue, cart, checkout, and baseline order flow well. It does not natively solve advanced inventory, international tax, subscription logic, loyalty, or sophisticated analytics. The App Store exists to fill those gaps.&lt;/p&gt;&lt;p&gt;Each gap feels small in isolation. A returns app after chargebacks spike. A reviews app before a product launch. A search app when collection pages underperform. A tax app when you cross a border. An ERP connector when wholesale starts. None of these decisions are wrong in the moment.&lt;/p&gt;&lt;p&gt;The failure mode is &lt;strong&gt;incremental ownership&lt;/strong&gt;. Every app becomes the system of record for its slice, until two slices claim the same slice. Inventory sync runs through one connector; bundles through another. Email flows trigger from Shopify tags and a separate ESP segment logic. Finance exports from three dashboards and merges in Google Sheets.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The store was built in weeks. The operating model accreted in layers nobody designed.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Teams tolerate the friction because it is familiar. Reconciliation becomes someone&#39;s Tuesday. Subscription invoices auto-renew. Removing an app feels risky without knowing what breaks. So the stack grows, and &lt;strong&gt;margin quietly compresses&lt;/strong&gt;.&lt;/p&gt;&lt;figure class=&quot;blog-diagram epmb-figure&quot; role=&quot;figure&quot; aria-labelledby=&quot;epmb-3-caption&quot; data-diagram-id=&quot;epmb-3&quot;&gt;
  &lt;p class=&quot;epmb-figure__summary visually-hidden&quot; id=&quot;epmb-3-summary&quot;&gt;Quarterly Shopify app audit&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-3&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: 350.56640625px;&quot; viewBox=&quot;-8 -50.1015625 350.56640625 531.646875&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot;&gt;&lt;style&gt;#epmb-3{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-3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#epmb-3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#epmb-3 .error-icon{fill:#141414;}#epmb-3 .error-text{fill:#ebebeb;stroke:#ebebeb;}#epmb-3 .edge-thickness-normal{stroke-width:1px;}#epmb-3 .edge-thickness-thick{stroke-width:3.5px;}#epmb-3 .edge-pattern-solid{stroke-dasharray:0;}#epmb-3 .edge-thickness-invisible{stroke-width:0;fill:none;}#epmb-3 .edge-pattern-dashed{stroke-dasharray:3;}#epmb-3 .edge-pattern-dotted{stroke-dasharray:2;}#epmb-3 .marker{fill:#8a8a7a;stroke:#8a8a7a;}#epmb-3 .marker.cross{stroke:#8a8a7a;}#epmb-3 svg{font-family:&#39;Syne&#39;,system-ui,sans-serif;font-size:16px;}#epmb-3 p{margin:0;}#epmb-3 .label{font-family:&#39;Syne&#39;,system-ui,sans-serif;color:#fafae6;}#epmb-3 .cluster-label text{fill:#fafae6;}#epmb-3 .cluster-label span{color:#fafae6;}#epmb-3 .cluster-label span p{background-color:transparent;}#epmb-3 .label text,#epmb-3 span{fill:#fafae6;color:#fafae6;}#epmb-3 .node rect,#epmb-3 .node circle,#epmb-3 .node ellipse,#epmb-3 .node polygon,#epmb-3 .node path{fill:#141414;stroke:#db5461;stroke-width:1px;}#epmb-3 .rough-node .label text,#epmb-3 .node .label text,#epmb-3 .image-shape .label,#epmb-3 .icon-shape .label{text-anchor:middle;}#epmb-3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#epmb-3 .rough-node .label,#epmb-3 .node .label,#epmb-3 .image-shape .label,#epmb-3 .icon-shape .label{text-align:center;}#epmb-3 .node.clickable{cursor:pointer;}#epmb-3 .root .anchor path{fill:#8a8a7a!important;stroke-width:0;stroke:#8a8a7a;}#epmb-3 .arrowheadPath{fill:#f1eff0;}#epmb-3 .edgePath .path{stroke:#8a8a7a;stroke-width:1px;}#epmb-3 .flowchart-link{stroke:#8a8a7a;fill:none;}#epmb-3 .edgeLabel{background-color:#141414;text-align:center;}#epmb-3 .edgeLabel p{background-color:#141414;}#epmb-3 .edgeLabel rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-3 .labelBkg{background-color:rgba(20, 20, 20, 0.5);}#epmb-3 .cluster rect{fill:#141414;stroke:hsl(0, 0%, 17.8431372549%);stroke-width:1px;}#epmb-3 .cluster text{fill:#fafae6;}#epmb-3 .cluster span{color:#fafae6;}#epmb-3 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-3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#fafae6;}#epmb-3 rect.text{fill:none;stroke-width:0;}#epmb-3 .icon-shape,#epmb-3 .image-shape{background-color:#141414;text-align:center;}#epmb-3 .icon-shape p,#epmb-3 .image-shape p{background-color:#141414;padding:2px;}#epmb-3 .icon-shape .label rect,#epmb-3 .image-shape .label rect{opacity:0.5;background-color:#141414;fill:#141414;}#epmb-3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#epmb-3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#epmb-3 .node .neo-node{stroke:#db5461;}#epmb-3 [data-look=&quot;neo&quot;].node rect,#epmb-3 [data-look=&quot;neo&quot;].cluster rect,#epmb-3 [data-look=&quot;neo&quot;].node polygon{stroke:url(#epmb-3-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-3 [data-look=&quot;neo&quot;].swimlane.cluster rect{filter:none;}#epmb-3 [data-look=&quot;neo&quot;].node path{stroke:url(#epmb-3-gradient);stroke-width:1px;}#epmb-3 [data-look=&quot;neo&quot;].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-3 [data-look=&quot;neo&quot;].node .neo-line path{stroke:#db5461;filter:none;}#epmb-3 [data-look=&quot;neo&quot;].node circle{stroke:url(#epmb-3-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-3 [data-look=&quot;neo&quot;].node circle .state-start{fill:#000000;}#epmb-3 [data-look=&quot;neo&quot;].icon-shape .icon{fill:url(#epmb-3-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-3 [data-look=&quot;neo&quot;].icon-shape .icon-neo path{stroke:url(#epmb-3-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#epmb-3 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;epmb-3_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-3_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-3_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-3_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-3_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-3_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-3_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-3_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-3_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-3_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-3_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-3_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;M136.855,60.889L136.855,65.056C136.855,69.222,136.855,77.556,136.855,85.222C136.855,92.889,136.855,99.889,136.855,103.389L136.855,106.889&quot; id=&quot;epmb-3-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;W3sieCI6MTM2Ljg1NTQ2ODc1LCJ5Ijo2MC44ODkwNjI0OTk5OTk5OTR9LHsieCI6MTM2Ljg1NTQ2ODc1LCJ5Ijo4NS44ODkwNjI1fSx7IngiOjEzNi44NTU0Njg3NSwieSI6MTEwLjg4OTA2MjUwMDAwMDAxfV0=&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-3_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M136.855,163.778L136.855,167.945C136.855,172.111,136.855,180.445,136.855,188.111C136.855,195.778,136.855,202.778,136.855,206.278L136.855,209.778&quot; id=&quot;epmb-3-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;W3sieCI6MTM2Ljg1NTQ2ODc1LCJ5IjoxNjMuNzc4MTI1MDAwMDAwMDJ9LHsieCI6MTM2Ljg1NTQ2ODc1LCJ5IjoxODguNzc4MTI1fSx7IngiOjEzNi44NTU0Njg3NSwieSI6MjEzLjc3ODEyNX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-3_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M136.855,266.667L136.855,270.834C136.855,275.001,136.855,283.334,136.855,291.001C136.855,298.667,136.855,305.667,136.855,309.167L136.855,312.667&quot; id=&quot;epmb-3-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;W3sieCI6MTM2Ljg1NTQ2ODc1LCJ5IjoyNjYuNjY3MTg3NX0seyJ4IjoxMzYuODU1NDY4NzUsInkiOjI5MS42NjcxODc0OTk5OTk5NX0seyJ4IjoxMzYuODU1NDY4NzUsInkiOjMxNi42NjcxODc0OTk5OTk5NX1d&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-3_flowchart-v2-pointEnd)&quot;/&gt;&lt;path d=&quot;M136.855,369.556L136.855,373.723C136.855,377.89,136.855,386.223,136.855,393.89C136.855,401.556,136.855,408.556,136.855,412.056L136.855,415.556&quot; id=&quot;epmb-3-L_S4_DOMAINS_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_S4_DOMAINS_0&quot; data-points=&quot;W3sieCI6MTM2Ljg1NTQ2ODc1LCJ5IjozNjkuNTU2MjV9LHsieCI6MTM2Ljg1NTQ2ODc1LCJ5IjozOTQuNTU2MjV9LHsieCI6MTM2Ljg1NTQ2ODc1LCJ5Ijo0MTkuNTU2MjV9XQ==&quot; data-look=&quot;classic&quot; marker-end=&quot;url(#epmb-3_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 class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_S4_DOMAINS_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-3-flowchart-S1-0&quot; data-look=&quot;classic&quot; transform=&quot;translate(136.85546875, 34.44453125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-117.01171875&quot; y=&quot;-26.44453125&quot; width=&quot;234.0234375&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; 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; 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;owner,&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; 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-3-flowchart-S2-1&quot; data-look=&quot;classic&quot; transform=&quot;translate(136.85546875, 137.33359375)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-125.5&quot; y=&quot;-26.44453125&quot; width=&quot;251&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; Calculate&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; true&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; monthly&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;cost&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-3-flowchart-S3-2&quot; data-look=&quot;classic&quot; transform=&quot;translate(136.85546875, 240.22265625)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-104.37109375&quot; y=&quot;-26.44453125&quot; width=&quot;208.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;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; Check&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; overlap&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; by&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;domain&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-3-flowchart-S4-3&quot; data-look=&quot;classic&quot; transform=&quot;translate(136.85546875, 343.11171874999997)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-128.85546875&quot; y=&quot;-26.44453125&quot; width=&quot;257.7109375&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; One&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; source&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; of&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; truth&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; per&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;domain&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-3-flowchart-DOMAINS-9&quot; data-look=&quot;classic&quot; transform=&quot;translate(136.85546875, 446.55078125)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-127.26953125&quot; y=&quot;-26.99453125&quot; width=&quot;254.5390625&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;Inventory&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; tax&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; email&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;analytics&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; each&lt;/tspan&gt;&lt;tspan font-style=&quot;normal&quot; class=&quot;text-inner-tspan&quot; font-weight=&quot;normal&quot;&gt; needs&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&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;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-3-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-3-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-3-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;167.283203125&quot; y=&quot;-25&quot; class=&quot;flowchartTitleText&quot;&gt;Quarterly Shopify app audit&lt;/text&gt;&lt;/svg&gt;
  &lt;/div&gt;
  
  &lt;figcaption class=&quot;epmb-figure__caption&quot; id=&quot;epmb-3-caption&quot;&gt;Quarterly Shopify app audit&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h2&gt;Signs your backend costs more than your theme&lt;/h2&gt;&lt;p&gt;Theme spend is visible: agency quotes, redesign projects, A/B tests on product templates. Backend spend hides across subscriptions, usage tiers, and labour.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Your backend likely costs more than your theme when:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Combined app subscriptions exceed what you spend on theme maintenance or CRO in a quarter&lt;/li&gt;&lt;li&gt;Staff or agencies reconcile inventory, revenue, or tax figures manually every week&lt;/li&gt;&lt;li&gt;Page speed audits blame apps, not the theme, yet the theme was never the heaviest script loader&lt;/li&gt;&lt;li&gt;You pay for three tools that all touch order data (returns, tax, email) without a documented data owner&lt;/li&gt;&lt;li&gt;New hires need a &amp;quot;tool walkthrough&amp;quot; before they can answer a basic customer query&lt;/li&gt;&lt;li&gt;You hesitate to remove an app because nobody knows what still depends on it&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;A polished theme improves conversion rate. A bloated backend taxes &lt;strong&gt;every converted order&lt;/strong&gt; with fees, sync delays, and error correction. For how theme and app weight interact on the storefront, 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;, the diagnosis often points to apps, not Liquid.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Cost layer&lt;/th&gt;&lt;th&gt;Typical monthly range (growing store)&lt;/th&gt;&lt;th&gt;Visibility&lt;/th&gt;&lt;th&gt;Scales with orders?&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Shopify plan&lt;/td&gt;&lt;td&gt;£79–£299&lt;/td&gt;&lt;td&gt;High, single invoice&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;App subscriptions (8–15 apps)&lt;/td&gt;&lt;td&gt;£400–£1,800&lt;/td&gt;&lt;td&gt;Medium, split across vendors&lt;/td&gt;&lt;td&gt;Sometimes (usage tiers)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Theme maintenance &amp;amp; CRO&lt;/td&gt;&lt;td&gt;£200–£600&lt;/td&gt;&lt;td&gt;Medium, project-based&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Ops reconciliation time&lt;/td&gt;&lt;td&gt;£500–£2,000 (staff/agency hours)&lt;/td&gt;&lt;td&gt;Low, buried in payroll&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Performance drag from app scripts&lt;/td&gt;&lt;td&gt;Conversion %, hard to invoice&lt;/td&gt;&lt;td&gt;Very low&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;The row merchants miss is &lt;strong&gt;ops reconciliation time&lt;/strong&gt;. A £49/month app that saves six hours of manual exports is a bargain. A £99/month app that duplicates an existing connector and adds two hours of weekly fixes is expensive at any price.&lt;/p&gt;&lt;h2&gt;The quarterly app audit framework&lt;/h2&gt;&lt;p&gt;Treat your app stack like inventory: count it, value it, rotate the dead stock. Run this every quarter, calendar it before peak season, not after a crisis.&lt;/p&gt;&lt;h3&gt;Step 1: Inventory and ownership&lt;/h3&gt;&lt;p&gt;Export every installed app from Shopify admin. For each, record:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Monthly subscription and usage-based fees&lt;/li&gt;&lt;li&gt;Who installed it and when&lt;/li&gt;&lt;li&gt;The &lt;strong&gt;one job&lt;/strong&gt; it is supposed to own&lt;/li&gt;&lt;li&gt;Which customer-facing or finance workflow breaks if you remove it&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If nobody can name the owner, the app is already a liability.&lt;/p&gt;&lt;h3&gt;Step 2: Calculate true monthly cost&lt;/h3&gt;&lt;p&gt;Subscription price is the floor, not the total. Add:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Usage overages (SMS, reviews, returns processed)&lt;/li&gt;&lt;li&gt;Agency or staff hours tied to that tool&lt;/li&gt;&lt;li&gt;Downstream cost of errors (wrong stock, mis-taxed orders, duplicate emails)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Compare the total to the value it replaces. An app that costs £150/month but eliminates ten hours of manual work may stay. One that costs £40/month but forces weekly reconciliation should not survive on price alone.&lt;/p&gt;&lt;h3&gt;Step 3: Overlap and drift check&lt;/h3&gt;&lt;p&gt;Group apps by &lt;strong&gt;domain&lt;/strong&gt;, not by brand:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Domain&lt;/th&gt;&lt;th&gt;Ask&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Inventory &amp;amp; fulfilment&lt;/td&gt;&lt;td&gt;Which system owns stock truth?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tax &amp;amp; compliance&lt;/td&gt;&lt;td&gt;Which layer calculates and reports?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Returns &amp;amp; post-purchase&lt;/td&gt;&lt;td&gt;Which tool initiates and tracks?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Email &amp;amp; SMS&lt;/td&gt;&lt;td&gt;Which platform owns consent and send?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Analytics &amp;amp; attribution&lt;/td&gt;&lt;td&gt;Which spine feeds finance and marketing?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Search &amp;amp; merchandising&lt;/td&gt;&lt;td&gt;Which tool indexes and ranks?&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Two apps in the same column with active write access to order or product data is overlap. Drift is when each was correct at install and wrong together six months later.&lt;/p&gt;&lt;h3&gt;Step 4: Consolidate or cut&lt;/h3&gt;&lt;p&gt;For each overlap, pick &lt;strong&gt;one source of truth&lt;/strong&gt;. Demote the other to read-only, replace with native Shopify capability where sufficient, or remove entirely. Document the decision in a simple stack map your team can reference before the next install.&lt;/p&gt;&lt;p&gt;Cuts should be deliberate. Removing tax or returns tooling without a replacement is how audits become emergencies.&lt;/p&gt;&lt;h2&gt;Building a one source of truth stack&lt;/h2&gt;&lt;p&gt;A healthy Shopify operation does not minimise apps, it &lt;strong&gt;minimises conflicting owners&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Inventory and fulfilment.&lt;/strong&gt; Shopify holds catalogue and sellable quantity for most merchants. When wholesale, multi-warehouse, or marketplace complexity arrives, one ERP or WMS owns fulfilment truth. Connectors sync into Shopify; they do not fight each other for write priority.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tax.&lt;/strong&gt; One compliance layer per jurisdiction model. If Shopify Tax covers your footprint, avoid a second calculator on checkout. If you use Avalara or TaxJar, ensure order tags and exemptions flow one way into accounting.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Returns.&lt;/strong&gt; One platform initiates returns, updates inventory, and triggers customer communication. Helpdesk sees the status; it does not become a parallel returns database.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Email and SMS.&lt;/strong&gt; One ESP owns consent, segments, and attribution. Shopify customer records stay in sync; flows do not duplicate across three send tools.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Analytics.&lt;/strong&gt; One reporting spine, whether that is Shopify analytics plus finance exports, or a dedicated attribution tool, feeds the numbers marketing and finance both trust. Disagreement between dashboards is a architecture bug, not a reporting preference.&lt;/p&gt;&lt;p&gt;This is not minimalism for its own sake. It is &lt;strong&gt;margin preservation&lt;/strong&gt;. Every duplicate owner is a subscription plus reconciliation tax on every order. Plan selection still matters, 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;, but Plus does not fix a stack that was never designed.&lt;/p&gt;&lt;h2&gt;When consolidation is worth the disruption&lt;/h2&gt;&lt;p&gt;Not every store should rip out apps tomorrow. Consolidation pays off when:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Manual reconciliation exceeds a few hours per week&lt;/li&gt;&lt;li&gt;App subscriptions plus ops time exceed theme and acquisition spend combined&lt;/li&gt;&lt;li&gt;You are preparing for scale (new market, wholesale, or headcount) and the current stack will not survive volume&lt;/li&gt;&lt;li&gt;A rebuild or migration is already planned, stack design should lead the technical brief, not follow it. Use our &lt;a href=&quot;https://ocontis.studio/tools/migration-readiness-assessment/&quot;&gt;&lt;em&gt;Migration Readiness Assessment&lt;/em&gt;&lt;/a&gt; to score readiness before scoping the project.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Defer consolidation when revenue is unstable, the team lacks bandwidth to test cutover, or overlap is cosmetic (two analytics views, one owner). The framework still helps, you document truth now and schedule cuts later.&lt;/p&gt;&lt;p&gt;For brands where storefront performance is the bottleneck, invest in theme architecture first. &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; explains the structural shift that reduces page-builder app dependency, and &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; outlines what lean frontend structure looks like. For brands where operations eat margin after every sale, fix the stack first. Most mature stores need both, sequenced honestly.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;The hidden cost of running a Shopify store is often not the plan, the theme, or the ads. It is the &lt;strong&gt;operational layer&lt;/strong&gt;, twelve apps that each made sense alone and cost a fortune together.&lt;/p&gt;&lt;p&gt;Run the quarterly audit. Assign one source of truth per domain. Measure true cost, not list price. If your backend reconciliation bill exceeds your theme line item, you do not have a conversion problem, you have a stack problem.&lt;/p&gt;&lt;p&gt;New to Shopify cost modelling? Read &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; first for the full TCO map, then return here for the app audit framework.&lt;/p&gt;&lt;p&gt;If the audit surfaces integration overlap or runaway app spend, see &lt;a href=&quot;https://ocontis.studio/services/shopify-app-development/&quot;&gt;Shopify custom app development&lt;/a&gt;, &lt;a href=&quot;https://ocontis.studio/services/integrations-and-system-optimisation/&quot;&gt;Integrations and System Optimisation&lt;/a&gt;, or &lt;a href=&quot;https://ocontis.studio/services/shopify-stack-audit/&quot;&gt;Shopify Stack Audit&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Google AI Overviews for Shopify: What Merchants Should Actually Optimise</title>
    <link href="https://ocontis.studio/blog/post/google-ai-overviews-for-shopify-what-merchants-should-actually-optimise/" />
    <updated>2026-07-10T10:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/google-ai-overviews-for-shopify-what-merchants-should-actually-optimise/</id>
    <content type="html">&lt;h1&gt;Google AI Overviews for Shopify : What Merchants Should Actually Optimise&lt;/h1&gt;&lt;p&gt;Every few months, a new acronym arrives to panic the ecommerce inbox. &lt;strong&gt;GEO&lt;/strong&gt;. &lt;strong&gt;LLMO&lt;/strong&gt;. &lt;strong&gt;AI SEO scores&lt;/strong&gt;. Agencies sell audits. Apps add badges. Slack channels fill with screenshots of ChatGPT recommending a competitor’s moisturiser while ignoring yours.&lt;/p&gt;&lt;p&gt;Google AI Overviews sit at the centre of this anxiety, especially for Shopify merchants who already depend on Google Shopping, organic product discovery, and paid search for a meaningful share of revenue.&lt;/p&gt;&lt;p&gt;AI-shaped search clearly matters. The practical question is &lt;strong&gt;which layer of your Shopify operation AI systems can actually read&lt;/strong&gt;, and whether your current optimisation budget is pointed at that layer or at theatre.&lt;/p&gt;&lt;p&gt;This article separates community hype from the levers practitioners can verify today: Merchant Center product data, product page truth, and the operational discipline that keeps them aligned.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;Shopify merchants are being asked to optimise for a surface that is still maturing. Google’s AI shopping experiences pull from the &lt;strong&gt;Shopping Graph&lt;/strong&gt;, a structured product knowledge layer fed primarily by Merchant Center, not by your theme’s meta tags alone.&lt;/p&gt;&lt;p&gt;That reframes the work.&lt;/p&gt;&lt;p&gt;If your feed says one thing and your product detail page says another, no amount of blog content will convince an AI system to recommend the SKU with confidence. If your top-selling products lack variant clarity, FAQ-style facts, or review density, conversational queries will route to competitors whose data is simply easier to parse.&lt;/p&gt;&lt;p&gt;This reflects patterns we see regularly across the Shopify merchant and developer community: intense interest in AI ranking signals, confusion about where feed optimisation ends and on-site SEO begins, and a rush toward tools that promise visibility without changing product truth.&lt;/p&gt;&lt;p&gt;We work on Shopify builds where discovery, conversion, and data architecture intersect, from &lt;a href=&quot;https://ocontis.studio/projects/industry/beauty-and-skincare/&quot;&gt;beauty &amp;amp; skincare&lt;/a&gt; launches with dense variant catalogues to performance-sensitive storefronts where page experience still matters for human buyers even when AI documentation remains vague on technical signals.&lt;/p&gt;&lt;p&gt;The goal here is not a checklist copied from a Google AMA. It is a practitioner framework for where to invest this quarter, and what to ignore until measurement catches up.&lt;/p&gt;&lt;h2&gt;What the community is reacting to&lt;/h2&gt;&lt;p&gt;Three anxieties keep surfacing in merchant conversations.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;First: opacity.&lt;/strong&gt; AI Overviews do not publish a transparent ranking formula equivalent to classic SEO folklore. Merchants want to know which signals “win”, E-E-A-T, schema, reviews, feed attributes, Core Web Vitals, buying guides, and in what order. When the answer is “Google has not confirmed yet,” the vacuum fills with speculation.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Second: feed versus storefront.&lt;/strong&gt; Many stores treat Google Shopping as a performance channel managed by ads teams, while SEO owns the blog and collection pages. AI shopping blurs that boundary. The product facts AI cites may come from Merchant Center even when the shopper never clicks through to a PDP, yet the PDP still must match those facts when they do click.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Third: tool fatigue.&lt;/strong&gt; New “AI visibility” products score pages using opaque models. They create activity without confirming whether Google’s shopping AI consumed the inputs those scores claim to improve. Merchants risk paying twice: once for the tool, once for the opportunity cost of not fixing feed drift on their top 50 SKUs.&lt;/p&gt;&lt;p&gt;None of this means AI visibility is fake. It means the community is early in the cycle, similar to mobile-first panic in 2012 or Core Web Vitals urgency in 2021, and the winners will be merchants who improve &lt;strong&gt;structured product truth&lt;/strong&gt; faster than competitors, not merchants who publish the most AI-themed blog posts.&lt;/p&gt;&lt;h2&gt;What is actually changing&lt;/h2&gt;&lt;p&gt;Google’s public guidance for AI shopping surfaces emphasises &lt;strong&gt;rich, accurate product data&lt;/strong&gt; in Merchant Center, including newer conversational attributes designed for natural-language questions.&lt;/p&gt;&lt;p&gt;Practically, that introduces two parallel workstreams for Shopify brands:&lt;/p&gt;&lt;h3&gt;1. Merchant Center as the AI product brain&lt;/h3&gt;&lt;p&gt;Your feed is no longer just an ads prerequisite. It is the structured vocabulary AI uses to answer questions like “Does this run quiet enough for an open-plan kitchen?” or “Which variant includes the extended warranty?”&lt;/p&gt;&lt;p&gt;High-impact areas merchants still underfill:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Product highlights&lt;/strong&gt;, short, quotable selling points AI can reuse directly&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Product details&lt;/strong&gt;, structured spec sections (name/value pairs) for technical queries&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Question and answer&lt;/strong&gt;, FAQ pairs in plain language mapped from PDP content&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Variant options and item group titles&lt;/strong&gt;, clarity when Shopify variant logic exceeds default colour/size/material&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Related products&lt;/strong&gt;, accessories, spare parts, and “often bought with” relationships&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Document links&lt;/strong&gt;, manuals, spec PDFs, ingredient lists, assembly guides&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Popularity rank&lt;/strong&gt;, relative ranking within your catalogue for “best” or “most popular” queries&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;These attributes do not replace core feed hygiene. They extend it. A store with perfect conversational fields but wrong GTINs, stale availability, or mismatched prices still fails the basics.&lt;/p&gt;&lt;h3&gt;2. On-site content for broader AI answers&lt;/h3&gt;&lt;p&gt;AI Overviews also draw on &lt;strong&gt;informational and comparative content&lt;/strong&gt; when shoppers ask category-level questions, not only product cards. Buying guides, comparison tables, collection narratives, and internally linked editorial pages help AI systems understand how your products relate to each other.&lt;/p&gt;&lt;p&gt;This is where Shopify’s content architecture matters. A merchant publishing orphan blog posts without links into collections and PDPs builds words, not a graph. See &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; for why section-based themes and structured templates make that linking work easier to maintain.&lt;/p&gt;&lt;p&gt;The practitioner split is simple:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Shopping AI product cards&lt;/strong&gt; → feed-first optimisation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Brand and education answers&lt;/strong&gt; → PDP + collection + editorial optimisation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Both&lt;/strong&gt; → must tell the same story&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Hype vs reality&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Claim you will hear&lt;/th&gt;&lt;th&gt;Reality on Shopify today&lt;/th&gt;&lt;th&gt;What to do instead&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;“Run an AI SEO score and fix whatever is red”&lt;/td&gt;&lt;td&gt;Scores rarely map to confirmed Google Shopping AI inputs&lt;/td&gt;&lt;td&gt;Test 10–20 real buyer prompts; trace which source types win&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;“Schema alone will get you into AI Overviews”&lt;/td&gt;&lt;td&gt;Feed gaps and PDP mismatches block trust before schema matters&lt;/td&gt;&lt;td&gt;Audit top SKUs for feed/page parity, then validate structured data&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;“Rewrite all descriptions with ChatGPT”&lt;/td&gt;&lt;td&gt;Generic copy reduces differentiation; AI systems favour factual density&lt;/td&gt;&lt;td&gt;Add specs, FAQs, use-case language tied to real product attributes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;“Core Web Vitals are confirmed AI ranking factors”&lt;/td&gt;&lt;td&gt;Google has not explicitly tied CWV to AI shopping placements&lt;/td&gt;&lt;td&gt;Still fix performance for human conversion, see our theme performance work&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;“Blog more about AI trends”&lt;/td&gt;&lt;td&gt;Editorial volume without product linkage weakens entity clarity&lt;/td&gt;&lt;td&gt;Link guides to collections and PDPs; mirror facts in feed attributes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;“Set popularity rank to 100 on everything”&lt;/td&gt;&lt;td&gt;Rank is relative within your catalogue, not a cheat code&lt;/td&gt;&lt;td&gt;Update ranks from sales velocity and margin-aware priorities&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;The table is intentionally blunt. AI discovery rewards &lt;strong&gt;clarity and consistency&lt;/strong&gt; more than novelty. That aligns with how strong Shopify operators already think about catalogue quality, AI just raises the cost of letting sloppy data persist.&lt;/p&gt;&lt;h2&gt;What merchants should do now&lt;/h2&gt;&lt;h3&gt;Phase 1 : Truth audit on top revenue SKUs (week 1–2)&lt;/h3&gt;&lt;p&gt;Pick the SKUs that matter commercially, not your entire catalogue on day one. For each:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Compare Merchant Center feed values to live PDP: title, price, availability, variant labels, key specs, review count&lt;/li&gt;&lt;li&gt;Log mismatches by root cause: feed app mapping, manual override, theme metafield gap, variant sync delay&lt;/li&gt;&lt;li&gt;Fix availability and pricing drift first, they erode trust fastest&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;On builds like &lt;a href=&quot;https://ocontis.studio/projects/medik8/&quot;&gt;Medik8&lt;/a&gt;, where variant and regimen language is clinically precise, small title inconsistencies between feed and PDP can silently degrade both ads efficiency and AI-parseable product identity.&lt;/p&gt;&lt;h3&gt;Phase 2 : Conversational attributes on winners (week 3–4)&lt;/h3&gt;&lt;p&gt;Map existing PDP FAQs and specification tables into supplemental feed fields where Google’s conversational attributes apply. Rules worth respecting:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Do not duplicate the same fact across highlight, detail, and Q&amp;amp;A fields&lt;/li&gt;&lt;li&gt;Write Q&amp;amp;A in natural shopper language, not internal SKU shorthand&lt;/li&gt;&lt;li&gt;Group variants with shared &lt;strong&gt;item group titles&lt;/strong&gt; before AI has to infer family relationships from messy titles alone&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If your Shopify FAQ content lives in accordion apps or page builders, treat export mapping as a &lt;strong&gt;data pipeline task&lt;/strong&gt;, not a copy task.&lt;/p&gt;&lt;h3&gt;Phase 3 : Editorial graph, not AI blog spam (month 2)&lt;/h3&gt;&lt;p&gt;Publish fewer, sharper pieces that connect products to decisions:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ingredient or material explainers linked from relevant collections&lt;/li&gt;&lt;li&gt;Comparison guides that state trade-offs honestly&lt;/li&gt;&lt;li&gt;Care, sizing, or compatibility content tied to metafields you also expose in feed details&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Internal linking is not a hack, it is how you teach systems (human and machine) which pages belong together. &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 how navigation and merchandising structure affect discovery and revenue; the same structural clarity helps AI entity understanding.&lt;/p&gt;&lt;h3&gt;Phase 4 : Measurement with humility (ongoing)&lt;/h3&gt;&lt;p&gt;Native AI overview reporting in Merchant Center is still rolling out. Until it is live in your account:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Maintain a prompt log: category questions, comparison queries, problem/solution searches&lt;/li&gt;&lt;li&gt;Capture which competitors appear and whether results skew product cards vs articles&lt;/li&gt;&lt;li&gt;Time-box feed changes and note before/after movement in Shopping impressions where available&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Avoid declaring victory or failure on weekly noise. AI surface behaviour will shift as Google expands reporting and user adoption.&lt;/p&gt;&lt;h2&gt;Shopify-specific implementation notes&lt;/h2&gt;&lt;p&gt;Generic SEO advice breaks quickly on Shopify because the platform splits product truth across admin, theme templates, apps, and feed exports. These are the failure modes we see most often on client audits.&lt;/p&gt;&lt;h3&gt;Feed apps are not set-and-forget&lt;/h3&gt;&lt;p&gt;Most Shopify merchants rely on a Google &amp;amp; YouTube app, a third-party feed connector, or an agency-managed supplemental feed. Each approach can work, but only with ownership rules. When marketing updates PDP copy in the theme while operations adjusts variant SKUs in admin, the feed layer often becomes a third undocumented system.&lt;/p&gt;&lt;p&gt;Assign a single owner for &lt;strong&gt;field mapping documentation&lt;/strong&gt;: which metafield populates &lt;code&gt;product_detail&lt;/code&gt;, where FAQs originate, how bundles map to &lt;code&gt;item_group_id&lt;/code&gt;, and how sale pricing flows into &lt;code&gt;sale_price&lt;/code&gt; and &lt;code&gt;availability&lt;/code&gt;. Without that document, every agency rotation reintroduces drift.&lt;/p&gt;&lt;h3&gt;Variant complexity is an AI tax&lt;/h3&gt;&lt;p&gt;Stores with nested options, shade families, bundle sizes, subscription intervals, B2B price lists, export titles that read like internal codes. AI systems parsing conversational queries need &lt;strong&gt;human-readable variant dimensions&lt;/strong&gt; and shared group titles.&lt;/p&gt;&lt;p&gt;If your theme hides variant logic behind JavaScript swatches but the feed exports bare SKUs, you are optimising for humans while starving machines. Metafields for spec sheets, compatibility, and care instructions should be treated as &lt;strong&gt;first-class product data&lt;/strong&gt;, not theme decoration. That mirrors the metafield discipline we apply on catalogue-heavy builds in &lt;a href=&quot;https://ocontis.studio/projects/industry/fashion-and-apparel/&quot;&gt;fashion &amp;amp; apparel&lt;/a&gt; and &lt;a href=&quot;https://ocontis.studio/projects/industry/health-and-wellness/&quot;&gt;health &amp;amp; wellness&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Reviews and UGC still matter commercially&lt;/h3&gt;&lt;p&gt;Google’s shopping AI documentation emphasises review signals for listing quality. Merchants frequently ask about customer-generated content beyond star ratings, video reviews, Instagram embeds, post-purchase surveys. Even where a specific format is not yet feed-supported, the underlying principle holds: &lt;strong&gt;social proof density&lt;/strong&gt; influences whether a product looks safe to recommend.&lt;/p&gt;&lt;p&gt;Practical steps on Shopify:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ensure your review app syncs counts and aggregates into the feed where supported&lt;/li&gt;&lt;li&gt;Keep review content moderated but specific, vague five-star praise helps humans less than attribute-level feedback (“fits true to size”, “quiet on low setting”)&lt;/li&gt;&lt;li&gt;Do not bury verified buyer language only in carousel widgets; mirror factual phrases in PDP specs and feed highlights where appropriate&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Original imagery is a differentiation lever, not a vanity metric&lt;/h3&gt;&lt;p&gt;Forum discussions often ask whether AI favours lifestyle photography over pack shots. The practitioner answer is simpler: &lt;strong&gt;sameness is the risk&lt;/strong&gt;. When every listing in a category shows identical white-background manufacturer assets, the product with distinctive, accurate imagery earns attention in any surface, classic Shopping, organic, or AI-mediated.&lt;/p&gt;&lt;p&gt;That does not require a full reshoot. It requires a hierarchy: hero lifestyle where it aids comprehension, accurate pack shots for variant clarity, and spec imagery for technical products. On &lt;a href=&quot;https://ocontis.studio/projects/industry/beauty-and-skincare/&quot;&gt;beauty &amp;amp; skincare&lt;/a&gt; launches, regimen and texture cues frequently outperform generic stock in both conversion tests and catalogue comprehension.&lt;/p&gt;&lt;h3&gt;Multi-store brands need explicit localisation rules&lt;/h3&gt;&lt;p&gt;Merchants operating UK and US Shopify stores, or multiple language markets, ask how to maximise AI visibility without duplication penalties. The answer is operational, not mystical:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Localise titles and descriptions where language or compliance differs; do not clone verbatim across regions&lt;/li&gt;&lt;li&gt;Ensure each market feed points to the correct domain and currency&lt;/li&gt;&lt;li&gt;Use market-specific bestseller ranks rather than copying popularity rank across catalogues&lt;/li&gt;&lt;li&gt;Link markets with consistent product identifiers (GTIN, MPN, brand) so systems recognise family relationships without merging conflicting copy&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If you are still consolidating markets inside one admin, document which collections and URLs represent each country before layering AI optimisation on top. Migration and market architecture mistakes compound under AI discovery because errors scale across every automated answer that references your catalogue.&lt;/p&gt;&lt;h3&gt;When to escalate beyond merchant-led fixes&lt;/h3&gt;&lt;p&gt;Some AI visibility blockers are not feed copy issues. They are platform architecture issues: app conflicts blocking structured data, checkout extensibility limiting subscription presentation, or ERP sync delays that make availability unreliable for high-velocity SKUs.&lt;/p&gt;&lt;p&gt;Escalate to a build partner when:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Feed mismatches trace back to theme or app architecture, not content edits&lt;/li&gt;&lt;li&gt;Variant count exceeds manageable manual mapping and needs automated metafield pipelines&lt;/li&gt;&lt;li&gt;Performance work and data work compete for the same sprint without a prioritisation framework&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&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; is a useful companion read here, not because AI adds another line item, but because &lt;strong&gt;operational complexity&lt;/strong&gt; determines whether optimisation projects actually ship.&lt;/p&gt;&lt;h2&gt;What this does not change&lt;/h2&gt;&lt;p&gt;AI anxiety should not distract from fundamentals that still drive Shopify profitability.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Unit economics still govern scale.&lt;/strong&gt; Visibility in an AI answer means little if contribution margin collapses under discounts, returns, and app stack bloat. Read &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; before scaling spend to chase new placement types.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Storefront performance still converts humans.&lt;/strong&gt; Even where Google has not confirmed CWV for AI shopping, slow PDPs and layout shift damage conversion on the traffic you already pay for. &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; remains the right baseline for technical storefront work.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Platform choice still matters strategically.&lt;/strong&gt; AI discovery does not remove Shopify’s operational constraints, markets, B2B, subscriptions, and app dependencies still shape what “good data” looks like in your stack. &lt;a href=&quot;https://ocontis.studio/blog/post/what-is-shopify-features-limitations-and-use-cases/&quot;&gt;&lt;em&gt;What Is Shopify? Features, Limitations, and Use Cases&lt;/em&gt;&lt;/a&gt; is the wider lens for that decision context.&lt;/p&gt;&lt;p&gt;AI Overviews add a &lt;strong&gt;data discipline&lt;/strong&gt; requirement on top of those fundamentals, they do not replace them.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Google AI Overviews are not a new mystic channel. They are a sharper mirror held up to product data quality, the same quality that has always separated efficient Google Shopping accounts from leaky ones.&lt;/p&gt;&lt;p&gt;For Shopify merchants, the winning move in 2026 is unglamorous:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Align feed and PDP truth on top SKUs&lt;/li&gt;&lt;li&gt;Enrich Merchant Center with conversational attributes mapped from real product knowledge&lt;/li&gt;&lt;li&gt;Build internally linked editorial content that supports category questions without contradicting feed facts&lt;/li&gt;&lt;li&gt;Test prompts manually until platform reporting matures&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The merchants who treat AI visibility as a &lt;strong&gt;catalogue operations problem&lt;/strong&gt; will outperform merchants who treat it as a content marketing trend, because AI systems recommend products they can describe accurately, not products wrapped in the best hype language.&lt;/p&gt;&lt;p&gt;When PDP structure and metafield coverage are the constraint, &lt;a href=&quot;https://ocontis.studio/services/shopify-theme-development/&quot;&gt;Shopify theme development&lt;/a&gt; or a &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;stack assessment&lt;/a&gt; usually comes before another content sprint.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Migrating from Amazon Seller Central to Shopify: Building Your D2C Channel</title>
    <link href="https://ocontis.studio/blog/post/migrating-from-amazon-to-shopify/" />
    <updated>2026-07-07T16:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/migrating-from-amazon-to-shopify/</id>
    <content type="html">&lt;h1&gt;Migrating from Amazon Seller Central to Shopify: Building Your D2C Channel&lt;/h1&gt;&lt;p&gt;Amazon is where customers find you. Shopify is where you own the relationship. The brands that treat Amazon-to-Shopify as a catalog migration miss the point. This is a channel strategy shift, not a platform swap.&lt;/p&gt;&lt;p&gt;Seller Central gives you access to demand. It does not give you customer emails, brand experience control, or margin independence. Every successful Amazon brand eventually asks: what happens if the algorithm changes, fees increase, or a competitor undercuts on the same listing?&lt;/p&gt;&lt;p&gt;Shopify is the answer to that question, but only if you treat it as a D2C business, not a mirror of your Amazon store.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;This guide covers what Amazon sellers need to know about launching on Shopify: catalog import, inventory sync, traffic strategy, and realistic expectations.&lt;/p&gt;&lt;p&gt;Run the &lt;a href=&quot;https://ocontis.studio/tools/migration-readiness-assessment/?platform=amazon&quot;&gt;&lt;em&gt;Shopify Migration Readiness Assessment&lt;/em&gt;&lt;/a&gt;. Select Amazon as your source platform and answer questions about catalogue scale, channels, and execution capacity.&lt;/p&gt;&lt;p&gt;For unit economics of scaling D2C, see the &lt;a href=&quot;https://ocontis.studio/tools/unit-economics-simulator/&quot;&gt;&lt;em&gt;Unit Economics Simulator&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;When launching Shopify makes sense (and when it does not)&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Launch Shopify when:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Amazon fees compress margin below sustainable levels&lt;/li&gt;&lt;li&gt;You want customer data for email, retention, and repeat purchase&lt;/li&gt;&lt;li&gt;Brand experience and storytelling matter for your category&lt;/li&gt;&lt;li&gt;You are investing in paid social and need a owned conversion destination&lt;/li&gt;&lt;li&gt;Subscription or bundle models are harder to run on Amazon&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Delay Shopify when:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Amazon is your only viable channel and D2C acquisition cost exceeds Amazon ROAS&lt;/li&gt;&lt;li&gt;You lack brand assets (photography, copy, identity) for a standalone storefront&lt;/li&gt;&lt;li&gt;Operations cannot handle two fulfilment channels yet&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Platform-specific data model mapping&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Amazon concept&lt;/th&gt;&lt;th&gt;Shopify equivalent&lt;/th&gt;&lt;th&gt;Notes&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;ASIN / SKU listings&lt;/td&gt;&lt;td&gt;Products + variants&lt;/td&gt;&lt;td&gt;Import via flat file or SP-API. Optimise for D2C.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;A+ Content&lt;/td&gt;&lt;td&gt;Theme sections + metafields&lt;/td&gt;&lt;td&gt;Rebuild as brand storytelling. No direct import.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Amazon categories&lt;/td&gt;&lt;td&gt;Collections + tags&lt;/td&gt;&lt;td&gt;Organise for your brand taxonomy, not Amazon browse tree.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;FBA inventory&lt;/td&gt;&lt;td&gt;Shopify inventory + sync&lt;/td&gt;&lt;td&gt;Marketplace Connect or third-party sync.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Customer data&lt;/td&gt;&lt;td&gt;Shopify customers&lt;/td&gt;&lt;td&gt;Amazon does not share customer emails. D2C list starts fresh.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Brand Registry&lt;/td&gt;&lt;td&gt;Shopify brand assets&lt;/td&gt;&lt;td&gt;Consistent identity across channels.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;URL and SEO strategy&lt;/h2&gt;&lt;p&gt;Amazon sellers launching Shopify often start with zero organic search equity on their owned domain. SEO strategy is about building from scratch, not protecting existing rankings.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;D2C SEO priorities:&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Brand keyword ownership (your brand name should rank #1)&lt;/li&gt;&lt;li&gt;Product-specific landing pages with unique content (not Amazon copy)&lt;/li&gt;&lt;li&gt;Blog and content strategy for category keywords&lt;/li&gt;&lt;li&gt;Technical SEO foundation (sitemap, structured data, page speed)&lt;/li&gt;&lt;li&gt;Google Shopping and paid search integration&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;Channel strategy framework&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Channel&lt;/th&gt;&lt;th&gt;Role&lt;/th&gt;&lt;th&gt;Shopify integration&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Amazon&lt;/td&gt;&lt;td&gt;Demand capture&lt;/td&gt;&lt;td&gt;Marketplace Connect for inventory sync&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Shopify D2C&lt;/td&gt;&lt;td&gt;Owned conversion&lt;/td&gt;&lt;td&gt;Primary storefront&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Social&lt;/td&gt;&lt;td&gt;Awareness&lt;/td&gt;&lt;td&gt;Shopify sales channels&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Email&lt;/td&gt;&lt;td&gt;Retention&lt;/td&gt;&lt;td&gt;Klaviyo or similar&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Common failure modes&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;1. Copying Amazon listings verbatim.&lt;/strong&gt; D2C product pages need brand storytelling, not bullet-point spec sheets.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. No traffic strategy.&lt;/strong&gt; Building a Shopify store without acquisition plan produces an expensive brochure.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. Inventory conflicts.&lt;/strong&gt; Selling the same SKUs on both channels without sync creates overselling.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. Expecting instant D2C revenue.&lt;/strong&gt; Amazon demand does not transfer. Budget for 6–12 months of D2C growth investment.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5. Neglecting Amazon.&lt;/strong&gt; Successful D2C brands maintain Amazon as a channel, not abandon it.&lt;/p&gt;&lt;h2&gt;oContis approach and case study&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://ocontis.studio/projects/scrumbles/&quot;&gt;Scrumbles&lt;/a&gt; operates across channels with complex subscription and fulfilment requirements. The pattern for Amazon-origin brands is similar: start with clean Shopify architecture, add channel sync, build email retention, then scale paid acquisition to the owned store.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Amazon to Shopify is not a migration in the traditional sense. It is launching an owned channel alongside a marketplace presence. The catalog import is the easy part. Brand experience, traffic, and retention are the work.&lt;/p&gt;&lt;p&gt;Run the &lt;a href=&quot;https://ocontis.studio/tools/migration-readiness-assessment/?platform=amazon&quot;&gt;&lt;em&gt;Migration Readiness Assessment&lt;/em&gt;&lt;/a&gt; to plan your D2C launch. For replatforming and channel build-out, see &lt;a href=&quot;https://ocontis.studio/services/replatforming-and-migration/&quot;&gt;Replatforming and Migration&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Migrating from Wix and Squarespace to Shopify: A Practitioner&#39;s Guide</title>
    <link href="https://ocontis.studio/blog/post/migrating-from-wix-squarespace-to-shopify/" />
    <updated>2026-07-07T15:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/migrating-from-wix-squarespace-to-shopify/</id>
    <content type="html">&lt;h1&gt;Migrating from Wix and Squarespace to Shopify: A Practitioner&#39;s Guide&lt;/h1&gt;&lt;p&gt;Wix and Squarespace are excellent starting points. Drag-and-drop design, fast setup, and low monthly cost let founders launch quickly. The friction starts when the brand outgrows the platform: subscription billing, wholesale, advanced analytics, checkout optimisation, or simply the need for a storefront that does not fight the brand&#39;s growth pace.&lt;/p&gt;&lt;p&gt;Migration to Shopify from these platforms is less a technical data migration and more a graduation to full ecommerce infrastructure.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;This guide sets realistic expectations for Wix and Squarespace to Shopify migration: what exports, what rebuilds, and where SEO risk actually lives.&lt;/p&gt;&lt;p&gt;Run the &lt;a href=&quot;https://ocontis.studio/tools/migration-readiness-assessment/?platform=wix-squarespace&quot;&gt;&lt;em&gt;Shopify Migration Readiness Assessment&lt;/em&gt;&lt;/a&gt; to assess your readiness.&lt;/p&gt;&lt;p&gt;For post-migration growth planning, see &lt;a href=&quot;https://ocontis.studio/blog/post/why-most-shopify-stores-dont-scale-past-50k-month/&quot;&gt;&lt;em&gt;Why Most Shopify Stores Don&#39;t Scale Past £50k/Month&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;When migration makes sense (and when it does not)&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Migration makes sense when:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;You need subscription billing, B2B, or wholesale capabilities&lt;/li&gt;&lt;li&gt;Checkout conversion is limiting growth and Wix/Squarespace checkout cannot be optimised further&lt;/li&gt;&lt;li&gt;You want a deeper app ecosystem (email, reviews, loyalty, analytics)&lt;/li&gt;&lt;li&gt;International selling requires multi-currency and localised storefronts&lt;/li&gt;&lt;li&gt;You are investing in paid acquisition and need contribution margin visibility&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Stay on Wix/Squarespace when:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Your store is genuinely small (under £200k GMV) and meets current needs&lt;/li&gt;&lt;li&gt;Design simplicity matters more than ecommerce depth&lt;/li&gt;&lt;li&gt;Migration cost exceeds 12 months of platform savings&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Platform-specific data model mapping&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Wix / Squarespace&lt;/th&gt;&lt;th&gt;Shopify equivalent&lt;/th&gt;&lt;th&gt;Migration notes&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Products&lt;/td&gt;&lt;td&gt;Products&lt;/td&gt;&lt;td&gt;CSV export/import. Validate images and variants.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Categories / collections&lt;/td&gt;&lt;td&gt;Collections&lt;/td&gt;&lt;td&gt;Recreate manually or via import tags.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pages&lt;/td&gt;&lt;td&gt;Pages&lt;/td&gt;&lt;td&gt;Manual copy or CSV. Rebuild in OS 2.0 sections.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Blog posts&lt;/td&gt;&lt;td&gt;Blog&lt;/td&gt;&lt;td&gt;Manual migration. Plan URL redirects.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Wix/Squarespace apps&lt;/td&gt;&lt;td&gt;Shopify apps&lt;/td&gt;&lt;td&gt;Evaluate need. Many are unnecessary on Shopify.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Design template&lt;/td&gt;&lt;td&gt;Shopify theme&lt;/td&gt;&lt;td&gt;Full rebuild. No template port.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;URL and SEO migration checklist&lt;/h2&gt;&lt;p&gt;Wix and Squarespace URLs are typically cleaner than enterprise platforms, which reduces SEO risk for smaller sites.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Actions:&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Export sitemap or crawl all pages&lt;/li&gt;&lt;li&gt;Map product and content URLs to Shopify paths&lt;/li&gt;&lt;li&gt;Set 301 redirects before DNS cutover&lt;/li&gt;&lt;li&gt;For Wix: note that product URLs may include category paths&lt;/li&gt;&lt;li&gt;Monitor Search Console for 14 days post-launch&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;Common failure modes&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;1. Expecting design transfer.&lt;/strong&gt; Templates do not port. Budget for Shopify theme design and development.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. Underestimating content migration.&lt;/strong&gt; Blog posts and landing pages need manual work.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. Over-engineering the first Shopify build.&lt;/strong&gt; Brands graduating from Wix often over-customise their first Shopify theme. Start clean, iterate after launch.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. Migrating too early.&lt;/strong&gt; If the business has not outgrown the platform, migration adds cost without proportional benefit.&lt;/p&gt;&lt;h2&gt;oContis approach and case study&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://ocontis.studio/projects/yumove/&quot;&gt;YuMOVE&lt;/a&gt; demonstrates the post-migration pattern for health and wellness brands scaling on Shopify: custom theme architecture, subscription integration, and conversion-focused product pages. Brands graduating from Wix follow the same path: clean theme, strong product pages, integrations added incrementally.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Wix and Squarespace to Shopify migration is a growth investment, not a technical rescue. Data export is manageable. The value is in building ecommerce infrastructure that scales with the brand.&lt;/p&gt;&lt;p&gt;Run the &lt;a href=&quot;https://ocontis.studio/tools/migration-readiness-assessment/?platform=wix-squarespace&quot;&gt;&lt;em&gt;Migration Readiness Assessment&lt;/em&gt;&lt;/a&gt;. For replatforming scope, see &lt;a href=&quot;https://ocontis.studio/services/replatforming-and-migration/&quot;&gt;Replatforming and Migration&lt;/a&gt; or &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;book a discovery call&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Migrating from PrestaShop to Shopify: A Practitioner&#39;s Guide</title>
    <link href="https://ocontis.studio/blog/post/migrating-from-prestashop-to-shopify/" />
    <updated>2026-07-07T14:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/migrating-from-prestashop-to-shopify/</id>
    <content type="html">&lt;h1&gt;Migrating from PrestaShop to Shopify: A Practitioner&#39;s Guide&lt;/h1&gt;&lt;p&gt;PrestaShop powers a large share of European ecommerce, particularly among brands that started with open-source commerce and grew through modules and customisations. The platform is capable and affordable. It is also prone to module conflicts, upgrade fragility, and technical debt that accumulates quietly.&lt;/p&gt;&lt;p&gt;Migration to Shopify is usually driven by maintenance burden, not platform philosophy. The team wants to stop fighting module updates and start focusing on conversion.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;This guide covers PrestaShop to Shopify migration: module audit, data cleaning, multi-shop consolidation, and legacy URL handling.&lt;/p&gt;&lt;p&gt;Start with the &lt;a href=&quot;https://ocontis.studio/tools/migration-readiness-assessment/?platform=prestashop&quot;&gt;&lt;em&gt;Shopify Migration Readiness Assessment&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;When migration makes sense (and when it does not)&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Migration makes sense when:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Module conflicts and upgrade breaks consume developer time&lt;/li&gt;&lt;li&gt;Hosting and performance require constant optimisation&lt;/li&gt;&lt;li&gt;You need modern checkout, POS, and omnichannel without more modules&lt;/li&gt;&lt;li&gt;Your catalogue has outgrown PrestaShop&#39;s admin UX&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Reconsider when:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Custom PrestaShop modules power features with no Shopify equivalent&lt;/li&gt;&lt;li&gt;Multi-shop architecture cannot be consolidated into your target Shopify setup&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Platform-specific data model mapping&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;PrestaShop concept&lt;/th&gt;&lt;th&gt;Shopify equivalent&lt;/th&gt;&lt;th&gt;Migration notes&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Product + combinations&lt;/td&gt;&lt;td&gt;Product + variants&lt;/td&gt;&lt;td&gt;Clean combinations before import.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Features / attributes&lt;/td&gt;&lt;td&gt;Metafields / tags&lt;/td&gt;&lt;td&gt;Define schema before bulk import.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Categories&lt;/td&gt;&lt;td&gt;Collections&lt;/td&gt;&lt;td&gt;Flat hierarchy on Shopify.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Customer groups&lt;/td&gt;&lt;td&gt;Segments / B2B&lt;/td&gt;&lt;td&gt;Recreate pricing rules.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CMS pages&lt;/td&gt;&lt;td&gt;Pages&lt;/td&gt;&lt;td&gt;Manual migration for content-heavy sites.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Modules&lt;/td&gt;&lt;td&gt;Apps&lt;/td&gt;&lt;td&gt;Full MoSCoW audit required.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;URL and SEO migration checklist&lt;/h2&gt;&lt;p&gt;PrestaShop legacy URLs are among the most challenging for SEO continuity. ID-based paths like &lt;code&gt;/3-category-name/42-product-name&lt;/code&gt; must map to &lt;code&gt;/collections/category-name&lt;/code&gt; and &lt;code&gt;/products/product-name&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Pre-launch actions:&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Crawl all indexed URLs including language variants&lt;/li&gt;&lt;li&gt;Cross-reference with Search Console coverage report&lt;/li&gt;&lt;li&gt;Build redirect map accounting for trailing slashes and parameters&lt;/li&gt;&lt;li&gt;Test redirects on staging with a sample of top-traffic URLs&lt;/li&gt;&lt;li&gt;Monitor 404 rate daily for 30 days post-launch&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;Common failure modes&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;1. Skipping data cleaning.&lt;/strong&gt; Importing years of inactive products and broken combinations creates a messy Shopify catalogue.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. Module audit gaps.&lt;/strong&gt; Modules that modify checkout or pricing silently break when removed on migration.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. Multi-shop confusion.&lt;/strong&gt; Running multiple PrestaShop shops without a consolidation plan creates duplicate data on Shopify.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. Legacy URL neglect.&lt;/strong&gt; PrestaShop&#39;s URL patterns are the highest SEO risk in this migration type.&lt;/p&gt;&lt;h2&gt;oContis approach and case study&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://ocontis.studio/projects/lanoguard/&quot;&gt;Lanoguard&lt;/a&gt; migrated to Shopify 2.0 with custom sections from a legacy platform stack. The same principles apply to PrestaShop: metafield schema first, redirect map before theme build, integration MoSCoW before app selection.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;PrestaShop to Shopify migration rewards disciplined data cleaning and early SEO planning. The export tools exist. The risk is in legacy complexity, not data access.&lt;/p&gt;&lt;p&gt;Run the &lt;a href=&quot;https://ocontis.studio/tools/migration-readiness-assessment/?platform=prestashop&quot;&gt;&lt;em&gt;Migration Readiness Assessment&lt;/em&gt;&lt;/a&gt;. For replatforming delivery, see &lt;a href=&quot;https://ocontis.studio/services/replatforming-and-migration/&quot;&gt;Replatforming and Migration&lt;/a&gt; or &lt;a href=&quot;https://ocontis.studio/contact/&quot;&gt;book a discovery call&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Migrating from Shopware to Shopify: A Practitioner&#39;s Guide</title>
    <link href="https://ocontis.studio/blog/post/migrating-from-shopware-to-shopify/" />
    <updated>2026-07-07T13:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/migrating-from-shopware-to-shopify/</id>
    <content type="html">&lt;h1&gt;Migrating from Shopware to Shopify: A Practitioner&#39;s Guide&lt;/h1&gt;&lt;p&gt;Shopware is a serious platform, particularly in the DACH and broader EU mid-market. Rule Builder, B2B capabilities, and sales channel architecture give merchants genuine control. For brands that grew up on Shopware, the platform feels like home.&lt;/p&gt;&lt;p&gt;The migration conversation usually starts when international expansion, checkout performance, or agency availability pushes the team toward Shopify. Not because Shopware failed, but because the growth path looks different on a managed platform with global scale.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;This guide addresses Shopware to Shopify migration for EU and international brands: promotion logic, B2B pricing, multi-language setups, and the data export path.&lt;/p&gt;&lt;p&gt;Run the &lt;a href=&quot;https://ocontis.studio/tools/migration-readiness-assessment/?platform=shopware&quot;&gt;&lt;em&gt;Shopify Migration Readiness Assessment&lt;/em&gt;&lt;/a&gt; to assess your readiness and timeline.&lt;/p&gt;&lt;h2&gt;When migration makes sense (and when it does not)&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Migration makes sense when:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;You want Shopify Markets for faster international rollout&lt;/li&gt;&lt;li&gt;Checkout conversion and Shop Pay matter more than Rule Builder flexibility&lt;/li&gt;&lt;li&gt;Your agency ecosystem is stronger on Shopify than Shopware&lt;/li&gt;&lt;li&gt;Managed hosting and PCI compliance reduce operational overhead&lt;/li&gt;&lt;li&gt;You need POS and omnichannel under one admin&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Reconsider when:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Shopware B2B workflows are deeply embedded and cannot be replicated on Shopify B2B&lt;/li&gt;&lt;li&gt;Custom Shopware plugins power revenue-critical features with no Shopify equivalent&lt;/li&gt;&lt;li&gt;Your team has deep Shopware expertise and no Shopify operational experience&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Platform-specific data model mapping&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Shopware concept&lt;/th&gt;&lt;th&gt;Shopify equivalent&lt;/th&gt;&lt;th&gt;Migration notes&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Product with properties&lt;/td&gt;&lt;td&gt;Product + metafields&lt;/td&gt;&lt;td&gt;Define metafield schema before import.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Categories&lt;/td&gt;&lt;td&gt;Collections&lt;/td&gt;&lt;td&gt;Flat hierarchy. Navigation rebuild required.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Rule Builder promotions&lt;/td&gt;&lt;td&gt;Discounts + Functions&lt;/td&gt;&lt;td&gt;Recreate logic. No automated transfer.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Sales channels&lt;/td&gt;&lt;td&gt;Markets / channels&lt;/td&gt;&lt;td&gt;Map per-market config to Shopify Markets.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;B2B customer pricing&lt;/td&gt;&lt;td&gt;B2B catalogs&lt;/td&gt;&lt;td&gt;Validate pricing rules on Shopify B2B.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CMS pages&lt;/td&gt;&lt;td&gt;Pages + sections&lt;/td&gt;&lt;td&gt;Rebuild in OS 2.0. Content may need manual migration.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Plugins&lt;/td&gt;&lt;td&gt;Apps&lt;/td&gt;&lt;td&gt;MoSCoW audit. Map to Shopify app ecosystem.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;URL and SEO migration checklist&lt;/h2&gt;&lt;p&gt;Shopware URL patterns vary by configuration and language. Common patterns include &lt;code&gt;/category-name/product-name&lt;/code&gt; or language-prefixed paths like &lt;code&gt;/en/category-name&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Actions before launch:&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Crawl all language variants separately&lt;/li&gt;&lt;li&gt;Map hreflang relationships to Shopify Markets structure&lt;/li&gt;&lt;li&gt;Build 301 redirects per market&lt;/li&gt;&lt;li&gt;Configure tax and shipping zones in Shopify before cutover&lt;/li&gt;&lt;li&gt;Validate EU compliance requirements (invoicing, VAT) with appropriate apps&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;Integration MoSCoW framework&lt;/h2&gt;&lt;p&gt;EU brands typically have ERP (SAP, Weclapp, Xentral), email (Klaviyo, Emarsys), and payment (Klarna, PayPal) integrations. Classify each as must/should/could/won&#39;t before scoping Shopify apps.&lt;/p&gt;&lt;h2&gt;Common failure modes&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;1. Underestimating Rule Builder recreation.&lt;/strong&gt; Promotion logic is often more complex than teams remember. Audit active rules early.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. B2B pricing gaps.&lt;/strong&gt; Customer-specific pricing that worked in Shopware may need Shopify B2B plus an app layer.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. Multi-language content loss.&lt;/strong&gt; Migrating products but not translated content creates market-specific 404s.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. EU compliance assumptions.&lt;/strong&gt; Tax, invoicing, and GDPR workflows need explicit mapping to Shopify apps and settings.&lt;/p&gt;&lt;h2&gt;oContis approach and case study&lt;/h2&gt;&lt;p&gt;We approach Shopware migrations with a markets-first discovery: which sales channels map to which Shopify Markets, and what compliance requirements apply per region.&lt;/p&gt;&lt;p&gt;Our &lt;a href=&quot;https://ocontis.studio/projects/medik8/&quot;&gt;Medik8&lt;/a&gt; work demonstrates the post-migration pattern for international beauty brands: metafield-driven product data, multi-store architecture, and Shopify 2.0 sections designed for fast merchandising across markets.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Shopware to Shopify migration is common for EU brands seeking managed scale. The data export path is reliable. The work is in promotion logic, B2B pricing, and market configuration.&lt;/p&gt;&lt;p&gt;Run the &lt;a href=&quot;https://ocontis.studio/tools/migration-readiness-assessment/?platform=shopware&quot;&gt;&lt;em&gt;Migration Readiness Assessment&lt;/em&gt;&lt;/a&gt; and use the output in your replatforming RFP. For delivery scope, see &lt;a href=&quot;https://ocontis.studio/services/replatforming-and-migration/&quot;&gt;Replatforming and Migration&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Migrating from BigCommerce to Shopify: A Practitioner&#39;s Guide</title>
    <link href="https://ocontis.studio/blog/post/migrating-from-bigcommerce-to-shopify/" />
    <updated>2026-07-07T12:00:00Z</updated>
    <id>https://ocontis.studio/blog/post/migrating-from-bigcommerce-to-shopify/</id>
    <content type="html">&lt;h1&gt;Migrating from BigCommerce to Shopify: A Practitioner&#39;s Guide&lt;/h1&gt;&lt;p&gt;BigCommerce sits in a sensible middle ground: more structured than WooCommerce, less complex than Magento. Stencil themes are capable. The API is reliable. For many brands, it works well until growth demands faster merchandising, better checkout conversion, or a richer app ecosystem.&lt;/p&gt;&lt;p&gt;The migration conversation usually starts when a team wants to move faster than Stencil development allows, or when BigCommerce&#39;s app marketplace lacks a critical integration that Shopify supports natively.&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;This guide covers BigCommerce to Shopify migration from a practitioner&#39;s perspective: data mapping, theme rebuild expectations, integration translation, and SEO continuity.&lt;/p&gt;&lt;p&gt;Run the &lt;a href=&quot;https://ocontis.studio/tools/migration-readiness-assessment/?platform=bigcommerce&quot;&gt;&lt;em&gt;Shopify Migration Readiness Assessment&lt;/em&gt;&lt;/a&gt; first to score readiness and generate a phase roadmap.&lt;/p&gt;&lt;p&gt;For post-migration theme architecture, see &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;h2&gt;When migration makes sense (and when it does not)&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Migration makes sense when:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Stencil theme development is slower than your merchandising cadence requires&lt;/li&gt;&lt;li&gt;You need Shopify&#39;s checkout conversion, Shop Pay, and POS integration&lt;/li&gt;&lt;li&gt;App ecosystem gaps on BigCommerce block growth initiatives&lt;/li&gt;&lt;li&gt;Your agency pool is deeper on Shopify than Stencil&lt;/li&gt;&lt;li&gt;You want Shopify Markets for international expansion&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Reconsider when:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;BigCommerce&#39;s native multi-storefront setup maps perfectly to your regional architecture&lt;/li&gt;&lt;li&gt;Script Manager customisations power revenue-critical checkout flows with no Shopify equivalent&lt;/li&gt;&lt;li&gt;You are mid-contract with significant BigCommerce platform incentives&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Platform-specific data model mapping&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;BigCommerce concept&lt;/th&gt;&lt;th&gt;Shopify equivalent&lt;/th&gt;&lt;th&gt;Migration notes&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Product with options&lt;/td&gt;&lt;td&gt;Product with variants&lt;/td&gt;&lt;td&gt;API export is reliable. Validate modifier mapping.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Categories&lt;/td&gt;&lt;td&gt;Collections&lt;/td&gt;&lt;td&gt;Flat hierarchy on Shopify. Plan navigation rebuild.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Customer groups&lt;/td&gt;&lt;td&gt;Segments / B2B catalogs&lt;/td&gt;&lt;td&gt;Recreate pricing rules explicitly.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Price lists&lt;/td&gt;&lt;td&gt;B2B catalogs / apps&lt;/td&gt;&lt;td&gt;Shopify B2B or SparkLayer for wholesale.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Stencil theme&lt;/td&gt;&lt;td&gt;Liquid OS 2.0 theme&lt;/td&gt;&lt;td&gt;Full rebuild. Use Stencil as design reference only.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Script Manager&lt;/td&gt;&lt;td&gt;Theme app extensions&lt;/td&gt;&lt;td&gt;Reimplement business logic. No direct port.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Webhooks / API integrations&lt;/td&gt;&lt;td&gt;Shopify webhooks / apps&lt;/td&gt;&lt;td&gt;Most BC integrations have Shopify equivalents.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;URL and SEO migration checklist&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;BigCommerce pattern&lt;/th&gt;&lt;th&gt;Shopify target&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;/product-slug/&lt;/td&gt;&lt;td&gt;/products/product-slug&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;/category-slug/&lt;/td&gt;&lt;td&gt;/collections/category-slug&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;/brands/brand-slug/&lt;/td&gt;&lt;td&gt;/collections/brand-slug or vendor collection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;/blog/post-slug/&lt;/td&gt;&lt;td&gt;/blogs/news/post-slug&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;Pre-launch actions:&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Export all URLs from BigCommerce, crawls, and Search Console&lt;/li&gt;&lt;li&gt;Map to Shopify URL structure with 301 redirects&lt;/li&gt;&lt;li&gt;Use short product canonical URLs on Shopify&lt;/li&gt;&lt;li&gt;Test redirects in staging before DNS cutover&lt;/li&gt;&lt;li&gt;Monitor 404 rates for 30 days post-launch&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;Integration MoSCoW framework&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Priority&lt;/th&gt;&lt;th&gt;BigCommerce examples&lt;/th&gt;&lt;th&gt;Shopify approach&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Must have&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;ERP, email platform, payment&lt;/td&gt;&lt;td&gt;Shopify app ecosystem equivalents&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Should have&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Search, reviews, subscriptions&lt;/td&gt;&lt;td&gt;Evaluate Search &amp;amp; Discovery, Yotpo, Recharge&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Could have&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Custom Stencil widgets&lt;/td&gt;&lt;td&gt;OS 2.0 sections or theme app extensions&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Won&#39;t have&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Script Manager experiments&lt;/td&gt;&lt;td&gt;Retire or reimplement if revenue-critical&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Common failure modes&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;1. Attempting Stencil-to-Liquid conversion.&lt;/strong&gt; There is no reliable automated port. Budget for a theme rebuild.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. Ignoring Script Manager audit.&lt;/strong&gt; Hidden checkout scripts cause post-launch surprises when features silently disappear.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. Customer group pricing gaps.&lt;/strong&gt; B2B pricing that worked on BigCommerce may need Shopify B2B plus app support.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. Channel integration gaps.&lt;/strong&gt; Amazon, eBay, and social channel connectors need Shopify equivalents (Marketplace Connect, etc.).&lt;/p&gt;&lt;h2&gt;oContis approach and case study&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://ocontis.studio/projects/bdxy-studios/&quot;&gt;BDXY Studios&lt;/a&gt; replatformed from a THG Ingenuity stack to Shopify for a fashion brand that needed faster merchandising and a modern storefront experience. The project followed the same pattern we use for BigCommerce migrations: data audit, redirect map, theme rebuild, integration mapping, parallel QA.&lt;/p&gt;&lt;p&gt;The lesson from that build: fashion brands migrating from structured enterprise platforms benefit most when merchandising workflows are redesigned for Shopify&#39;s admin, not replicated from the old system.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;BigCommerce to Shopify migration is straightforward on data but significant on theme and integration rebuild. The API makes catalogue export reliable. The work is in recreating the storefront experience and business logic in Shopify&#39;s paradigm.&lt;/p&gt;&lt;p&gt;Run the &lt;a href=&quot;https://ocontis.studio/tools/migration-readiness-assessment/?platform=bigcommerce&quot;&gt;&lt;em&gt;Migration Readiness Assessment&lt;/em&gt;&lt;/a&gt; and bring the scored roadmap to your agency discovery call. For replatforming delivery, see &lt;a href=&quot;https://ocontis.studio/services/replatforming-and-migration/&quot;&gt;Replatforming and Migration&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
</feed>