Locations & Transfers
Model every place stock lives — warehouses, stores, suppliers, manufacturers, co-packers, or virtual/transit nodes — and move inventory between them with a full lifecycle. Each location tracks its own per-variant levels, and transfers walk draft → pending → in transit → received (or cancelled), automatically deducting the source on ship, crediting the destination on receive, amortizing freight onto landed cost, and recording damage or discrepancies on arrival.
Key capabilities
- Locations typed as warehouse, store, virtual, drop ship, office, supplier, manufacturer, packaging, copacker, or other
- One default location where new stock lands unless a location is specified
- Optional short code (unique per business), full address, and contact details per location
- Per-location inventory levels, with optional reorder point and reorder quantity per variant
- Transfers between two distinct locations with variant line items and quantities
- Ship / Receive / Cancel transitions that move inventory automatically
- Received-quantity capture per line, with damage flag and damage notes
- Discrepancy detection when received quantity differs from shipped quantity
- Tracking number, carrier, expected arrival, and freight cost (estimate + confirmed actual) per transfer
- Inbound freight amortized per unit onto destination landed cost on receipt
- Auto-suggested transfer numbers (e.g. TRF-0001), status filtering, and archiving
- Filter transfers by status, source location, or destination; dedicated in-transit and pending views plus a status summary
How it works
Shipping moves a transfer to in-transit and deducts the source; receiving credits the destination and amortizes freight; cancelling reverses any deduction already made.
flowchart LR
draft["Draft / Pending"] --> ship["Ship (deduct source, set in_transit)"]
ship --> receive["Receive (credit destination)"]
receive --> freight["Amortize freight per unit to landed cost"]
freight --> done["Received"]
ship -.->|"Cancel"| reverse["Reverse source deduction"]
draft -.->|"Cancel"| void["Cancelled (no inventory change)"]How to use it
- Open the Locations tab (
/inventory?section=locations) and create a location for each warehouse, store, supplier, or transit node you use. - Pick the location type and set one location as default — new inventory lands there unless you specify otherwise.
- Click the inventory icon on a location to view its per-variant on-hand, or compare on-hand across locations in the matrix.
- Switch to the Transfers tab, click New Transfer, choose distinct source and destination locations, and add variants with quantities.
- Optionally set tracking number, carrier, and expected arrival; add or remove line items while the transfer is still draft/pending.
- Ship the transfer to deduct from the source and mark it in transit, then Receive at the destination to credit stock there.
- On receive, record the actual received quantity per line and flag any damage with notes.
Pro tips
- Source and destination must be different locations — the system rejects a transfer that points a location at itself.
- You can only edit, add, or remove line items while a transfer is draft or pending; once shipped it's locked except for receive/cancel.
- Cancelling a transfer that's already shipped automatically reverses the source deduction; cancelling a draft/pending transfer makes no inventory change.
- Enter the carrier's actual freight once the invoice lands — the confirmed freight cost overrides your ship-time estimate when freight is amortized onto destination landed cost.
- Use the Overview Transfer Summary tiles (Draft, Pending, In Transit, Received, Cancelled) for a fast read on what's moving and what's stuck.
- Archive locations you've retired instead of deleting them so historical movements and balances stay intact.
In-depth guide
Transfer status lifecycle
| Status | Meaning | Inventory effect |
|---|---|---|
| Draft | Created, not finalized | None; editable |
| Pending | Ready to ship | None; editable |
| In transit | Shipped | Source deducted |
| Received | Arrived | Destination credited; freight amortized |
| Cancelled | Cancelled | Source deduction reversed if it had shipped |
Capability rules:
- Ship — from draft or pending.
- Receive — only from in transit, and only when it has at least one line item.
- Cancel — from draft, pending, or in transit.
Transfer line items
| Field | Notes |
|---|---|
| Variant | Variant being moved |
| Quantity | Quantity shipped (> 0) |
| Received quantity | Actual received; may differ from shipped |
| Damage flag & notes | Damage flag and free-text detail |
Two derived signals come off these fields:
- Final quantity — the received quantity when set, otherwise the shipped quantity.
- Discrepancy — a line is flagged when received ≠ shipped (positive = over, negative = short), and the transfer is flagged if any received line differs.
Stock movement between locations
- Stock is always per variant per location.
- Shipping appends negative deltas at the source and flips status to in-transit.
- Receiving appends positive deltas at the destination using the recorded received quantities.
- Because levels aren't floored at zero, shipping more than is on hand is permitted and shows as negative on-hand rather than being blocked.
Freight & landed cost
- Each transfer stores an expected freight cost (your ship-time estimate) and a confirmed carrier amount.
- The effective freight uses the confirmed amount when present, else the estimate, then divides it across total units to get a per-unit figure.
- On receive, that per-unit freight is added to the destination variant's existing landed-cost snapshot for the month — only when a snapshot already exists, since the nightly rollup establishes the baseline cost. This keeps internal moves from fabricating cost out of thin air.
Transfers vs. inbound shipments
- Internal moves use Transfers.
- Inbound goods from a vendor flow through Purchase Orders and their shipments: marking a PO shipped creates a linked in-transit transfer, and receiving the PO/shipment credits the destination location.
- The Transfers tab shows both internal moves and PO-driven inbound shipments.
Edge cases
- A legacy in-transit transfer with no line items can't be received (it would always fail validation) — cancel it instead.
- Locations referenced by transfers can't be deleted, so archive rather than delete locations that have history.
- Setting freight after receipt only adjusts the month's snapshot if one exists for that variant.
Start free and keep stock accurate across every location.