You rang up $42,000 in sales this month. Your dashboard glows green. Then the returns start: a defective batch, a few changed minds, a wholesale customer who over-ordered. By the time you refund $3,800, your bank account tells a very different story than your sales report. If you logged those refunds as an expense — "refunds expense," "customer service cost," or worse, lumped them into general expenses — your books now show you sold more than you did and spent more than you did. Your gross margin looks off, your tax return is wrong, and you have no idea what your real return rate is until your accountant flags it in April.
This is one of the most common bookkeeping mistakes small product businesses make, and it quietly distorts every number you use to make decisions.
Why Refunds Are Not an Expense
Revenue is the top line of your business — the total consideration you expect to keep in exchange for what you delivered. A refund is not a cost of doing business like rent, supplies, or payment processing fees. It is a reversal of revenue you thought you had earned but ultimately did not.
Accountants call this contra-revenue: an account that lives right underneath gross sales and is subtracted from it to arrive at net revenue or net sales. Common contra-revenue accounts include:
- Sales Returns and Allowances — full or partial refunds when a customer sends goods back or keeps them at a reduced price
- Sales Discounts — early-payment discounts or promotional discounts taken at checkout
Think of it this way: an expense is something you spend to generate revenue. A return is revenue you didn't keep. Netting refunds against revenue preserves that distinction and keeps your gross profit honest.
What does burying refunds in expenses break?
- Gross profit is overstated. If you report $42,000 in gross sales and hide $3,800 in refunds inside expenses, your gross profit looks like $42,000 minus cost of goods sold. The real net sales are $38,200. You will think your markup is healthier than it is.
- Return rate disappears. When refunds live in expenses, you cannot calculate return rate ($3,800 ÷ $42,000 = 9%) without manual digging. That rate is the early warning system for product quality, sizing, listing accuracy, and customer fit.
- Comparability dies. Industry benchmarks, lender reviews, and even year-over-year trends use net revenue. Expense-buried refunds make your numbers incomparable.
The fix is simple: create a contra-revenue account and use it every time.
What the IRS Actually Wants on Schedule C
You do not need to be a GAAP scholar to get this right for taxes. The IRS has spelled it out for decades in the Tax Guide for Small Business and on Schedule C itself:
- Line 1: Gross receipts or sales — report what you actually collected, including sales of merchandise that was later returned.
- Line 2: Returns and allowances — subtract cash or credit refunds, rebates, and other allowances off the sales price. Report it as a positive amount on line 2; the form does the subtraction.
- Line 3: Net receipts — line 1 minus line 2. This is your net sales for tax.
- Line 4: Cost of goods sold — then subtract inventory costs to get line 5, gross profit.
The IRS description of line 2 is explicit: "Returns and allowances include cash or credit refunds you make to customers, rebates, and other allowances off the actual sales price."
In other words, the federal tax return already expects contra-revenue accounting. If you buried refunds in expenses, your Schedule C will show too much income on line 1+3 and too many deductions elsewhere — and the two errors do not cancel cleanly because gross profit, self-employment tax, and qualified business income calculations all key off that gross profit line.
Practical tip for cash-basis filers: You still track refunds in the same place. A cash-basis business recognizes revenue when money is received and reverses it when money is refunded, but the reversal still goes to Sales Returns and Allowances, not to an expense. The distinction is about where on the income statement, not when.
The GAAP View in Plain English: Variable Consideration and the Refund Liability
If you issue financial statements for a bank, investor, or accrual-basis tax return and follow U.S. GAAP, refunds have a formal name: variable consideration under ASC 606, Revenue from Contracts with Customers.
Every sale where the customer has a right to return the goods is not a "done" sale for the full price. You estimate how much you will actually keep — the transaction price — and recognize only that amount as revenue up front. The rest is a refund liability.
At the point of sale (simplified):
- Debit Cash or Accounts Receivable for the full amount
- Credit Revenue for the amount you expect to keep (gross sales minus estimated returns)
- Credit Refund Liability for the amount you expect to refund
If you can recover the goods, you also record a return asset (inventory you expect to get back) and reduce cost of goods sold. You are not booking bad debt; you are acknowledging from day one that some sales are provisional.
At year-end, even if the physical returns have not shown up yet, you still estimate the liability for goods sold but not yet returned. That estimate — often based on your last 3–12 months of return rate by product line — keeps December revenue from being overstated and January from being artificially depressed.
You do not need to be a public company to benefit from this discipline. Any business with material returns (apparel, beauty, electronics, food & beverage, craft wholesale) that wants its monthly P&L to mean anything should accrue an estimated refund liability and adjust it monthly.
Your Chart of Accounts: Set It Up Once, Get It Right Forever
You do not need 200 accounts. You need four well-named buckets that match the way you want to report:
Income (4000s)
4000 — Gross Sales— every sale at full price before anything is taken off4005 — Sales Returns and Allowances(contra-revenue, normal debit balance) — all full and partial cash/credit refunds, rebates, and allowances4010 — Sales Discounts(contra-revenue, normal debit balance) — early-pay or coupon discounts if you track them separately from returns
Your P&L then shows:
Gross Sales $42,000
Less: Sales Returns & Allowances (3,800)
Less: Sales Discounts (200)
-----------------------------------------
Net Sales $38,0002400 — Refund Liability(balance sheet, current liability) — estimate of refunds owed for sales made but not yet returned1300 — Estimated Returns Inventoryor1215 — Inventory: Expected Returns(balance sheet asset) — cost of goods you expect to recover
How it flows:
When you refund a customer $100 for a product that cost you $60 and is resalable:
Debit 4005 Sales Returns & Allowances $100
Credit 1000 Cash / 1210 Clearing $100
Debit 1300 Estimated Returns Inventory $60 (if you use a liability/asset model)
Credit 5000 Cost of Goods Sold $60
— and when the box arrives —
Debit 1400 Inventory $60
Credit 1300 Estimated Returns Inventory $60If the item is unsalvageable, you do not restock it — you debit a shrinkage or inventory write-off instead of inventory. The key is that COGS is reversed either way; you do not leave the cost in COGS for goods that came back.
Keep payment processing fees out of contra-revenue. A 2.9% + 30¢ processor fee and a chargeback fee are costs of collecting money — they belong in 6300 — Payment Processing Fees (an expense). Only the refund amount itself reduces revenue.
If you use plain-text accounting, the shape is identical: separate income accounts for gross sales and contra-revenue, plus liability/asset accounts for the estimate. See the patterns in the Beancount documentation for how to model income, liabilities, and inventory in text form — the account names matter less than preserving gross vs. net as distinct postings.
Sales Tax, Inventory, and Processor Fees: The Three Places Everyone Trips
1. Sales tax is not revenue — and its refund is not yours
When you collect sales tax, you are holding money in trust for the state. It should never hit your revenue accounts in the first place.
- At sale: Credit
2400 — Sales Tax Payable(liability), not revenue. - At refund: Debit
2400 — Sales Tax Payablefor the tax portion of the refund, so you remit only tax on net taxable sales.
If you recorded the full cash received as revenue and then expensed the refund including tax, you overstated both revenue and expenses, and your sales-tax reconciliation will not tie to filed returns. Most states require you to reduce taxable sales by the refunded amount on the sales-tax return for the period in which the refund was issued, not the period of the original sale — check your state, but the bookkeeping entry is always a liability reversal.
Marketplace-facilitated sales (Amazon, Etsy, eBay) add a wrinkle: the marketplace is the deemed collector in most states, so you may never touch the tax cash at all. Still track it: your gross-to-net reconciliation should show "tax collected by marketplace" as a separate liability reimbursed, not as your revenue.
2. Inventory: every return touches COGS
Two inventory mistakes inflate cost:
- Forgetting to reverse COGS when a sale is refunded — you left the cost in even though the sale disappeared.
- Restocking at sale price rather than cost — you overstated inventory and understated COGS on the next sale.
For resalable returns, the path is: reduce COGS when the return is authorized (via the returns asset), then move it to inventory at cost when inspected. For damaged, expired, or open-food returns, move it to 5050 — Inventory Shrinkage & Write-Offs instead of back to salable inventory.
For businesses without perpetual tracking (many Shopify sellers), tie this to your monthly physical count: net sales and COGS should reconcile to "beginning inventory + purchases − ending inventory" after returns are accounted for. If your calculated COGS uses gross sales, your gross margin is fiction.
3. Processor fees stay in expenses
A common Shopify/Stripe reconciliation error is to pull the net payout into the books as revenue. The payout is gross sales minus refunds minus fees minus reserves. If you book the payout as revenue, you have understated revenue (good luck deducting COGS correctly) and buried refunds and fees where no one can see them.
Correct reconciliation is gross → net → cash:
- Book gross sales from the platform's gross sales report
- Book sales returns & allowances from the platform's refund report
- Book payment processing fees from the fees report as an expense
- Reconcile the remainder to the bank deposit via a clearing account
That clearing account (1210 — Stripe Clearing or 1211 — Shopify Clearing) should zero out after each payout cycle except for in-transit amounts and any rolling reserve.
Reconciling What Your Platform Says You Made vs. What You Kept
Your 1099-K and your platform dashboard report gross payment volume before fees, refunds, or reserves. Your bank sees net deposits. Your tax return wants net receipts (gross minus returns & allowances). All three can be true at once if you reconcile them explicitly.
A weekly workflow that takes fifteen minutes:
- Export three reports from each channel: gross sales, refunds/returns, and fees/payouts.
- Post gross sales to
4000, returns to4005, fees to6300. Do not net them. - Post the payout as a transfer from the clearing account to the bank, not as new revenue.
# Example: Shopify payout of $8,420 on $9,500 of gross sales
2026-08-10 * "Shopify sales Aug 3-9 - gross"
Assets:Clearing:Shopify 9500.00 USD
Income:Gross-Sales -9500.00 USD
2026-08-10 * "Shopify refunds Aug 3-9"
Income:Sales-Returns 680.00 USD
Assets:Clearing:Shopify -680.00 USD
2026-08-10 * "Shopify fees and chargebacks fees Aug 3-9"
Expenses:Payment-Processing 400.00 USD
Assets:Clearing:Shopify -400.00 USD
2026-08-11 * "Shopify payout to bank"
Assets:Bank:Checking 8420.00 USD
Assets:Clearing:Shopify -8420.00 USDAfter posting, Assets:Clearing:Shopify should match "sales not yet paid out + refunds in transit + reserve holds." If it does not, you have a missing refund, a double-counted fee, or a product bug — exactly what reconciliation is meant to catch. Visualize net sales vs. gross and track return rate in Fava to see whether the gap is seasonal or structural.
At year-end, tie your platform gross to the 1099-K gross line, tie your books' net sales (gross minus 4005) to Schedule C line 3, and tie your bank deposits to the cleared clearing account. The NRF benchmark — about 17–19% of retail merchandise returned in recent seasons, and higher online — does not set your return rate, but it is a useful stress test: if your contra-revenue is under 2% while your product category averages near 15%, either your product is exceptional or your refunds are leaking into expenses.
A Simple Monthly Workflow That Prevents Year-End Surprises
You do not need to estimate returns daily. You do need a monthly habit:
At the start of the month:
- Review the prior month's return rate by channel and product line (returns ÷ gross sales). Three to six months of data is enough for a stable estimate unless you just launched.
During the month:
- Post every refund to
4005 Sales Returns & Allowancesthe day it is issued, with sales tax split out to the liability. - Reverse COGS and restock or write off inventory immediately upon inspection. Do not wait for the next count.
At month-end:
- Accrue the estimate for goods sold but not yet returned:
Debit 4005 / Credit 2400 Refund Liabilityfor the expected refund amount, andDebit 1300 Expected Returns / Credit COGSfor the expected recoverable cost. Even 1–3% for low-return categories makes December and January comparable. - Reconcile clearing accounts for each payout platform (Stripe, Shopify, Amazon, PayPal) to the bank. Unreconciled differences older than seven days are almost always a refund or fee you missed.
- Reconcile sales-tax payable to filed returns. A refund without a sales-tax payable debit is a red flag.
- Report net sales — gross minus returns and discounts — on your internal P&L and management dashboard, not just gross, so pricing and purchasing decisions use the right top line.
Quarterly, test the estimate: compare the refund liability you set last quarter to actual returns that came in. If you consistently over- or under-accrue by more than 20%, adjust the percentage.
Common Mistakes That Inflate Your Profit (and Your Tax Bill)
1. "Refunds as marketing expense." Even if you call a goodwill credit "customer retention," a price concession that refunds part of the sales price is still contra-revenue under ASC 606, not a marketing expense. Classify by economics, not label.
2. "Fees are the same as refunds." Under GAAP, the amount refunded to the customer reduces revenue; the fee the processor charges you to handle the refund does not. The latter is an operating expense. Mixing them understates revenue quality and overstates expense leverage.
3. "Sales tax was just part of revenue." If tax collected lives in revenue, every refund overstates the expense and leaves sales-tax payable too high. Separate it on day one.
4. "COGS was never reversed." For a product with 50% gross margin, forgetting to reverse $1,000 of COGS on returned goods overstates cost by $1,000 and understates margin by the same amount. Over a year, that can swing lender covenants.
5. "Netting at data entry." Posting only "net sales = gross − refunds" in a single line without a contra account hides the return rate from every report. You saved one line of data entry and lost your most diagnostic metric.
6. "No estimate for open return windows." If your policy is 30-day returns and December is your biggest month, December net revenue is overstated without an estimate, and January looks mysteriously weak when the boxes come back. Accrue.
Good books make the fix mechanical: every order has one lifecycle — sale, then either kept or partially/fully refunded — and every step has one home in the ledger. When your chart allows gross, returns, and fees to live separately, your P&L can finally answer the questions you actually ask: what is my real margin by SKU, which channel has the highest return rate, and did the new supplier actually cost me more after returns?
Keep Your Finances Organized from Day One
Handling refunds correctly is not just a tax-compliance exercise — it is how you know what you really earned, what customers actually want, and where your margin truly lives. Maintaining clear, separate records for gross sales, returns and allowances, and sales-tax payable makes every downstream task easier, from reconciling a Shopify payout to tying out Schedule C line 3 to pricing your next product run.
Beancount.io provides plain-text accounting that gives you complete transparency and control over your financial data — no black boxes, no vendor lock-in. Your contra-revenue accounts, refund liability estimates, and platform clearing accounts are all version-controlled text you can audit, diff, and query with BQL. Get started for free and see why developers and finance professionals are switching to plain-text accounting.