Skip to main content

Browse & manage FIFO layers

Every time stock enters a warehouse — a purchase-order receipt, a positive adjustment, a completed transfer, a manufacturing output — SKU.io opens a FIFO layer that carries those units and the cost you paid for them. As you sell or consume the stock, the layer's units drain in first-in, first-out order and their cost realizes as COGS. The FIFO Layers list is where you inspect those cost layers: find a layer, read its remaining quantity and unit cost, open it to see its movements and genealogy, archive layers you're done with, and — for landed-cost corrections — re-prorate their totals.

This guide covers browsing and filtering the list, opening a layer's detail, archiving and unarchiving (single and bulk), and the recalculate-total-costs maintenance action, along with the archive and delete guards that protect your cost history. To understand why layers exist and how COGS is realized, read FIFO layers & how COGS is realized. For every field, status, and enum in one place, see the FIFO layer reference.

Before you begin

  • Open the list at Inventory → FIFO Layers (route /inventory/fifo-layers).
  • Anyone with inventory read access can browse, search, filter, and open layers. The actions that change data — Archive, Unarchive, and recalculating costs — are gated by inventory read-write access; controls you lack permission for don't appear.
  • FIFO layers are created and drained automatically by receipts, sales, transfers, and manufacturing. You don't create a layer by hand from this screen — you review and maintain the ones the system opened. See FIFO layers & how COGS is realized.
  • To change a layer's cost rather than just view it, use Revalue COGS; to rebuild costs across a whole product, use Rebuild COGS. This guide is about browsing and housekeeping.

Browse the FIFO Layers list

The list shows one row per layer, newest layer date first. Each row carries these columns:

ColumnShows
IDThe layer's internal identifier.
DateThe layer date — when the stock became on hand (the receipt or event date).
SKU / Product NameThe product the layer holds.
WarehouseWhere the layer's stock sits.
Original QtyUnits the layer opened with.
Fulfilled QtyUnits already consumed out of the layer.
Available QtyUnits still remaining (Original − Fulfilled). A green chip when positive, muted when depleted.
Avg CostPer-unit cost carried by the layer.
Total CostThe layer's total cost value.
OriginA cross-link to the source document that opened the layer (receipt, adjustment, transfer, and more).
Created / UpdatedRecord timestamps.
  • Sort by clicking a sortable header — ID, Date, Original Qty, Fulfilled Qty, Available Qty, Avg Cost, Total Cost, Created, or Updated. Clicking again toggles ascending and descending. The default order is newest layer date first.
  • Paginate with the controls beneath the table. The list shows 10 rows per page by default.
  • Choose columns with the Columns selector in the toolbar to show or hide any column above.
Consigned layers carry a chip

A layer that holds consigned (supplier-owned) stock shows a purple Consigned chip next to its quantity. Consigned stock is cost-carrying but held off your balance sheet until it sells. See FIFO layers & how COGS is realized for how consigned cost behaves.

The Origin link always names the real source

The Origin cell links to the exact document that opened the layer, and its tooltip shows the underlying link type and record ID — for example Inbound Receipt ID 4821 or Warehouse Transfer ID 190. If the source document can't be resolved, the cell falls back to a plain label rather than a broken link.

Search and filter the list

Narrow the list with the search bar, the quick filters, advanced filters, and the archived toggle. Everything you set is reflected in the page URL, so a filtered view is shareable and survives a refresh, and you can capture a filter-plus-column combination as a saved view.

Type into the search bar (placeholder Search FIFO layers...) to match by ID, SKU, product name, warehouse, or Source Reference (the origin document's reference).

Quick filters

Four dropdown filters sit above the table:

FilterNarrows to
WarehouseLayers in one warehouse.
Source TypeLayers opened by a kind of document — Inbound Receipt (purchase order), Inventory Adjustment, Warehouse Transfer, Stock Take, Return Receipt, Manufacturing Order / Assembly, and more.
Origin TypeThe exact underlying link type, for finer-grained filtering than Source Type.
AvailabilityAvailable (units remaining), Depleted (none remaining), Used (any units consumed), or Unused (nothing consumed yet).

Advanced filters

Click Advanced filters to build a filter tree over numeric, text, and date fields — Original Qty, Fulfilled Qty, Avg Cost, Total Cost, SKU, Product Name, Layer Date, Created At, Updated At, plus lot fields like Batch # and expiry date. You can also filter to layers expiring within N days, useful for perishable or dated stock.

Archived toggle

The list footer carries an All / Active / Archived toggle. It opens on Active, so archived layers are hidden by default. Switch to Archived to see only archived layers, or All to see both. Hiding archived layers is the default behavior of the list — the toggle simply overrides it.

An empty list shows "No FIFO layers found"

When your search or filters match nothing — or a product has no cost layers yet — the table shows No FIFO layers found rather than an error. Clear a filter or widen the archived toggle to see more. On a phone, the list renders as a card list with the same data and the same empty state.

Open a layer's detail

Click a row to open the layer's detail page. The detail page carries three tabs, and the active tab is remembered in the page URL (?tab=):

  • Details — the layer's core fields (quantities, costs, warehouse, product), its lot identifiers, a cross-link to the source document, its movements, its allocations (which sales orders consumed from it), and — for manufacturing outputs — a Consumed From genealogy panel.
  • Revalue COGS — an embedded panel to correct this layer's cost. See Revalue COGS for what a revaluation does.
  • Activity — the layer's activity log: who changed it and when.

What the Details tab shows

  • Lot identifiersBatch #, Manufacture date, and Expiry date appear only for lotted layers (layers produced or received as a tracked batch). Non-lotted layers omit them entirely.
  • Movements — every inventory movement written against this layer, so you can trace exactly how it filled and drained. This is the same audit trail as the movement ledger, scoped to one layer.
  • Allocations — the sales orders that recorded consumption against the layer, each with its quantity, customer, and order status. Allocations are product-and-warehouse level rather than per-layer, so this panel reflects the movements that actually drew from this layer.
  • Consumed From — for a layer that a manufacturing order produced, this panel lists the depth-1 parent layers (the source components) consumed to make it, with the quantity taken from each. It appears only for manufacturing outputs; ordinary receipt layers have no parents.
Genealogy resolves the real source, even through a movement

For manufacturing outputs — including simple-mode disassembly — the source chip traverses the underlying inventory movement to reach the manufacturing order, so the origin you see always points at the real production record rather than an intermediate row.

Archive a layer

Archiving hides a layer from the default list without deleting it or touching its cost history. Archive a layer once it's fully consumed and you no longer need it cluttering the active view.

  1. On the list, open the row's action menu and click Archive (or use the archive icon on a mobile card).
  2. Confirm in the dialog. Archiving a fully consumed layer removes it from the default (Active) view; you can restore it later.

To bring a layer back, switch the footer toggle to Archived or All, open the row's menu, and click Unarchive. A confirmation dialog appears for both directions.

Only fully consumed layers can be archived

A layer can be archived only when its Available Qty is 0 — every unit has been consumed. If you try to archive a layer that still has stock remaining, SKU.io blocks it with the FIFO layer cannot be archived since it's not fully fulfilled. This guard exists because an active layer still participates in FIFO consumption and cost realization; hiding it would obscure live stock.

Empty (fully consumed) layers are archivable

A layer whose available quantity has reached zero is a valid archive target — that's the whole point of archiving. If you've ever seen a fully drained layer wrongly refuse to archive as "not fully fulfilled," that was an earlier defect in the archive guard (a strict comparison against the remaining-quantity column) and it has been corrected: the archive check, the bulk archive check, and the pre-flight archivable check now all agree and use the same numeric comparison. A depleted layer archives cleanly.

If you archive a layer that's already archived, SKU.io returns a warning (the FIFO Layer is already archived) rather than an error, and likewise unarchiving an already-active layer returns already unarchived. Nothing is harmed either way.

Archive or unarchive many layers at once

When you've filtered the list to a set of depleted layers, act on all of them together.

  1. Select rows with the checkboxes, or filter the list to exactly the layers you want.
  2. In the bulk-action bar, choose the scope:
    • Selected Only — acts on the rows you checked.
    • All Filtered — acts on every layer matching your current filters, across all pages. The count shown is the full filtered total.
  3. Click Archive (or Unarchive when the selection is already archived) and confirm.

SKU.io reports how many layers succeeded — for example 8/10 fifo layers had been archived successfully. Layers that still have stock remaining are skipped by the same "fully consumed" guard as single archive, so a bulk archive over a mixed selection archives the eligible layers and leaves the rest untouched. If none of the selected layers can be archived, you get the FIFO layer maybe already archived and nothing changes.

All Filtered resolves the exact set from your filters

When you pick All Filtered, SKU.io re-runs your current search and filter conditions to resolve the full list of layer IDs — so the operation always matches what the filtered list shows, not just the page you're looking at. Unarchive bypasses the default archived-hidden rule so it can reach and restore archived rows.

Recalculate total costs (landed-cost re-proration)

Recalculating total costs re-derives each affected layer's total cost and cost breakdown from its source document — most importantly, re-prorating a purchase order's landed cost (freight, duties, and other charges) across the units it received. Use it after you've corrected landed-cost figures on receipts and need the FIFO layers to reflect the new proration.

To run it from the list, select the layers you want with the checkboxes, then click Recalculate Costs in the bulk-action bar and confirm. The recalculation applies to the selected layers only.

What it does, per layer:

  • Reads the current cost breakdown from the linked document and rewrites the layer's total cost and cost breakdown.
  • When the per-unit cost actually changed, it records a dated revaluation entry so the correction is auditable, and propagates the new cost to the layer's active usages.
  • After processing, it refreshes the affected products' average cost so the product pages match the recalculated layers — a landed-cost re-proration would otherwise leave the product showing its pre-recalculation average.

Each layer is processed in its own transaction that automatically retries on database deadlocks, so a large run tolerates contention with live inventory operations. The underlying API also accepts optional scoping parameters — discounts only and non-default-currency only narrow the run to purchase-order-receipt layers that have a discount or a foreign-currency PO, and a start/end date window limits it to layers in a date range — for scripted maintenance beyond the on-screen selection.

Recalculate is a maintenance action, not an everyday fix

Recalculate Costs is a bulk cost-maintenance action, best kept for after you've corrected landed-cost figures on receipts. For day-to-day cost corrections you'll use the dedicated tools instead — Revalue COGS for a single layer or product, Rebuild COGS for a full product rebuild. Correcting COGS: revalue vs rebuild vs recalculate explains which tool fits which problem.

Why you can't delete a layer with movements

A FIFO layer is the anchor for every cost movement written against it, so it isn't casually deletable. When a layer is deleted — always as part of a larger cascade, never a stray button on this screen — SKU.io runs the deletion in a transaction, removes the layer's child inventory movements first, and then refuses to finish if any movement still remains, raising Unable to delete Fifo Layer due to existing movements. This guard protects your cost history: a layer can only disappear once every movement tied to it has been cleanly removed, so you can never end up with orphaned cost movements pointing at a layer that no longer exists.

If you need to retire a layer from view, archive it (above) rather than deleting it — archiving keeps the full history intact.

Common problems

SymptomLikely causeFix
A layer won't archive — "not fully fulfilled."The layer still has Available Qty > 0; only fully consumed layers can be archived.Wait until the layer drains, or filter by Availability → Depleted to find archivable layers.
A depleted layer you archived isn't in the list.Archived layers are hidden by default.Switch the footer toggle to Archived or All.
A bulk archive reports fewer successes than selected.Some selected layers still had stock; they're skipped by the fully consumed guard.That's expected — the eligible layers archived; leave the rest until they drain.
The Origin cell shows a plain label, not a link.The source document behind the layer can't be resolved (for example, it was removed).The layer and its cost are unaffected; the label still names the original source type and ID.
Product average cost still looks wrong after fixing landed cost.A landed-cost change on the receipt doesn't re-prorate existing layers on its own.Recalculate total costs (above), or use Rebuild COGS for the product.

Next steps

Last verified: