Freight in COGS confuses more sellers than almost any other accounting question. The answer is simpler than the panic suggests. Inbound freight — the cost of getting inventory to you — belongs in Cost of Goods Sold. Outbound freight — the cost of getting a finished product to your customer — does not. Get that backwards and you misstate margins and inventory value on every financial statement you produce.
This post draws the line cleanly. One test settles almost every case: did the freight acquire inventory, or did it deliver a sale?
The one test that settles 90% of cases
Ask one question for every shipping charge: did this cost bring inventory in, or send a product out?
Inbound freight acquires inventory. It's part of what your product cost to land in your warehouse. The IRS treats it as part of the cost of goods — Publication 334 is explicit that freight-in is included in inventory cost. So it sits in COGS.
Outbound freight delivers a finished sale. It's a cost of doing business, not a cost of owning inventory. It belongs in operating expenses, usually as a selling cost.
Here's the practical version. You buy 1,000 units at $4 each and pay $600 to ship them from your supplier. Your landed cost is $4,600, or $4.60 per unit. That $600 is freight in COGS. Later, you pay $9 to ship one order to a customer. That $9 is an operating expense. Same word — "shipping" — two completely different lines.
Why getting it wrong distorts every margin you report
Misclassifying freight doesn't just shuffle one number. It cascades.
Put outbound shipping into COGS and you understate gross margin while overstating operating efficiency. Put inbound freight into operating expenses and you do the reverse — gross margin looks too healthy, and your inventory is carried below its true cost. Either way, the COGS figure that drives your gross margin is wrong.
Consider a seller doing $2M in revenue with a true 40% gross margin. Move $80K of outbound shipping into COGS and gross margin drops to 36% on paper. That's a four-point swing on a number investors, lenders, and your own pricing model all depend on. As NerdWallet notes, COGS feeds directly into gross profit — so an error here flows into every downstream decision.
If you want to see how these distortions compound across fees and returns, our breakdown of e-commerce margins walks through the full stack.
Inbound freight: the costs that belong in COGS
Inbound freight is everything it takes to get sellable inventory into your hands and ready to ship.
Include these in your landed cost:
- Supplier-to-warehouse freight — ocean, air, ground, the carrier invoice.
- Import duties and customs fees — a real cost of acquiring the goods.
- Freight forwarder and brokerage charges tied to the inbound shipment.
- Inbound handling to receive and stock the units.
These all roll into the per-unit cost that hits COGS when the unit sells — not when you pay the freight bill. That timing matters. Freight in COGS is capitalized into inventory first, then expensed at the point of sale. The IRS guidance on inventory cost is built around exactly this matching.
For a deeper treatment of landed cost mechanics, see our inventory costing hub. And the Cost of Goods Sold glossary entry gives you the clean one-line definition to anchor your team on.
Outbound freight: the costs that stay out of COGS
Outbound freight is fulfillment. It's what you spend to move a sold product to the buyer's door.
Keep these in operating expenses:
- Customer shipping — the carrier label on each order.
- Last-mile delivery and local courier fees.
- Packaging consumables for fulfillment, like boxes, mailers, and tape.
- Fulfillment-center pick-and-pack fees from a 3PL.
These are real costs, and they can quietly eat your margin. But they aren't part of what your inventory cost to acquire. BigCommerce's accounting guide classifies these as selling and fulfillment expenses, separate from product cost. Treating them that way keeps your gross margin honest and your inventory valued correctly.
The gray zone: free shipping. If you eat the outbound cost to win the sale, it's still outbound. It's a marketing and fulfillment decision, not an inventory cost. It stays out of freight in COGS regardless of who technically pays.
How to set this up so you never have to guess again
Build the rule into your chart of accounts once, and the classification stops being a monthly judgment call.
Create separate accounts. One for freight-in inside your inventory/COGS structure. One for outbound shipping inside operating expenses. Never let a single "Shipping" account collect both — that's where most errors start. Shopify's e-commerce accounting guide recommends this separation explicitly for exactly this reason.
Then tag at the source. When a supplier freight invoice arrives, it codes to freight-in. When a carrier fulfillment bill arrives, it codes to outbound shipping. Make it a rule your bookkeeper or accounting software applies automatically, not a decision someone makes each time.
CentSight reads your live ledger from QuickBooks and your bank and shows you gross margin in real time — so when freight is miscoded, the margin moves and you see it. The intelligence layer doesn't replace your books. It catches the distortion before it reaches a pricing decision. As Shopify's retail finance overview puts it, clean margin data is the foundation everything else stands on.
Two more places this matters: marketplace fees, which sometimes bundle shipping in confusing ways, and returns analysis, where reverse freight needs its own treatment. The gross margin glossary entry is worth bookmarking for your team.
The takeaway
Run the one test on every shipping charge. Did it bring inventory in, or send a product out? Inbound is freight in COGS. Outbound is an operating expense. Build two separate accounts so the answer is automatic, and watch your gross margin — when freight is miscoded, the margin tells on it. Clear classification gives you a margin number you can actually price against. That's the whole point.


