Conversion Research

The Friction Tax

What 55 million behavioral events reveal about why Shopify stores quietly lose conversions. A four-store, 296,093-session audit of clicks that go nowhere, taps that hang, and apps that fail silently.

May 19, 2026 14 min read Methodology Observational · no A/B test
Jump to section
  1. Summary
  2. Method & dataset
  3. Mobile is the store
  4. The apps are the friction
  5. The cart leaks
  6. Product images break twice
  7. Tap response feels heavy
  8. Half never scroll
  9. Buttons are too small
  10. Playbook
  11. Limitations

SummaryWhat 296,000 sessions show

We analyzed 55 million real-visitor behavioral events across 296,093 shopping sessions on three high-traffic Shopify stores, with a fourth store on a custom platform as a contrast. We didn't look at page views. We looked at what shoppers' hands and eyes actually did. Every click that went nowhere. Every rage-tap. Every image people hovered but never touched. Every script that timed out mid-checkout.

Five patterns showed up on every store. None of them are visible in standard analytics:

2.5×
Mobile friction rate vs desktop
15.6%
Of sessions saw the cart fail to load
87%
Of slow-paint elements are images
43–56%
Of sessions never scroll past the fold

The top source of "clicks that do nothing" is not the store's own design. It is the third-party widgets every store installs: chat bubbles, email-capture popups, cart drawers. The shopper's first interaction with the store is often a fight with the close button on a popup. This report walks through each finding with the underlying data, explains why each one quietly costs sales, and ends with a prioritized fix list.

Run this on your store
Want this audit, but for your own site?
Add the Harvv pixel to your store. Inside 72 hours you get the same kind of analysis you're about to read, on your own visitors. No engineering work, no PII collected, free on the starter plan.

01How the data was collected

Most analytics tools tell a store owner what happened. 10,000 visits, 2 percent conversion, $40 average order. They almost never tell you why the other 98 percent left. "Why" lives in behavior: the hesitations, the mis-taps, the dead ends. Behavior is exactly what page-view analytics throws away.

So the question we asked was narrower and more useful. Across many Shopify stores, what specific, repeatable, measurable things go wrong between "visitor arrives" and "visitor buys?" And of those, which ones are the same everywhere, structural to how Shopify stores are built, rather than one store's bad luck?

Every store in this study runs the Harvv pixel, a 16 KB script that sits on the page and records behavior, not identity. It captures 49 distinct event types. The ones that matter for this report:

Dead click
A visitor clicked something and nothing happened. No navigation, no menu, no response. The signature of a broken or not-yet-ready element.
Rage click
Three or more fast clicks on the same spot. The digital equivalent of jiggling a stuck door handle.
Hover abandon
A visitor's cursor rested on an element three or more times, but they never clicked it. Interest without payoff.
LCP
Largest Contentful Paint. How long until the biggest thing on screen, usually the hero or product image, actually appears.
INP
Interaction to Next Paint. When you tap something, how long until the screen visibly reacts. The truest measure of "does this site feel fast."
Scroll depth
How far down the page a visitor actually got.
Network failure
A request the page made to load the cart, a script, an image, that errored or timed out.

The pixel records zero personal data. No names, no emails, no form contents. It records the shapes of behavior.

What this is, and isn't

This is a multi-store case study, not a population census. The cohort is three confirmed Shopify stores plus one store on a custom platform used as a contrast point. That is a small number of stores, but a very large number of sessions and events (296K and 55M), which is what gives the within-store findings their weight.

Read the findings this way. When a pattern appears on every store at high volume, treat it as a strong, structural hypothesis worth acting on. When it appears on one, treat it as that store's problem. We will be explicit about which is which.

One more piece of honesty, stated up front and again at the end: we measured friction, not conversion lift. We can prove "32,000 sessions hit a cart that failed to load." We cannot prove "fixing it adds exactly X percent to revenue." The link from each friction signal to lost sales is mechanistic reasoning, a clear chain of cause and effect, not a measured A/B result. We flag every place that distinction matters.

The dataset

Four stores. Anonymized, because we do not publish customers' private behavioral data under their names.

StoreSectorPlatformSessions (30d)Events (30d)Mobile %
AActivewear & dancewearShopify204,68846,806,81475%
BPerformance auto partsShopify75,6996,899,80966%
COff-road motorsports gearShopify15,7061,377,34677%
DFine jewelryCustom (contrast)3,380147,71366%
Total  299,47355,231,682 

Everything below is computed from these snapshots. No figure is estimated or illustrative. Each one is a direct count or percentile from the data.

02The store is a phone, and the phone is where it breaks

Two-thirds to three-quarters of shoppers walk in on a phone. That isn't a "mobile is important too" footnote. Mobile is the store. Desktop is the minority experience.

Now the friction. Store A's behavioral cohort analysis produced this finding directly from the data:

Mobile visitors hit friction (dead clicks plus rage clicks per session) at 93.9 percent, which is 2.5 times the site-wide baseline. Desktop visitors on the same store sit at 37.1 percent.
Friction-event rate per session, Store A
Mobile shoppers hit friction at 2.5× the desktop rate
DESKTOP 37.1% MOBILE 0% 40% 80% 93.9%
Source: Harvv behavioral cohort analysis, Store A, 30-day window ending 2026-05-19. n = 204,688 sessions.

A shopper on a phone is standing in a checkout line, walking down the street, one-thumbing the screen in bad light. They have the least patience and the least precision, and they are hitting 2.5 times the friction. Every dead tap, every mis-hit button, every too-slow response gets amplified by the context they are in.

The uncomfortable implication: most stores are designed and QA'd on a desktop, by people on a desktop, and then shipped to an audience that is overwhelmingly not on a desktop. The desktop experience is the rehearsal. The phone is the performance.

Confidence: structural. Mobile majority on all four stores. Measured 2.5× mobile-friction multiplier on the largest store.

03The apps you bolted on are the friction

This is the most surprising finding, and it held on every store.

We ranked every element on each store by dead clicks. Here is the top of each list:

Store A · top dead-click targets

ElementDead clicksSessions
Cart "remove item" (×) icon10,7035,274
Search-app "Filters" button10,5945,457
Cart drawer "close" (×)8,8844,672
Returns/chat widget panel7,8951,545

Store B · top dead-click targets

ElementDead clicksSessions
Email-capture popup · close / sign up dialog1,045842
Product image636346
Cart app background380215
Email-capture popup · sign-up form367335

Stores C and D

Store C's single biggest dead-click target was the Shopify chat widget: 1,619 dead clicks across 348 sessions. Store D's biggest was the email-capture popup's close / unlock button: 137 dead clicks across roughly 110 sessions.

What's getting dead-clicked
Third-party overlays are the #1 source on 3 of 4 stores
STORE A Cart drawer + chat widget STORE B Email-capture popup STORE C Shopify chat widget STORE D Email-capture popup close
Top-ranked dead-click element on each store, expressed as share of the store's top-source category. All four are third-party app integrations.

Look at what is on these lists. It is not the store's own product grid or "Add to cart" button. It is, over and over:

  • Email-capture popups, the "sign up for 10 percent off" overlay. Number one on Stores B and D.
  • Chat widgets. Number one on Store C, top-four on Store A.
  • Cart drawers from cart-upsell apps. Top-four on Stores A and B.
  • Search and filter apps. Top-two on Store A.

These are all third-party apps, the bolt-ons every Shopify store installs. And the specific thing failing is telling. On Stores B and D, the single biggest dead-click element is the close button of the email popup. Shoppers are trying to dismiss the interruption, and the dismiss button itself does not respond. So they tap again. And again. (On Store D, that close button measures 14 by 14 pixels, roughly a third of the size a finger reliably hits. More on this in finding seven.)

Why it costs sales

Picture the first ten seconds of a mobile visit. The page is still settling. An email popup slides in over the product the shopper came to see. They reach to close it, and the close button doesn't work yet, because the popup's own scripts haven't finished initializing. They tap two or three more times. Then they can finally see the store.

That is the first interaction many shoppers have with the store. It is a fight. The popup was installed to grow an email list. But (see finding 3b below) email drives almost no traffic to these stores, while the popup is measurably taxing every visitor's first moments.

This is the quiet cost of the Shopify app ecosystem. Each app is individually reasonable, but they are all third-party code, loading on their own schedule, layering interactive things on top of a page that isn't ready for them. The store owner sees a tidy list of installed apps. The shopper sees a screen that fights back.

Confidence: structural. Third-party overlays are the number-one dead-click source on 3 of 4 stores and top-four on the fourth.

3b. The popups feed a channel that is nearly empty

A supporting data point. Here is where each store's traffic actually comes from:

SourceStore AStore BStore CStore D
Direct105,87125,6373,2511,007
Organic search38,01122,9564,7721,377
Social14,53615,0475,055898
Referral46,26912,0212,62098
Email63680

Email isn't a rounding error away from zero. It is zero, on every store. Six sessions. Thirty-six. Eight. Zero.

We're careful here. Low email traffic does not prove email is worthless. Email often drives high-intent return visits that convert well. But it is worth a store owner sitting with this contrast honestly: the email-capture popup is one of the most friction-generating elements on the store (finding 3), and the channel it feeds is currently the smallest source of visits by three or four orders of magnitude. At minimum, the popup's close button must work instantly and be large enough to hit. Whether the popup should interrupt mobile visitors in the first two seconds at all is a question the data politely raises.

Mid-doc
Find out which third-party app is fighting your visitors
Harvv ranks every interactive element on your store by dead-click rate. Within 72 hours of installing the pixel you'll know which app's close button, popup, or chat widget is eating mobile taps. The audit takes one paste of a script tag.

04The cart leaks

Beyond clicks, the pixel records network failures, requests the page made that errored or timed out. On Store A:

Failed requestFailuresSessions% of sessions
Store's product/data API (timeout)253,08735,28117.2%
The cart's data file /cart.js (timeout)89,06431,99115.6%
Shopify's analytics endpoint135,21230,23714.8%

And on Store B, a single third-party app's API failed catastrophically:

Failed requestFailuresSessions% of sessions
Third-party store-data app (error 525)181,24857,02275.3%
/cart.js timeout rate, Store A
Roughly 1 in 6 sessions saw the cart fail to load
15.6% 31,991 sessions
/cart.js network timeouts as a share of 204,688 sessions, 30-day window.

/cart.js is the file that tells the page what is in the shopper's cart. When it times out, the cart icon can't update, the drawer can't render, the "you have 2 items" count goes stale. On Store A this happened in roughly one in six sessions. 31,991 of them.

A shopper who adds something to the cart and sees nothing change does not file a bug report. They assume they did something wrong, or that the store is broken, and they leave. This is conversion loss that is completely invisible in standard analytics. The session just ends.

Store B is worse in a different way. A single installed app's backend was failing in three out of every four sessions. Whatever that app was supposed to do (show options, prices, inventory), it was failing far more often than it was working, for nearly every visitor.

The lesson sharpens finding 3: third-party code fails silently, and a store owner has no built-in way to know. Shopify's admin shows the app as "installed and active." Only behavioral data shows it as "failing for 57,000 people."

Confidence: store-specific in detail, structural in kind. The exact failing requests differ per store, but some critical third-party or cart request was failing at high volume on every store we looked at.

05Product images: slow, then unclickable

Two findings about the same element. The product image. Together they explain a lot.

5a. The image is what's slow

LCP, Largest Contentful Paint, is the time until the biggest thing on screen appears. We measured which element was the LCP on each store:

StoreLCP is an imageLCP is text
A87%13%
B51%49%
C83%17%
D78%22%

On three of the four stores, the slowest-to-appear thing on the page is an image, the overwhelming majority of the time. And those images are not fast:

Store AStore BStore CStore D
Median LCP1.3 s0.7 s1.2 s1.4 s
Slow visitor (p75) LCP1.9 s1.1 s1.8 s2.4 s
Worst 5% (p95) LCP4.2 s2.6 s4.0 s6.9 s
LCP percentile by store
The median looks fine. The worst 5% bleeds.
SECONDS 2.5s good 4s needs work Store A Store B Store C Store D median slow visitor (p75) worst 5% (p95) 0s 2.5s 4s 5.5s 7s
Real-user LCP percentiles, field data. Google's "good" threshold is 2.5 seconds; "needs improvement" is 4 seconds.

The average LCP image specifically clocked in at 2.0 seconds on A, 2.7 seconds on C, and 3.6 seconds on D. The practical takeaway: on a Shopify store, image optimization is speed optimization. Compressing and correctly sizing the hero and product images is not a nice-to-have. It is the single highest-impact speed lever, because the image is, measurably, the slow thing.

5b. The image is also what nobody can click

Now the behavioral half. We measured hover-abandons, elements a visitor's cursor rested on repeatedly but never clicked.

Store A · most-hovered, never-clicked elements:

ElementHoversSessionsClicks
Product image slide95,97318,7320
Product image section77,91819,9650
Image slider74,93518,6520

Store C · same story:

ElementHoversSessionsClicks
Product image thumbnail8,0572,1520
Product media wrapper4,7412,1030

Tens of thousands of sessions, hovering the product image gallery, and zero clicks.

The product image is the most important thing on a product page. It is what a shopper uses to decide "is this the right thing." Online, they cannot pick it up. Zooming, swiping through angles, tapping a thumbnail. That is the digital version of handling the product.

The hover data says shoppers want that interaction. Their cursor goes straight to the image gallery and lingers. The zero clicks say they don't get it. Either the image isn't clickable, or the gallery's interaction (swipe, zoom) isn't discoverable, or (finding 6) it isn't responding fast enough to feel clickable.

We saw the sharp end of this on Store C, where the data flagged a specific issue. Shoppers clicking product images and getting nothing. A genuine dead click. The likely mechanism is a timing race. The image is clickable after it loads, but a shopper who taps it before it's ready gets nothing. On a slow mobile connection, "before it's ready" is a wide window.

So findings 5a and 5b compound. The image is slow to appear (5a), and in the gap before it's ready, taps on it are lost (5b). Same element, two failures, both costing the exact moment a shopper is deciding to buy.

Confidence: structural. Image-dominant LCP on 3 of 4. Large-volume image hover-abandonment on every store with product pages.

06Tapping the store doesn't feel like anything

INP, Interaction to Next Paint, measures the lag between you tap something and the screen visibly reacts. Google's threshold for "good" is 200 milliseconds. Above that, the store feels sluggish. Above roughly 500 ms, it feels broken.

Slow-visitor (p75) INP on each store:

Store AStore BStore CStore DGoogle "good"
416 ms320 ms280 ms403 ms≤ 200 ms
INP p75 vs Google's "good" threshold
Every store fails. Stores A and D at roughly 2× the threshold.
200 ms (good) Store A 416 ms Store B 320 ms Store C 280 ms Store D 403 ms
Real-user INP at the 75th percentile. The dashed line marks Google's "good" threshold (200 ms).

The cause shows up in another signal: long tasks. Stretches where the browser's main thread is busy and cannot respond to taps. Average long-task duration ran from 110 ms to over 1,000 ms across the stores. (Honesty note: the maximum long-task values get contaminated by browser tabs left open for hours. We rely on averages, not maxima.)

Why it costs sales

This is the most felt finding and the least seen one. There is no error message, no broken layout. The store just feels heavy. You tap "add to cart" and there's a beat. A quarter to half a second where nothing happens. You tap again.

That beat is the browser being busy running all the third-party scripts from findings 3 and 4. Each app adds JavaScript. All that JavaScript competes for the one main thread. While it's competing, your taps wait in line.

A store that feels slow to the thumb feels untrustworthy to the brain, even if the shopper never consciously notices why. Speed is not a technical metric here. It is the store's body language.

Confidence: structural. All four stores fail INP at p75.

07Half your visitors never scroll

We measured how far down the page each session actually got.

Store AStore BStore CStore D
Shallow (never passed first screen)43%56%46%47%
Deep reads (got 75%+ down)37%12%25%26%
Median scroll depth25%0%25%25%

On Store B, the median session scrolled 0 percent. More than half of all visitors did not meaningfully scroll at all.

We also measured scroll velocity. Fast scrolling means skimming, slow means reading. Across every store, visitors covered 6 to 12 times more distance skimming than reading. (Store A: 8,719 pixels skimmed versus 740 read.)

Roughly half of every store's visitors make their entire stay-or-leave decision based on the first screen. Whatever is below the fold (trust badges, reviews, detailed description, related products) a coin-flip share of visitors will never see any of it.

This reframes the homepage and the collection page. They are not documents to be read top-to-bottom. They are a single screen that has to do the whole job. Say what this store is, show the product, give one obvious reason to stay, in the space visible without a thumb-swipe. Most stores spend that priceless first screen on a hero banner and an announcement bar. The data says that screen is the entire conversation with half the audience.

Confidence: structural. 43–56% shallow on all four stores.

08On a phone, the buttons are too small

The pixel measures the rendered size of tappable elements. Apple and Google's guidance is a 44 by 44 pixel minimum touch target. On mobile, across the stores, generic links and several real controls came in well under that:

StoreUndersized elementMeasured size
ABody links (generic)149 × 27 px
BBody links (generic)100 × 20 px
CBody links (generic)50 × 21 px
DPopup close button14 × 14 px
DNavigation menu items25 × 40 px
Touch-target size visualized
14 × 14 vs the 44 × 44 minimum
44 × 44 (target) RECOMMENDED MIN 149 × 27 (Store A links) STILL TOO SHORT 14 × 14 (Store D close) UNHITTABLE
Each block is drawn at 2× the measured pixel size for visibility. Apple HIG and Material specify 44 × 44 logical pixels as the floor for thumb-reachable controls.

(One honesty note: the pixel also lists 1 by 1 pixel "skip-to-content" links as tiny targets. Those are intentionally invisible accessibility aids, not defects. We excluded them from this finding. The numbers above are real, visible, meant-to-be-tapped controls.)

A 27-pixel-tall link on a phone is a target roughly half the height a thumb reliably hits. The shopper doesn't get a clean miss-or-hit. They get a maybe. Sometimes it works, sometimes the tap lands on the neighbor, sometimes on nothing. A dead click. Which is how findings 3 and 8 reinforce each other.

Store D's 14 by 14 pixel popup close button is the worst case and the most poetic. The store interrupts the shopper with a popup (finding 3), then makes the escape hatch one-tenth the area a finger can reliably hit. That is precisely the element showing up in Store D's dead-click data.

Confidence: structural for body links. The egregious cases (14 × 14 close button) are store-specific.

09What this means for conversion

We said we'd be honest about causation, so here is the careful version.

We did not run A/B tests. We cannot hand a store owner "fix this, gain 1.4 percent." What we can do is trace each friction signal along a chain of cause and effect that is hard to argue with.

A shopper on a phone (finding 2) lands on a store. An email popup covers the product. Its close button lags or is too small (findings 3, 8), so their first act is a fight. The page's main image is slow to paint (finding 5a) and, in the gap, their taps on it are lost (finding 5b). Every tap they do land has a half-second of dead air (finding 6). The cart can't confirm what they added because its data file timed out (finding 4). And they are making the whole stay-or-go call from the first screen alone (finding 7).

Each link in that chain is individually measured and individually small. A 300-millisecond tap delay does not, by itself, lose a sale. But conversion is not lost to one big thing. It is lost to the accumulation of small frictions, each one a tiny reason to give up, stacked at exactly the moments a shopper is deciding.

That is the friction tax of the title. It is not one broken feature. It is a dozen papercuts, most of them inflicted by code the store owner installed for good reasons and has no way to see failing. The opportunity is that papercuts are individually cheap to fix. And the data tells you exactly which ones, in what order.

10The playbook

Ordered by our read of impact-over-effort. Items 1 through 3 are structural and apply to essentially any Shopify store. Items 4 through 7 are universal but vary in severity per store.

  1. Audit your third-party apps as if they were staff you can't see working. They are the number-one friction source (findings 3, 4, 6). For each installed app, ask: is it failing? Store B had one failing for 75 percent of sessions. Is it worth its weight in main-thread time? Uninstall ruthlessly.
  2. Make the email popup's close button instant and finger-sized, or delay the popup until the page is interactive, or reconsider interrupting mobile visitors in the first two seconds at all (findings 3, 3b, 8).
  3. Monitor /cart.js and your cart app like a checkout camera. A cart that silently fails to load (finding 4) is pure, invisible lost revenue. If it times out for 1 in 6 sessions, that is the first thing to fix.
  4. Treat image optimization as speed optimization. The product image is the LCP element (finding 5a). Compress it, size it correctly for the device, and make sure it is clickable and zoomable the instant it appears, not after (finding 5b).
  5. Budget your JavaScript. INP fails on every store (finding 6). Every app added is main-thread time taken. The fix for "the store feels slow" is usually "the store does less."
  6. Design the first screen as the whole store. Half your visitors never scroll (finding 7). The first viewport must say what this is, show the product, and give one reason to stay. Before the announcement bar, before the hero carousel.
  7. Re-QA on a phone, on a slow connection. Your audience is 66 to 77 percent mobile (finding 2), and mobile friction is 2.5 times higher. The desktop check is the rehearsal. The phone is the show.

Run this audit on your own store

Every metric in this report came from the Harvv behavioral pixel. Add it to your store with one script tag and you will see your own dead-click rankings, your own cart-failure rate, your own LCP percentile, your own scroll-depth distribution. Inside 72 hours. Free on the starter plan.

Add the pixel free
No engineering work. No PII collected. Used by stores doing 200K+ sessions/month.

11Limitations

A research report that doesn't list its own weaknesses isn't research. Ours:

  • Small store count. Three Shopify stores plus one contrast store. The sessions and events are plentiful (296K and 55M), which makes the within-store findings solid. But "this is true of all Shopify stores" is a hypothesis this dataset supports, not proves. A finding that appeared on all four stores is a strong lead. It is not a law.
  • Friction measured, conversion inferred. We counted dead clicks, failures, and delays directly. We did not measure the dollar impact of fixing them. Every "costs sales" claim in this report is mechanism-based reasoning, clearly labelled as such. Not an A/B result.
  • Verticals are narrow. Activewear, auto parts, motorsports gear, jewelry. Useful breadth, but not fashion-broad, not grocery, not digital goods.
  • Data-quality caveats, disclosed. On one store, a separate tracking bug had been polluting the page-address field. We relied only on store-wide aggregates for that store, not page-by-page numbers, and the bug is fixed going forward. Long-task maximum values are inflated by browser tabs left open for hours, so we used averages. Intentionally-invisible 1 by 1 accessibility links were excluded from the tap-target finding.
  • A 30-day window. One month. Seasonality (a sale, a holiday, a viral moment) could shift the mix. The patterns here are a snapshot, not a trend line.

None of these undo the findings. They scope them. The right way to use this report: as a map of where to look on your own store, then measure your own store, and ideally test the fixes.

Methodology & full figures

Collection. Each store runs the Harvv behavioral pixel (about 16 KB, 49 event types, zero personal data). Events stream to a central store. This report was generated from each store's 30-day diagnostic rollup (counts, percentiles, and element-level tallies, never raw payloads).

Window. 30 days ending 2026-05-19.

Cohort. 4 stores (3 Shopify plus 1 custom-platform contrast). 299,473 sessions. 55,231,682 events.

Definitions. Dead click: a click producing no DOM mutation, navigation, or network activity within a deferred observation window. Rage click: three or more rapid clicks on the same coordinates. Hover abandon: an element hovered three or more times with zero recorded clicks. Shallow session: maximum scroll depth less than 25 percent. Deep read: maximum scroll depth at or above 75 percent. LCP / INP / CLS: the Google Core Web Vitals, measured from real visitors (field data), not lab simulation.

Per-store headline figures

MetricStore AStore BStore CStore D
Sessions (30d)204,68875,69915,7063,380
Events (30d)46,806,8146,899,8091,377,346147,713
Mobile share75%66%77%66%
Dead clicks / session0.780.180.170.34
Rage clicks / session0.090.020.030.07
Shallow sessions43%56%46%47%
Deep reads37%12%25%26%
LCP p751.9 s1.1 s1.8 s2.4 s
LCP p954.2 s2.6 s4.0 s6.9 s
INP p75416 ms320 ms280 ms403 ms
LCP element is an image87%51%83%78%

All figures are direct counts or percentiles from the 30-day diagnostic snapshots. No value in this report is estimated, modelled, or illustrative.

Prepared by Harvv. For questions about methodology or to run this analysis on your own store, get in touch.

Jordan Olivas
FOUNDER, HARVV
Founded Harvv after running into the same problem on every site I shipped: analytics tools tell you what happened, not why visitors left. Previously at Klarna, working on conversion and checkout. Harvv is the behavioral pixel I needed and could not buy.
Run this on your store  →