Adjustment fields, reasons & columns
This page defines every column on the Inventory Adjustments list and every core field on an adjustment record, plus the four things that most often trip people up: which bin location the adjustment posts into, what the reason value means, the difference between Active and Archived, and the permissions that decide who can create or change an adjustment.
An adjustment is a manual correction to on-hand stock — you increase, decrease, or set a product's quantity in one warehouse, and SKU.io writes the matching inventory movement and FIFO layer behind it. For the model — how an adjustment moves stock and realizes cost — see How adjustments move stock and cost. For the day-to-day tasks, see Adjust stock and Review, correct and delete adjustments.
Before you begin
- To view the list, you need read access to inventory. To add, edit, archive, delete, or bulk-act on adjustments you need the inventory.adjust permission; to export you need inventory.export. See Permissions and scope below.
- Adjustments apply only to products that hold stock. You can't adjust a bundle or matrix (parent) product — SKU.io rejects those at validation.
List columns
Open Inventory → Adjustments to reach the list. Each row is one adjustment. Use the column selector to show or hide columns; the columns below are the defaults, left to right.
| Column | What it shows |
|---|---|
| ID | The adjustment's internal id. Sortable. |
| Correction | A warning chip that appears only when the adjustment's reason is correction. Blank for every other adjustment. Corrections are system-generated and locked — see Active vs archived. |
| Date | The adjustment date (adjustment_date) — the date the stock change is effective and the accounting date for its transaction. Sortable. |
| SKU | The product's SKU. Truncates at width with a column-expand toggle. |
| Product Name | The product's name. Truncates with the same expand toggle. |
| Warehouse | The warehouse the adjustment posted to, linked to the warehouse record. The adjustment's bin location isn't a column here — see Warehouse and bin location. |
| Quantity | The signed change: +N for an increase, -N for a decrease, 0 for a net-zero set. For a product measured in a non-EACH unit of measure, the stock UoM code is appended (for example +12 CASE). Sortable. |
| Unit Cost | The per-unit cost the movement was valued at, read from the adjustment's FIFO layer. Shows - when no layer cost is available. For a non-EACH product the UoM is appended as / CASE. |
| Notes | Free-text notes. Truncates with an expand toggle. |
| Link | The document this adjustment came from, if any — see The Link column. |
| Archived | The archive timestamp (archived_at) when the row is archived; blank when active. Sortable. |
| Created At / Updated At | Audit timestamps. Sortable. |
SKU, Product Name, and Notes truncate to keep rows compact. Use the expand toggle in each of those column headers to show the full value inline.
The Link column
Most adjustments you create by hand are standalone and show nothing in Link. When an adjustment was written by another document — a purchase receipt, a fulfillment, a stock take, an assembly, or a warehouse transfer — the Link column resolves that source to a clickable label such as Purchase Order #1234 or Stock Take #56.
| Source document | Link label | Links to |
|---|---|---|
| Purchase order (receipt) | Purchase Order | The purchase order |
| Sales order / fulfillment | Sales Order | The sales order |
| Stock take | Stock Take | The stock take |
| Assembly | Assembly | The assembly build |
| Warehouse transfer | Warehouse Transfer | The transfer |
A source type SKU.io doesn't have a route for is shown as plain text (a de-camel-cased label and id) rather than a link.
Sorting, filtering, and export
The list has quick filters for direction (All / Positive / Negative), correction (All / Corrections only / Exclude corrections), warehouse, and the archive scope toggle described in Active vs archived. To pull the current view to CSV, click Export (requires the inventory.export permission). See Review, correct and delete adjustments for working the list.
Core fields
These are the fields an adjustment record stores. You set the editable ones when you adjust stock; the rest are derived or stamped by SKU.io.
| Field | Editable | What it holds |
|---|---|---|
| Adjustment date | Yes (required) | The effective date of the stock change and the accounting date of its transaction. Stored as a date-time. If you enter a date earlier than your inventory start date, SKU.io clamps it forward to the start date. |
| Product | On create only | The product being adjusted. Must be a stock-holding product — bundle and matrix products are rejected. You can't change the product when editing an existing adjustment; delete it and create a new one instead. |
| Warehouse | Yes | The warehouse the stock change posts to. The warehouse must have a default location or the save fails. See Warehouse and bin location. |
| Quantity | Yes (required) | The change amount. Must be numeric and below the ceiling of 1,000,000. For increase and decrease adjustments it must be non-zero. The sign is derived from the adjustment type. |
| Unit cost | Yes (conditional) | The per-unit cost for the units being added. Required for an increase or set unless the product already has an average cost to inherit. Must be zero or greater. Not used for a plain decrease, which consumes existing FIFO layers at their own cost. |
| Notes | Yes | Free text explaining the adjustment. Optional but recommended for the audit trail. |
| Reason | System-set | Why the adjustment exists. Blank for manual adjustments; set to correction, expired, or over_fulfillment by system pipelines. See Adjustment reasons. |
| Link | System-set | The source document (link_type / link_id), rendered in the Link column. |
Adjustment type
When you create an adjustment you choose a type, which decides how Quantity is applied:
- Increase — add the entered quantity as new stock. Needs a unit cost (unless the product already has an average cost).
- Decrease — remove the entered quantity, consuming existing FIFO layers at their own cost. You can optionally name specific lots to consume (a FEFO override).
- Set — set the on-hand to an exact target; SKU.io computes the difference and routes it through the increase or decrease path. A set that nets down to a target below current stock behaves like a decrease.
The type is a create-time choice, not a stored column — the persisted record simply carries the resulting signed Quantity. For lot-tracked products, an increase can capture batch and expiry details; see Set up a product's inventory.
Unlike receiving against a purchase order, a manual increase on a lot-tracked product doesn't force you to enter a batch or expiry — an unknown or undated lot is valid (a blank batch is generated for you). This supports found-stock and opening-balance adjustments.
Warehouse and bin location
An adjustment stores a warehouse, but it stores no bin location of its own — there is no location column on the adjustment record. The location lives on the inventory movement the adjustment creates. In the adjust-stock dialog, the Location field appears only when the chosen warehouse has bin locations enabled; for a warehouse without locations, the movement simply lands in the warehouse's single default location.
When the warehouse has locations enabled, SKU.io resolves the target bin in this order of precedence:
- Explicit location — the location you pick in the dialog, provided it belongs to that warehouse and isn't deprecated.
- Product's preferred bin — the product's preferred storage location for that warehouse, if one is set.
- Typed warehouse default — the warehouse's default storage location for the adjustment context.
- Default storage location — the warehouse's catch-all Unassigned storage bin.
Two things to keep in mind:
- The warehouse must have a default location. If it doesn't, the adjustment fails validation with a message telling you to set one — even when you pick an explicit bin, the default is the fallback the resolver relies on.
- Changing the warehouse clears the location. A bin belongs to exactly one warehouse, so switching Warehouse in the dialog resets the Location field back to the default.
For moving stock between bins after the fact, see Move stock between bins.
Adjustment reasons
Every adjustment carries a reason. Manual adjustments you create in the UI have no reason (null). The three named reasons are set only by internal pipelines, and one of them makes the record immutable.
| Reason | Set by | Editable? | Meaning |
|---|---|---|---|
| (none / manual) | You, in the UI | Yes | A normal manual adjustment — the everyday increase, decrease, or set. |
| correction | Inventory-health repair scripts | No — locked | An automatic reconciliation written to bring ledger and stock back into agreement. Shown with the Correction chip and locked against edit, archive, and delete. |
| expired | FIFO layer write-off | Yes | The disposal side of writing off an expired or near-expiry FIFO layer. Behaves like a normal editable adjustment. |
| over_fulfillment | Over-fulfillment pipeline | Yes | Records stock consumed when a fulfillment shipped more than was allocated. Behaves like a normal editable adjustment. |
The correction reason is the single locked state. Attempting to modify a correction adjustment through the API returns "Correction inventory adjustments cannot be modified," and the UI hides its edit, archive, and delete actions with the tooltip Corrections cannot be archived or deleted. expired and over_fulfillment adjustments are ordinary records you can edit or archive like any manual one. There is no "reserved" or "pending-approval" reason — adjustments post immediately and have no approval workflow.
Active vs archived
Every adjustment is either Active or Archived. Archiving is a soft state — it stamps an archived_at timestamp so the row drops out of the default list, but it doesn't reverse any inventory. On-hand, allocations, and FIFO layers are untouched by archiving. To actually undo an adjustment's stock effect, delete it or post a compensating adjustment — archiving alone won't do it.
Use the scope toggle in the list footer to switch which set you see:
| Scope | Shows |
|---|---|
| Active (default) | Only adjustments that haven't been archived. |
| All | Active and archived together. |
| Archived | Only archived adjustments. |
You need the inventory.adjust permission to archive or unarchive, individually or in bulk. Correction adjustments can't be archived — their archive action is disabled with the tooltip noted above.
Permissions and scope
All adjustment endpoints sit under the inventory read/write scope (scope.rw:inventory). Beyond that scope, individual actions require specific permissions:
| Action | Permission required |
|---|---|
| View the list, open an adjustment, view its activity log | Inventory read scope only |
| Create an adjustment | inventory.adjust |
| Edit an adjustment | inventory.adjust |
| Delete an adjustment | inventory.adjust |
| Archive / unarchive (single or bulk) | inventory.adjust |
| Bulk delete / check deletable | inventory.adjust |
| Export to CSV | inventory.export |
A user with the read scope but without inventory.adjust can browse and inspect adjustments but not change them — the UI hides the Add, Archive, Delete, and (without inventory.export) Export buttons. There is no per-record approval or maker-checker workflow; anyone with inventory.adjust can post an adjustment directly.
Next steps
- Adjust stock (increase, decrease, set) — create an adjustment.
- Review, correct and delete adjustments — work the list and undo mistakes.
- How adjustments move stock and cost — the model behind the record.
- Stock states and fields reference — how on-hand, available, and non-sellable reconcile.
- Movement types and fields reference — the movement each adjustment writes.