Your Shopify dashboard says your bestselling hoodie earns a 45 percent gross margin. But that number only knows the factory price. It has never met the pick-and-pack fee, the monthly pallet storage, the ocean freight, the import duty, or the customs broker who cleared the container — and every one of those costs came out of your pocket before a single customer clicked buy. For cross-border sellers, the gap between dashboard margin and true margin is where profit quietly disappears.
Cross-border selling is no longer a side bet: 59 percent of global shoppers now buy from retailers outside their home country, and the cross-border B2C market is projected to reach $2.16 trillion in 2026. If you sell internationally on Shopify, reconciling fulfillment fees and duties into product COGS is not advanced accounting — it is the only way to know what you actually earned. This guide walks through the three cost streams in every cross-border order, who books the duty under different shipping terms, how to build a landed cost per SKU, and a monthly routine that keeps every dollar accounted for.
The Three Cost Streams in Every Cross-Border Order
A domestic order has one cost story: you bought or made the product, and you shipped it. A cross-border order has three, and they arrive on three different schedules.
Fulfillment fees are what it costs to store, pick, pack, and ship each unit. If you use a third-party logistics provider (3PL) connected to Shopify, a typical invoice breaks into receiving (often $10–$20 per pallet), storage (commonly around $25 per pallet per month, or 20–40 cents per cubic foot), pick and pack (roughly $2.50 per order plus about 50 cents per additional item), plus packaging, kitting, and returns processing. Multi-item orders cost more than single-item ones, slow-moving SKUs rack up storage month after month, and none of these lines appear inside your Shopify payout — they arrive as a separate monthly invoice.
Duties and import taxes are what the destination country charges to let your goods in. Shopify's Managed Markets service can calculate, collect, and remit these at checkout, acting as merchant of record for your international orders so the buyer sees one landed price with no surprise bill at delivery. That convenience comes with a per-order fee, and it creates bookkeeping traffic — collected duties and remitted duties — that must pass through your books without ever touching revenue.
Freight and payout netting is the timing layer. Your Shopify payout is a net settlement: gross sales minus processing fees, refunds, and adjustments, deposited days after the sale. Inbound freight, broker fees, and duty bills land weeks later. Reconciliation means tying all three streams to the same units sold, even though the paperwork shows up a month apart.
DDP or DAP: Who Pays the Duty Decides Who Books It
Before you can reconcile duties, you need to know whose duties they are. The shipping terms on the order decide.
Under DDP (Delivered Duty Paid), you — the seller — handle import clearance and pay all duties and taxes. The buyer gets the goods with nothing extra owed. Under DAP (Delivered at Place), you deliver the goods to the destination, but the buyer handles clearance and pays the duties. (You may still see the older term DDU, Delivered Duty Unpaid, on carrier paperwork; it means the same thing as DAP and was retired from the official Incoterms rules years ago.)
This distinction runs your books:
- DDP duties are your product cost. They attach to the units sold and belong in COGS, exactly like the factory price and inbound freight.
- DAP duties are never your cost at all. The buyer pays the carrier or broker directly. No money moves through you, so nothing hits your books — do not estimate them into COGS "for completeness."
- Checkout-collected duties under Managed Markets are pass-through funds. You collect them from the buyer and they are remitted on your behalf. Record the collection as a liability (duties payable), not revenue, and the remittance as clearing that liability, not an expense. Treating the collection as sales inflates both your revenue and your costs by the same amount and makes every margin ratio meaningless.
If you mix DDP and DAP orders — common when you sell DDP in your biggest markets and DAP everywhere else — tag the shipping terms on each order before month-end. A single blended duty rate applied to all international sales will overstate COGS on DAP orders and understate it on DDP ones.
Duties Are Inventory Cost, Not an Expense
Here is the rule most small sellers get wrong: import duties on goods you will resell are part of the cost of the goods, not a period expense. Under U.S. GAAP, ASC 330 defines inventory cost as all expenditures incurred in bringing an item to its existing condition and location for sale — and accounting guidance is explicit that tariffs and duties paid to import goods are inventory costs. They sit on the balance sheet inside inventory value and flow into COGS only when the units sell.
Why this matters in practice:
- Expensing duties in the month you pay them pulls cost forward. A $1,400 duty bill paid in March for hoodies that sell through August should burden March-through-August COGS, not nuke March's margin while flattering the summer.
- Capitalizing duties keeps inventory honest. If duties are 10–20 percent of your unit cost and you expense them, your balance sheet understates inventory every month of the year — and any lender reading it sees a thinner asset base than you actually own.
- Small resellers are not exempt from the concept. Businesses under the inflation-adjusted $25 million gross-receipts threshold get relief from the complex UNICAP capitalization rules, but ordinary acquisition costs — purchase price, freight-in, duties — still attach to inventory under the standard inventory rules.
The same logic covers inbound freight, cargo insurance, and brokerage fees tied to getting goods to your warehouse. What it does not cover is everything after the goods are ready to sell: ongoing warehouse storage, pick-and-pack, outbound shipping, and returns processing are operating expenses of the period, not product cost. The dividing line is availability for sale — costs to get inventory ready attach to units; costs to store and move sold units hit the month.
Build the Landed Cost for Every SKU
Landed cost is the true per-unit cost of getting a product ready to sell: purchase price plus every allocated acquisition cost. The formula is simple:
Landed cost = product cost + freight + insurance + duties + brokerage and handling, allocated across units.
Allocation is where sellers stumble. A container holds many SKUs, but the freight invoice shows one number. Pick one consistent method — by units, by weight, or by value — and stick with it all year. Value-based allocation suits mixed-margin catalogs; weight-based suits heavy goods; per-unit suits single-SKU shipments. Consistency matters more than sophistication, because changing methods mid-year makes period comparisons useless.
A worked example makes this concrete. Suppose you import 400 hoodies:
| Cost component | Shipment total | Per unit |
|---|---|---|
| Factory price ($14 each) | $5,600 | $14.00 |
| Ocean freight | $1,200 | $3.00 |
| Cargo insurance | $100 | $0.25 |
| Import duties and tariffs | $1,400 | $3.50 |
| Broker and port fees | $300 | $0.75 |
| Total landed cost | $8,600 | $21.50 |
Your "real" unit cost is $21.50, not $14 — more than 50 percent higher than the factory quote. Price against $14 and a 45 percent dashboard margin is really about a 16 percent margin before fulfillment fees even enter the picture. Once landed costs live in your books as inventory lots, tracking how they drift over time — as freight rates and duty rates move — shows you exactly when a SKU needs a price increase. A visual dashboard such as Fava makes that drift easy to spot across your whole catalog.
Refresh landed costs on a schedule, not when you remember. Freight and duty rates move constantly; a landed cost computed once in January is fiction by October. Recompute per SKU at least quarterly, and immediately after any shipment whose freight or duty bill looks materially different from the last.
Reconcile the Payout: Gross-to-Net With Fulfillment Lines
Shopify payout reconciliation for a cross-border seller has one more step than the domestic version: the payout report is only the first of three source documents. Here is the monthly routine.
Step 1: Decompose each payout gross-to-net. For every Shopify payout in the month, start from the settlement detail, not the deposit. Book gross sales to revenue, processing fees to a fees expense account, refunds to a contra-revenue or refund account, collected sales tax and collected duties to their payable accounts, and route the net through a clearing account that the bank deposit then zeroes out. Every payout's clearing balance should return to zero; a leftover balance is a missing refund, fee, or adjustment.
Step 2: Match the 3PL invoice to the month's shipments. Your fulfillment invoice deducts nothing from payouts — it is a standalone bill, usually monthly. Split it into its components: receiving and inbound handling attach to the inventory lots they received (add them to landed cost), while storage, pick-and-pack, outbound shipping, and returns go to operating expense accounts. Then tie the pick-and-pack line to order counts: if you shipped 1,200 orders and were billed for 1,200 picks plus 300 additional-item fees, the math should reconcile to your order report within a small tolerance for replacements and split shipments.
Step 3: Accrue what has not been billed yet. At month-end, you will always have uninvoiced fulfillment: orders shipped in the last week that the next 3PL invoice will catch, and containers cleared by the broker whose bill arrives next month. Estimate both from recent averages and book an accrual (debit the expense or inventory account, credit accrued liabilities), then reverse it when the real invoice posts. Without this step, the last week of every month looks artificially profitable.
Step 4: Clear the duty pass-through. Total the duties collected at checkout against the duties remitted through Managed Markets or paid to your broker. The payable account should clear to near zero each month. A growing credit balance means collections you never remitted — a liability you owe, not profit. A growing debit balance means you paid duties out of pocket (likely DDP orders) that need reclassing into COGS.
Step 5: Reconcile foreign currency separately. Cross-border sellers often pay suppliers in one currency, collect in several, and settle payouts converted to home currency. Book supplier bills at the spot rate on the invoice date, book payments at the settlement rate, and let the difference fall to foreign-exchange gain or loss — never into COGS, where it would distort product margins. The same applies to payout conversion differences from Shopify.
Recording these entries is straightforward once the accounts exist: a clearing account per channel, separate expense accounts for each fee type, and payables for tax and duties. If you keep your books in plain text, the docs walk through setting up exactly this kind of account structure.
Five Mistakes That Understate Your COGS
1. Booking the net payout as revenue. Recording the $36,400 deposit instead of $39,800 in gross sales understates revenue and hides every fee deducted along the way. Your 1099-K reports the gross to the tax authority; your books should agree with it.
2. Expensing duties in the month paid. A duty bill is not office supplies. Capitalize it into the inventory lot it cleared, and let it reach COGS as those units sell. Immediate expensing shifts cost into the wrong period and understates your inventory asset.
3. Putting every fulfillment dollar in the same bucket. Inbound receiving that prepares goods for sale attaches to units; monthly storage and per-order pick-and-pack are period operating expenses. Blending them either overstates COGS (storage in product cost) or understates it (receiving in general expense). Split the 3PL invoice every month.
4. Recording collected duties as revenue. Duties you collect at checkout and remit are agency funds, not sales. Booking them as revenue inflates your top line and — when you book the remittance as an expense — your costs, leaving margin ratios pure noise. Run them through a payable account instead.
5. Forgetting the final mile of FX. Supplier bills in euros, payouts converted from pounds, duties paid in Canadian dollars — each conversion creates a small gain or loss. Individually trivial, collectively material, and they belong in FX gain/loss, not buried in product cost or ignored in the clearing account.
Your Monthly Cross-Border Close Checklist
Run this checklist before you close the books each month:
- Every Shopify payout decomposed gross-to-net; all clearing accounts at zero
- 3PL invoice split: inbound costs to inventory lots, storage and pick-pack to operating expense
- Pick counts tied to shipped order counts within tolerance
- Accruals booked for uninvoiced late-month fulfillment and broker bills
- Duty payable cleared: collections matched to remittances, DDP out-of-pocket reclassed to COGS
- Landed costs refreshed for any SKU with a new shipment this month
- FX gains and losses separated from product cost
- Inventory roll-forward agrees: opening balance plus purchases and capitalized costs, minus COGS, equals ending balance
Keep Your Cross-Border Margins Honest
Reconciling fulfillment fees and duties is the difference between a margin you hope is real and one you can prove. Beancount.io provides plain-text accounting that gives you complete transparency and control over your financial data — no black boxes, no vendor lock-in. Get started for free and see why developers and finance professionals are switching to plain-text accounting.





