Beancount.io LogoBeancount.io

E-Commerce Inventory Accounting With 3PLs and Multi-Channel Fulfillment: How Online Sellers Allocate Landed Costs, Track FBA Reserved Inventory, Reconcile Marketplace Settlements, and Avoid Phantom COGS at Year-End

10 min readMike ThriftMike Thrift
E-Commerce Inventory Accounting With 3PLs and Multi-Channel Fulfillment: How Online Sellers Allocate Landed Costs, Track FBA Reserved Inventory, Reconcile Marketplace Settlements, and Avoid Phantom COGS at Year-End

A seller scrolls through their Shopify dashboard and sees a 60% gross margin on their best product. They feel good. Then their accountant pulls the year-end numbers and the real margin is closer to 38%. The other 22 points were quietly eaten by inbound freight, duties, 3PL pick fees, peak-season surcharges, and lost units at the Amazon warehouse that nobody bothered to write down. Welcome to the most expensive accounting blind spot in e-commerce: phantom COGS.

Multi-channel sellers earn roughly 190% more revenue than single-channel retailers, but they also inherit 190% more bookkeeping complexity. Inventory sits in five places at once, settlement reports arrive in three different formats, fees come in 14 flavors, and units get lost, returned, or reclassified between marketplaces every day. If you do not have a deliberate system for landed costs, reserved inventory, settlement reconciliation, and year-end true-ups, your P&L is fiction.

This guide walks through the four moves that turn fiction into a clean general ledger.

What Counts as Cost of Goods Sold for an Online Seller

COGS is the direct cost of producing or acquiring the goods you actually sold during the period. For a physical product seller, the formula is simple to write down:

COGS = Beginning Inventory + Net Purchases + Freight In + Duties + Direct Labor − Ending Inventory

The simplicity is the trap. Most sellers populate "Net Purchases" with the supplier invoice and stop there. Everything else — the costs you actually paid to get the product to a saleable state at your fulfillment node — gets dumped into miscellaneous expense buckets and never makes it back to the unit cost. That is how a 60% margin becomes a 38% margin without anyone noticing.

The IRS expects the full landed cost in inventory, and so do your investors, your lenders, and your future self when you try to price for a new marketplace.

Step 1: Build a True Landed Cost Per SKU

Landed cost is what it actually costs to get one unit to the location from which it ships, ready to sell. For most e-commerce operations, the components are:

  • Vendor cost: the invoice price after volume discounts and rebates.
  • Inbound freight: ocean, air, rail, or trucking from the factory to the port and onward to your warehouse or 3PL receiving dock.
  • Duties and tariffs: HTS-classified duty rates, Section 301 tariffs where applicable, and merchandise processing fees.
  • Customs brokerage and insurance: fixed fees per entry plus cargo insurance premiums.
  • Inbound receiving fees: 3PLs typically charge per pallet, per carton, or per labor hour to receive and put away inventory.
  • Prep and labeling: poly-bagging, bundling, FNSKU labels, expiration date stickers — anything required by the destination marketplace.
  • Packaging materials: branded mailers, dunnage, inserts, and gift cards if they ship with every unit.

You allocate these costs to units using a method that fits the cost driver. Vendor cost and prep are per-unit. Inbound freight and duties are usually allocated by either weight, volume, or invoice value across the units in the shipment. Receiving fees might be per pallet allocated to the units on that pallet.

The math is straightforward, but the discipline is not. The fix that works for nearly every seller above $1M in revenue is a single owned cost catalog. Every new PO recalculates the landed cost for every SKU it touches, and the new unit cost becomes the inventory layer for the units received. Spreadsheets work up to a point; past about 200 SKUs across more than one fulfillment channel, you need software.

Step 2: Track Inventory Wherever It Sleeps Tonight

In a multi-channel operation, the same physical SKU can exist as five distinct inventory states at the same moment:

  1. In transit from supplier: title may have passed at the port, so it is your inventory, but it is not yet receivable.
  2. At your 3PL, sellable: the working stock that picks orders for DTC, eBay, Walmart, Shopify, and so on.
  3. At Amazon, sellable (FBA): stock available for Prime orders, counted against your replenishment limits.
  4. At Amazon, reserved: units flagged as in transit between fulfillment centers, customer-order processing, or inventory adjustments. This bucket is invisible to your replenishment system but very much your asset.
  5. At Amazon, unfulfillable: returned, damaged, or expired units waiting on disposition.

Each of those states should map to a sub-account on your balance sheet or, at minimum, a dimension on your inventory ledger. When sellers lump everything into one "Inventory" line, they lose the ability to see when Amazon is sitting on $80,000 of reserved stock that has not moved in 21 days — a real cash flow problem hiding inside an accounting blind spot.

For the FBA reserved bucket specifically, reconcile against Amazon's Inventory Ledger Report and Manage FBA Inventory report at least monthly. Reserved units that age past a few weeks usually indicate a routing problem you can fix; reserved units that never reappear belong in a reimbursement claim.

Step 3: Reconcile Marketplace Settlements, Not Bank Deposits

The single biggest mistake new e-commerce bookkeepers make is treating the lump-sum payout from Amazon or Shopify Payments as revenue. It is not revenue. It is the residue of revenue after the marketplace has already netted out a dozen kinds of activity against it.

A typical Amazon biweekly settlement deposit might be the algebraic sum of:

  • Gross product sales
  • Shipping income collected from buyers
  • Gift wrap income
  • Promotional rebates given to buyers (negative)
  • Refunds (negative)
  • Referral fees (negative)
  • FBA fulfillment fees (negative)
  • Monthly storage fees (negative)
  • Long-term storage fees (negative)
  • Inbound shipment service fees (negative)
  • Removal and disposal fees (negative)
  • Advertising service charges (negative)
  • Sales tax collected and remitted (pass-through)
  • Reserve withholdings (negative this period, positive when released)
  • Reimbursements for lost or damaged units (positive)

If you book the net deposit as "Amazon Sales," every single one of those lines disappears from your books. Your revenue is understated, your fees never get categorized, and your COGS does not flow against the right channel.

The correct pattern is to import the settlement report, post each fee category to its own expense account, and post the gross revenue and refunds separately. Most ecommerce-aware bookkeeping tools do this by summarizing each settlement into a journal entry of 10 to 30 lines that exactly equals the bank deposit when posted. That deposit then reconciles to the bank in one click, and you can see your true gross revenue, your true fee load, and your channel profitability for the first time.

A separate "Amazon Reserves" current-asset account holds withheld funds. When Amazon releases reserves in a later settlement, you move dollars from Reserves to Cash. This is how you keep an honest balance sheet instead of pretending money you cannot touch is already in the bank.

Accurate marketplace bookkeeping from day one is what separates sellers who can confidently raise prices, accept a venture debt term sheet, or sell their store, from sellers who spend the week before a tax deadline reconstructing a year of fees in a panic.

Step 4: Hunt Down Phantom COGS at Year-End

Phantom COGS is the gap between what your books say you sold and what your physical inventory says you sold. It comes from three reliable sources:

Unrecorded shrinkage at the 3PL or FBA. Units get miscounted, damaged in pick paths, or lost in transfers between FCs. If your inventory management system shows 1,000 units on hand and the warehouse cycle count finds 940, you have 60 units of phantom inventory inflating your balance sheet and depressing your COGS. Until you record the write-down, every report you produce is wrong.

Unprocessed returns. A buyer returns a unit, the marketplace refunds the customer, but the unit either never makes it back to your warehouse or arrives unsellable. If you only book the revenue reversal without booking the inventory addition or write-off, your COGS layer for that unit stays gone forever.

Cost layer drift. If you change suppliers, switch shipping modes, or hit a tariff change, your true landed cost can move materially between POs. If your accounting still values existing stock at last year's cost while you sell at this year's price, your margins look great for two quarters and then collapse when reality catches up.

The fix is a year-end physical inventory count compared against book inventory, with a single journal entry to true up the variance. If the adjustment is more than about 10% of inventory value, the cause is systemic, not a one-time event, and the fix is process work in the cost catalog and the 3PL workflows — not a bigger adjustment next year.

The tax impact of getting this wrong is not small. Overstated ending inventory understates COGS, which inflates taxable income. On a $50,000 understatement, the federal tax overpayment for a profitable seller in the 22% bracket plus self-employment tax can land between $10,000 and $18,000. That is real money sitting in the IRS's pocket because a warehouse never sent you the cycle count.

A Sample Monthly Close Routine

A clean multi-channel close for a seller doing $500K to $5M a year fits on one page:

  1. Import each marketplace settlement and post the multi-line journal entry. Reconcile each gross deposit to the bank.
  2. Import 3PL invoices and post fulfillment fees by channel.
  3. Pull the FBA Inventory Ledger Report and reconcile Reserved, Sellable, and Unfulfillable balances against your books. Open reimbursement claims for any persistent shortages.
  4. Pull a 3PL cycle count or end-of-month on-hand report and reconcile against your inventory system.
  5. Run COGS for the period using your weighted average or FIFO layers. Confirm gross margin by channel against your expected band, and investigate any channel outside it.
  6. Post landed cost updates for any POs received in the period.
  7. Move released Amazon reserves from the Reserves account to Cash.

This routine takes a focused half day if your systems are wired together and several painful days if they are not. The payback shows up the first time you can answer "what is my real margin on this SKU on Walmart versus Amazon versus Shopify?" without staring at a wall.

Plain-Text Books Make Multi-Channel Sane

The deeper you go into multi-channel e-commerce, the more you need an accounting system that can be queried, scripted, audited, and version-controlled like code. Closing fees, marketplace mappings, landed-cost methodology, and write-down policies are the kinds of decisions you will revisit every year. They deserve to live in something better than a brittle chart of accounts inside a closed-source ledger.

Keep Your Inventory Books Honest from the First Unit

The sellers who survive multi-channel scale are the ones whose books reflect the physical, financial, and operational reality of their business — not just the bank deposits. Beancount.io offers plain-text, version-controlled accounting that makes channel P&Ls, landed costs, and inventory states transparent and inspectable. No black-box reports, no vendor lock-in, no surprise reconciliations at year-end. Get started for free and see why developers and finance-savvy operators are switching to plain-text accounting for their commerce stack.