Your Shopify payout lands in the bank for 4,180 dollars on 5,000 dollars of sales, and your accounting software imports the deposit and calls it a day. But the 820 dollars that never arrived is only half the story. Sitting on a separate Shopify invoice — billed on its own rhythm, through its own threshold — are the shipping labels you bought all month, plus any fulfillment fees from the warehouses that picked and packed your orders. If those never reach your books as cost of goods sold, your margin is a fiction: revenue understated on one side, costs missing on the other, and gross profit wrong in a direction that flatters you right up until tax time.
This guide covers the cost side of Shopify reconciliation that most sellers skip. The revenue side — gross versus net payouts, chargebacks, refunds — deserves its own walkthrough. Here you will learn where every shipping and fulfillment dollar hides, how to book each one, and how to prove at month-end that nothing slipped through.
Why Shipping Costs Vanish From Shopify Books
Shopify moves your money through three separate paths, and only one of them shows up in your bank feed:
- Payout deductions. Processing fees, refunds, and chargebacks are netted out of each payout before the deposit hits your bank. You never see that money, so bank-feed bookkeeping records revenue net of fees.
- Threshold-billed invoices. Shipping labels you buy through Shopify Shipping are not deducted from payouts. They accumulate against a billing threshold, and Shopify charges your payment method when you hit it — or rolls the balance into your monthly subscription invoice if you never do. The charge arrives on a different day, under a different description, from the payout it relates to.
- Third-party fulfillment bills. If a 3PL warehouse or fulfillment network picks, packs, and ships for you, those pick-pack fees, storage charges, and outbound freight bills arrive as ordinary vendor invoices, completely outside Shopify.
Each path needs its own bookkeeping treatment, and the classic failure is recording only path one. The seller who books the bank deposit as revenue and the Shopify subscription as software expense has captured neither the label spend nor the fulfillment spend anywhere. At year-end the tax return shows too little revenue and too few costs, and the error does not cancel out — it compounds, because the missing revenue is taxed at your marginal rate while the missing deductions are lost entirely.
Shipping Labels: From Threshold Billing to Your Books
When you buy a postage label inside Shopify, Shopify fronts the carrier cost and bills you later. Labels accumulate until your label spend crosses your account's billing threshold, at which point Shopify immediately invoices and charges your card. Below the threshold, label charges simply join your next monthly Shopify bill alongside your plan subscription and app charges.
That bundling is where the bookkeeping breaks. A single 340-dollar Shopify charge might contain a 39-dollar Basic plan subscription, 12 dollars of app fees, and 289 dollars of postage — three different accounts in one bank line. Book the whole thing as software subscriptions and you have overstated an operating expense while your shipping costs disappear from margin analysis.
How to book label spend correctly
Pull the detailed billing invoice from your Shopify admin (Settings, then Billing) for every charge, and split it:
- Postage itself goes to a shipping or fulfillment cost account. Whether that account sits inside COGS or in operating expenses is a decision you make once and keep — more on that below.
- Carrier price adjustments — the debits and credits carriers issue when a package weighs more than the label stated, or when a voided label is refunded — belong in the same account, in the month they post. A voided label is not revenue; it is a cost reversal.
- The subscription and app portions stay in software expenses where bank-feed bookkeeping wanted to put everything.
Reconcile monthly: total label purchases in your shipping reports for the month should equal label charges across that month's Shopify invoices, plus or minus the timing float of labels bought just before or after an invoice cut. If the two drift apart by more than a few dollars, you are either missing an invoice or double-counting an adjustment.
Fulfillment Fees: COGS or Operating Expense?
Pick-pack fees, per-order handling charges, warehouse storage, and the boxes and mailers your 3PL consumes all raise the same classification question: are they cost of goods sold or operating expenses? Accounting standards give you room — outbound fulfillment costs may sit in either place — but they demand consistency. The choice changes your reported gross margin, and flipping it mid-year makes every trend comparison meaningless.
For most small product businesses, the practical rule is:
- Costs that scale with each unit shipped — pick-pack fees, per-order handling, packaging materials, outbound postage you pay — belong in COGS (or a clearly labeled fulfillment-cost account grouped with COGS). They behave like product cost: no sale, no spend.
- Costs that accrue with time rather than orders — monthly warehouse storage minimums, account management fees, 3PL software seats — belong in operating expenses. They behave like overhead: you pay them in a slow month too.
Inbound freight is a separate, stricter rule. The IRS treats freight-in — what you pay to get inventory from your supplier to your shelf — as part of inventory cost, which flows into COGS only when the goods sell. If you expense a 900-dollar inbound freight bill in January for goods that sell in March, you have deducted the cost in the wrong period. Fold inbound freight into your landed unit cost instead: net invoice plus freight plus duties, divided by units received.
Document the policy in one paragraph — which accounts hold which fees — and apply it identically every month. When a lender or a buyer later asks why your gross margin moved three points, the answer should be pricing or sourcing, never a reclassification you forgot you made.
Sales Tax on Shipping: Collected Tax Is a Liability, Not Revenue
Charging a customer 8 dollars for shipping does not make shipping revenue of 8 dollars if your state taxes delivery charges. In many states — including Texas, New York, Washington, and Pennsylvania — shipping on a taxable sale is taxable even when separately stated on the invoice. In others, separately stated shipping escapes tax, but only if you actually state it separately; bundle shipping into the item price and it is taxable everywhere the sale is taxable. A few states split the difference further, exempting transportation while taxing handling.
Three bookkeeping rules follow:
- Sales tax collected on shipping is a liability the moment you collect it, exactly like tax on the product. It sits in a sales-tax-payable account until you remit it. Never let it pool inside revenue.
- Shipping income and shipping expense are separate lines. If you collect 8 dollars and the label cost 6.40, book 8 dollars of shipping income and 6.40 of shipping cost. Netting them to 1.60 hides both the true cost trend and the taxable base if your state ever audits the shipping line.
- Verify what Shopify actually collected. Shopify Tax can compute and collect tax on shipping per your settings, but the settings are yours to configure — product taxability, shipping taxability overrides, nexus registrations. Pull a monthly report of tax collected on shipping and tie it to the liability account before you file each return.
Getting this wrong fails in the expensive direction: under-collected tax still comes out of your pocket at filing time, plus penalties and interest for the months it sat unremitted.
The Monthly Reconciliation Workflow
Set aside one session a month and work the cost side the same way you work payouts. You need four source documents: the month's payout reports, the month's Shopify billing invoices, your 3PL or carrier invoices, and your sales-tax collection report.
Step 1: Stage payouts through a clearing account. Record gross sales, refunds, fees, and collected sales tax from each payout report into a Shopify clearing account, then record the bank deposit against the same account. A zero clearing balance proves the revenue side reconciled.
Step 2: Split every Shopify invoice. For each billing charge, separate subscription, apps, and label spend from the invoice detail. Post the label portion to your shipping cost account with the invoice date, not the date you bought the labels.
Step 3: Book third-party fulfillment. Enter 3PL invoices to the fulfillment accounts your policy names — per-order fees to COGS-side accounts, storage minimums to operating expenses. Match per-order fees against shipped-order counts; a fee with no matching shipment is either a billing error or a package that never left.
Step 4: True up adjustments and voids. Carrier adjustments and voided-label credits post after the fact, sometimes weeks later. Book each to the same shipping account as the original label, in the month it posts, so the account reflects true spend.
Step 5: Tie out shipping tax. Total tax collected on shipping per your reports should equal the movement in the sales-tax-payable account attributable to shipping. Any gap is either a misconfigured product or an unremitted liability.
Step 6: Review the margin. Compute gross margin with your COGS-side fulfillment costs included. A sudden improvement with flat pricing usually means a missing invoice, not a windfall — investigate before you celebrate.
Mistakes That Quietly Corrupt Shopify COGS
Booking the net payout as revenue. The single most common error, and it poisons both sides of the ledger: revenue understated, fees invisible — and a mismatch against the 1099-K payment report Shopify files with the IRS. Record gross sales and split every fee.
Lumping label charges into the subscription. One Shopify invoice, three account types. If your bookkeeper posts the whole charge to software, your shipping cost is zero on paper while carriers collected thousands.
Double-counting shipping income. Recording the bank deposit as revenue and then also recording Shopify sales from a sales report books every dollar twice. The clearing account in Step 1 exists to prevent exactly this.
Ignoring adjustments and voids. Voided labels and carrier weight adjustments feel like trivia at 4 dollars each, but across hundreds of shipments they move the shipping account by real money — and always in the direction that overstates your costs if you skip the credits.
Changing classifications mid-year. Moving fulfillment fees from COGS to operating expenses in July because the P&L looked better hands you a margin chart that lies. Decide once, document it, revisit annually at most.
Forgetting inbound freight timing. Freight-in is inventory cost, not January's expense. Sellers who expense it on arrival understate January profit and overstate March profit on the same goods.
Keep Your Shipping Costs Visible From Day One
Every label, fee, and freight bill in this guide is a row your future self will audit — at tax time, during a loan application, or the day a buyer opens your books. Maintaining clear records from the start turns that audit from a reconstruction project into a printout. Beancount.io offers plain-text accounting that keeps every one of those rows transparent, version-controlled, and ready for analysis — no black boxes, no vendor lock-in. Get started for free and see why developers and finance professionals are switching to plain-text accounting.





