Allocating Real Shipping Cost Per Order From Shopify Shipping Labels

Customer-paid shipping is not label cost — and the gap silently distorts ROI. Here's how to export the Shopify Shipping labels report, allocate real cost per order, and flag the free-shipping-threshold orders where you eat the full label.
Quick answer
Export the Shopify Shipping labels report (Settings → Shipping and delivery → Shipping labels → Export), join it to your orders export on order name, and subtract the label cost from customer-paid shipping. The negative rows are orders where you ate the label — flag every one that crossed a free-shipping threshold and treat the delta as a contribution-margin line in your ROI model.
Allocating real shipping cost per order from Shopify Shipping labels
Assigning the actual label cost you paid Shopify Shipping to each order, so ROI reflects true contribution margin instead of customer-paid shipping revenue.
Shopify's default order export shows what the customer paid for shipping — a revenue line. It does not show what you paid the carrier for the label, which is a cost line. Those two numbers rarely match: free-shipping-threshold orders zero out the revenue side entirely, and residential surcharges routinely push label cost past the customer-quoted rate.
Allocating real shipping cost per order means pulling the Shopify Shipping labels report, joining it to orders on the order name, and using label price (net of any voids and refunds) as the shipping cost input to per-order contribution margin. It is the single fix that most cleans up marketing ROI on a Shopify store between €1M and €15M.
If your ROI model uses customer-paid shipping as a proxy for shipping cost, every free-shipping order is silently marked as break-even on logistics. It is not. You paid the label, the customer paid zero, and that gap lives inside contribution margin — usually against the highest-AOV cohort you have.
Why customer-paid shipping and label cost drift apart
Three mechanisms drive the gap. First, free-shipping thresholds: any order above the trigger contributes zero shipping revenue while still incurring a full label. Second, flat-rate shipping: you quote €4.90 at checkout and the actual label is €6.30 for a residential ZIP. Third, post-purchase adjustments — dimensional weight corrections, address correction fees, fuel surcharges — that hit the carrier invoice days after the order ships.
On a typical Shopify apparel store, we see label cost run 8-22% higher than customer-paid shipping revenue once thresholds and surcharges are included. On a beauty store with a €50 free-shipping bar and heavy glass SKUs, the gap can hit 35% because the trigger is low and the parcels are heavy.
The ROI distortion this creates
If you compute ROI as (revenue − COGS − ad spend) ÷ ad spend and use customer-paid shipping as your shipping-cost line, a Meta campaign that drove €40 AOV orders above a €35 free-shipping bar will look ~€6-8 more profitable per order than it actually is. Multiply by 3,000 orders a month and you're mis-allocating six figures of ad budget a year.
How to detect the gap: export the labels report
In Shopify admin, go to Settings → Shipping and delivery → Shipping labels → Export. The full walkthrough lives in exporting the Shopify Shipping labels report for cost allocation, but the essentials: pick a date range that matches your ROI period, include voided labels so you can subtract them, and export as CSV. You'll get one row per label with order name, service, weight, and label price.
Join that CSV to your orders export on the order name column (usually #1001, #1002, …). For orders with one label, the join is 1:1. For orders that shipped in multiple boxes, sum the label prices before joining — and if one label covered a multi-item order that partially returned, see allocating one shipping label across multi-item orders by weight vs line value for the split logic.
How to fix it: three allocation rules that hold up
Rule one: use label price net of voids and refunds, not gross. A voided label is a €0 cost, not a €7 cost. Rule two: reconcile monthly against the carrier invoice — Shopify's labels report shows the price at purchase, but carrier surcharges and adjustments that hit after label purchase can add 3-9% on top. Book that delta as a separate cost line so you don't distort per-order figures.
Rule three: for cross-border orders, split duties and import fees from the label cost. On EU-to-UK and UK-to-EU shipments especially, the label line often bundles VAT and duty pre-payments that are not logistics cost — they're a tax pass-through. Reconciling customer-paid vs label-charged shipping per order gets a lot cleaner once duties are on their own line.
Don't forget return labels
If you offer prepaid returns, the return label is a cost against the original order, not a standalone expense. Attributing return-label and reverse-logistics cost back to the original order is what turns a 4% return-rate SKU from "fine" into "unprofitable at this AOV".
Flagging the free-shipping-threshold orders
After the join, filter for rows where customer-paid shipping = €0 and label cost > €0. Those are the orders where you ate the full label. Tag them with the promotion or threshold that triggered the free shipping — a €50 site-wide bar behaves very differently from a Klaviyo win-back code that unlocks free shipping at any cart value. Flagging free-shipping-threshold orders where you eat the full label cost has the detailed tagging pattern.
The output you want is a per-order contribution-margin column that already nets label cost. Feed that into your Shopify marketing ROI inputs alongside COGS, payment fees, and ad spend, and campaign-level ROI stops lying to you. On a 10,000-order-per-month store, we typically see reported ROAS drop 6-14% after this fix — and it drops most on the campaigns you were about to scale.
Frequently asked questions
Shopify admin → Settings → Shipping and delivery → Shipping labels. The Export button appears in the top right. If you don't see it, you're on a plan or region without Shopify Shipping enabled and your labels are in your third-party carrier or ShipStation account instead.
Only if you have no free-shipping thresholds, no flat rates, and no residential surcharges — which almost no store fits. For everyone else, customer-paid shipping systematically understates cost, and the error is largest on your highest-AOV orders because those are the ones crossing the free-shipping bar.
ShipStation exports include carrier-side adjustments faster than Shopify's labels report, but the join key and workflow are similar. Shopify Shipping labels report vs ShipStation cost export for ROI reconciliation covers when to pick which — short version: use ShipStation if more than 20% of your labels are bought outside Shopify.
Sum every label tied to the order name before joining. If the boxes carried different line items and one was returned, you need a per-line allocation rule — usually by billable weight, sometimes by line value if the parcels were mixed. The multi-item allocation spoke has both formulas.
Monthly, aligned to your carrier invoice close. That's when post-purchase surcharges (dim-weight adjustments, residential fees, fuel) are finalised, so any earlier snapshot will understate cost by 3-9%.
Per-order is enough for marketing ROI. Per-SKU matters when you're pricing individual products or deciding whether to keep a heavy, low-margin item — that's when the multi-item weight-vs-line-value split earns its keep.
The label line for cross-border shipments often includes pre-paid VAT and duties, which are pass-through taxes and not logistics cost. Separate them into their own column before computing shipping contribution margin — see the cross-border duties spoke for the specific fields.
Yes. A return label is a direct cost caused by the original order, not a general opex line. Attributing it back to the order (and the acquisition channel) is what surfaces high-return-rate SKUs that look profitable in aggregate but aren't at the unit level.
Yes — shipping cost moves from a fixed proxy to a per-order line, which usually drops reported ROAS 6-14% on free-shipping campaigns. The corrected number is the one you should be scaling against.
Yes. Metricuno pulls the Shopify Shipping labels export, joins it to orders on order name, subtracts voids and surcharges, and feeds per-order shipping cost into the same contribution-margin view your campaigns roll up to — no CSV work per month.
Get an AI expert review of your site
Paste your URL — Metricuno's AI runs the same heuristic checks a senior CRO consultant would, scoring your page and prioritising the fixes that'll move conversion fastest.