Warehouse + 3PL Combo

How Warehouse OS and 3PL OS work together for multi-customer warehouse providers.

Chapter 1 — Why This Combo Exists

This is the standard 3PL warehouse setup — by far the most common Trenvar configuration. Warehouse OS gives you the physical operations; 3PL OS gives you multi-customer accounting and the customer portal.

The two OSes are technically independent — you could run either alone — but they're designed to fit together. This guide covers the workflows that only make sense when both are enabled.

Chapter 2 — Roles in This Combo

All Warehouse OS roles + all 3PL OS roles. Note how they overlap.

RoleWhat's different in the combo
company_adminManages both warehouse setup AND customer accounts.
operations_managerRuns multi-customer ops — segregates inventory, tracks per-customer fulfillment SLAs.
operatorSame warehouse work, but every receiving event tags inventory with an owner customer.
customer_serviceCustomer-facing — sees customer-owned inventory and answers customer questions.
accountingBills customers monthly using fulfillment + storage accrual + extras.
customer_admin / customer_userPortal users for downstream customers. See their own inventory and orders.

Chapter 3 — Onboarding a 3PL Customer End-to-End

From "we just signed Acme Corp as a 3PL customer" to "Acme can place orders and pay invoices through their portal."

  1. Create the customer record. /console/customer-service/customers → Add Customer. Fill display name, slug, primary contact. Mark billable: true.
  2. Set portal access. Toggle the OSes Acme can see in their portal (3pl, etc.).
  3. Add their SKUs. /console/business/wms/item-master → Create SKU with Client toggle ON, owner_customer_id = Acme. Repeat for each SKU.
  4. Create storage rule for Acme. /console/business/storage/rules → set Unit Code (e.g., CBM or BARREL), Quantity Source (Volume CBM, Assigned SKU Storage Units, Pallets, etc.), Cadence, Unit Price, Free Days. Customer Scope = Acme. Then assign Acme's SKUs to the matching Storage Billing Unit Code in Item Master.
  5. Create fulfillment pricing rule for Acme. /console/business/billing/pricing-rules → Source: fulfillment, Customer: Acme, Billing Unit: package, Weight Basis: exact, define weight tiers.
  6. Invite portal users. /console/business/settings/users → Add User with role customer_admin, link to Acme. Acme's owner gets an invite email.
  7. Verify with a test order. Have Acme place a test order through the portal; pick/pack/ship; generate a test invoice; confirm pricing matches contract.
Document the contract terms
Attach the signed contract to the customer record (M26 documents). Future-you will want it.

Chapter 4 — Inbound: Customer-Owned Receiving

Every receiving event in 3PL mode tags inventory with an owner customer. This is what makes per-customer billing possible.

The flow

  1. Acme notifies you of incoming goods (or sends a customer-portal pre-alert).
  2. Operations manager creates the pre-alert at /console/ops-manager/pre-alert. Critical: link it to Acme (customer field).
  3. Operator receives at /console/operator/receiving.
  4. Trenvar creates handling units automatically tagged with owner_customer_id = Acme.
  5. Inventory items posted with the same owner tag.
  6. Storage accrual begins immediately (since 3PL OS is on).
Forgetting to link customer = orphan inventory
If the pre-alert isn't linked to a customer, the resulting inventory is "unassigned" — it won't show in any customer's portal and won't accrue customer-billable storage. Fix: edit the inventory items to assign owner.

Chapter 5 — Storage Segregation

In 3PL operations, mixing customers' inventory in one bin is sometimes allowed, sometimes not.

Mixed-SKU bins

Capacity rules have an Allow Mixed SKU toggle. Set it to false on bins that should hold one customer's stock only. Set it to true if you can co-locate.

Customer-restricted bins

For dedicated customer space, you can list specific SKUs on the capacity rule's SKU Restrictions. Trenvar will refuse putaway to that bin for any other SKU.

Storage zones per customer

Many 3PLs name a whole zone after a customer (e.g., "ACME-ZONE-01") and configure all bins inside with SKU restrictions. This makes physical audits trivial.

Chapter 6 — Outbound: Customer-Scoped Fulfillment with Weight-Tier Billing

This is the headline 3PL workflow — the one your billing depends on.

Setup recap — three setups for three contract shapes

Shape A — every SKU ships in its own package, weight-tier billing

  1. SKUs in Item Master: Fulfillment Billing = package, Ship Alone = true.
  2. Pricing rule: Pricing Method = Standard, Weight Basis = Exact package weight, weight tiers defined.

Shape B — small SKUs share a package, billed per parcel

  1. SKUs in Item Master: Fulfillment Billing = package, Ship Alone = false, Packaging Group = small-parcel (recommended).
  2. Pricing rule: Pricing Method = Standard, Billing Unit = package, weight basis to taste.
  3. Result: 3 small SKUs in 1 carton = 1 parcel charge.

Shape C — flat per-order base + per-additional-SKU charge

  1. SKUs in Item Master: Fulfillment Billing = package, Ship Alone = false.
  2. Pricing rule: Pricing Method = Base + additional distinct SKU, Base Amount $1.50, Included Distinct SKUs 1, Additional Distinct SKU Charge $0.50.
  3. Result: 1 SKU = $1.50; 2 SKUs = $2.00; 5 SKUs = $3.50. Doesn't matter how many units of each.
Mix shapes per customer
Acme on Shape A, Beta on Shape B, Gamma on Shape C — each customer-specific pricing rule overrides the default. See 3PL OS Chapter 7 for full pricing-rule walkthroughs.

Execution

  1. Order arrives (manual / API / portal / Shopify).
  2. Trenvar creates a fulfillment order with owner = Acme.
  3. Operator picks Acme's items.
  4. Operator packs into cartons. Enters weight per carton.
  5. Operator generates shipping label. Each parcel weight is captured on the label.
  6. Order ships.

Billing

  1. End of month, accounting opens a draft invoice for Acme.
  2. Click Append Fulfillment.
  3. Trenvar finds completed, uninvoiced fulfillment work for Acme + window.
  4. For each fulfillment order, reads the linked shipping label's parcel rows.
  5. Evaluates each parcel against Acme's weight tiers.
  6. Creates invoice lines: "1 package up to 5kg = $4.25", etc.
Weight on every parcel
Without parcel-level weights, weight-tier pricing falls back to default amount. Build it into operator training: weigh every carton, every time.

Worked example

1 fulfillment order, 5 SKUs all Ship Alone, 5 parcels: 3 over 5kg, 2 under. Tier rule:

5=3.5=Under 5kg
=5=Over 5kg

Result: 3 × $5.00 + 2 × $3.50 = $22.00.

Chapter 7 — Monthly Billing Run End-to-End

A typical month-end for an accounting clerk in a Warehouse + 3PL tenant.

  1. Run accrual. Confirm storage accrual job ran daily. If a day was missed, run it manually for the back-fill window.
  2. Reconcile shipping labels. Spot-check that every shipped order has a linked label with parcel weights. Fix any orphans before invoicing.
  3. For each billable customer:
    • Create a draft invoice.
    • Click Append Accruals — pulls all storage entries.
    • Click Append Fulfillment — pulls all completed fulfillment.
    • Add manual lines for extras (kitting, special projects).
    • Add adjustments (early-pay discount, contracted credit).
    • Review subtotal, tax, total.
    • Click Finalize. Trenvar emails the invoice via Resend.
  4. Run aging report. Chase overdue invoices.
  5. Reconcile payments. Stripe payments auto-post; manual ones (cheques, wires) you record by hand.
  6. Export to QuickBooks. Per-invoice export, or bulk CSV for the accountant.

Chapter 8 — Customer Portal in 3PL Mode

What customers see when both OSes are enabled.

ScreenShows for the logged-in customer
/console/customer/inventoryTheir stock with lot, location, available/awaiting/reserved.
/console/customer/incomingTheir pre-alerts and inbound shipments.
/console/customer/ordersTheir fulfillment orders + status.
/console/customer/invoicesTheir invoices + Stripe Pay Now.
/console/customer/integrationsShopify connection management.

(With Commerce OS added, customers also get /console/customer/catalog and /console/customer/ship-now — see Warehouse + Commerce combo guide.)

Chapter 9 — Common Pitfalls

"Customer's invoice is missing storage"

  • Customer billing profile has billable: false — flip it.
  • SKU's Storage Billing Unit Code doesn't match any active rule's Unit Code (case-sensitive) — check Item Master and the rule.
  • Storage rule is inactive or out of effective window — check.
  • Quantity Source is Volume (CBM) but inventory has no volume_cm3 and Item Master has no dimensions — fix the data.
  • Quantity Source is Assigned SKU Storage Units but SKU is missing Storage Billing Qty/Unit — set it.
  • Append Accruals wasn't clicked — run it.

"Customer's portal shows zero inventory"

  • Inventory items don't have owner_customer_id set — fix the receiving link or transfer ownership.
  • Portal user is linked to wrong customer — check user record.
  • Customer record's portal access toggle for 3pl is off — turn it on.

"Fulfillment pricing fell back to default"

  • Linked shipping label has no parcel rows — operator skipped pack weight. Train + audit.
  • Customer-specific pricing rule is inactive — activate it.
  • Tiers are out of order — Trenvar should auto-sort but verify.

"Customer can see another customer's data"

Stop. This is a security incident. Capture screenshots, note timestamps, escalate to your platform admin immediately.

Chapter 10 — Full Worked Example: Acme's First Month

An end-to-end walkthrough of one Warehouse + 3PL customer's first 30 days, day by day, role by role.

Day 1 — onboarding

  1. 09:00 — You (company_admin) create customer record "Acme Corp" at /console/customer-service/customers. Set billable=true, payment terms Net 30.
  2. 09:15 — Configure billing profile + Stripe customer.
  3. 09:30 — Create storage rule "ACME-CBM" — Unit Code = CBM, Quantity Source = Volume (CBM), Cadence = Daily, Unit Price = $1.20, Customer Scope = Acme. Assign Acme's SKUs in Item Master with Storage Billing Unit Code = CBM.
  4. 09:45 — Create fulfillment pricing rule for Acme: package billing, weight tiers (2kg/$2.75, 5kg/$4.25, 10kg/$6.50, >10kg/$9.00).
  5. 10:00 — Invite Jane Smith (customer_admin) at jane@acme.com. She gets the email, accepts.
  6. 10:30 — Add Acme's first 50 SKUs via bulk import (Item Master Walkthrough B).
  7. 11:00 — Send Jane the Foundations + 3PL OS guide PDFs.

Day 5 — first inbound

  1. 14:00 prior day — Jane sends a pre-alert via portal: 500 units across 3 SKUs, ETA tomorrow 9 AM.
  2. 09:00 today — Truck arrives at receiving dock. Operator Maria opens /console/operator/receiving, picks Acme's pre-alert, scans each line, accepts. 3 handling units created (HU-1042, HU-1043, HU-1044), all tagged owner_customer_id=Acme. Storage accrual starts immediately.
  3. 09:30 — Maria moves to /console/operator/putaway, places HUs in their assigned bins. HU status flips to stored.

Days 6–25 — daily fulfillment

  1. Most days: 2–5 outbound orders for Acme arrive (manual entry by ops manager, or via Acme's Shopify if Commerce OS is added later).
  2. Operator picks/packs each order. Carton weights captured at pack. Shipping label generated; parcel weights flow to the label record.
  3. Storage accrual runs daily at 02:00 UTC, charging Acme $1.20 per CBM per day for whatever's still on shelves (resolved via the SKUs' Storage Billing Unit Code = CBM).

Day 30 — first invoice

  1. 09:00 — Accounting opens /console/accounting/billing → Create Invoice → Customer = Acme Corp, Period = May 5–31.
  2. 09:05 — Click Append Accruals. Trenvar pulls 26 days of storage entries grouped by SKU. Adds 8 invoice lines totaling $487.50.
  3. 09:08 — Click Append Fulfillment. Trenvar pulls 87 completed orders; for each, reads the linked label's parcel rows, applies Acme's weight tiers. Adds 87 invoice lines totaling $654.75.
  4. 09:10 — Add a manual line for kitting work: $35.00.
  5. 09:12 — Apply early-payment discount adjustment: -$25.00.
  6. 09:13 — Subtotal: $1,152.25. Click Finalize. Tax calculated ($149.79 HST). Total $1,302.04.
  7. Invoice INV-2026-001234 emailed to ap@acme.com via Resend with PDF attached and Stripe Pay Now link.
  8. Day 32 — Jane (or Acme's AP team) clicks Pay Now in the portal. Stripe processes the card. Invoice flips to Paid automatically.

That's Warehouse + 3PL end-to-end, in real numbers. Repeat each month.

Chapter 11 — Bidirectional End-to-End Flow (Customer Self-Service)

In Chapter 10 you (the tenant) drove most of the workflow. This chapter shows what happens when the customer drives both sides — submits inbound pre-alerts and outbound orders themselves, while you receive, pick, pack, and ship. End-to-end across two screens: the customer's portal and your operator console.

The setup (one-time, you do this)

  1. Customer "Acme Corp" record created (3PL OS Chapter 3).
  2. Storage rule + fulfillment pricing rule scoped to Acme.
  3. Customer's catalog populated with their SKUs (Item Master, Client view).
  4. Jane Smith invited as customer_admin at Acme.
  5. Jane sets her Fulfillment Automation to Always send to 3PL on her Orders page.

The flow

Inbound — Acme sends goods to your warehouse

TimeWhoWhereWhat happens
Mon 14:00Jane (customer_admin)/console/customer/incomingClicks New 3PL Receiving Order. Fills expected arrival = next Monday 09:00. Adds 3 lines: 200 × SKU-A, 150 × SKU-B, 50 × SKU-C. Notes: "Driver Mike, dock 4". Clicks Submit. Pre-alert PA-20260510-001 created.
Mon 14:01System/console/ops-manager/pre-alertPre-alert appears in your queue with Source = customer_portal, Customer = Acme. Visible to your ops manager immediately.
Next Mon 09:00TruckReceiving dockTruck arrives at your dock with the goods Jane pre-alerted.
09:05Operator Maria/console/operator/receivingPicks Acme's pre-alert from queue. Scans each line, accepts. 3 HUs created, all tagged owner_customer_id=Acme. Storage accrual starts.
09:30Operator Maria/console/operator/putawaySystem suggests destination bins. Maria scans, confirms. HUs status → stored. Acme's portal at /console/customer/inventory now shows the new on-hand counts.

Outbound — Acme places an order to ship out

TimeWhoWhereWhat happens
Tue 10:00Jane/console/customer/ordersClicks Create Manual Order. Fills recipient = Beta Industries Calgary (Google Maps autocomplete). Adds 2 lines: 12 × SKU-A, 8 × SKU-B. Notes: "Standard ground". Submits.
10:01System/console/business/wms/fulfillmentOrder O-20260512-014 created. Source = customer_portal. Pick task generated. Lands in operator queue.
10:30Operator Tom/console/operator/fulfillment (Pick tab)Picks the task. Scans HU + SKU at each location. Confirms 12 × SKU-A and 8 × SKU-B. Click Complete Pick. Order status → picked. Jane sees update in her portal.
11:00Operator TomPack tabPacks 20 items into 1 carton. Weight = 4.2 kg, dims 40×30×20 cm. Click Complete Pack. Status → packed.
11:10Operator TomGenerate Shipping LabelPicks FedEx Ground. Confirms parcel weight. Trenvar calls FedEx API, returns label PDF + tracking number. Tom prints, sticks label on carton.
11:15Operator TomClick Mark Dispatched. Order status → dispatched. Jane's portal shows FedEx tracking link.
Day 2FedExCarton delivered to Beta Industries. Tracking shows "delivered". Jane's portal shows delivered.

End of month — invoicing

TimeWhoWhat happens
Day 30, 09:00AccountingOpen Acme's draft invoice. Click Append Accruals — pulls storage from the inbound goods Acme sent. Click Append Fulfillment — pulls all 14 customer-submitted orders Acme placed this month, applies the weight tiers from each linked label.
09:13AccountingFinalize. Resend emails Jane the invoice PDF with Stripe Pay Now link.
Day 32JanePays via Stripe Checkout from her portal. Invoice flips to Paid automatically.

Why this is powerful

  • Single source of truth. Jane's pre-alert and order data flows directly into Trenvar — no email transcription, no spreadsheet handoffs, no missed details.
  • Real-time visibility for the customer. Jane sees pre-alert status, inventory level changes, order status updates, dispatch tracking, and invoice — all live, all in one place.
  • Your team only does the physical work. Receive, pick, pack, ship. No data entry, no reconciliation. The customer self-serves the rest.
  • Auditable both ways. Every customer-side action is logged with their user UID. Every operator action with yours. The audit trail is complete and one-stop.

Common questions

QuestionAnswer
Can the customer edit a pre-alert after submitting?Only while it's in open status. Once your operator starts receiving against it, edits are locked.
Can the customer cancel an order after submitting?Yes, while it's still in open status (before pick starts). After picking begins, cancellation requires a tenant-side action and may incur a partial-pick charge.
What if the customer submits an order with no inventory available?The system validates against on-hand and rejects creation if Requested Units exceeds Available. They get an inline error before submission.
Can the customer set Fulfillment Automation to require their decision first?Yes — see the Automation toggle on /console/customer/orders. Useful for customers who want to review every order before it ships.
What if the customer pre-alerts something and the goods never arrive?Your ops manager can cancel the pre-alert with a reason. The customer sees the cancellation in their portal.

Appendix A — Glossary (Combo-Specific)

Cross-cutting terms specific to the Warehouse + 3PL combination. For per-OS terms, see the Warehouse OS and 3PL OS guides' glossaries.

Append Accruals — One-click action on a draft invoice that pulls all unappended storage accrual entries for the customer + period and adds them as invoice lines.

Append Fulfillment — One-click action that pulls completed, uninvoiced fulfillment orders, applies the customer's pricing rule (with weight tiers from the linked label), and adds them as invoice lines.

Bidirectional flow — When the customer drives both inbound (3PL receiving order) and outbound (manual order) from their portal, while you handle physical work + invoicing.

Customer-owned inventory — Inventory tagged with owner_customer_id to indicate whose stock it is. Required for 3PL billing and customer portal visibility.

Pricing shape — A way to describe a customer's contracted billing pattern: Shape A (every SKU ships alone, weight tiers), Shape B (small SKUs share a package), Shape C (base + additional distinct SKU).

Source: customer_portal — Marker on a pre-alert or order showing the customer submitted it from their portal (versus you entering it).

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

End of Warehouse + 3PL Combo Guide  ·  v1.0  ·  May 2026