Accounting & Finance
How do I account for ecommerce returns so refunds, restocked inventory, and damaged units hit the right accounts?
Recording refunds, restocked stock, and damaged goods so returns hit the right accounts.
Last updated September 16, 2026
A return is not a restock. A restock is not a refund. Those are three events, and they often happen on three different days.
Holding COGS until the unit returns
When you issue the credit, inventory has usually not come back. Hold the COGS (and the inventory value) in a clearing account until the warehouse or 3PL actually receives the unit. Think of it as inventory returned, not received. The credit note reduces revenue (or a returns contra) and puts that value in the holding account. When the return shipment is marked received, the holding account releases and on-hand goes up. If you never require the unit back, do not use that holding account, or it will sit forever and COGS will look wrong in between. Under ASC 606 the expected refund is variable consideration: estimate what will come back, do not wait for month-end surprises. The holding account is the operational gap between the credit note and the physical receipt, not a second revenue policy.
Receiving returns into QC, not stock
Do not receive into sellable stock. Land everything in a returns or QC location outside the primary storage zone. Channels should only see available-to-sell from storage. The receipt is not the restock. Inspect, then transfer the good units into storage. That transfer, not the receipt, puts the SKU back on sale, usually at the WAC that left. Damaged units never make that transfer. Write them off (adjustment or a lost-and-found location) to shrink or a damage expense. Quarantine is a hold while you decide. It is not the write-off. Do not receive a return as a zero-cost PO. That recycles whatever error already sits on the SKU and then poisons every later sale.
Restock and refund as separate signals
Restock and refund are separate signals. Gift-card and store-credit returns still have to tell the warehouse to restock, or you get a financial-only return and the unit never appears. If nothing physical comes back, cancel the return document; do not mark it received. Received is an inventory event and you cannot un-receive. One system should own on-hand. If Shopify also restocks from the return while the warehouse does, quantities double-count.
Fees and incentives belong where they are calculated. A restocking fee or return-shipping deduction is not COGS. It is other income or a contra against the refund. A store-credit bonus is marketing, not product cost. Unidentifiable inbound with no SKU gets written off. Found stock with no RMA comes in as a cycle count, not a fake return that credits the wrong customer.
Handling 3PL returns at close
At a 3PL, most files will not send item-level disposition. Default their returns location to non-sellable, transfer after QC, write off the rest. Open return shipments at month end will leave the not-received holding account fat. Cut those off or your close will argue with COGS that later reverse. Tie the credit notes, the QC location, and the write-off journals before you lock. Ops disposition (which bin, which zone) is a different post. This one is the accounts.
Connect Claude or ChatGPT to your Fulfil data with the Fulfil MCP, then run this prompt on your own numbers.
You are the controller for a DTC brand with Shopify refunds and a 3PL or own warehouse. Here is: rma_id, sku, qty, refund_amount, refund_date, received_date, location (qc / storage / damaged / none), disposition, original_cogs, holding_acct_146_or_equiv. [paste] Produce: 1. What hits revenue/contra, the not-received holding account, sellable inventory, and damage/shrink. Dates may differ. 2. Lines that refunded but never received (leave in holding, or cancel if nothing is coming). 3. Lines received into sellable too early (should have been QC, then transfer). 4. Financial-only returns (store credit, no restock signal) that must not increment on-hand. Return is not restock. Restock is not refund. Flag any double restock (channel plus warehouse).
Explore this in Fulfil
More on Accounting & Finance
Moving-average cost and contribution margin
How weighted-average cost feeds an honest contribution margin for each product.
How do I speed up month-end close for a Shopify Plus brand with a 3PL and Amazon?
Closing the books faster when sales run across Shopify, a 3PL, and Amazon.
How do I reconcile Shopify Payments payouts and Amazon settlements to my bank account?
Matching Shopify and Amazon payouts to your bank so cash ties out cleanly.
See it run on
your data.
Fulfil runs inventory, fulfillment, purchasing, and accounting for scaling DTC brands in one system.