August 7, 2026
Free Shipping Is Quietly Eating Your Shopify Margins. Here Is How to See the Damage
Shopify counts shipping you charge as revenue but never subtracts what you paid for the label. Free shipping makes it worse. Here is how to calculate the real margin impact per product.
Johny | Shopsterra
Free Shipping Is Quietly Eating Your Shopify Margins. Here Is How to See the Damage
Free shipping converts. Nobody disputes that. Offer it and your cart abandonment drops, your average order value often climbs, and the customer feels like they got a deal. What almost nobody measures is what it costs, because Shopify makes the cost nearly invisible.
When you charge for shipping, that amount lands in your revenue. When you offer free shipping, the label cost is pure cost with no revenue against it. Either way, Shopify does not subtract what you actually paid the carrier from the order. The label cost sits in a separate billing export, the revenue sits in your dashboard, and the two never meet in any report that shows you profit.
What Shopify does and does not track on shipping
If a customer pays $8 for shipping, that $8 is counted as revenue. Shopify treats it the same as product revenue. What Shopify does not do is put the actual label cost, the number the carrier charged you, next to that order as a deduction. So an order where you charged $8 and paid $12 for the label looks, in your revenue figure, like it made you $8. It actually lost you $4 on shipping alone.
With free shipping it is worse, because there is no $8 to soften it. You paid $12 for the label and Shopify shows nothing. The order looks as profitable as an identical order shipped to a customer next door for $5. Same product, same price, wildly different real margin, and no report anywhere reflects it.
The number that matters: charged minus paid, per order
The mistake most stores make is looking at shipping as a monthly total. Total shipping revenue versus total label spend. That number hides the problem completely, because your profitable light orders subsidise your unprofitable heavy ones and the average looks fine.
The number that actually tells you something is shipping charged minus shipping paid, per order. Export a month of orders, put the actual carrier cost next to what the customer paid on each one, and sort by the difference. What you find almost every time is that the losses cluster. One or two SKUs, usually the heavy ones or the ones people order on their own, eat most of the gap. The rest of your catalog is roughly fine.
That changes the fix entirely. You do not need to kill free shipping across the store. You need to handle the specific products and order profiles where it loses money.
Why single-item orders are the hidden trap
Here is a pattern that catches a lot of stores. Your shipping economics on a three-item order are usually fine, because the order value is high enough to absorb one label. The same product ordered on its own carries the full label cost against a single low-priced item, and that is where free shipping goes underwater.
A $25 product with a $9 label has a $9 shipping cost against $25 of revenue. That is 36% of the sale price gone to shipping before you count the product cost, payment fees, or ad spend. On a three-item $75 order with a $12 label, shipping is 16% of revenue. Same products, completely different math, driven entirely by how many units are in the order.
This is why a flat free shipping policy quietly punishes you on exactly the orders that are already least profitable, the small single-item ones, and why raising a free shipping threshold above your typical single-item order value often fixes more than changing the policy ever would.
How to actually calculate the impact
To see the real picture you need three things joined together per order: what the customer paid for shipping, what you paid for the label, and what was in the order. Here is the structure.
Pull your orders for a period with the shipping charged on each. Pull your shipping label costs from Settings, then Shipping and delivery, then Shipping labels, or from your carrier billing if you ship outside Shopify. Join them on order number. Add a column for charged minus paid. Then bring in the order contents so you can see which products appear in the negative rows.
Sort by the charged-minus-paid column, most negative first. The products and order profiles at the top of that list are the ones costing you money. Now you can decide per case: raise the threshold, reprice the heavy SKU, switch that product to calculated shipping instead of free, or bundle it so it never ships alone.
Folding shipping into real per-product profit
Shipping in isolation is only part of the story. A product can lose money on shipping and still be profitable overall if its margin is fat enough, or look fine on shipping and lose money once you add ad spend and returns. The only decision-grade number is net profit per product with shipping, cost of goods, payment fees, ad spend, and refunds all accounted for.
Getting there manually means maintaining the shipping join above, plus landed costs, plus ad spend allocation, plus return rates, and redoing it whenever anything moves. It works for a small catalog. It becomes a part-time job at any real scale.
Shopsterra pulls your Shopify orders, shipping costs, cost of goods, ad spend, and refunds into one place and shows real net profit per product, with shipping already netted out per order rather than averaged across the month. You connect once and see which products and which shipping policies are actually costing you.
If you want to see where free shipping is eating your margin instead of guessing, connect your store at shopsterra.com/register. Free during beta, no credit card, about 5 minutes to connect.