Why is the shipping rate customers pay at checkout different from what I actually pay for the label?
You quote one shipping price at checkout, then the label you buy costs more, or less. Here's why the numbers diverge and how to close the gap without guessing.
What's going on
A merchant sets up carrier-calculated shipping so checkout shows a real rate instead of a flat fee, then finds that the rate the customer paid and the rate on the label they actually purchase don't match, sometimes by a dollar or two, sometimes by a lot more on heavier or oddly shaped items. Over enough orders this either eats margin, when the label costs more than what was collected, or looks needlessly expensive to shoppers, when the label costs less and the store effectively overcharged for shipping.
This isn't usually a bug, it's a symptom of checkout and fulfillment pulling from different assumptions. Checkout calculates a rate at the moment of purchase using whatever package dimensions, weight, and carrier service your shipping profile has configured. The label gets purchased later, sometimes with a different box, a different carrier account, or a corrected weight once the item is actually packed. Any mismatch between those two moments shows up as a rate gap, and it tends to get worse as order volume and product variety grow.
Why it happens
The single biggest driver is package setup. Shopify sends a default, or per-product, package's dimensions and weight to the carrier to generate the checkout quote. Carriers typically price on whichever is greater of actual weight and dimensional weight, a figure calculated from the package's volume, so a default package that's bigger than what you actually pack into, or one that doesn't reflect how a product really ships, produces a quote that has little to do with reality.
The second driver is a mismatch between the rate source shown at checkout and the rate actually purchased. If checkout is configured to quote one carrier or service tier but fulfillment ends up buying a label from a different one, because a cheaper option gets chosen manually, a service gets substituted, or multiple items get combined or split into more boxes than checkout assumed, the two numbers were never going to agree. Fuel surcharges, residential delivery fees, and address-correction fees that get applied at label-purchase time but aren't reflected in the live checkout quote add further drift.
5 ways to fix it
Fix your default package dimensions and weight first
In Shopify admin, go to Settings > Shipping and delivery > Packages and review the dimensions and weight on your default package. Add custom packages that match the boxes and mailers you actually use, and assign the right package to each product or product type. Carriers price using dimensional weight as well as actual weight, so a default package that's larger than what you really pack into produces a checkout quote that has little to do with what you'll pay. This is a free, native fix and the first thing to check.
Make sure checkout and fulfillment are quoting the same carrier and service
In each shipping profile under Settings > Shipping and delivery, confirm that the carrier accounts and service levels enabled for carrier-calculated rates are the ones you actually buy labels from. If checkout is set to quote a service you rarely purchase, because a cheaper or faster option gets chosen manually at fulfillment time, the quote and the label will never line up. Keeping the enabled services and your real buying habits in sync removes a large share of the discrepancy.
Add a percentage or flat-rate buffer to calculated rates
Within a shipping profile, Shopify lets you apply a rate adjustment, a percentage markup, a flat dollar amount, or both, on top of carrier-calculated rates. If dimensional weight quirks, fuel surcharges, or remote-area fees mean labels reliably run a bit higher than the live quote even after packaging is fixed, a modest buffer commonly in the low single digits to around ten percent absorbs that variance so you're not chasing pennies on every order.
Test multi-item and multi-box orders, not just single-item checkouts
Rate gaps are often invisible on single-item test orders because the assumed package matches reality. Place test orders with two, three, and mixed-product carts and compare the checkout quote to what you'd actually pack and ship, whether that's combined into one larger box, split into two shipments, or padded with extra dunnage that adds weight. If the gap only shows up on multi-item orders, the fix is usually box and package logic rather than the base package profile.
Reconcile quoted vs. actual rates periodically instead of per-order
Even with packaging and rate sources dialed in, some drift is normal, since carrier surcharges and demand pricing shift over time. Rather than trying to eliminate the gap to zero, pull a periodic report comparing collected shipping revenue to label spend, using your shipping label history or carrier account, and adjust your buffer or package setup only if the gap is trending consistently in one direction.
Bottom line
In most cases this is fixable with free, native settings: accurate package profiles, matched rate sources, and a small calculated-rate buffer close the gap for the majority of stores. If you ship highly variable box sizes or weights across a large catalog and the native package and profile tools still can't keep pace, that's a case where a dedicated shipping-rate or packaging app, not a BesPoP product, is the more targeted next step rather than a general storefront app.
Browse the rest of the problem library, run a free storefront scan to catch issues like this automatically, or email us and we'll work out a custom solution for it.