Margins and True Cost

Free Shipping and Shipping Cost Allocation: The Hidden Margin Killer

Free shipping is never actually free. Here is how to allocate the real cost per order and per SKU instead of burying it in a general expense line.

Read time
~ 6 min
Platforms
Multi-platform
Scope
Canadian Sellers

“Free shipping” is a phrase that describes what the buyer sees, not what actually happens to the cost. Someone pays for the carrier to move the box: either the buyer, through a higher listed price that absorbs the shipping cost, or the seller, through a margin reduction on every order. When a store advertises free shipping, the cost has not disappeared, it has moved into the product price or into the margin line, and if the bookkeeping does not track it explicitly, it becomes invisible in exactly the report that most needs to show it: per-order and per-SKU profitability.

Most sellers know this in the abstract. Where it goes wrong in practice is in how shipping cost gets recorded: lumped into a single general “shipping expense” account at the store level, disconnected from the specific orders and SKUs that generated it, which makes it impossible to see whether a given order or product is actually profitable once its real shipping cost is included.

Why “Free” Shipping Still Has a Real Cost

There are two structural ways free shipping gets funded, and most stores are doing some blend of both without a clean split between them:

Built into the listed price. The product’s selling price is set higher than it would be if shipping were charged separately, with the shipping cost embedded in that higher price. This works cleanly in theory, but it requires the price increase to actually reflect the real average shipping cost for that product; a flat price increase across a catalog with widely varying product weights and sizes will overcharge for shipping on light items and undercharge on heavy ones.

Absorbed directly into margin. The listed price stays where it would have been with paid shipping, and the shipping cost is simply eaten as a margin reduction on every order. This is common on marketplaces where price competitiveness against other listings makes raising the price to cover shipping impractical, and on Shopify stores using free shipping as a conversion-rate lever without repricing to offset it.

Neither approach is wrong on its own, but a store needs to know which one it is actually running, and by how much, to understand true per-order margin. A store that believes it built shipping into pricing, when the actual average shipping cost has crept above what was priced in, is absorbing an unplanned margin loss on every order without visibility into it.

Allocating Shipping Cost Per Order and Per SKU

The fix is to track shipping cost as a per-order (and, where products vary significantly in size or weight, per-SKU) cost, the same way landed cost of goods is tracked per unit, rather than as a single lump expense account that only shows a monthly total disconnected from any specific sale.

A workable allocation approach:

  • Pull the actual carrier cost per shipment from the shipping label provider or platform (Shopify Shipping, Amazon’s fulfillment fee structure, a third-party carrier account, or a 3PL’s shipping pass-through) rather than assuming a flat average
  • Attribute that actual cost to the order it shipped, and where an order contains a single SKU, to that SKU
  • For multi-item orders, allocate the shipping cost across the SKUs in the order, commonly by weight or dimensional weight proportion, since a flat per-unit split misrepresents cost when order contents vary in size
  • Compare the allocated shipping cost against the shipping revenue (if any is charged) or against the shipping amount assumed to be built into the price, to see the actual shipping margin or shipping cost drag by SKU

This produces a per-SKU shipping cost figure that can sit alongside landed cost of goods and platform fees in a true contribution margin calculation, rather than a store-level shipping expense total that says nothing about which products are driving the cost.

Carrier Cost Variability Breaking Flat-Rate Assumptions

Carrier pricing is not flat. It varies by actual and dimensional weight, package dimensions, origin and destination zone, and service level, and rate cards are updated periodically by every major carrier. A store that prices free shipping into its catalog based on a flat assumed shipping cost per order, without revisiting that assumption as the product mix or carrier rates change, will drift out of alignment over time, typically in the direction of underpricing for heavier or bulkier items as they are added to the catalog.

This is a particular risk for stores that expanded their product range after the free-shipping pricing decision was originally made. A product line’s shipping cost assumption set when the catalog was all small, light items does not hold once a heavier or larger product is added under the same free-shipping policy, and the newer product can be shipping at a loss that a store-level shipping expense total will not surface.

Platform-Subsidized Shipping and Double-Counting Risk

Several platforms bundle or discount shipping cost in ways that create a risk of either missing the true cost or double-counting it:

ProgramWhat it doesDouble-counting risk
Shopify Shipping discounted ratesProvides discounted carrier rates through Shopify’s negotiated volume pricingRecording the discounted rate as the shipping expense while also assuming a separate margin-drag allocation for shipping already built into pricing can double the assumed cost
Amazon FBA fulfillment feesBundles pick, pack, and outbound shipping into a single per-unit fulfillment fee, already reflected in the settlement reportTreating FBA outbound shipping as a separate cost on top of the fulfillment fee already recorded, rather than recognizing that shipping is embedded in that fee, overstates total shipping cost
Third-party carrier accounts or 3PL shipping pass-throughCarrier cost billed directly, sometimes with a markup or handling fee from the 3PLFailing to separate the carrier cost from the 3PL’s handling or pick-and-pack fee obscures which portion is actually shipping versus fulfillment labour

The core risk in each case is the same: a cost that is already embedded in one line item (a fulfillment fee, a bundled rate) gets recorded again separately, inflating the apparent shipping cost, or a cost that looks bundled is actually separate and gets missed entirely. The 3PL Warehousing and Fulfillment Cost Accounting guide covers the fulfillment side of this in more detail for sellers using a third-party warehouse.

Building the Per-Order Shipping Allocation Workflow

  1. Identify every source of shipping cost: carrier accounts, Shopify Shipping, Amazon FBA fulfillment fees, 3PL pass-through charges
  2. Confirm which costs are already bundled into another fee (such as Amazon’s fulfillment fee) versus billed separately, to avoid double-counting
  3. Pull actual per-shipment cost data rather than relying on an assumed flat rate
  4. Allocate multi-item order shipping cost across SKUs by weight or dimensional proportion
  5. Compare allocated shipping cost per SKU against any shipping revenue charged and against the amount assumed to be built into the listed price
  6. Flag SKUs where actual shipping cost materially exceeds what was priced in or assumed
  7. Revisit the pricing or shipping-cost assumption periodically, particularly after adding new products with different weight or size profiles, or after carrier rate changes
  8. Feed the resulting per-SKU shipping cost into the broader contribution margin calculation alongside landed cost and platform fees

Scope of This Guide

This guide covers how to identify and allocate the true cost of free and flat-rate shipping programs for Canadian e-commerce sellers. It does not cover:

Free shipping is a legitimate and often necessary competitive decision. What it should never be is an invisible one. A store that knows its actual per-order shipping cost, and where that cost concentrates by SKU, can make a deliberate pricing decision instead of discovering the margin impact after the fact.

Get in touch if your shipping cost currently lives in a single general expense account disconnected from order and SKU data. Building a per-order allocation is usually the missing piece in an otherwise complete margin analysis.

Alex Teplov, CPA / Last updated: August 22, 2026

This guide is for general informational purposes only and does not constitute professional accounting, tax, or legal advice. It does not create an accountant-client relationship. Marketplace rules, CRA administrative positions, and cross-border compliance rules change, and the correct treatment depends on the records behind your specific file.

EcomCount
About EcomCount
Marketplace accounting operated by Teplov CPA

EcomCount helps Canadian marketplace sellers with bookkeeping, tax compliance, payout reconciliation, margin reporting, and cross-border accounting questions. The file is handled within Teplov CPA, with the operating model adapted to e-commerce reporting complexity.

About the practice
Browse the library

All resources

Guides on marketplace accounting, GST/HST, reconciliation, inventory, and cross-border seller issues.

View all guides
Get file-specific help

Work with EcomCount

General guidance is useful. The real answer still depends on the reporting setup, source documents, and platform mix in your file.

Talk to EcomCount
Next step

Want the treatment checked against actual marketplace records?

Send the channels you sell on, your accounting software, and the reporting issue you are trying to resolve.

Contact EcomCount