When your Shopify cart price is different from the checkout price, the first job is to separate two very different things. Some differences are expected: checkout adds taxes, shipping and duties the cart didn’t show, and currency rounding can shift a total by a cent. Those are settings, not bugs. Other differences are real bugs — usually an app or custom script that discounts a line in the cart with JavaScript but never enforces that price at checkout, so Shopify recalculates and charges a different number. The first kind costs you trust if it’s unexplained; the second kind costs you trust and margin. Diagnose which one you have before you touch anything.
Diagnosis: expected difference vs real bug
A price mismatch at checkout falls into one of two buckets. Getting the bucket right saves you from “fixing” a tax setting that was never broken, or from shipping an order flow that quietly leaks margin.
| What you see | Bucket | Why it happens |
|---|---|---|
| Checkout total is higher (tax line appears) | Expected | Tax-exclusive display; tax added at checkout |
| Total shifts by a cent across currencies | Expected | Currency rounding under Shopify Markets |
| Shipping/duties appear at checkout | Expected | Rates and duties are calculated at checkout, not in cart |
| Cart shows a discount, checkout charges full price | Bug | Discount faked in the cart by an app/script, not enforced server-side |
| Bundle “save 15%” in cart, gone at checkout | Bug | Bundle pricing done in theme JS with no Shopify Function backing it |
| Old price sticks after you changed it | Bug (stale) | Shopper’s cart cached a price that no longer exists |
If the number only goes up at checkout by a tax or shipping line, that’s almost always a display setting. If a discount you promised in the cart disappears at checkout, that’s a bug — and it’s the expensive one.
Why it matters: trust and margin at the worst moment
A cart-to-checkout price difference hits at the single most fragile moment in the whole funnel: the shopper has decided to buy and is about to enter payment details. If the number jumps, they assume a bait-and-switch and abandon — you paid to acquire that click and lost it at the finish line.
The opposite failure is quieter and arguably worse. If an app shows full price in the cart but checkout applies a discount you didn’t intend — or a bundle discount fires twice — you win the sale but ship it below margin. Nobody complains, so nobody notices, and the leak runs on every order. That’s why checkout price difference issues deserve a real audit, not a one-off patch. If you’d rather have someone trace it end to end, that’s exactly what a free profit audit is for.
Likely causes, one by one
Tax display (inclusive vs exclusive). If your store shows tax-exclusive prices, the cart shows the pre-tax number and checkout adds tax — expected, but jarring if it’s unexplained. Stores selling to the EU/UK usually want tax-inclusive display so cart and checkout agree.
Currency and Shopify Markets rounding. Under Markets, prices convert with rounding rules per currency. A product that rounds nicely in your home currency can land a cent off in another, and per-line rounding vs order-level rounding can diverge. Expected, but confusing — and worth testing per market.
Discounts applied only in the cart by an app. The classic Shopify discount mismatch: an app (or theme snippet) rewrites the displayed cart total in JavaScript to show a deal, but nothing enforces that price server-side. Checkout ignores the cosmetic number and charges the real one. This is the root cause behind most “why is my cart price different from checkout” tickets — see the sibling deep-dive on a discount not applying at checkout.
Bundle and line-item pricing via scripts. Bundles that compute “buy 3, save 15%” in the theme, or line-item properties that are supposed to change price, only affect the cart display. Unless a Shopify Function recalculates the discount, checkout drops it.
Stale cart state. Shoppers leave carts open for days. If you changed a price, ran a sale, or edited a discount in the meantime, their cart may hold an old value that no longer exists at checkout. Reproducible only with an aged cart.
Shipping and duties at checkout. Shipping rates, and international duties/import fees, are calculated at checkout by design. The cart legitimately can’t know them yet.
How to diagnose it
- Reproduce it deliberately. Build the exact cart that misbehaves — same products, quantities, discount code and currency. Intermittent means it’s probably stale-cart or currency-specific.
- Compare cart vs checkout line by line. Don’t compare totals; compare each line item, each discount line, tax and shipping separately. The line that changes tells you the cause.
- Test across currencies and markets. Switch currency and repeat. If the gap only appears in one currency, it’s rounding, not a discount bug.
- Disable suspect apps one at a time. Turn off cart/upsell/bundle/discount apps individually and re-test. When the mismatch vanishes, you’ve found the owner.
- Clear and rebuild the cart. If a fresh cart is correct but an old one isn’t, it’s stale state — not a live bug.
How to fix each
- Tax mismatch → set tax-inclusive vs exclusive display to match customer expectations, and make it explicit in the cart (“taxes calculated at checkout”).
- Currency rounding → set sensible rounding rules per market and accept sub-cent shifts as normal; don’t chase them as bugs.
- Cart-only discount → move the discount off cosmetic JavaScript and enforce it at checkout with a Shopify Function, so the shown price is the charged price.
- Bundle/line-item pricing → back it with a Function that recomputes the discount server-side; never rely on theme math alone.
- Stale cart → expire or refresh carts, and re-validate prices at checkout against current values.
- Shipping/duties → communicate them in the cart before checkout so the jump isn’t a surprise.
The principle: enforce pricing at checkout
Every reliable fix here is the same idea — what’s shown must be what’s charged, and only the checkout can guarantee that. Anything a theme or app draws in the cart is cosmetic until a server-side rule enforces it. On Shopify that rule is a Shopify Function: it recalculates discounts and bundle pricing at checkout, so the total can’t drift, be gamed, or silently leak.
This is why we lean on Functions rather than JavaScript-only discount apps — and why the Shopify Functions vs discount apps comparison matters when you’re choosing how to build an offer. If you’re stacking deals, the same enforcement rules decide whether they combine correctly — see how to run multiple discounts on Shopify. Building that enforcement is exactly what our custom apps and Shopify Functions work delivers.
Common mistakes
- Treating every difference as a bug. Tax and shipping at checkout are expected; don’t refactor a working store to “fix” them.
- Comparing totals instead of lines. The total hides which line changed. Always go line by line.
- Trusting the cart display. A discount shown in the cart proves nothing about what checkout will charge.
- Skipping multi-currency tests. A store that’s correct in one currency can mismatch in another under Markets.
- Patching the symptom. Rewriting the cart number to match checkout hides the leak instead of enforcing the right price.
Cart and checkout prices not matching? If an app or script is discounting in the cart without enforcing it at checkout, you’re risking trust and margin. We build checkout-safe pricing with Shopify Functions. See Custom Apps & Shopify Functions or get a free profit audit.