how-to
How to read a Shopify “compare at” price
Price & Thread editorial · Jul 20, 2026 · every figure measured from our own tracking data, snapshot July 20, 2026 · methodology
That struck-through price you see on almost every independent clothing store — $178 $106.80 — has a specific technical origin. Most direct-to-consumer brands run on Shopify, and Shopify products carry two price fields: price, what you'll actually be charged, and compare_at_price, a second number the merchant may fill in. When the second number is bigger than the first, the storefront draws a strikethrough and calls it a sale. That's the whole mechanism.
Understand what that field is not: it is not audited, not automatically populated from pricing history, and not required to be a price anyone ever paid. It is a text box. The strikethrough on a product page is a merchant's self-reported claim rendered in CSS — which is why we call these “compare-at claims” across this site, and why the amber chip on our cards reads “retailer claims $178” until independent evidence says otherwise.
What stores actually type into the box
Our July 20, 2026 snapshot covered every live markdown across 19 Shopify-based stores — 6,109 of them — and the compare-at field has an unmistakable statistical signature:
- 82.6% of compare-at prices end in .00 and another 16.0% end in .99. Between them, 98.6% of every “was” price we track. Organic price histories don't look like this; pricing spreadsheets do.
- 65.5% of claimed discounts are exact multiples of 5% (to within a tenth of a point), and two-thirds of the whole market sits on just six depths: 20, 30, 40, 50, 60, 70. Markdowns are applied to collections by rule, not to items by history.
- One in nine compare-ats is at least triple the asking price. At that ratio, the field is doing motivational work, not archival work.
None of this makes any individual claim false — plenty of compare-ats reflect a real recent shelf price. It means the field, in aggregate, is a marketing instrument, and each claim deserves the courtesy of a background check. (The full numbers are in our discount-menu study.)
Three questions that expose a decorative one
- Does this store ever charge the compare-at? Check the rest of the store's sale section. If the whole rack claims the same depth — at Gymshark the median claimed cut and the 90th percentile are both 70% — the sticker is a permanent prop, not a former price.
- Is the discount a suspiciously clean number? A sale price with odd cents ($13.80, $106.80, $519.20) is usually the output of a percent rule applied to a round sticker. That tells you the markdown was a collection-level decision — useful context for how negotiable the “was” is.
- What does the rest of the market charge? The strongest test the field can face: the same product priced at other stores, independent typical-price data, or (for sneakers) the resale floor. A compare-at that no other seller's live price supports is a claim standing alone.
Check the raw field yourself
Shopify storefronts expose their product data publicly. On most stores, adding .json to a product page's URL (or /products.json to the store's domain) returns the raw catalog — the same public data our pipeline reads, politely and on a schedule. In it you'll find each variant's price and compare_at_price, unstyled. Seeing your first four-figure compare_at_price sitting above an asking price a third of its size is a small rite of passage.
What we do with the field
On Price & Thread, a compare-at price starts with zero credibility and earns its way up. Uncorroborated, it renders as the amber “retailer claims” chip — never a strikethrough, and it counts at half weight in ranking, so a fantasy sticker can't beat a modest real cut. Corroborated by independent evidence (a store's measured markdown pattern, cross-store pricing, typical-price ranges), it graduates tiers. The exact evidence bar for every phrase we render is public at how we verify, and the narrative version — following one real claim through the machine — is here.
The one-line takeaway: on Shopify stores, the strikethrough is an interface element, not a receipt. Read it the way you'd read any unaudited claim — possibly true, worth checking, and never worth paying extra to believe.