Record Off-Channel Sales
For sales your connected channels don’t know about — wholesale invoices, trade shows, gift baskets, or selling down discontinued stock outside your channels. Upload a CSV, review exactly what will be deducted, then confirm.
When to use it — and when not to
Use it for a sale that happened somewhere your connected channels can’t see: a wholesale invoice you send directly to a buyer, a trade show or pop-up where you take payment away from your store and marketplaces, a gift basket or sample kit you hand out, or selling down discontinued stock through a channel you haven’t connected. It records the stock movement and its cost — nothing else. There is no customer, no price, no invoice document, and nothing to manage afterward. You still invoice the buyer however you normally do (QuickBooks, a PDF, whatever you use); this feature only updates your inventory and your books.
Don’t import a sale that already happened on a connected channel. An order placed on Shopify, BigCommerce, Amazon, Walmart, or eBay already deducted your inventory the moment it came in. Importing that same sale here deducts it a second time.
It’s also not the tool for corrections — shrinkage, damage, or fixing a count that was wrong. For those, use Adjust Stock instead. Adjust Stock is built for corrections: it posts as an inventory adjustment, not a sale, and it doesn’t explode a built item into its components the way a sale does — adjusting a made-on-demand kit down would just push that one SKU negative instead of consuming its parts.
The CSV format
The file has exactly two columns: SKU Code and Quantity. Header matching is lenient about case and extra spaces. Quantities must be positive whole numbers — no decimals, no negatives.
| SKU Code | Quantity |
|---|---|
| WIDGET-100 | 4 |
| GADGET-200 | 2 |
Open Inventory → Record Off-Channel Sales and use the Download template link in the dialog for a pre-formatted file with fictional example rows to fill in. A row for a SKU that’s built from components (a Dynamic BOM) deducts its components at the multiplied quantity instead of the finished good — the review screen shows you exactly what that expands to before anything is written.
Reference, location, and fixing a mistake
Every batch needs a Reference (a free-text label, e.g. “Wholesale PO #1042”) and a Location to deduct from. A reference can only have one live batch per location at a time — that’s what stops the same invoice from being imported twice by accident, including a duplicate confirm click. If an invoice ships from two locations, upload two files under the same reference, one per location.
If you spot a mistake in a file you already confirmed, the fix is always the same loop: Undo the batch from the history list, correct the CSV, and re-import it under the same reference. Undo reverses every row that changed inventory, across every connected channel, and frees the reference so the corrected file can go in under the same name. You can’t just re-upload a corrected file over a live batch — undoing first is what keeps the reference from being double-counted.
Review before anything is deducted
Uploading a file never deducts anything by itself. It parses the file and shows a review screen with the row count, total units, any duplicate SKU codes, validation errors, unusually large quantities worth double-checking, and a summary of what any built-item rows expand to. Nothing is written to inventory until you click Confirm Import.
If you don’t confirm within 24 hours, the review expires automatically. Nothing was ever written, so there’s nothing to undo — just upload again.
Once confirmed, follow progress in the batch history list below the button. A batch that finishes with every row applied shows as Completed. A batch with any row that couldn’t fully apply shows as Completed — action required instead of a plain “Done,” with an alert calling out the row counts.
Partial rows. A row built from several components can partially apply — some components had enough stock and were deducted, others didn’t. That row is marked partially applied, and it means real inventory has already changed. Editing the CSV and re-importing under the same reference won’t undo the part that already happened — undo the batch first to correct it, then re-import.
Dates and cost of goods sold
Every row is recorded at the moment you confirm the import — there’s no way to backdate a row to the actual invoice or sale date. The Reference field is where the invoice identity lives (e.g. an invoice number or the buyer’s name); the ledger entry itself is always dated at import time.
If you have live QuickBooks Online or Xero posting connected, off-channel sales post cost of goods sold the same way every other channel does, on the daily accounting run. Undoing a batch after that day has already posted doesn’t rewrite the day’s entry — it posts one final counter-entry that nets the cost back out.
The COGS by Channel report reads sales, not undos, so an undone batch still shows there at its original (gross) amount. Your accounting export is the one that nets to the true figure, through that counter-entry. If a period you’re looking at includes an undone off-channel batch, the report calls this out directly with the affected batch reference.
Good to know
- Channel quantities reflect your settings, not raw on-hand. After an import, the quantity pushed to each connected channel reflects your Inventory Reserve and Dynamic Cloak settings, same as any other stock movement — it won’t match the raw on-hand number one-for-one.
- Late undos on lot-tracked stock. Undoing a batch long after it was imported returns those units to the exact lots they came from — even if that lot has since expired. That’s correct, and you’ll see it reflected in the Lot Expiry report.
- Discontinued SKUs import and deduct normally — selling down discontinued stock outside your channels is exactly what this feature is for.
- A file can hold up to 1,000 rows.