Chapter 1 — What Warehouse OS Gives You
Warehouse OS is the foundational stack. It powers everything from "goods arrive at the dock" to "goods leave on a truck."
Modules included
| Module | What it does |
|---|---|
| M01 | Auth, RBAC, tenancy isolation, audit, entitlements. |
| M08–M09 | Company settings, branding, user/role management. |
| M10 | Shipments (inbound + outbound master records). |
| M11 | Handling Units. |
| M12 | Receiving. |
| M13 | Putaway. |
| M14 | Locations + capacity rules. |
| M15 | Map / scanning. |
| M16 | Inventory ledger. |
| M17 | Fulfillment orders + pick/pack. |
| M18 | Shipping labels. |
| M22 | Proof of delivery (basic; extended in Transport OS). |
| M25, M27–M29, M31–M35 | Operational CRM (read), comms, tax, billing essentials, system admin essentials. |
Default landing path
/console/business/wms/inventory for company_admin who picks the WMS module.
Chapter 2 — Roles That Light Up with Warehouse OS
Trenvar has 13 roles total. With only Warehouse OS enabled, these are the ones that have meaningful work to do.
| Role | What they do in Warehouse OS |
|---|---|
| company_admin | Owns everything. Sets up locations, Item Master, capacity rules, invites users, configures settings. |
| operations_manager | Runs day-to-day. Creates pre-alerts, monitors receiving and putaway, oversees fulfillment, audits inventory. |
| operator | Hands-on warehouse work. Receives goods, puts them away, picks orders, packs cartons, generates labels. |
| customer_service | Read-only across shipments, inventory, handling units. Answers customer questions. |
| accounting | Read-only on shipments and inventory (for billing context). Manages services, pricing, invoices in the billing module. |
driver role exists but has no work without Transport OS. Customer portal roles (customer_admin, customer_user, etc.) have minimal surface — they show up in 3PL OS and Commerce OS guides.
Chapter 3 — Setting Up Your Warehouse
Before goods arrive, Trenvar needs a map of your warehouse — buildings, zones, aisles, bays, levels, bins. This chapter walks through every step from empty warehouse to a complete location tree, plus capacity rules.
The hierarchy
| Node Type | Description | Example code |
|---|---|---|
| warehouse | The building itself. | WH-01 |
| zone | Functional area: receiving, bulk, pick, returns, QC, staging. | RCV-01 |
| aisle | Row of shelving. | A |
| bay | Section of an aisle. | 01 |
| level | Vertical slot (top, middle, bottom). | 1 |
| bin | Final storage spot. | A-01-01-01 |
Specialized types you can also create: pick_face, bulk, pallet, quarantine, returns, staging.
Walkthrough A — create your first warehouse + zone
Prerequisites
- You're signed in as company_admin or operations_manager.
- You have
wms.locations.configure. - You know your warehouse's address and rough layout.
What the screen looks like
Navigate to /console/business/wms/locations. Page header reads "Locations" with two tabs at the top: Tree (default) and Capacity Rules. Below the tabs:
- Top right: a blue Create Location button.
- Center: a tree-view component that's empty for a new tenant ("No locations yet — create your first warehouse to begin").
Step-by-step
- Click Create Location in the top right. A slide-over form opens from the right.
- Form fields, in order:
- Node Type — dropdown. Pick warehouse.
- Code — text. Type
WH-01. Must be unique within the tenant. - Name — text. Type "Main Warehouse" (or whatever your facility is called).
- Parent Location — disabled for a warehouse (warehouses are root nodes).
- Status — radio. Default active. Leave it.
- Click Create at the bottom of the form. Toast appears: "Location created."
- The slide-over closes. The tree view now shows one row: "WH-01 — Main Warehouse".
- Now create a zone. Click the warehouse row → click Create Child Location button that appears in the top-right.
- Form opens with Parent Location already filled (locked to WH-01).
- Node Type → zone.
- Code →
RCV-01. - Name → "Receiving Dock".
- Click Create.
- Tree now shows: WH-01 > RCV-01.
Walkthrough B — drilling down to bins
Worked example — create one full leaf bin
Goal: create bin A-01-01-01 inside Aisle A, Bay 1, Level 1.
- From the tree at
/console/business/wms/locations, expand WH-01. Click on the "Bulk Storage Zone" you've already created (or create one first using Walkthrough A). - Click Create Child Location. Set Node Type = aisle, Code =
A, Name = "Aisle A". Save. - Click on Aisle A. Click Create Child Location. Set Node Type = bay, Code =
01, Name = "Bay 1". Save. - Click on Bay 1. Click Create Child Location. Set Node Type = level, Code =
01, Name = "Level 1". Save. - Click on Level 1. Click Create Child Location. Set Node Type = bin, Code =
A-01-01-01, Name = "Bin A-01-01-01". Optionally set Capacity Rule ID (see Walkthrough D below). - Click Create. Tree now shows the full path: WH-01 > BULK-ZONE > A > 01 > 01 > A-01-01-01.
code,name,node_type,parent_code,capacity_rule_code,status. Sample template downloadable from the same dialog.
Naming convention checklist
- All codes uppercase, no spaces.
- Use a consistent separator (
-is standard). - Pad numbers with leading zeros:
01not1. Sorting depends on this. - Reserve prefixes for special zones:
QC-*,RTN-*,STG-*(returns, staging, etc.).
Walkthrough C — editing or moving a location
- Click the location in the tree.
- The right-hand detail panel shows: code, name, node type, parent, status, capacity rule, occupancy snapshot.
- Click Edit (top right of the panel).
- Form opens pre-filled. Change name, status, or capacity rule.
- Code is locked after creation — you cannot rename a location's code without deleting it. (If you need to, only do it before any handling units have been placed there.)
- Click Save.
Walkthrough D — Capacity Rules
A capacity rule is a reusable template that limits what fits in a location. Apply one rule to many locations to keep things consistent.
Create a capacity rule
- From
/console/business/wms/locations, click the Capacity Rules tab. - Click Create Rule (top right).
- Form fields:
- Code — uppercase ID. Type
PICK-STD. - Name — type "Standard Pick Face".
- Node Types — multi-select. Tick pick_face and bin.
- Max Units — number. Type
50(or your physical limit). - Max Volume cm³ — number. Type
5000. - Max Weight kg — number. Optional.
- Max Pallet Positions — number. Optional.
- Allow Mixed SKU — checkbox. Tick it for general bins; leave unchecked for dedicated SKU pick faces.
- SKU Restrictions — optional. Tag-input. Type SKU codes to allow only those in this location.
- Active — checkbox. Default on.
- Code — uppercase ID. Type
- Click Create. Toast: "Capacity rule created."
Apply the rule to locations
- Go back to the Tree tab.
- Click a bin you want to constrain.
- Click Edit on the detail panel.
- Find the Capacity Rule dropdown. Pick PICK-STD.
- Save.
Worked example
You create rule PALLET-1POS: max units 1000, max weight 1000 kg, max pallet positions 1, mixed SKU allowed. You apply it to every floor-level bin in the bulk zone (200 bins). Now putaway will refuse to place a second pallet in any of those bins, and any bin trying to exceed 1000 kg will reject the operation with the message: "Capacity exceeded for location WH-01-BULK-A-01-01: would put 1080kg in a 1000kg-limit bin."
wms.locations.configure. company_admin and operations_manager have it by default.Chapter 4 — The Item Master (SKUs)
Your catalog of every product. Receiving, picking, and billing all key off this data — so it's worth setting up carefully.
The fields, in detail
| Field | What it means | Required? |
|---|---|---|
| SKU | Unique code. A–Z, 0–9, dot, dash, slash, colon, underscore. Auto-uppercased on save. | Yes |
| Product Name | Display name operators see during scanning and picking. | Recommended |
| Description | Internal notes. | No |
| Barcodes | EAN / UPC / GTIN codes used by scanners. Multiple allowed (comma-separated input). | No |
| Dimensions (L × W × H, cm) | Used for volume calculation and capacity checks. | Recommended |
| Weight (kg) | Critical for shipping and any weight-tier billing. | Recommended |
| Unit of Measure | uom_each (1 unit), uom_case (units per case), uom_pallet (units per pallet). | Defaults to each |
| Lot Controlled | If true, every receiving line must capture a lot number. | Toggle off by default |
| Serial Controlled | If true, every unit needs a unique serial. | Toggle off by default |
| Expiry Required | If true, every receiving line must capture an expiry date. | Toggle off by default |
| Fulfillment Billing | inherit / package / sku / picked_unit — drives how this SKU is billed when fulfilled. | Defaults inherit |
| Ship Alone | If true, this SKU must ship in its own carton — no co-packing. | Toggle off by default |
| Packaging Group | Optional grouping label (e.g., small-parcel) that signals which SKUs are usually compatible to share a package. Used in 3PL shared-package billing. | Optional |
| Cannot Mix Groups | Optional. List of Packaging Groups this SKU cannot share a package with. Lets you allow co-packing in general but block specific combinations without forcing Ship Alone. | Optional |
| Storage Billing Unit Code | Tenant-defined unit code (e.g., BARREL, CBM, LITRE, DRUM) that links this SKU to a storage rule with the matching Unit Code. Required for 3PL / Air Cargo storage billing. | Required if storage billing is on |
| Storage Billing Qty/Unit | How many of the storage unit one stocked unit equals. 1 for "one stocked unit = one barrel"; 200 for "one stocked unit = 200 litres"; blank when the rule uses Volume (CBM) and quantity comes from dimensions. | Optional, depends on rule |
| Default Storage Type | pick_face / bulk / pallet / quarantine / returns / staging. Suggests where putaway will route the item. | Recommended |
BARREL and barrel are different. Keep a tenant convention (uppercase is recommended).
Walkthrough A — create a single SKU manually
Prerequisites
- You're signed in as company_admin or have
wms.inventory.update. - You've decided your SKU code (and ideally a naming convention before doing 100 of them).
What the screen looks like
Go to /console/business/wms/item-master. The page shows:
- Header: "Item Master" title, top-right buttons: Import, Export, Create SKU.
- Filter bar: search field (matches SKU + name + barcode), status pills (All / Active / Archived), category dropdown.
- Table: columns SKU, Name, Status, Weight, Dimensions, Last Updated. Click a row to open the SKU detail.
Step-by-step
- Click Create SKU (top right). A slide-over form opens from the right with five collapsible sections: Identification, Physical, Tracking, Billing, Storage.
- Identification section:
- SKU → type
SKU-BLUE-SHIRT-M. The field shows uppercase as you type. - Product Name → "Blue T-Shirt, Medium".
- Description → optional. "Crew neck, 100% cotton."
- Barcodes → "0123456789012, 0123456789029" (comma-separated).
- SKU → type
- Physical section:
- Length (cm) → 25. Width → 18. Height → 3.
- Weight (kg) → 0.18.
- Unit of Measure → leave each.
- Tracking section: leave all toggles off (T-shirts don't have lots, serials, or expiry).
- Billing section:
- Fulfillment Billing → package (so it bills per carton).
- Ship Alone → off (T-shirts can co-pack).
- Storage section:
- Default Storage Type → pick_face (fast-mover).
- Click Create at the bottom. Toast: "Item created — SKU-BLUE-SHIRT-M". Slide-over closes; the new SKU appears at the top of the table (sorted by Last Updated).
What you should see now
The Item Master table shows your new SKU. Clicking it opens the detail page with tabs: Profile, Barcodes, Pricing Overrides (if you have customer-specific pricing), Inventory (live on-hand counts across locations).
Walkthrough B — bulk import 500 SKUs from CSV
Prerequisites
- You have a CSV with one row per SKU. Required columns:
sku,product_name. Recommended:weight_kg,length_cm,width_cm,height_cm,fulfillment_billing,ship_alone,default_storage_type,barcodes(semi-colon delimited if multiple).
Step-by-step
- Click Import (top right of Item Master).
- A modal opens with three tabs: Upload, Map columns, Review & commit.
- On Upload: drag your CSV onto the dropzone or click Choose file. File parses; you see a row count + column-detected message.
- Click Next: Map columns.
- On Map columns: Trenvar auto-maps based on header names. Fix any mis-mapped columns by picking from the dropdown.
- Click Next: Review.
- Review screen shows: total rows, valid rows, rows with errors (with first-10-error preview). Common errors: duplicate SKU, invalid barcode format, weight not a number.
- Either fix errors in your CSV and re-upload, or click Commit valid rows to import what's good and skip errors.
- Progress bar shows "Importing 487 SKUs…" then completes with summary: "487 created, 13 skipped (errors)."
Walkthrough C — edit an existing SKU
- From Item Master, search for the SKU code or scroll the list and click the row.
- Detail page opens. Click Edit in the top-right.
- The slide-over form opens with all fields pre-filled.
- Change what you need (e.g., update weight from 0.18 to 0.19 kg).
- Click Save. Toast: "Item updated."
- Click the History link in the top-right to see your edit logged: actor, timestamp, old → new value diff.
Walkthrough D — archive (retire) a SKU
- Open the SKU detail.
- Top right: click the three-dot menu → Archive.
- Confirmation dialog warns you about open inventory: "This SKU has 142 units on-hand. Archiving will not delete inventory but new pre-alerts and orders will not accept this SKU."
- Type the SKU code to confirm. Click Archive.
- Status moves to Archived; the SKU disappears from the default Active filter view.
wms.inventory.update for create / edit / archive. company_admin and operations_manager have it.Chapter 5 — Pre-Alerts
A pre-alert is "heads up — a truck is coming with these goods." It lets the warehouse plan dock space and gives receiving a list to scan against. This chapter walks through creating one as an ops manager.
Field reference
| Field | Notes |
|---|---|
| Prealert Code | Auto-generated (format PA-YYYYMMDD-NNN) or manual. |
| Source | wms (you created it), customer_portal (a customer notified you), unknown. |
| Purchase Order | Optional link to upstream PO. |
| Customer | Optional. Required if 3PL OS is on and stock is owned by a downstream customer. |
| Expected Lines | SKU + expected units + lot/serial/expiry if the SKU requires them. |
| Expected Arrival | Date + time. Used for dock scheduling. |
| Status | open → partially_received → received (or cancelled). |
| Notes | Free text. Visible during receiving. |
Walkthrough A — create a pre-alert as ops manager
Prerequisites
- Signed in as operations_manager or company_admin.
- Have
wms.prealert.create. - The SKUs you'll list already exist in Item Master. (Create them first if not.)
- You know roughly when the truck arrives.
What the screen looks like
Go to /console/ops-manager/pre-alert. Header reads "Pre-Alert Queue". Filter bar with date range, status pills (Open / Partially received / Received / Cancelled), customer filter (if 3PL is on). Table columns: Code, Customer, Expected Arrival, Lines, Total Units, Status, Source. Top-right button: Create Pre-Alert.
Step-by-step
- Click Create Pre-Alert. A two-pane modal opens. Left pane: header fields. Right pane: line items.
- Fill the header (left pane):
- Prealert Code → leave blank to auto-generate, or type your own (e.g.,
PA-20260503-001). - Customer (if visible) → start typing the customer name; pick from dropdown.
- Purchase Order → optional. Link an existing PO or leave blank.
- Expected Arrival → date-time picker. Pick today + time the truck arrives.
- Notes → optional free text ("Driver Mike, dock door 4").
- Prealert Code → leave blank to auto-generate, or type your own (e.g.,
- Add expected lines (right pane):
- Click Add Line.
- SKU search → type "BLUE-SHIRT-M", pick the matching SKU.
- Expected Units → type
120. - If the SKU is lot-controlled: a Lot field appears — type or scan the lot code.
- If serial-controlled: a Serial Range field appears.
- If expiry-required: an Expiry Date picker appears.
- Click Add Line again to add another SKU. Repeat for all expected SKUs.
- Review the totals at the bottom right: "5 lines, 540 units expected."
- Click Create Pre-Alert at the bottom. Toast: "Pre-Alert PA-20260503-001 created."
- The modal closes; the new pre-alert appears at the top of the queue with status open.
Worked example
Acme Corp emails you Friday saying "we're sending 3 SKUs on Monday morning, ETA 9 AM." Your steps:
- Go to /console/ops-manager/pre-alert.
- Click Create Pre-Alert.
- Customer = "Acme Corp". Expected Arrival = next Monday 09:00.
- Add line 1: SKU-BLUE-SHIRT-M, 120 units.
- Add line 2: SKU-RED-SHIRT-L, 80 units.
- Add line 3: SKU-WHITE-SHIRT-S, 200 units.
- Notes: "Driver: Mike Johnson. Dock 4."
- Create Pre-Alert.
- Monday 9 AM, the operator opens /console/operator/receiving and sees this pre-alert at the top of the queue, ready to receive against.
Walkthrough B — edit a pre-alert
- From the queue, click on a pre-alert that's still in open status (you can't edit ones that are partially or fully received).
- Detail panel slides in from the right.
- Click Edit.
- Modify fields or lines (you can add/remove/edit lines).
- Click Save Changes.
Walkthrough C — cancel a pre-alert
- Open the pre-alert detail.
- Click the three-dot menu (top-right) → Cancel Pre-Alert.
- Confirmation dialog asks for a reason ("Truck cancelled by carrier", "Wrong shipment", etc.).
- Type the reason. Click Cancel Pre-Alert.
- Status changes to cancelled. Audit log captures actor, time, reason. Receiving will no longer offer this pre-alert.
wms.prealert.create.Chapter 6 — Receiving Inbound Goods
When the truck arrives, an operator opens the receiving screen, scans the goods, counts them, flags problems, accepts. This chapter is the most-used workflow in the warehouse — your operators run it many times a day.
Walkthrough — receive a pre-alerted truck
Prerequisites
- Signed in as operator (or operations_manager / company_admin).
- Have
wms.receiving.update. - A pre-alert in open status exists for the inbound truck.
- Barcode scanner connected (USB or Bluetooth) — or you can manually search SKUs.
What the screen looks like
Go to /console/operator/receiving. The screen shows:
- Top: a search/scan field labelled "Scan or search pre-alert code". This is also where you'd scan a SKU barcode in scan-first mode.
- Below: a queue of open pre-alerts as cards. Each card shows: code, customer, expected arrival time, line count, total expected units, status pill.
- Cards sort by expected arrival time (earliest first).
Step-by-step
- Find your pre-alert. Either scan its code, type the code in the search field, or click the card directly.
- The detail view opens. You see the header (code, customer, expected arrival, notes) and a table of expected lines, each with: SKU, expected units, lot field (if lot-controlled), serial field, expiry, plus action column "Receive".
- For the first line, click Receive. A receive-line modal opens:
- SKU → already filled. Read-only.
- Scan or confirm → scan the SKU barcode on the carton to confirm. The field turns green when matched. If barcodes are missing, click Confirm manually.
- Lot → if SKU is lot-controlled, scan or type the lot code (e.g.,
LOT-2026-04-15). - Serial Range → if SKU is serial-controlled, scan first and last serial.
- Expiry Date → date picker if SKU requires expiry.
- Received Units → number input. Defaults to expected. Edit if actual count differs.
- Volume cm³ → optional. Auto-calc'd from Item Master dimensions × units. Override if you measured something different.
- Discrepancy Code → dropdown: none / shortage / overage / damage.
- If discrepancy ≠ none, two extra fields appear: Damage Units, Shortage Units.
- QC Hold → checkbox. If ticked, a QC Hold Reason text field appears.
- Click Accept (green button) or Reject (red, less common — only for goods you absolutely won't accept). Toast: "Line accepted — HU-1042 created."
- The line in the table flips to a check-mark icon. Repeat for every expected line.
- If the truck has goods that aren't on the pre-alert, click Add Unexpected Line at the bottom — opens the same modal but with SKU search instead of pre-filled.
- When all lines are received, click Complete Receiving at the bottom right.
- Confirmation dialog: "Complete receiving for PA-20260503-001? 5 of 5 lines processed." Click Complete.
- Pre-alert status flips to received. The screen returns to the receiving queue, and the pre-alert is gone (it's now in the "received" filter).
What Trenvar does behind the scenes
- Creates a handling unit for each accepted line (status = receiving).
- Writes a receiving event to the audit log: actor, timestamp, units, discrepancy.
- Generates a putaway task per HU, queued for the next chapter.
- If 3PL OS or Air Cargo OS is on, storage accrual begins immediately for the customer-owned stock.
Worked example — partial receipt with damage
Pre-alert says 120 units of SKU-BLUE-SHIRT-M expected. Truck actually delivers 118 — two cartons are crushed.
- Click Receive on that line.
- Confirm SKU.
- Received Units → 116 (118 minus 2 damaged).
- Discrepancy Code → damage.
- Damage Units → 2.
- Shortage Units → 2 (since 120 expected − 118 actual = 2 short, plus the 2 damaged means net usable = 116).
- QC Hold → optional. Tick if the rest needs inspection.
- Click Accept. Toast: "116 units accepted, 2 damage logged, HU-1042 created."
- The damaged units don't enter inventory — they're written as a damage record visible on the pre-alert detail.
wms.receiving.update — operator, operations_manager, company_admin.Chapter 7 — Putaway
Putaway is moving received goods from the dock to their permanent storage location. Trenvar suggests a destination based on your capacity rules and the SKU's default storage type — operators usually accept the suggestion.
Walkthrough — putaway a handling unit
Prerequisites
- Signed in as operator (or higher).
- Have
wms.putaway.update. - At least one HU exists with status receiving (i.e., something has been received but not yet placed).
- Capacity rules and locations are set up (Chapter 3).
What the screen looks like
Go to /console/operator/putaway. The screen shows:
- Top: scan field "Scan HU or location barcode".
- Below: queue of putaway tasks as cards. Each card: HU code, SKU, units, current location (usually "Receiving Dock"), suggested destination, age (how long since received).
- Cards sort oldest first by default — to encourage clearing the dock.
Step-by-step
- Pick the next HU in the queue. Either click the card or scan the HU barcode (handing units printed at receiving have a sticker).
- The detail view opens. You see:
- HU code, contents (SKU, lot/serial/expiry, units).
- Current location: "Receiving Dock".
- Suggested destination: a list of bin codes ranked by score. Top suggestion has a green tick badge. Each row shows bin code, capacity remaining, fit score.
- Option A — accept the suggestion: click the top suggested bin. The system confirms the bin and prompts you to scan the bin's barcode to verify physical placement.
- Walk to the bin, scan its barcode label.
- Field turns green. Click Confirm Placement.
- Option B — choose a different bin: scan a different bin's barcode in the scan field at the top. The system validates:
- Bin status (must be active).
- Capacity (will the HU fit? Max units / volume / weight / pallet positions all checked).
- SKU restrictions (does this bin allow this SKU?).
- Mixed-SKU rule (if the bin already has a different SKU and Allow Mixed SKU is off, rejected).
- If valid, you see a green confirmation. If invalid, you see a red error message explaining which constraint failed.
- Click Confirm Placement.
- Toast: "HU-1042 stored at A-01-01-01."
- HU status flips to stored. The location's occupancy snapshot is updated. The card disappears from the queue.
Worked example
HU-1042 contains 50 units of SKU-BLUE-SHIRT-M. SKU's default storage type is pick_face. System suggests bin A-01-01-01 (a pick_face with capacity 50 units, 0 currently used). Operator scans the bin barcode, sees green, clicks Confirm. Done in 15 seconds.
Walkthrough — exception: capacity exceeded
Same HU but the operator scans bin A-01-01-01 which already has 30 units. System rejects:
Capacity exceeded for A-01-01-01. Bin currently holds 30 units (limit 50). Adding 50 more would put it at 80 — over by 30. Choose a different bin or split this HU.
Operator's options:
- Pick a different bin (scan a new barcode).
- Split the HU: click Split HU in the top menu of the putaway detail. Form: how many units to split off into a new HU. Place each split HU separately.
- Escalate to ops manager if no compatible bins exist.
wms.putaway.update — operator, operations_manager, company_admin.Chapter 8 — Inventory Management
Once stock is put away, it lives in the inventory ledger. This chapter walks through the three things you'll do most: look up stock, adjust it, and (if you have 3PL OS) transfer ownership.
Inventory states
| State | Meaning |
|---|---|
| on_hand | Physically present in the warehouse, regardless of owner. |
| allocated | Reserved for an open pick task. |
| available | on_hand minus allocated. Free to pick for new orders. |
| quarantine | QC hold. Cannot be picked. |
| owned_units | Belongs to a specific customer (3PL OS only). |
| unassigned_units | Internal stock with no owner. |
Walkthrough A — look up stock by SKU
What the screen looks like
Page header reads "Inventory". Filter bar at the top:
- SKU — typeahead search.
- Lot — text filter.
- Serial — text filter.
- Location — typeahead.
- Owner Customer — dropdown (3PL OS only).
- Status pills — All / Available / Allocated / Quarantine.
Below: a table grouped by SKU. Each row shows: SKU, Lot, Serial, Location, On-Hand, Allocated, Available, Quarantine, Owner, Last Movement timestamp.
Step-by-step
- Type a SKU code in the SKU field (e.g., "BLUE-SHIRT-M"). Picker auto-suggests; pick it.
- Optionally narrow by lot, serial, location, or owner.
- The table filters live. Each row is one inventory item — a unique combination of SKU + lot + serial + location + owner.
- Click any row to open the detail panel:
- Profile tab — current state, owner.
- Movement history tab — every event that touched this item, in reverse-chronological order.
- Handling units tab — which HUs contain this item.
- Allocations tab — which open pick tasks have reserved units.
Worked example
Customer asks "do we have any blue shirts in size M?" You go to /console/ops-manager/inventory, type "BLUE-SHIRT-M". Two rows appear:
- BLUE-SHIRT-M, Loc A-01-01-01, On-Hand 50, Allocated 12, Available 38.
- BLUE-SHIRT-M, Loc B-03-02-01 (bulk), On-Hand 200, Allocated 0, Available 200.
Total available: 238 units. Tell the customer.
Walkthrough B — manual inventory adjustment
For physical count variance, damage, donation, write-off — anything that changes inventory without a normal receiving / pick event.
Prerequisites
- Signed in as operator, ops_manager, or company_admin.
- Have
wms.inventory.update. - You know the actual physical count (vs. system count) and the reason for the variance.
Step-by-step
- From the inventory screen, find the row you need to adjust. Click it.
- In the detail panel, click Adjust Inventory (top right).
- A modal opens:
- SKU / Lot / Serial / Location → pre-filled. Read-only.
- Current On-Hand → read-only display, e.g., 50.
- Adjustment Type → radio: Increase / Decrease / Set to value.
- Adjustment Quantity → number. If type=Increase, this adds. If Decrease, subtracts. If Set to value, replaces.
- New On-Hand → calculated preview, e.g., 48 (after a 2-unit decrease).
- Reason → dropdown: Physical count variance / Damage / Donation / Write-off / Lost / Found / Other.
- Reason Notes → free text. Required if reason = Other.
- Click Submit Adjustment.
- Confirmation dialog: "Decrease 50 → 48 units of BLUE-SHIRT-M at A-01-01-01. Reason: Physical count variance. Continue?"
- Click Confirm. Toast: "Adjustment recorded."
- Inventory updates immediately. Movement history shows the adjustment with your name, timestamp, reason, before/after values.
Worked example
Cycle count finds 48 actual units of BLUE-SHIRT-M at A-01-01-01, but system shows 50. Adjust:
- Open the row, click Adjust Inventory.
- Adjustment Type: Decrease. Quantity: 2. Reason: Physical count variance. Notes: "Cycle count 2026-05-03, missing units not located".
- Submit, confirm. Inventory now shows 48 on-hand.
- Movement history records the adjustment.
Walkthrough C — transfer ownership (3PL only)
If 3PL OS is on, inventory items can change owner customer (e.g., consignment switch). See the 3PL OS guide for the full walkthrough.
wms.inventory.read (operator+). Adjust: wms.inventory.update (operator+).Chapter 9 — Cycle Counts
Cycle counts are scheduled physical recounts to catch variance before it compounds. Run them weekly on fast-movers, monthly on slow-movers.
Walkthrough — schedule and run a cycle count
Prerequisites
- operations_manager or company_admin.
- Have
wms.inventory.update. - The location or zone has stock to count.
What the screen looks like
Header reads "Cycle Counts". Two tabs: Active (currently running counts) and History. Top-right: Schedule Count button.
Step-by-step (manager)
- Click Schedule Count. Modal opens.
- Pick scope: By Location (one bin), By Zone (e.g., RCV-01), By SKU (every location holding this SKU), By Owner Customer (3PL only).
- Pick the target (typeahead).
- Pick mode: Blind (count screen hides expected qty — better data) or Visible (operator sees expected — faster, less rigorous).
- Pick assigned operator.
- Schedule date/time (or "Now").
- Click Schedule. The count appears in the Active tab. The assigned operator now sees a card on their /console/operator/locations dashboard.
Step-by-step (operator)
- Operator clicks the cycle count card. Detail screen shows the list of items to count: SKU, location, expected qty (hidden if blind mode).
- For each item: walk to the location, scan the bin barcode, scan SKU, type the count.
- If counted > or < expected, the line shows a yellow variance flag.
- After all items counted, click Submit Count.
Manager review
- Manager opens the completed count.
- Variances are listed at the top.
- For each variance, click Resolve. Options: Auto-adjust (system makes the matching adjustment with reason "cycle count variance"), Recount (sends back to operator), Investigate (leaves variance unresolved, flagged for follow-up).
- Click Close Count when all variances handled.
Chapter 10 — Outbound Orders & Fulfillment
An order is "ship these things to this address." A fulfillment order is the warehouse's record of executing it.
How orders enter Trenvar (Warehouse OS)
- Manual entry through this screen.
- API push from your ERP (if connected).
- Linked to an outbound shipment.
(With 3PL OS or Commerce OS, customers can also place their own orders through the portal — see those guides.)
Order lifecycle
open → picking → picked → packing → packed → dispatch_ready → dispatched
Walkthrough — create a fulfillment order manually
Prerequisites
- Signed in as company_admin or operations_manager.
- Have
wms.fulfillment.create. - Available inventory exists for the SKUs you're going to ship.
- You have the recipient's address.
What the screen looks like
Go to /console/business/wms/fulfillment. Page header "Fulfillment Orders". Filter bar: status pills (Open / Picking / Picked / Packing / Packed / Dispatched / Cancelled), customer filter, date range. Top-right: Create Order.
Step-by-step
- Click Create Order. Modal opens with three sections: Header, Lines, Shipping.
- Header:
- Fulfillment Code → leave blank to auto-generate (format
FO-YYYYMMDD-NNN) or type your own. - Order Type → sales (customer order) or transfer (internal warehouse transfer).
- Customer → search and pick (3PL only — otherwise fill recipient directly).
- Allocation Strategy → dropdown:
- manual — operator picks whatever HU.
- fifo — system allocates oldest receipt first.
- fefo — system allocates closest expiry first (perishables).
- Fulfillment Code → leave blank to auto-generate (format
- Lines: click Add Line:
- SKU search → type, pick.
- Requested Units → number.
- Lot / Serial → only if SKU is lot/serial-controlled.
- Add more lines as needed.
- Shipping:
- Recipient Name, Phone, Email.
- Address (street, city, state/province, zip, country).
- Carrier (optional — can also be picked at label generation).
- Service Level (optional).
- Click Create Order. Toast: "Fulfillment order FO-20260503-001 created."
- The system creates the order and one or more pick tasks (one per pick zone, typically).
Worked example
Customer Acme orders 5 SKUs to be shipped to a single recipient. Order Type = sales, Allocation = fifo, 5 lines added. After save, two pick tasks are generated (some SKUs are in pick face, some are in bulk). Both appear in the operator's pick queue.
Chapter 11 — Pick
Picking is the operator gathering items from inventory locations for one or more fulfillment orders.
Walkthrough — execute a pick task
Prerequisites
- operator role with
wms.picking.update. - At least one pick task in open status in your queue.
- Barcode scanner connected.
What the screen looks like
Go to /console/operator/fulfillment. Tabs across the top: Pick (default), Pack, Ship. Pick tab shows queue of pick tasks as cards. Each card: pick task code, customer, line count, age, priority badge.
Step-by-step
- Click on the next pick task. Detail screen shows:
- Header: order code, customer, allocation strategy.
- Pick path: ordered list of locations to visit (system-optimized for shortest path).
- Required lines table: SKU, lot/serial, qty, source location, status.
- For the first line, walk to its source location.
- Scan the HU barcode at the location. Field shows green if matched.
- Scan the SKU barcode on the unit you're picking. Field shows green if matched. (If barcodes mismatch HU contents, system shows red and rejects.)
- Type Picked Units (defaults to required qty). If you can pick less, type the actual number — system flags as partial.
- If lot/serial-controlled, scan the specific lot/serial.
- Click Confirm Pick. The line flips to a green check.
- Move to the next location and repeat.
- When all lines are done, click Complete Pick (bottom right).
- Toast: "Pick complete. Order ready for packing."
What happens behind the scenes
- System writes an immutable
picked_linesarray on the fulfillment order. - Inventory at the picked locations moves from allocated to picked-and-removed.
- Order status flips from picking to picked.
- The order moves to the operator's Pack tab.
Chapter 12 — Pack
After picking, items go into cartons. Operator records what went into each carton, with weight and dimensions.
Walkthrough — pack a picked order
Prerequisites
- operator with
wms.packing.update. - An order in picked status in the Pack tab.
- A scale and (recommended) dimensioning equipment.
Step-by-step
- From
/console/operator/fulfillmentclick the Pack tab. - Pick a picked order from the queue.
- Detail screen shows the picked items as a flat list with quantities.
- Click Add Carton. A new carton card appears.
- For each item in this carton:
- Click Add Item to Carton 1.
- Pick from the unpacked items list (drag, or type).
- Set qty.
- Once carton is full, set:
- Weight (kg) — read off the scale and enter.
- Dimensions (L × W × H, cm) — measure or use carton standard.
- Carton Type — dropdown of pre-defined sizes (small box, medium box, large box, custom).
- Click Save Carton.
- Add more cartons until all picked items are packed. The "unpacked" count goes to zero.
- Click Complete Pack at the bottom.
- Order status flips to packed; ready for shipping label.
Worked example
Order has 50 picked T-shirts (split across 3 SKU sizes). Operator packs 20 into Carton 1 (weight 3.6 kg), 20 into Carton 2 (3.6 kg), 10 into Carton 3 (1.8 kg). Three cartons saved. Click Complete Pack.
Chapter 13 — Shipping Labels
Trenvar calls the carrier API and returns a label PDF and tracking number(s) per parcel. The parcel data is what billing uses for weight-tier pricing.
Walkthrough — generate a shipping label
Prerequisites
- operator with
wms.fulfillment.update. - Carrier accounts configured by company_admin (FedEx, UPS, DHL credentials in tenant settings).
- Order in packed status with carton weights set.
Step-by-step
- From the packed order detail, click Generate Shipping Label.
- A modal opens:
- Carrier → dropdown (FedEx, UPS, DHL, USPS, Canada Post — whatever's configured).
- Service → dropdown that filters by selected carrier (e.g., FedEx → Ground / Express Saver / Priority Overnight).
- Parcels → table prefilled from packing. Each row: weight, dimensions, contents summary. Verify or edit each row.
- Insurance → optional. Check if you want insured shipment + declared value.
- Customs (international only) → opens a sub-form for HS codes, declared values, country of origin.
- Click Request Label from Carrier. Spinner: "Calling carrier..."
- 5–15 seconds later, the modal shows:
- Label ID.
- One tracking number per parcel.
- Label PDF — click to download or to send to the printer.
- Estimated cost.
- Click Print Labels if you have a label printer connected, otherwise download the PDF and print.
- Stick labels on the cartons.
- Click Mark Dispatched when the cartons leave the facility.
- Order status flips to dispatched.
Origin types (where the label came from)
| Origin | Meaning |
|---|---|
| tenant_generated | You generated it through Trenvar's carrier integration. |
| customer_generated | A portal customer generated it for their own order. |
| customer_provided_external | Customer brought their own pre-printed label from outside. |
Chapter 14 — Handling Units (HUs)
A handling unit is a physical container — carton, pallet, tote, case. Trenvar tracks every HU through receiving, putaway, picking, and shipping. Most HUs are auto-created during receiving; manual creation is for special cases.
Lifecycle
receiving → stored → in_transit → merged → closed
Walkthrough A — create an HU manually (for returns or system corrections)
Step-by-step
- Go to
/console/business/wms/handling-units. - Click Create Handling Unit.
- Fields:
- HU Code → optional. Leave blank for auto-generation (e.g., HU-005012).
- HU Type → dropdown: carton / pallet / tote / case / generic.
- Linked Shipment → optional.
- Owner Customer → optional (3PL only).
- Click Add Contents:
- SKU → search and pick.
- Lot / Serial / Expiry → if applicable.
- Qty → number.
- Add more SKUs if mixed contents.
- Click Create. HU appears in the list with status receiving.
- Putaway it as normal (Chapter 7).
Walkthrough B — split an HU
Useful when a single HU is too big for any available bin.
- Open the HU detail.
- Click Split HU (top-right menu).
- Pick which units to split off into a new HU.
- System creates a child HU with those units; original HU's qty decreases.
- Place each HU separately.
Walkthrough C — merge two HUs
Useful when consolidating multiple receipts into one carton/pallet for shipping.
- Open the HU you want to keep (the parent).
- Click Merge into this HU.
- Search and select the source HU.
- Confirm. Source HU status flips to merged; parent HU contents grow.
Chapter 15 — Daily Flow per Role
Operator's day
- Log in → /console/operator/locations.
- Receiving queue: process incoming pre-alerts.
- Putaway queue: place HUs on shelves.
- Pick queue: gather items for fulfillment orders.
- Pack queue: box, weigh, dimension.
- Generate shipping labels.
Operations manager's day
- Log in → /console/ops-manager/pre-alert.
- Create pre-alerts based on customer notifications.
- Monitor receiving exceptions (shortage/damage/QC holds).
- Review inventory adjustments.
- Watch fulfillment SLA.
Customer service's day
- Log in → /console/customer-service/pre-alert.
- Look up shipments and inventory in response to customer questions.
- Open cases for issues.
- Send notices.
Accounting's day in Warehouse-only mode
Mostly billing-side work in /console/accounting/billing — invoices, services, pricing. WMS data is read-only context.
Appendix A — Warehouse OS Console Paths
| Path | Screen |
|---|---|
| /console/business/wms/inventory | Inventory (admin) |
| /console/business/wms/item-master | Item Master |
| /console/business/wms/locations | Locations + capacity rules |
| /console/business/wms/handling-units | Handling units |
| /console/business/wms/handling-units/[huId] | HU detail |
| /console/business/wms/pre-alert | Pre-alerts |
| /console/business/wms/receiving | Receiving (admin) |
| /console/business/wms/putaway | Putaway (admin) |
| /console/business/wms/movement | Movement events |
| /console/business/wms/fulfillment | Fulfillment orders |
| /console/business/wms/shipments | Shipments |
| /console/business/wms/shipments/new | Create shipment |
| /console/business/wms/shipments/[shipmentId] | Shipment detail |
| /console/business/wms/purchase-orders | Purchase orders |
| /console/business/wms/cycle-count | Cycle counts |
| /console/business/wms/replenishment | Replenishment |
| /console/business/wms/returns | Returns |
| /console/business/wms/map | Warehouse map |
| /console/ops-manager/pre-alert | Pre-alert queue |
| /console/ops-manager/receiving | Receiving manager view |
| /console/ops-manager/putaway | Putaway manager view |
| /console/ops-manager/inventory | Inventory + adjustments |
| /console/ops-manager/fulfillment | Fulfillment manager view |
| /console/ops-manager/handling-units | HUs |
| /console/ops-manager/locations | Locations |
| /console/operator/locations | Operator landing / scan hub |
| /console/operator/receiving | Receiving execution |
| /console/operator/putaway | Putaway execution |
| /console/operator/fulfillment | Pick & pack |
| /console/operator/inventory | Inventory (read) |
| /console/operator/shipments | Shipments |
| /console/operator/tools/fulfillment-scan | Manual scan entry |
Appendix B — Warehouse OS Permissions
| Permission | Held by (default) |
|---|---|
| wms.shipments.list / read / create / update | company_admin, operations_manager (read+write); operator + customer_service + accounting (read) |
| wms.purchase_orders.* (list/read/create/update) | company_admin, operations_manager |
| wms.handling_units.* (list/read/create/update) | company_admin, operations_manager |
| wms.inventory.* (list/read/update) | company_admin, operations_manager, operator (incl. update) |
| wms.locations.list / read / configure | company_admin, operations_manager (configure); operator (read) |
| wms.map.read | company_admin, operations_manager, operator |
| wms.prealert.create | company_admin, operations_manager |
| wms.receiving.update | company_admin, operations_manager, operator |
| wms.putaway.update | company_admin, operations_manager, operator |
| wms.movement.update | company_admin, operations_manager, operator |
| wms.picking.update | company_admin, operations_manager, operator |
| wms.packing.update | company_admin, operations_manager, operator |
| wms.loading.update | company_admin, operations_manager, operator |
Appendix C — Glossary
Every Warehouse-OS-specific term, in plain English. If a term appears in this guide, it's defined here.
Aisle — A row of shelving in your warehouse. Top of the bin hierarchy below the zone.
Allocated — Inventory units reserved for an open pick task (not yet physically removed). Available = on-hand minus allocated.
Available — Inventory units free to pick for a new order. Calculated = on-hand minus allocated.
Bay — A section of an aisle. Sits between aisle and level in the location hierarchy.
Bin — The smallest physical storage spot. Where individual handling units actually sit.
Capacity Rule — A reusable template that limits what fits in a location: max units, max volume, max weight, mixed-SKU policy.
Cycle Count — A scheduled physical recount of stock to catch variance against system records.
Discrepancy Code — Why receiving accepted less or more than expected: shortage / overage / damage / none.
Fulfillment Order — The warehouse's record of executing one customer order. Has lines (SKU + qty) and a recipient address. Lifecycle: open → picking → picked → packing → packed → dispatch_ready → dispatched.
Handling Unit (HU) — A physical container — carton, pallet, tote, case. Trenvar tracks every HU through receiving, putaway, picking, and shipping.
Item Master — Your catalog of every product (SKU). One row per SKU with all its physical and billing attributes.
Level — A vertical slot in a bay (top / middle / bottom shelf).
Location — Any node in the warehouse tree: warehouse, zone, aisle, bay, level, bin, or special types like pick_face / bulk / quarantine.
Lot — A grouped batch of inventory (often by manufacturing date). Lot-controlled SKUs require a lot value at receiving.
On-hand — Total physical units in the warehouse, regardless of owner or status.
Pack Record — The record of what items went into which carton during pack, with weight + dimensions.
Pick Task — The work assigned to an operator to gather items for one or more fulfillment orders.
Pick Face — A specialized location type designed for fast picking (forward-pick zone).
Pre-Alert — Advance notice that goods are arriving. Lets the warehouse plan dock space and gives receiving a list to scan against.
Putaway — Moving received goods from the receiving dock to their permanent storage location.
Quarantine — Stock on a quality-control hold. Cannot be picked until released.
Receiving Event — The audit-logged record of accepting one inbound line: actor, time, units, discrepancies.
Serial — A unique identifier for a single unit. Serial-controlled SKUs require a serial value at receiving.
Ship Alone — A SKU flag. If true, this SKU must ship in its own carton (no co-packing).
Shipping Label — A carrier-issued label (PDF + tracking number) generated by calling the carrier's API. Holds the parcel rows that drive billing.
SKU — Stock Keeping Unit. The unique code identifying one product in your Item Master.
Status pill — A small coloured badge showing the current state of a record (open / picking / packed / etc.).
Volume (cm³ / CBM) — Cubic capacity. cm³ is cubic centimetres; CBM is cubic metres (1 CBM = 1,000,000 cm³).
Warehouse — The root node of your location tree. The building.
Zone — A functional area inside a warehouse: receiving, bulk, pick, returns, QC, staging.
End of Warehouse OS Guide · v1.0 · May 2026