Session replay for / Shopify
Session replay for Shopify stores
You can see in Shopify Analytics that people are adding to cart and not buying. What you cannot see is the moment they gave up, or why.
What to watch for
- Dead clicks on variant selectors A size or colour swatch that does not update the price or image reads as out of stock. Buyers assume the product is unavailable and leave.
- Discount code failures The single most common silent failure on a Shopify store. The code is expired or does not apply to the collection, the field clears without explanation, and the buyer assumes the sale is fake.
- Rage clicks on "Add to cart" Usually a theme app blocking the button while an upsell widget loads. The button looks live, does nothing for two seconds, gets hammered.
- Shipping calculator stalls A slow rate lookup with no loading state looks like a broken form. This is the last step before people abandon the cart entirely.
- Form abandonment on the cart page Someone who typed a discount code and left without submitting is a buyer you nearly had, and the transcript records the attempt.
What a session looks like
- 0:00 session start · /products/field-recorder · viewport 390×844 - 0:11 click button "Size — Medium" - ⚠ 0:12 dead click button "Size — Medium" — nothing on the page responded - 0:19 click button "Add to cart" - 0:24 navigated to /cart - 0:31 typed in a field (value masked at source) - 0:33 click button "Apply discount" - ⚠ 0:34 POST /cart/update.js · 422 - ⚠ 0:36 rage click ×4 · button "Apply discount" - ⚠ 0:52 typed into a form but left without submitting (heuristic) - 0:58 session end · total 0:58
Shopify gives you a funnel and a conversion rate. It does not give you the thirty seconds where someone typed a discount code four times and left.
The gap Shopify Analytics leaves
Shopify tells you 340 people added to cart and 71 completed checkout. That is a number, and it is the wrong shape to act on. It cannot distinguish between people who were browsing, people whose card failed, and people who hit a bug in your theme.
Session replay covers the part of the journey your theme controls: product page, variant selection, cart, and every app widget layered on top. That is where most theme bugs live, because that is where the customisation is.
The Shopify-specific problem: apps
A typical store runs somewhere between five and twenty apps, each injecting scripts into the same page. Upsell widgets, review carousels, stock counters, cookie banners, currency switchers.
They interact. An upsell app that overlays the add-to-cart button while it loads produces exactly the rage-click pattern above. A currency switcher that re-renders prices after the variant selector has bound produces dead clicks on swatches. None of this shows up in an error tracker, because nothing throws — the page just quietly does not work for a few seconds.
You cannot reproduce it locally because your development store does not run the same twenty apps in the same order at the same speed. The only reliable way to see it is to watch a real session on the real storefront.
Where the recording stops, and why
Being direct about this, because it decides whether this page is useful to you: session replay cannot follow a customer into Shopify’s hosted checkout.
Checkout runs on Shopify’s own domain. Unless you are on Shopify Plus with checkout extensibility, you cannot add scripts to it. This is a platform restriction, not a limitation of any particular tool — if a session replay vendor implies they can record standard Shopify checkout, be sceptical.
What you get is everything up to the checkout hand-off. In practice that is where most fixable problems are, because checkout itself is Shopify’s well-tested code and your cart page is not. But if your drop-off is specifically inside checkout, replay will not show it to you and you should know that before signing up for anything.
Reading the discount-code failure
The transcript above is the most common single pattern on Shopify stores, so it is worth walking through:
The buyer typed a code, clicked apply, and POST /cart/update.js returned 422.
The theme caught it, cleared the field, and displayed nothing. From the buyer’s
side the code simply vanished — so they retyped it, clicked four more times,
then left.
The fix is not the 422. The code genuinely did not apply; it was scoped to a collection this product is not in, and the API was right to reject it. The bug is that the theme swallowed the response. One line of error handling — “this code doesn’t apply to items in your cart” — converts a lost sale into an informed customer.
That is the general shape of most of these: the failure is not the problem, the silence is.
Doing it without watching video
Nobody running a store has time to watch recordings. Every session comes with the text transcript shown above, and sessions are filterable by whether they contain an error or a rage click at all — so you are reading nine transcripts, not scrubbing four hundred videos.
Connect it to Claude Code or Cursor over MCP and you can ask the question directly, as in the example above. For a store, the useful standing question is some version of “what broke between cart and checkout this week”, asked on a Monday.
Asking your agent
$ claude "did anyone fail to use a discount code this week?" ▸ usertapes list_tapes(url_contains: "/cart", has_errors: true) ← 9 tapes · 7 with rage clicks on "Apply discount" ▸ usertapes read_transcript(a41f9c22) ← 0:34 ⚠ POST /cart/update.js · 422 ▸ all 7 used codes scoped to a collection the item is not in. The theme clears the field and shows nothing.
Over MCP, in Claude Code or Cursor — see session replay over MCP.
Installing it here
Add the snippet to layout/theme.liquid, immediately before </head>:
<script src="https://usertapes.com/tapes.js"
data-token="YOUR_SITE_TOKEN" async></script>
It loads async and weighs under 15 KB, so it stays out of the critical
path — which matters more on Shopify than most places, since theme apps
have usually spent your performance budget already.
Mask anything showing customer data. Order confirmation and account pages
render names and addresses as ordinary text, so add class="ut-mask" to
those blocks in customers/order.liquid and customers/account.liquid.
When this is the wrong tool
- Shopify’s hosted checkout. Unless you are on Shopify Plus with checkout extensibility, you cannot inject scripts into checkout.shopify.com — no replay tool can, and any vendor implying otherwise is misleading you. Recording stops at the cart.
- Attribution and revenue reporting. Shopify Analytics already does that and does it better; replay tells you why one session failed, not what your ROAS was.
- Stores doing under a few hundred sessions a week, where you will learn more by ringing five customers than by reading recordings.