How a purchase order becomes inventory
Receiving a purchase order is the moment ordered stock turns into on-hand inventory — physical units sitting in your warehouse, ready to sell — each carrying a real cost. Behind the Receive button, SKU.io records a receipt, creates a cost record and an inventory record for every unit, refreshes your on-hand counts, and releases any backorders those units now cover.
A backorder is a sale you've already taken but couldn't ship because the item was out of stock; receiving the stock is what lets it finally ship.
This page explains what happens end to end, how later events (landed costs, currency corrections, credits, deletions) change the cost of what you received, and which tabs on the purchase order let you audit every step.
For the hands-on steps of recording a receipt, see Receive stock against a PO. This page is the "what happens and why" behind those steps.
The chain from order to sellable stock
Every unit you receive travels the same path — from the purchase order that ordered it, to a cost layer that prices it, to the available stock you can sell, and finally to the cost of goods when it's sold:
Read left to right: the purchase order says what to expect and at what price; the receipt confirms what arrived; that creates a FIFO cost layer (a batch of units at one cost) and an inventory movement (the audit record of stock entering the warehouse); those units become available stock you can sell; and when they sell, the layer's cost becomes your COGS (cost of goods sold — the cost of the specific units you shipped).
What happens when you hit Receive
When you confirm a receipt against a PO, SKU.io does the work in the background so a large multi-line receipt never freezes the page. You can watch its progress in the job tray as it moves through five stages:
| Stage | What it does |
|---|---|
| Recording Lines | Logs the receipt with one line per PO line received, and raises each PO line's Received quantity. |
| Refreshing Inventory & Avg Cost | For every product received, creates a FIFO cost layer and an inventory movement, then recalculates on-hand quantity, availability, and average cost at the receiving warehouse. |
| Releasing Backorders | Hands the newly received stock to any backorders it can now cover. |
| Dispatching Fulfillments | Starts fulfillment for sales orders that were waiting on the stock. |
| Finalising | Records a summary and updates the PO's receipt status. |
Two things decide the numbers:
- Unit cost comes from the PO line's unit cost (plus any allocated landed cost — see How costs get corrected after receipt).
- Location is the physical receiving warehouse, which is authoritative for the cost layer and the on-hand count — even if it differs from the PO header's destination.
What you'll see: once the job finishes, the PO refreshes — each line's Received count rises, the receipt status advances (Unreceived → Partially received → Received, auto-closing the PO when the last unit lands), and the receipt appears on the Receipts tab. See How purchase order status works for the full status model.
FIFO cost layers: Your cost basis
FIFO stands for First In, First Out — the oldest stock is treated as the first stock sold. A FIFO cost layer is a batch of received units that all carry one cost. Receiving PO-DOCS-0001 (supplier Acme Supplies, destination Main Warehouse) creates one layer per line per receipt — each stamped with the received date, warehouse, quantity, and cost. As you sell or transfer stock, units are drawn from the oldest layer first, which is why these layers are the cost basis behind your COGS.
Open the FIFO Layers tab on the purchase order to see the layers a receipt created. Each row shows:
| Column | Meaning |
|---|---|
| SKU | The product (links to the product page). |
| Original Qty | Units the layer started with. |
| Fulfilled Qty | Units already drawn from the layer (sold or transferred). |
| Available Qty | Original minus fulfilled — what's still in this layer. |
| Avg Cost | Cost per unit for this layer. |
| Total Cost | Avg Cost × Original Qty. |
| Receipt | The receipt that created the layer. |
Every layer links to its full detail page. A lot-tracked product's receipt splits into one layer per captured lot, each carrying its own batch number and expiry.
A worked FIFO example
Say you receive the same product on two POs at different prices, then sell 150 units:
| Event | Units | Unit cost | Layer value |
|---|---|---|---|
| Receipt 1 (older layer) | 100 | $8.50 | $850.00 |
| Receipt 2 (newer layer) | 100 | $9.00 | $900.00 |
Now a customer buys 150 units. FIFO draws from the oldest layer first:
- 100 units from Receipt 1 at $8.50 = $850.00
- 50 units from Receipt 2 at $9.00 = $450.00
- COGS for the sale = $850.00 + $450.00 = $1,300.00
After the sale, Receipt 1's layer is fully consumed (Available Qty 0) and Receipt 2's layer has 50 units left at $9.00 — the cost basis for your next sale.
Because older, cheaper stock is booked as COGS first, FIFO usually reports a lower cost of goods (and higher profit) than averaging when prices are rising. The FIFO Layers tab lets you trace exactly which batch — and which cost — every sale was drawn from.
Zero-cost layers are blocked
Because a layer's cost feeds every future sale of that stock, SKU.io refuses to create a zero-cost layer by accident. A line at $0.00 unit cost that isn't explicitly marked free of charge blocks receiving until you resolve it — either enter a real price, or mark the line Free of Charge with a reason:
| Free-of-Charge reason |
|---|
| Sample |
| Warranty Replacement |
| Promotional |
| Vendor Concession |
| Other |
A line flagged Free of Charge has to keep a $0 unit cost, and a free-of-charge flag without a reason is rejected. The resolution dialog and the persistent zero-cost warning are covered in Receive stock against a PO; editing prices and free-of-charge flags is in Edit a PO and its line items.
Inventory movements: The audit trail
Every FIFO layer receiving creates is paired with an inventory movement — the line-by-line record of stock entering the warehouse. Open the Movements tab to see them, filtered by Type, Status, Link, and Warehouse, or searched by ID, reference, or SKU. A receipt movement shows as type Inbound Receipt, a positive quantity, the Layer it created (linked to the FIFO layer), and a Source linking back to the receipt. The movement's reference is the PO number.
The movement's Unit Cost normally comes from its FIFO layer's average cost. When a movement is created before a layer exists — for example, a movement that fills a backorder the instant stock arrives — the cost temporarily falls back to the product's provisional unit cost (its best-guess cost before the real layer is priced). It's flagged in italics with the tooltip "Provisional — using product unit cost (no FIFO layer yet)."
A provisional cost updates to the real layer cost once the layer is in place. A movement showing a provisional cost is expected, not an error.
Adjustments made at receipt
An inventory adjustment is a manual correction to stock levels that isn't a sale or a receipt. The Adjustments tab lists any adjustments tied to the PO. Receiving can create them:
- Over-receiving a product that's on the PO tops the line up to its ordered quantity and books the surplus as a positive inventory adjustment.
- Scanning an item that isn't on the PO can be resolved as an adjustment.
When nothing has been adjusted, the tab reads "No inventory adjustments for this order."
The Movements, FIFO Layers, and Adjustments tabs are audit surfaces only — you review them, you don't edit them. They're hidden for dropship POs, which never touch a warehouse (the supplier ships straight to your customer).
Follow it on the purchase order
The purchase order detail page organizes all of this into tabs, each with a count badge, and the tab bar and status bar stay pinned as you scroll. The tab set adapts to the kind of PO:
| Tab | When it appears |
|---|---|
| Shipments | Open, non-dropship POs. |
| Receipts | Standard POs. Relabeled Dropship Shipments for dropship POs, and hidden for Amazon FBA (Fulfillment by Amazon) and Walmart WFS (Walmart Fulfillment Services), where the channel reports receipt. |
| Amazon FBA / Amazon AWD (Amazon Warehousing & Distribution) | Only for those destinations. |
| Movements, FIFO Layers, Adjustments | Everything except dropship. |
| Accounting, Invoices, Deposits, Vendor Credits, Notes, Tags, Custom Fields, Activity | Always. |
The active tab is stored in the web address (?tab=), so you can deep-link straight to, say, a PO's FIFO layers, and each tab is a real link you can open in a new browser tab. For Amazon FBA/AWD flows, see Amazon and dropship POs.
How costs get corrected after receipt
The cost on a FIFO layer isn't always final at the moment of receipt. Two things adjust it later:
-
Landed costs. A landed cost is an extra bill on top of the goods — freight, duty, or handling — that belongs in the true cost of the stock. When you attach one to the PO, it's prorated (split proportionally) across the lines and lifts each unit's cost on the layers receiving created. You choose how the bill is split — by cost, quantity, weight, volume, or revenue, or by assigning it to specific lines or entering amounts manually — and the resulting per-line share raises the layer cost accordingly. Adding and prorating landed costs is covered in Add landed costs to a PO.
Example: a $200 freight bill prorated by quantity across 100 units adds $2.00 to each unit — a layer received at $8.50 becomes $10.50 landed.
-
Currency corrections. A PO in a foreign currency stores both the currency and the exchange rate. The rate is locked when you approve the PO, so the committed cost reflects the rate at approval. If you later correct the rate, SKU.io recalculates the FIFO layers on the affected receipts so their landed cost reflects the corrected rate.
Renaming the PO number after receipts exist updates the reference on the linked inventory movements too, so the audit trail stays consistent.
The accounting transaction
The Accounting tab is where the PO's financial entries live. If no entry exists yet, the tab shows an empty state — "No accounting transaction generated" — with a Generate button (you need the Update purchase orders permission). Generating builds the entry from the PO and saves it; you can regenerate it after changes.
Related documents get their own entries. The tab groups Invoices, Landed Cost Invoices, and Receipts, each with its own Generate action and each showing the entry's status and accounting-software sync state. A PO closed with a receiving discrepancy shows that entry here too.
SKU.io also keeps a mirror of the PO on your connected accounting platform — a QuickBooks Online or Xero purchase-order record linked to the accounting entry — so the order is visible on the accounting side as well. How invoices reconcile against receipts is explained in Invoicing and the 3-way match.
Reversing what receiving created
Because receiving creates real cost layers, reversing it has to unwind them carefully.
Editing or deleting a receipt (from the Receipts tab) recalculates the affected lines' received totals and the PO's receipt status, and reverses the inventory it created. But if that stock has already been used downstream — sold, transferred, or otherwise drawn from the layer — SKU.io blocks the change, because the layer can no longer be unwound. Return that stock via a vendor credit instead.
| Action | What it does |
|---|---|
| Edit or delete a receipt | Recalculates received totals and receipt status and reverses the inventory it created — unless the stock has already been consumed (blocked). |
| Vendor credit shipment | The path for returning received stock to the supplier. A physical return draws from the specific FIFO layers the PO receipt created and books the reversing inventory movements — closing the loop from receipt to layer to credit. See Vendor credits. |
| Delete the whole PO | Removes the receipts (and their FIFO layers, inventory movements, and received-quantity totals), inbound shipment lines, adjustments, and any Amazon pending inbound records. |
If the PO already has purchase invoices, deletion is refused — remove the invoices first.