Move stock between bins (location transfers)
A location transfer moves stock from one bin to another inside the same warehouse. Unlike a warehouse transfer, it has no ship-and-receive lifecycle and no in-transit state — it's created and completed in a single transaction, so the stock lands in its new bin immediately. It never changes the warehouse's on-hand total, available, allocated, or FIFO layers; it only rebalances where the stock sits within the warehouse.
You perform location transfers through the Put Away and Replenishment screens, not a dedicated transfers page. This guide covers running a transfer, reviewing the history, and how the negative-bin guard decides whether an over-draw is blocked, warned, or allowed.
- Bin / location — a physical storage slot within a warehouse (also called a warehouse location). Every warehouse with bins enabled has an UNASSIGNED catch-all bin that holds stock not yet put away.
- Location transfer — an intra-warehouse bin-to-bin move, numbered LT-######. It emits paired reclassification movements (a debit at the source bin, a matching credit at the destination) and nothing else.
- Reclassification — a movement type that shifts stock between bins without changing quantity, cost, or stock state. Reclassifications carry no cost, so they never touch FIFO layers.
Before you begin
| Requirement | Why it's needed |
|---|---|
| Global Warehouse Locations (Bins) setting on | Location transfers only exist where bins are enabled. With the feature off, Put Away and Replenishment show "Warehouse locations are not enabled." |
| Bins enabled on the specific warehouse | The warehouse's own Warehouse Locations toggle must also be on. A transfer against a warehouse without bins is rejected with "Warehouse locations are not enabled for warehouse …". |
Transfer inventory permission (inventory.transfer) | Required to submit a transfer. Without it you can view history but the Put Away action fails. |
| A direct (own) warehouse | Put away applies to your own warehouses, not fulfillment-partner or channel-managed warehouses. |
| At least two bins with stock to move | The source and destination bins must be different and both belong to the same warehouse. |
Location transfer vs. warehouse transfer
These two features share the word "transfer" but are different operations. Reach for the right one:
| Location transfer | Warehouse transfer | |
|---|---|---|
| Moves stock | Between two bins of the same warehouse | Between two warehouses |
| Lifecycle | None — created and completed at once | Draft → Shipped → Received → Closed |
| In-transit state | No | Yes — stock is in transit between ship and receive |
| Affects on-hand total | No — only bin balances shift | Yes — leaves one warehouse, arrives at the other |
| Affects FIFO / COGS | No — reclassification carries no cost | Yes — cost travels with the stock |
| Where you do it | Put Away and Replenishment screens | Inventory → Transfers |
| Document number | LT-###### | WT-###### |
| Reasons | Put Away, Relocation, Replenishment | n/a |
Because a location transfer leaves the warehouse's total untouched, it never appears as incoming or in transit on the product stock view — the units were already on hand and stay on hand. See Stock states for how these balances relate.
Run a location transfer (put away)
Put Away clears newly received stock out of the UNASSIGNED bin into its permanent home. Each row you confirm becomes one line of a single location transfer.
- Go to Inventory → Put Away.
- On the Queue tab, select a warehouse. The queue lists product + source-bin rows waiting to be put away.
- Select the rows you want to move, then click Put Away to open the drawer.
- For each row, set the destination bin and the quantity. SKU.io pre-fills a suggested destination and the full available quantity; adjust either as needed.
- To split one source into two destinations, use the split control and set a quantity for each — the two lines draw from the same source bin and are validated together.
- Optionally tick remember on a storage destination to save it as that product's preferred bin for next time.
- Add optional notes, then click Put Away to commit.
What you'll see: the drawer closes and a confirmation reads "Location transfer LT-000123 completed." The stock now shows against its new bins, and the transfer appears on the History tab. Behind that one click, SKU.io — in a single transaction — writes the transfer header, one line per row, and the paired reclassification movements for each line.
The Scan Mode button (top of Put Away) opens a barcode-driven flow for the same operation: scan a product, scan a destination bin, and confirm. It submits the identical location transfer under the hood.
Replenishment transfers
Inventory → Replenishment runs the same kind of move for a different purpose: topping up a pick face from bulk/overflow storage so pickers don't run dry. Enable bins to use it ("Enable the global Warehouse Locations (Bins) feature to run pick-face replenishment."). A replenishment is still a location transfer — same atomic execution, same reclassification movements — recorded under the Replenishment reason.
Transfer reasons
Every location transfer is tagged with a reason so the history explains why stock moved:
| Reason | When it's used |
|---|---|
| Put Away | Moving received stock out of UNASSIGNED into storage (the Put Away queue and Scan Mode). |
| Relocation | An ad-hoc move between two storage bins. |
| Replenishment | Topping up a pick face from bulk storage (the Replenishment queue). |
What SKU.io validates
A transfer is rejected as a whole (nothing is written) when any line fails these checks. All error messages are returned as 422 responses shown inline in the drawer.
| Rule | Message when it fails |
|---|---|
| Warehouse has bins enabled | "Warehouse locations are not enabled for warehouse …" |
| At least one line | "At least one transfer line is required." |
| Quantity greater than zero | "Line N: quantity must be greater than zero." |
| Source and destination differ | "Line N: the from and to locations must be different." |
| Both bins belong to the warehouse | "Line N: the from/to location does not belong to warehouse …" |
| Destination not deprecated | "Line N: location CODE is deprecated and cannot receive stock." |
| Product is transferable | "Bundle and matrix products cannot be transferred between locations." |
A bundle or matrix (variant-parent) product has no physical stock of its own — only its components or variants do. Attempting to transfer one is rejected, so move the underlying component or variant SKUs instead.
The negative-bin guard
When a line would draw a source bin below zero, the warehouse's negative-bin policy decides what happens. The policy is set per warehouse (in its bin settings) and applies to every per-bin debit — picks, dispatches, adjustments, and location transfers alike. Lines that draw from the same product + source bin are summed first, so the check is against the combined draw, not each line alone.
| Policy | Behavior on an over-draw |
|---|---|
| Block | The transfer throws "Insufficient stock for product SKU at location CODE: requested X, available Y." and the whole transaction rolls back — nothing moves. |
| Warn | The transfer proceeds, and a warning is logged (product, bin, requested vs. available). This is the default when a warehouse has no explicit policy set. |
| Allow | The over-draw is permitted silently. |
The warehouse's UNASSIGNED catch-all (its default bin) is exempt under every policy — it can always go negative as a source. This is deliberate: per-bin bookkeeping can never block a move that the warehouse's global on-hand fully supports. The guard row-locks each source bin's balance in a deterministic order, so concurrent transfers validate safely without deadlocking.
To move stock you don't have a bin record for, either set the policy to Warn/Allow, draw from UNASSIGNED, or correct the bin balance first with an adjustment or stock take.
View location transfer history
Every completed transfer is recorded and searchable.
- Go to Inventory → Put Away.
- Open the History tab.
The list shows the most recently completed transfers first (sorted by Completed At, newest first), 10 per page. Each row carries:
| Column | Shows |
|---|---|
| Number | The LT-###### document number. Click it to open the detail dialog. |
| Warehouse | The warehouse the move happened in (links to the warehouse). |
| Reason | Put Away, Relocation, or Replenishment. |
| Lines | The number of lines on the transfer. |
| Performed By | The user who ran it. |
| Completed At | When it completed. |
Click a row or its Number to open the detail dialog, which lists every line — product, source bin, destination bin, and quantity.
Filter and search
Narrow the history with the search bar, quick filters, and advanced filters:
| Filter | Matches |
|---|---|
| Search | Number, notes, warehouse name, or performed-by name. |
| Warehouse (quick filter) | A single warehouse. |
| Reason (quick filter) | Put Away, Relocation, or Replenishment. |
| Product | Transfers with a line for a given product. |
| Performed By | Transfers run by a given user. |
| Date range | Completed on or after / on or before a date. |
| Advanced filters | Operator-aware conditions on number, notes, id, completed at, and created at. |
Because reclassification movements are written per line, you can also trace a single product's bin history in the movement ledger — filter by the Reclassification movement type to see every bin-to-bin move for that product.
Next steps
- Browse allocations & pin stock to bins — where put-away destinations and preferred bins come into play.
- View the movement ledger — see the paired reclassification movements a transfer writes.
- Stock states — why a location transfer never changes on-hand, available, or allocated.
- How warehouse transfers work — the between-warehouse operation with a full ship/receive lifecycle.
- Create & open a warehouse transfer — when you need to move stock to a different warehouse instead.