Warehouse OS Guide

Item Master, locations, receiving, putaway, inventory, pick, pack, ship — the foundation every other OS sits on.

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

ModuleWhat it does
M01Auth, RBAC, tenancy isolation, audit, entitlements.
M08–M09Company settings, branding, user/role management.
M10Shipments (inbound + outbound master records).
M11Handling Units.
M12Receiving.
M13Putaway.
M14Locations + capacity rules.
M15Map / scanning.
M16Inventory ledger.
M17Fulfillment orders + pick/pack.
M18Shipping labels.
M22Proof of delivery (basic; extended in Transport OS).
M25, M27–M29, M31–M35Operational CRM (read), comms, tax, billing essentials, system admin essentials.
What Warehouse OS does NOT include
Storage accrual billing (3PL OS or Air Cargo OS), dispatch/drivers (Transport OS), AWB tracking (Air Cargo OS), B2B Storefront (Commerce OS). If you need those, enable the corresponding OS.

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.

RoleWhat they do in Warehouse OS
company_adminOwns everything. Sets up locations, Item Master, capacity rules, invites users, configures settings.
operations_managerRuns day-to-day. Creates pre-alerts, monitors receiving and putaway, oversees fulfillment, audits inventory.
operatorHands-on warehouse work. Receives goods, puts them away, picks orders, packs cartons, generates labels.
customer_serviceRead-only across shipments, inventory, handling units. Answers customer questions.
accountingRead-only on shipments and inventory (for billing context). Manages services, pricing, invoices in the billing module.
Roles that don't light up here
The 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.

Where
/console/business/wms/locations

The hierarchy

Node TypeDescriptionExample code
warehouseThe building itself.WH-01
zoneFunctional area: receiving, bulk, pick, returns, QC, staging.RCV-01
aisleRow of shelving.A
baySection of an aisle.01
levelVertical slot (top, middle, bottom).1
binFinal 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

  1. Click Create Location in the top right. A slide-over form opens from the right.
  2. 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.
  3. Click Create at the bottom of the form. Toast appears: "Location created."
  4. The slide-over closes. The tree view now shows one row: "WH-01 — Main Warehouse".
  5. Now create a zone. Click the warehouse row → click Create Child Location button that appears in the top-right.
  6. Form opens with Parent Location already filled (locked to WH-01).
    • Node Typezone.
    • CodeRCV-01.
    • Name → "Receiving Dock".
    • Click Create.
  7. 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.

  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).
  2. Click Create Child Location. Set Node Type = aisle, Code = A, Name = "Aisle A". Save.
  3. Click on Aisle A. Click Create Child Location. Set Node Type = bay, Code = 01, Name = "Bay 1". Save.
  4. Click on Bay 1. Click Create Child Location. Set Node Type = level, Code = 01, Name = "Level 1". Save.
  5. 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).
  6. Click Create. Tree now shows the full path: WH-01 > BULK-ZONE > A > 01 > 01 > A-01-01-01.
Don't fight the tree — use bulk import
Manually creating 500 bins is painful. Use the Import Locations button (top-right of the Locations screen) to upload a CSV. Format: 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: 01 not 1. Sorting depends on this.
  • Reserve prefixes for special zones: QC-*, RTN-*, STG-* (returns, staging, etc.).

Walkthrough C — editing or moving a location

  1. Click the location in the tree.
  2. The right-hand detail panel shows: code, name, node type, parent, status, capacity rule, occupancy snapshot.
  3. Click Edit (top right of the panel).
  4. Form opens pre-filled. Change name, status, or capacity rule.
  5. 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.)
  6. Click Save.
Re-parenting is not supported
You can't drag a bin to a different bay. If your physical layout changes, deactivate the old location (status = inactive) and create a new one in the right place. Move the inventory using putaway with reason "physical relocation."

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

  1. From /console/business/wms/locations, click the Capacity Rules tab.
  2. Click Create Rule (top right).
  3. 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.
  4. Click Create. Toast: "Capacity rule created."

Apply the rule to locations

  1. Go back to the Tree tab.
  2. Click a bin you want to constrain.
  3. Click Edit on the detail panel.
  4. Find the Capacity Rule dropdown. Pick PICK-STD.
  5. Save.
Mass-applying rules
In the tree view, multi-select bins via the checkboxes that appear when hovering each row. With multiple selected, a "Bulk actions" button appears at the top — choose Apply capacity rule and pick the rule. One save applies it to all selected bins.

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."

Required permission
Both walkthroughs need 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.

Where
/console/business/wms/item-master

The fields, in detail

FieldWhat it meansRequired?
SKUUnique code. A–Z, 0–9, dot, dash, slash, colon, underscore. Auto-uppercased on save.Yes
Product NameDisplay name operators see during scanning and picking.Recommended
DescriptionInternal notes.No
BarcodesEAN / 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 Measureuom_each (1 unit), uom_case (units per case), uom_pallet (units per pallet).Defaults to each
Lot ControlledIf true, every receiving line must capture a lot number.Toggle off by default
Serial ControlledIf true, every unit needs a unique serial.Toggle off by default
Expiry RequiredIf true, every receiving line must capture an expiry date.Toggle off by default
Fulfillment Billinginherit / package / sku / picked_unit — drives how this SKU is billed when fulfilled.Defaults inherit
Ship AloneIf true, this SKU must ship in its own carton — no co-packing.Toggle off by default
Packaging GroupOptional 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 GroupsOptional. 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 CodeTenant-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/UnitHow 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 Typepick_face / bulk / pallet / quarantine / returns / staging. Suggests where putaway will route the item.Recommended
Storage Billing Unit Code matters case-sensitively
The string in Storage Billing Unit Code must exactly match an active storage rule's Unit Code (case-sensitive). BARREL and barrel are different. Keep a tenant convention (uppercase is recommended).
Packaging Group + Ship Alone interplay
If Ship Alone = true, Packaging Group is ignored — the SKU always gets its own package. If Ship Alone = false, Packaging Group helps operators (and future packing logic) keep similar items together. Use it when you want consolidation without forcing one SKU per box.

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

  1. Click Create SKU (top right). A slide-over form opens from the right with five collapsible sections: Identification, Physical, Tracking, Billing, Storage.
  2. 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).
  3. Physical section:
    • Length (cm) → 25. Width → 18. Height → 3.
    • Weight (kg) → 0.18.
    • Unit of Measure → leave each.
  4. Tracking section: leave all toggles off (T-shirts don't have lots, serials, or expiry).
  5. Billing section:
    • Fulfillment Billing → package (so it bills per carton).
    • Ship Alone → off (T-shirts can co-pack).
  6. Storage section:
    • Default Storage Type → pick_face (fast-mover).
  7. 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

  1. Click Import (top right of Item Master).
  2. A modal opens with three tabs: Upload, Map columns, Review & commit.
  3. On Upload: drag your CSV onto the dropzone or click Choose file. File parses; you see a row count + column-detected message.
  4. Click Next: Map columns.
  5. On Map columns: Trenvar auto-maps based on header names. Fix any mis-mapped columns by picking from the dropdown.
  6. Click Next: Review.
  7. 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.
  8. Either fix errors in your CSV and re-upload, or click Commit valid rows to import what's good and skip errors.
  9. Progress bar shows "Importing 487 SKUs…" then completes with summary: "487 created, 13 skipped (errors)."
Test with a small batch first
Run a 10-row import before doing 500. If the field mapping is wrong, fixing 10 records is much faster than fixing 500.

Walkthrough C — edit an existing SKU

  1. From Item Master, search for the SKU code or scroll the list and click the row.
  2. Detail page opens. Click Edit in the top-right.
  3. The slide-over form opens with all fields pre-filled.
  4. Change what you need (e.g., update weight from 0.18 to 0.19 kg).
  5. Click Save. Toast: "Item updated."
  6. Click the History link in the top-right to see your edit logged: actor, timestamp, old → new value diff.
SKU code is locked after first inventory event
You can edit name, description, weight, dimensions, flags, etc. — but not the SKU code itself. If you really need to rename, archive the old SKU and create a new one. Trenvar offers a "Move inventory from old SKU to new SKU" tool from the archived SKU's detail page.

Walkthrough D — archive (retire) a SKU

  1. Open the SKU detail.
  2. Top right: click the three-dot menu → Archive.
  3. 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."
  4. Type the SKU code to confirm. Click Archive.
  5. Status moves to Archived; the SKU disappears from the default Active filter view.
Set weights if you bill by package weight
Without weight, the system can't apply weight-tier pricing — it falls back to a default amount per package. If your contract uses weight tiers, every SKU's weight matters.
Required permission
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.

Where
/console/ops-manager/pre-alert  ·  /console/business/wms/pre-alert

Field reference

FieldNotes
Prealert CodeAuto-generated (format PA-YYYYMMDD-NNN) or manual.
Sourcewms (you created it), customer_portal (a customer notified you), unknown.
Purchase OrderOptional link to upstream PO.
CustomerOptional. Required if 3PL OS is on and stock is owned by a downstream customer.
Expected LinesSKU + expected units + lot/serial/expiry if the SKU requires them.
Expected ArrivalDate + time. Used for dock scheduling.
Statusopen → partially_received → received (or cancelled).
NotesFree 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

  1. Click Create Pre-Alert. A two-pane modal opens. Left pane: header fields. Right pane: line items.
  2. 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").
  3. 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.
  4. Review the totals at the bottom right: "5 lines, 540 units expected."
  5. Click Create Pre-Alert at the bottom. Toast: "Pre-Alert PA-20260503-001 created."
  6. 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:

  1. Go to /console/ops-manager/pre-alert.
  2. Click Create Pre-Alert.
  3. Customer = "Acme Corp". Expected Arrival = next Monday 09:00.
  4. Add line 1: SKU-BLUE-SHIRT-M, 120 units.
  5. Add line 2: SKU-RED-SHIRT-L, 80 units.
  6. Add line 3: SKU-WHITE-SHIRT-S, 200 units.
  7. Notes: "Driver: Mike Johnson. Dock 4."
  8. Create Pre-Alert.
  9. 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

  1. 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).
  2. Detail panel slides in from the right.
  3. Click Edit.
  4. Modify fields or lines (you can add/remove/edit lines).
  5. Click Save Changes.

Walkthrough C — cancel a pre-alert

  1. Open the pre-alert detail.
  2. Click the three-dot menu (top-right) → Cancel Pre-Alert.
  3. Confirmation dialog asks for a reason ("Truck cancelled by carrier", "Wrong shipment", etc.).
  4. Type the reason. Click Cancel Pre-Alert.
  5. Status changes to cancelled. Audit log captures actor, time, reason. Receiving will no longer offer this pre-alert.
If the truck arrives and the pre-alert isn't there
Receiving has a manual entry mode — operator can create a pre-alert on the fly from the receiving screen. But pre-creating beforehand is much faster, gives you dock-scheduling visibility, and reduces operator errors.
Required permission
company_admin or operations_manager — 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.

Where
/console/operator/receiving  ·  /console/ops-manager/receiving

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

  1. Find your pre-alert. Either scan its code, type the code in the search field, or click the card directly.
  2. 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".
  3. 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.
  4. Click Accept (green button) or Reject (red, less common — only for goods you absolutely won't accept). Toast: "Line accepted — HU-1042 created."
  5. The line in the table flips to a check-mark icon. Repeat for every expected line.
  6. 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.
  7. When all lines are received, click Complete Receiving at the bottom right.
  8. Confirmation dialog: "Complete receiving for PA-20260503-001? 5 of 5 lines processed." Click Complete.
  9. 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.

  1. Click Receive on that line.
  2. Confirm SKU.
  3. Received Units → 116 (118 minus 2 damaged).
  4. Discrepancy Code → damage.
  5. Damage Units → 2.
  6. Shortage Units → 2 (since 120 expected − 118 actual = 2 short, plus the 2 damaged means net usable = 116).
  7. QC Hold → optional. Tick if the rest needs inspection.
  8. Click Accept. Toast: "116 units accepted, 2 damage logged, HU-1042 created."
  9. The damaged units don't enter inventory — they're written as a damage record visible on the pre-alert detail.
Storage starts the moment you click Accept
No grace period. If a customer's stock arrives at 9:00 AM and you accept it at 9:00 AM, storage charges begin at 9:00 AM. Even items on QC hold accrue storage. (Use the freeDays field on storage rules to give a contractual grace period; see 3PL OS guide.)
If receiving rejects the scan
Possible causes: the SKU's barcodes in Item Master are wrong, you scanned a UCC-prefixed pallet barcode by mistake, or the carton has the wrong SKU. Check the Item Master record's Barcodes tab to add the missing one (or fix the actual carton labelling on the dock).
Required permission
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.

Where
/console/operator/putaway  ·  /console/ops-manager/putaway

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

  1. Pick the next HU in the queue. Either click the card or scan the HU barcode (handing units printed at receiving have a sticker).
  2. 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.
  3. 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.
  4. 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).
  5. If valid, you see a green confirmation. If invalid, you see a red error message explaining which constraint failed.
  6. Click Confirm Placement.
  7. Toast: "HU-1042 stored at A-01-01-01."
  8. 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.
If you scan the wrong bin
The system blocks the placement before HU status changes. Scan the correct bin and try again. If you've already physically placed the HU, scan the actual bin you used and let the system update — never override the system to match your memory of where you put it.
Required permission
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

StateMeaning
on_handPhysically present in the warehouse, regardless of owner.
allocatedReserved for an open pick task.
availableon_hand minus allocated. Free to pick for new orders.
quarantineQC hold. Cannot be picked.
owned_unitsBelongs to a specific customer (3PL OS only).
unassigned_unitsInternal stock with no owner.

Walkthrough A — look up stock by SKU

Where
/console/ops-manager/inventory  ·  /console/operator/inventory (read-only)

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

  1. Type a SKU code in the SKU field (e.g., "BLUE-SHIRT-M"). Picker auto-suggests; pick it.
  2. Optionally narrow by lot, serial, location, or owner.
  3. The table filters live. Each row is one inventory item — a unique combination of SKU + lot + serial + location + owner.
  4. 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

  1. From the inventory screen, find the row you need to adjust. Click it.
  2. In the detail panel, click Adjust Inventory (top right).
  3. 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.
  4. Click Submit Adjustment.
  5. Confirmation dialog: "Decrease 50 → 48 units of BLUE-SHIRT-M at A-01-01-01. Reason: Physical count variance. Continue?"
  6. Click Confirm. Toast: "Adjustment recorded."
  7. 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:

  1. Open the row, click Adjust Inventory.
  2. Adjustment Type: Decrease. Quantity: 2. Reason: Physical count variance. Notes: "Cycle count 2026-05-03, missing units not located".
  3. Submit, confirm. Inventory now shows 48 on-hand.
  4. 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.

Required permissions
Look up: 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.

Where
/console/business/wms/cycle-count

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)

  1. Click Schedule Count. Modal opens.
  2. Pick scope: By Location (one bin), By Zone (e.g., RCV-01), By SKU (every location holding this SKU), By Owner Customer (3PL only).
  3. Pick the target (typeahead).
  4. Pick mode: Blind (count screen hides expected qty — better data) or Visible (operator sees expected — faster, less rigorous).
  5. Pick assigned operator.
  6. Schedule date/time (or "Now").
  7. 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)

  1. Operator clicks the cycle count card. Detail screen shows the list of items to count: SKU, location, expected qty (hidden if blind mode).
  2. For each item: walk to the location, scan the bin barcode, scan SKU, type the count.
  3. If counted > or < expected, the line shows a yellow variance flag.
  4. After all items counted, click Submit Count.

Manager review

  1. Manager opens the completed count.
  2. Variances are listed at the top.
  3. 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).
  4. Click Close Count when all variances handled.
Cadence recommendation
Pareto rule applies — count fast-movers (top 20% of SKUs by velocity) every week, the long tail every quarter. Schedule recurring counts in the same modal by ticking Repeat.

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.

Where
/console/business/wms/fulfillment

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

openpickingpickedpackingpackeddispatch_readydispatched

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

  1. Click Create Order. Modal opens with three sections: Header, Lines, Shipping.
  2. 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).
  3. Lines: click Add Line:
    • SKU search → type, pick.
    • Requested Units → number.
    • Lot / Serial → only if SKU is lot/serial-controlled.
  4. Add more lines as needed.
  5. Shipping:
    • Recipient Name, Phone, Email.
    • Address (street, city, state/province, zip, country).
    • Carrier (optional — can also be picked at label generation).
    • Service Level (optional).
  6. Click Create Order. Toast: "Fulfillment order FO-20260503-001 created."
  7. 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.

Where
/console/operator/fulfillment

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

  1. 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.
  2. For the first line, walk to its source location.
  3. Scan the HU barcode at the location. Field shows green if matched.
  4. 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.)
  5. Type Picked Units (defaults to required qty). If you can pick less, type the actual number — system flags as partial.
  6. If lot/serial-controlled, scan the specific lot/serial.
  7. Click Confirm Pick. The line flips to a green check.
  8. Move to the next location and repeat.
  9. When all lines are done, click Complete Pick (bottom right).
  10. Toast: "Pick complete. Order ready for packing."

What happens behind the scenes

  • System writes an immutable picked_lines array 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.
Scan verification is mandatory
If HU and SKU don't match the system's expectation, Trenvar rejects the pick. Possible causes: wrong location label, mis-stocked bin, wrong SKU on the carton. Don't override — find the correct stock and pick that. Cross-picking errors at the source compound into shipping wrong items.
Partial picks
If you pick less than required (e.g., 8 of 10 because the bin has only 8), system marks the line as partially picked. Manager will get an alert. The order status stays at picking until either you finish picking elsewhere or the manager decides to short-ship.

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

  1. From /console/operator/fulfillment click the Pack tab.
  2. Pick a picked order from the queue.
  3. Detail screen shows the picked items as a flat list with quantities.
  4. Click Add Carton. A new carton card appears.
  5. For each item in this carton:
    • Click Add Item to Carton 1.
    • Pick from the unpacked items list (drag, or type).
    • Set qty.
  6. 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).
  7. Click Save Carton.
  8. Add more cartons until all picked items are packed. The "unpacked" count goes to zero.
  9. Click Complete Pack at the bottom.
  10. 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.

Weights matter for billing
If your tenant bills fulfillment by weight tier (3PL OS), missing carton weights make pricing fall back to default. Weigh every carton, every time. Make this a non-negotiable workflow rule.

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

  1. From the packed order detail, click Generate Shipping Label.
  2. 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.
  3. Click Request Label from Carrier. Spinner: "Calling carrier..."
  4. 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.
  5. Click Print Labels if you have a label printer connected, otherwise download the PDF and print.
  6. Stick labels on the cartons.
  7. Click Mark Dispatched when the cartons leave the facility.
  8. Order status flips to dispatched.

Origin types (where the label came from)

OriginMeaning
tenant_generatedYou generated it through Trenvar's carrier integration.
customer_generatedA portal customer generated it for their own order.
customer_provided_externalCustomer brought their own pre-printed label from outside.
If carrier API returns an error
Common errors: address validation failed (the recipient address has a mistake), insufficient carrier credit, service not available for this destination. Fix the underlying data and click Retry. The order doesn't change status until a label is successfully generated.

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.

Where
/console/business/wms/handling-units

Lifecycle

receiving → stored → in_transit → merged → closed

Walkthrough A — create an HU manually (for returns or system corrections)

Step-by-step

  1. Go to /console/business/wms/handling-units.
  2. Click Create Handling Unit.
  3. 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).
  4. Click Add Contents:
    • SKU → search and pick.
    • Lot / Serial / Expiry → if applicable.
    • Qty → number.
  5. Add more SKUs if mixed contents.
  6. Click Create. HU appears in the list with status receiving.
  7. Putaway it as normal (Chapter 7).

Walkthrough B — split an HU

Useful when a single HU is too big for any available bin.

  1. Open the HU detail.
  2. Click Split HU (top-right menu).
  3. Pick which units to split off into a new HU.
  4. System creates a child HU with those units; original HU's qty decreases.
  5. Place each HU separately.

Walkthrough C — merge two HUs

Useful when consolidating multiple receipts into one carton/pallet for shipping.

  1. Open the HU you want to keep (the parent).
  2. Click Merge into this HU.
  3. Search and select the source HU.
  4. Confirm. Source HU status flips to merged; parent HU contents grow.
Don't manually create HUs for receiving
Receiving auto-creates HUs as you accept lines — that's the right path. Manual creation is for returns coming back into stock, transfers from another warehouse, or system corrections.

Chapter 15 — Daily Flow per Role

Operator's day

  1. Log in → /console/operator/locations.
  2. Receiving queue: process incoming pre-alerts.
  3. Putaway queue: place HUs on shelves.
  4. Pick queue: gather items for fulfillment orders.
  5. Pack queue: box, weigh, dimension.
  6. Generate shipping labels.

Operations manager's day

  1. Log in → /console/ops-manager/pre-alert.
  2. Create pre-alerts based on customer notifications.
  3. Monitor receiving exceptions (shortage/damage/QC holds).
  4. Review inventory adjustments.
  5. Watch fulfillment SLA.

Customer service's day

  1. Log in → /console/customer-service/pre-alert.
  2. Look up shipments and inventory in response to customer questions.
  3. Open cases for issues.
  4. 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

PathScreen
/console/business/wms/inventoryInventory (admin)
/console/business/wms/item-masterItem Master
/console/business/wms/locationsLocations + capacity rules
/console/business/wms/handling-unitsHandling units
/console/business/wms/handling-units/[huId]HU detail
/console/business/wms/pre-alertPre-alerts
/console/business/wms/receivingReceiving (admin)
/console/business/wms/putawayPutaway (admin)
/console/business/wms/movementMovement events
/console/business/wms/fulfillmentFulfillment orders
/console/business/wms/shipmentsShipments
/console/business/wms/shipments/newCreate shipment
/console/business/wms/shipments/[shipmentId]Shipment detail
/console/business/wms/purchase-ordersPurchase orders
/console/business/wms/cycle-countCycle counts
/console/business/wms/replenishmentReplenishment
/console/business/wms/returnsReturns
/console/business/wms/mapWarehouse map
/console/ops-manager/pre-alertPre-alert queue
/console/ops-manager/receivingReceiving manager view
/console/ops-manager/putawayPutaway manager view
/console/ops-manager/inventoryInventory + adjustments
/console/ops-manager/fulfillmentFulfillment manager view
/console/ops-manager/handling-unitsHUs
/console/ops-manager/locationsLocations
/console/operator/locationsOperator landing / scan hub
/console/operator/receivingReceiving execution
/console/operator/putawayPutaway execution
/console/operator/fulfillmentPick & pack
/console/operator/inventoryInventory (read)
/console/operator/shipmentsShipments
/console/operator/tools/fulfillment-scanManual scan entry

Appendix B — Warehouse OS Permissions

PermissionHeld by (default)
wms.shipments.list / read / create / updatecompany_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 / configurecompany_admin, operations_manager (configure); operator (read)
wms.map.readcompany_admin, operations_manager, operator
wms.prealert.createcompany_admin, operations_manager
wms.receiving.updatecompany_admin, operations_manager, operator
wms.putaway.updatecompany_admin, operations_manager, operator
wms.movement.updatecompany_admin, operations_manager, operator
wms.picking.updatecompany_admin, operations_manager, operator
wms.packing.updatecompany_admin, operations_manager, operator
wms.loading.updatecompany_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.

Trenvar Support
Email info@trenvar.com  ·  www.trenvar.com

End of Warehouse OS Guide  ·  v1.0  ·  May 2026