Full User Guide (Reference)

Complete reference manual covering all modules and roles in one place.

PART ONE

Foundations

Before you click anything, it helps to know what Trenvar is, who uses it, and how to find your way around. The next three chapters cover all of that.

Chapter 1 — What is Trenvar

Trenvar is a platform that helps a third-party logistics (3PL) company run their entire warehouse and shipping operation, and lets the customers who store goods in that warehouse self-serve through a portal.

The short version

Imagine a 3PL warehouse that stores goods for many different customers. Every day they receive trucks, put goods on shelves, pick orders, pack boxes, ship them out, send drivers on delivery routes, track air cargo waybills, and at the end of the month bill every customer for storage, fulfillment, dispatch, and any extras. Trenvar is the software that runs all of this.

What's inside the platform

AreaWhat it does
Warehouse Management (WMS)Inventory, locations, receiving, putaway, pick, pack, ship.
Transport & Dispatch (TMS)Dispatch jobs, route planning, driver assignment, live tracking.
Air Cargo (AWB)Air waybill creation, carrier status, delivery to customer portal.
Billing & InvoicingService catalog, pricing rules, storage accrual, invoicing, payments, tax, reports.
CRMCustomer records, contacts, cases, notices, communications.
Customer PortalSelf-serve view of inventory, orders, invoices, payment, AWB tracking.
Owner ConsolePlatform-level controls: tenants, plans, module enablement, audit, analytics.

How it's built (in plain language)

Trenvar is a multi-tenant SaaS web application. "Multi-tenant" means many separate companies use the same platform but never see each other's data. Each company is a "tenant." Inside each tenant there are users with different roles and there are downstream customers who get a separate, restricted portal view.

Most users open Trenvar in their web browser. There is also a mobile app for drivers (planned for a later release).

Tech Stack (FYI)
Built on Next.js + Firebase Auth + Firestore. Email is sent via Resend, payments via Stripe, air cargo tracking via configurable carrier providers. You don't need to know any of this to use Trenvar — but if you ever talk to support, this is the answer.

Who this guide is for

This guide is written so that any person — technical or not — can follow along. If you are a brand new operator on day one, start at Chapter 3. If you are a tenant owner setting things up, start at Chapter 4. If you just need to know how to do one specific thing, find it in the table of contents and jump straight there.

Chapter 2 — User Roles & What Each Person Can Do

Trenvar has two families of users: staff roles who work for the 3PL warehouse, and portal roles who are customers of the warehouse. Every screen and every action is controlled by what role you have.

The seven staff roles

RoleLives atCan do…
company_admin/console/business/*Everything inside the tenant. Manage users, billing, all modules.
operations_manager/console/ops-manager/*Run live operations, manage receiving/putaway/fulfillment, assign drivers, see all shipments.
operator/console/operator/*Day-to-day warehouse execution: scan, receive, put away, pick, pack, ship.
driver/console/driver/*See assigned jobs, mark statuses, capture POD.
customer_service/console/customer-service/*Read access to shipments, inventory, POD, cases. Talk to customers.
accounting/console/accounting/*Invoices, payments, tax, exports, reports.
system_admin/console/owner/*Platform-only. Manage tenants, plans, modules, audit.
Tip
A user can have more than one role. Roles are stored as an array (e.g., ["operations_manager", "accounting"]). When the user logs in, the system picks the highest-priority role to decide which console to land on.

The five customer portal roles

Customers of the 3PL — the companies whose goods you're storing — get their own restricted view. Their roles are:

RoleWhat they get
customer_adminManages users for their own company. Can place orders, view invoices, pay invoices, manage integrations.
customer_userStandard portal user. Place orders, view invoices, pay invoices.
customer_buyerB2B Storefront role. Can browse and place orders against the customer's catalog.
customer_ship_nowLight-touch role. Create labels and look up shipments only.
customer_aircargoAir cargo customers. View AWB status and documents.

Multi-tenant isolation — what this means for you

Every tenant's data lives in its own logical space. A user inside Tenant A cannot, under any circumstance, see Tenant B's data — even with valid credentials. The server enforces the tenant ID from the login token, never from anything the browser sends. The same separation applies to customer portal users: they only see their own customer's data, never another customer's.

Why this matters
If you ever see data that you don't think you should see, stop and report it. Cross-tenant or cross-customer visibility is a security incident, not a feature.

How a company_admin invites someone

  1. Go to /console/business/settings/users.
  2. Click Add User.
  3. Enter their email and display name.
  4. Tick the role boxes (you can pick more than one).
  5. Save. Trenvar sends them an email invite.
  6. The user clicks the link, sets a password, and they're in.
You need this role
Only company_admin can invite users or change someone else's roles.

Chapter 3 — Logging In and Finding Your Way Around

Every user starts in the same place: the login screen. After that, you land on the screen that fits your role.

Logging in

  1. Open your browser and go to your company's Trenvar URL (e.g., https://yourcompany.vectra.example.com). If you don't know the URL, ask your admin.
  2. Enter your email and password.
  3. Click Sign In.
  4. You'll land on your role's home screen (see table below).

Where you land after login

Your roleYou land here
company_admin/console/business/ — module switcher (WMS, Billing, etc.)
operations_manager/console/ops-manager/pre-alert — inbound queue
operator/console/operator/locations — scan hub
driver/console/driver/jobs — your job list
customer_service/console/customer-service/pre-alert
accounting/console/accounting/billing
system_admin/console/owner/tenants
customer (portal)/console/customer/inventory

Forgot your password

  1. On the login screen, click Forgot password.
  2. Enter your email.
  3. Check your inbox for a reset email from Firebase.
  4. Click the link, set a new password, log back in.
Session length
You stay signed in for about an hour. After that, the system asks you to sign in again. If a screen suddenly stops working or the page goes blank, refresh — you've probably timed out.

The shape of every screen

Once you're inside Trenvar, almost every screen has the same three parts:

  • Sidebar (left). The list of modules and screens you have access to. The sidebar changes depending on your role — operators see warehouse stuff, accounting sees invoices.
  • Top bar. Your name, current tenant, search, sign-out, and the module switcher (for company_admin).
  • Main area. Whatever you clicked.

Signing out

Click your name in the top right and choose Sign out. This clears your session immediately. If you forget, the session expires on its own in about an hour.

PART TWO

Setup

Everything a brand-new tenant needs to do once, before the warehouse can run normally. If you're already up and running, skim or skip.

Chapter 4 — Tenant Onboarding (Signing Up)

A "tenant" in Trenvar is one company that uses the platform. This chapter walks through becoming a tenant — from clicking the trial signup link to having a usable workspace.

Before you start

You'll need:

  • A company name and a contact email.
  • A credit card (the trial collects card details upfront, but does not charge during the trial period).
  • About 15 minutes.

Step 1 — Sign up for a trial

  1. Go to the public signup URL (provided by your sales contact or via the Trenvar website).
  2. Fill in: Company name, email, password.
  3. Click Continue. You're forwarded to a Stripe page.
  4. Enter a payment card. Stripe runs a setup-only authorisation — no charge yet.
  5. You're returned to /trial/activation with a success message.
What happens behind the scenes
Trenvar creates a tenant record in trialing status with a 7-day window. Your account is provisioned with the company_admin role. A Stripe customer is created against your card so that when (if) you convert to paid, billing is one click.

Step 2 — Log in for the first time

  1. Open your tenant URL (Trenvar emails it to you, or use the link on the activation page).
  2. Sign in with the email and password you just created.
  3. You land on /console/business/settings/company.

Step 3 — The setup checklist

Trenvar recommends doing these six things in order. None of them are enforced — you can use the platform without finishing them — but you'll have a much smoother experience if you do.

  1. Complete your company profile (Chapter 5).
  2. Upload your logo and branding (Chapter 5).
  3. Set up your email provider (Chapter 5).
  4. Invite your team (Chapter 2).
  5. Create your warehouse locations (Chapter 6).
  6. Build your Item Master and price lists (Chapters 7–9).

Trial vs. paid

Your trial lasts 7 days. During the trial you can use everything. At the end of the trial, the platform either auto-converts you to paid (if the card works and auto-charge is enabled) or pauses you until you act.

Pick your slug carefully
Your tenant slug (the short identifier that appears in URLs and customer-facing places) is set during signup and cannot be changed afterward. Pick something short, lowercase, and clean.

Chapter 5 — Company Profile, Branding & Email Setup

These three things make Trenvar "yours" — your company name on invoices, your logo on emails, and emails sent from your own domain instead of a generic one.

Company profile

Where
/console/business/settings/company

Fill in:

FieldWhat to enter
Company NameYour full legal or trading name. Appears on invoices.
Tenant SlugLocked at signup. Read-only here.
LogoUpload PNG/SVG. Used on portal, invoices, transactional emails.
Contact Email / PhoneWhere customers can reach you.
AddressStreet, city, state/province, zip, country.
Industry / Business TypeHelps Trenvar preset sensible defaults.

Branding

Same screen, branding section. Logo and colours flow into:

  • Your customers' portal.
  • Invoice PDFs.
  • Transactional emails (welcome, password reset, invoice).

Email setup (Resend)

Trenvar sends transactional emails through a service called Resend. You have two choices:

ModeWhat happens
platform_defaultTrenvar sends from a generic platform sender. No setup needed. Looks less professional.
tenant_senderEmail comes from your domain (e.g., support@yourcompany.com). Looks professional. Requires DNS setup.

Setting up tenant_sender

Where
/console/business/settings/email
  1. Sign up at resend.com and create an API key.
  2. Paste the API key into Trenvar. Only the last 4 characters will be visible afterwards.
  3. Choose tenant_sender mode.
  4. Enter From Name (e.g., "Acme Logistics"), From Email (e.g., support@acme.com), and an optional Reply-To.
  5. Add your domain (e.g., acme.com).
  6. Trenvar shows you SPF, DKIM, and return-path DNS records. Copy these.
  7. Add the DNS records at your domain registrar (GoDaddy, Cloudflare, etc.).
  8. Wait. Status moves from not_startedpendingverified. DNS can take 24–48 hours.
  9. Once verified, send a test email from the same screen.
Save the Resend API key somewhere safe
Resend only shows the full key once, at creation. If you lose it, you'll have to create a new one and re-paste.

Chapter 6 — Setting Up Your Warehouse Locations

Before you can receive a single carton, Trenvar needs to know what your warehouse looks like — buildings, zones, aisles, bays, bins.

The hierarchy

Locations in Trenvar form a tree. Top to bottom:

  • warehouse — the building.
  • zone — a part of the building (receiving, bulk, pick, returns, QC, staging).
  • aisle — a row of shelving.
  • bay — a section of an aisle.
  • level — a vertical slice (top/middle/bottom shelf).
  • bin — the actual storage spot.

Special types include pick_face, bulk, pallet, quarantine, returns, staging.

Creating locations

Where
/console/business/wms/locations
  1. Click Create Location.
  2. Start with the warehouse. Enter a code like WH-01 and a name like "Main Warehouse".
  3. Save. Now add zones under it (e.g., RCV-01 for "Receiving Zone").
  4. Add aisles, bays, levels, bins — drilling down as deep as you need.
  5. For each leaf-level bin, optionally assign a capacity rule (next section).
Naming convention
A common pattern: A-01-01-01 meaning Aisle A, Bay 1, Level 1, Bin 1. Pick a convention before you start and stick to it — it's painful to rename later.

Capacity rules

A capacity rule limits what fits where. You can apply one rule to many locations.

FieldWhat it does
Code / NameIdentifier (e.g., "PICK-STD") and label.
Node TypesWhich location types this rule applies to (e.g., bin, pick_face).
Max Units / Volume / Weight / PalletsHard limits per location.
Allow Mixed SKUIf false, only one SKU may live in a location at a time.
SKU RestrictionsOptional list of SKUs that only go here.

Chapter 7 — Item Master and SKUs

The Item Master is your catalog of every product you handle. Receiving, picking, and billing all key off the data you put here, so it's worth doing well.

Where
/console/business/wms/item-master

The fields that matter

FieldWhat it means
SKUUnique code. A–Z, 0–9, dot, dash, slash, colon, underscore. Required.
Product NameWhat operators see on screen.
BarcodesComma-separated EAN/UPC codes. Used at scan.
Dimensions (L × W × H)In centimetres. Used to calculate volume and check capacity.
Weight (kg)Critical for shipping and weight-tier pricing.
Unit of MeasureEach, case, pallet — and conversions between them.
Lot / Serial / Expiry flagsIf true, receiving must capture the lot, serial, or expiry per unit.
Fulfillment Billinginherit, package, sku, picked_unit. Drives how this SKU is billed in fulfillment orders.
Ship AloneIf true, this SKU must be packaged on its own — no co-packing.
Default Storage TypeSuggests where new stock is put away (pick_face, bulk, pallet, quarantine, returns, staging).

Internal vs. Client SKUs

Trenvar distinguishes between SKUs you own (internal) and SKUs your 3PL customer owns (client). The toggle lives in the Item Master form. When you switch to Client, you're configuring SKU rules that flow with that customer's products through your warehouse.

If you do 3PL fulfillment, set weights
If you bill fulfillment by exact package weight, every SKU's weight must be filled in. Without it, the system can't match parcels to weight tiers and falls back to a default amount — costing you money.

Step-by-step: create a SKU

  1. Click Create SKU.
  2. Enter a SKU code and product name.
  3. Fill in weight and dimensions if known.
  4. Tick lot/serial/expiry only if you actually need to track them.
  5. Set Fulfillment Billing = package if this SKU should bill by parcel.
  6. Set Ship Alone = true if it cannot share a carton.
  7. Save.

Chapter 8 — Service Catalog

Every line on every invoice references a Service. The Service Catalog is the list of things you can charge for.

Where
/console/business/billing/services

What's in a service

FieldNotes
CodeUppercase ID. Auto-generated from name if blank.
NameWhat appears on invoices.
Categoryfulfillment, qc, storage, extra_work, additional_work, shipping_label, other.
Unitorder, hour, day, label, kg — whatever you bill by.
Default Unit PriceUsed when no pricing rule matches.
TaxableTick if tax applies.
ActiveUntick to retire without deleting.

A starter set

  • Order Fulfillment — unit "order", default $1.50, taxable.
  • Daily Storage — unit "day", default $0.35, taxable.
  • QC Check — unit "unit", default $0.50, taxable.
  • Shipping Label — unit "label", default $0.20.
  • Extra Handling — unit "hour", default $35.00, taxable.

Chapter 9 — Pricing Rules

Pricing rules tell Trenvar how to turn warehouse activity into invoice lines. Rules can be tenant-wide, or scoped to one customer for negotiated rates.

Where
/console/business/billing/pricing-rules

The rule types you can build

Source TypeUsed for
fulfillmentPer-order, per-package, per-SKU, or per-picked-unit charges.
qcQuality-check labour.
storageDaily/monthly accrual-based storage charges.
extra_workOne-off labour (kitting, repacking, etc.).
additional_workProject fees.
shipping_labelPer-label charges.
manualAnything else added by hand at invoice time.
transport_rate / transport_accessorial / transport_fuel / transport_contractIf you've enabled the Transport OS module.

Walkthrough — fulfillment package pricing with weight tiers

This is the headline use case for a 3PL. The example mirrors the existing INSTRUCTION_GUIDE but with extra clarity.

  1. Click Create Rule.
  2. What are you pricing? → "Billing: Fulfillment".
  3. Rule Name → "3PL Fulfillment Package Pricing".
  4. Customer → leave blank for all customers, or pick one for a negotiated rate.
  5. Billable Fulfillment Unitpackage (per carton).
  6. Default Amount → fallback per-package rate (e.g., $5.00).
  7. Weight BasisExact package weight.
  8. Add weight tiers, one per line. Format: upToKg=amount=label. Last line uses an empty upToKg as the "and above" fallback.
2=2.75=Up to 2kg
5=4.25=Up to 5kg
10=6.5=Up to 10kg
=9=Over 10kg

Meaning: a 1.5kg package costs $2.75, a 4kg package costs $4.25, a 9kg package costs $6.50, an 18kg package costs $9.00.

How append uses the rule

When Trenvar adds fulfillment work to an invoice it:

  1. Finds completed, uninvoiced fulfillment work for the customer + window.
  2. Reads the linked shipping label parcel rows.
  3. Evaluates each parcel's weight against your tiers.
  4. Creates one invoice line per group.
Without parcel weights, you lose money
"Exact package weight" only works if the linked shipping label has parcel rows with real weights. If the label has no parcels, Trenvar falls back to the default per-package amount.

Customer-specific overrides

Want one customer at $1.25/package while everyone else is at $1.50? Create two rules:

  • Default rule (Customer = blank) → $1.50/package.
  • Customer-specific rule (Customer = "Acme Inc.") → $1.25/package.

The customer-specific rule wins for that customer. Everyone else falls through to the default.

Activation

Trenvar doesn't have built-in effective dates. Use the Active toggle to switch a rule on or off. Changes apply only to new invoice lines after the change — never retroactively.

Chapter 10 — Tax Setup

Trenvar calculates tax on invoice lines that are flagged taxable, using rates you define per region.

Where
/console/business/billing/tax

Creating a tax region

FieldExample
CodeON_SALES_TAX
NameOntario Sales Tax (HST)
CountryCA
State / ProvinceON
Tax Rate %13.0
InclusiveOff (tax adds on top); on if your prices already include tax.
Effective From / ToOptional date range.
ActiveOn.

How it gets applied

When you finalize an invoice, Trenvar reads the customer's billing address and matches it to a tax region. It applies the region's rate to every line where the service has Taxable ticked. Adjustments and credits also flow into the calculation before tax.

Multi-currency invoices?
Not supported. Every line on an invoice must use the same currency.
PART THREE

Daily Warehouse Operations

The actual day in, day out — receiving inbound, putting goods on shelves, picking orders, packing boxes, generating labels.

Chapter 11 — Pre-Alerts

A pre-alert is "heads up — a truck is coming with these goods." It lets the warehouse plan dock space and labour, and it gives receiving a list to scan against.

What's in a pre-alert

FieldNotes
Prealert CodeAuto or manual (e.g., PA-20260501-001).
Sourcewms (you created it), customer_portal (a customer notified you), unknown.
Purchase OrderOptional link.
Expected LinesSKU + expected units + lot/serial/expiry if required.
Expected ArrivalWhen the truck shows up.
Statusopen → partially_received → received, or cancelled.

Creating a pre-alert as ops manager

Where
/console/ops-manager/pre-alert
  1. Click Create Pre-Alert.
  2. Fill the code (auto OK), optional PO link, expected arrival.
  3. Add expected lines: search SKU → enter expected units → fill lot/serial/expiry if the SKU requires them.
  4. Save. The pre-alert appears in the receiving queue when the truck arrives.
Required permission
wms.prealert.create — held by company_admin and operations_manager.

Customers can also send pre-alerts from their portal, if you've enabled the feature for them.

Chapter 12 — Receiving Goods

When the truck arrives, an operator opens the receiving screen, scans the goods, counts them, flags problems, and accepts them.

Where
/console/operator/receiving

The flow

  1. Pick a pre-alert from the queue (or search by code).
  2. For each expected line:
    • Scan the SKU barcode (or pick from list).
    • If the SKU is lot/serial/expiry-controlled, scan or type those values.
    • Enter received units (can differ from expected).
    • Optionally enter measured volume.
    • Pick a discrepancy code: none / shortage / overage / damage. Enter affected units if any.
    • Tick QC Hold with a reason if the items must be inspected before being put away.
    • Click Accept (or Reject).
  3. Repeat for every line.
  4. Click Complete Receiving.

What Trenvar does behind the scenes

  • Creates a handling unit for each accepted line (status = receiving).
  • Records a receiving event in the audit log.
  • Starts storage accrual from this exact moment.
Storage starts the moment you click Accept
There is no grace period. If you receive at 9:00 AM, storage charges begin at 9:00 AM. If goods need a QC hold, use the QC Hold flag — but they still accrue storage.

Chapter 13 — Putaway

Putaway is moving the goods from the receiving dock to their permanent storage location.

Where
/console/operator/putaway

The flow

  1. Open the putaway queue. Trenvar has already generated a putaway task per handling unit.
  2. Click on a handling unit. The screen shows recommended destinations based on capacity, default storage type, and zone rules.
  3. Either accept the recommendation or scan a different bin barcode.
  4. Trenvar validates: is the bin active, will the unit fit, does the SKU restriction allow it?
  5. Click Confirm Placement.

The handling unit's status flips to stored and the location's occupancy updates immediately.

Required permission
wms.putaway.update — held by operator and operations_manager.

Chapter 14 — Inventory Management

Once stock is put away, it lives in the inventory ledger. This chapter is how to look it up, adjust it, and transfer ownership.

The states a unit can be in

StateMeaning
on_handPhysically in the warehouse, any owner.
allocatedReserved for an open pick task.
availableon_hand minus allocated. Free to pick.
quarantineOn QC hold.
owned_unitsBelongs to a specific customer (3PL).
unassigned_unitsInternal stock, no owner.

Looking up stock

Where
/console/ops-manager/inventory
  1. Enter or select a SKU.
  2. Optionally filter by lot, serial, location, or owner customer.
  3. Trenvar lists every matching inventory item with its location, on-hand/allocated/available/quarantine counts, and last movement.
  4. Click an item to drill in: movement history, related handling units, the receiving event that brought it in, and any pick tasks holding it.

Adjustments (manual corrections)

  1. From the inventory screen, click Adjust Inventory.
  2. Pick the SKU, lot/serial if applicable, location.
  3. Enter a positive (gain) or negative (loss) quantity.
  4. Choose a reason: physical count variance, damaged goods, donation, etc.
  5. Submit. Trenvar writes an adjustment event with your name, the time, and the reason.

Transfers between owners (3PL)

If your customer changes (consignment switch, ownership change), use Transfer Ownership to move quantity from one owner_customer_id to another. Trenvar records both sides of the transfer with a single audit event.

Cycle counts

Where
/console/business/wms/cycle-count

Schedule recurring physical counts of a location or zone. Trenvar generates a count list, the operator scans/counts physically, and Trenvar flags variance for review or auto-correction depending on policy.

Chapter 15 — 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

  • Manual — typed in here.
  • ERP / e-commerce sync — flowing in from connected systems (Shopify, etc.).
  • Customer portal — a customer places it themselves.
  • Linked to a shipment — for outbound transport.

The fulfillment order lifecycle

openpickingpickedpackingpackeddispatch_readydispatched

Creating one manually

  1. Click Create Order.
  2. Enter (or auto-generate) a fulfillment code.
  3. Pick the customer (or fill recipient details directly).
  4. Choose an allocation strategy:
    • manual — operator chooses what to pick.
    • fifo — first-in-first-out.
    • fefo — first-expiry-first-out (perishables).
  5. Add lines: SKU + requested units + lot/serial if applicable.
  6. Enter recipient address and shipping info.
  7. Save. Trenvar creates the fulfillment order and generates pick tasks.

Chapter 16 — Pick & Pack

Picking is gathering the items. Packing is putting them into boxes.

Where
/console/operator/fulfillment

Picking

  1. Click on a pick task in the work queue.
  2. Trenvar shows the requested lines and source locations.
  3. For each line:
    • Scan the handling unit barcode (the carton/pallet) at the source location.
    • Scan the SKU barcode to confirm.
    • Enter picked units (can be partial).
  4. When done, click Complete Pick.

Picking creates an immutable picked_lines array, marks inventory as allocated, and pushes the order into picked status.

Scan verification is mandatory
If the HU and SKU don't match, Trenvar rejects the pick. This stops cross-picking errors at the source.

Packing

  1. Open the pack queue.
  2. Click on a picked order.
  3. For each carton:
    • Add the picked items going into it.
    • Enter the carton's weight (kg) and dimensions (cm).
  4. Click Complete Pack.
Carton weights matter
If you skip weight here, your fulfillment pricing tiers can't be applied. Use the scale, every time.

Chapter 17 — Shipping Labels

A shipping label tells the carrier how to handle the parcel. Trenvar calls a carrier API and gets back a label PDF + tracking number.

Generating a label

  1. From a packed fulfillment order, click Generate Shipping Label.
  2. Pick a carrier (FedEx, UPS, DHL, etc.) and service (Ground, Express).
  3. For each parcel: confirm weight (kg), dimensions, and contents summary.
  4. Click Request Label from Carrier.
  5. Trenvar returns: a label ID, a tracking number per parcel, a PDF link, and a tracking URL.

Why this links to billing

The shipping label record holds a parcels array with weight and dimensions per parcel. When invoice append runs, it reads those rows to apply your weight tiers. If a label has no parcel rows or no weights, weight-tier pricing cannot be applied.

Label types

OriginMeaning
tenant_generatedYou generated it through Trenvar.
customer_generatedA portal customer generated it for their order.
customer_provided_externalThe customer brought their own label from outside.

Chapter 18 — Handling Units

A handling unit (HU) is a physical container — carton, pallet, tote, case. Trenvar tracks every HU through receiving, putaway, picking, and shipping.

Where
/console/business/wms/handling-units

HU lifecycle

  • receiving — just received, on the dock.
  • stored — placed in a location.
  • in_transit — being moved.
  • merged — consolidated into another HU.
  • closed — no longer active.

When are HUs created?

  • Automatically by the receiving workflow (preferred).
  • Manually via this screen, for special cases: returns, transfers, system corrections.

Creating one manually

  1. Click Create Handling Unit.
  2. Enter HU code, pick a type (carton, pallet, tote, case, generic).
  3. Optionally link to a shipment or customer.
  4. Add contents: SKU + lot/serial/expiry + quantity.
  5. Save.
Don't create HUs for receiving
If goods came in on a truck, use the receiving workflow — it makes the HU for you. Manual creation is for unusual cases only.
PART FOUR

Transport & Delivery

From the moment a shipment leaves your dock to the signed proof of delivery — dispatch jobs, route plans, drivers, and POD.

Chapter 19 — Dispatch Jobs

A dispatch job is the unit of execution for delivering a shipment. It links a shipment to a driver and tracks its lifecycle from open to completed.

Where
/console/business/dispatch/jobs

Job statuses

openassignedin_progresscompleted, with cancelled available at any point.

Creating a dispatch job

  1. Click Create Job.
  2. Enter (or auto-generate) the Job Code.
  3. Pick the Shipment the job is delivering.
  4. Customer is inherited from the shipment.
  5. Pick a Transport Mode (trucking, rail, ocean, air, parcel) — optional.
  6. Save. Job lands in status open.
Required permission
dispatch.jobs.create — operations_manager and company_admin.

Assigning a driver

  1. Open a job in status open.
  2. Click Assign Driver.
  3. Pick from the list of tenant drivers.
  4. Confirm. Status moves to assigned; the driver sees it on their phone or in /console/driver/jobs.

Cancelling

Use Cancel if a job needs to be killed. Cancellation is logged with reason and actor in the audit trail.

Chapter 20 — Route Planning

A route plan groups several jobs into one ordered sequence, assigned to a driver and vehicle. Useful when one driver does multiple stops.

Where
/console/business/dispatch/tracking

Building a route plan

  1. Click Create Route Plan.
  2. Pick a driver.
  3. Pick a vehicle from your fleet.
  4. Add stops (jobs or shipments) in the order you want them delivered.
  5. Optionally enter a capacity envelope (max weight and volume the truck can carry).
  6. Save. The plan appears with optimization_version = 1.

Optimizing the order

Open a plan and click Optimize. Trenvar deterministically resequences the stops; the version number bumps so you can see the history. The driver always sees the latest version.

Capacity is enforced
If you try to add a stop that puts the route over the truck's weight or volume envelope, Trenvar rejects it. Either split the route or pick a bigger vehicle.

Chapter 21 — The Driver Console

Drivers have a stripped-down console that shows only their own jobs and only the actions they can take.

Where
/console/driver/jobs

What a driver sees

  • List of jobs where they are the assigned driver.
  • Each job shows status, address, customer, and any notes.
  • Buttons to accept, mark en-route, mark arrived, complete.

The day in the life

  1. Driver opens /console/driver/jobs and sees today's assignments.
  2. Click Accept on a job — status moves to in_progress. If location publishing is enabled, the driver's GPS pings start.
  3. Drive to the stop. Click Arrived when at the dock.
  4. Capture the POD (Chapter 22).
  5. Click Complete. Status moves to completed.
Mobile app
A native React Native driver app is planned for a future release. Until then, drivers use the same web console on their phone — it works, but the dedicated app will be smoother on the road.

Live tracking

Drivers publish their GPS location via POST /api/dispatch/driver-location. The system enforces "you can only publish your own location." Operations managers can see all active drivers via GET /api/dispatch/driver-location/active; drivers stale after 3 minutes of no ping.

Chapter 22 — Proof of Delivery (POD)

A POD is the legal evidence that a shipment was delivered. Photo, signature, recipient name — captured by the driver, finalized, immutable.

Capturing a POD as the driver

Where
/console/driver/pod
  1. From an in-progress job, click Create POD Draft.
  2. Choose the Delivery Outcome: delivered, partial, or failed.
  3. Type the recipient name.
  4. Capture a signature on the touch screen.
  5. Take one or more photos (parcel at the door, signed paperwork, damage if any).
  6. Click Finalize POD.
Finalize requires evidence
Trenvar refuses to finalize a POD with neither a signature nor a photo. At least one is required.

What "finalized" means

Once finalized, the POD is immutable. The driver cannot edit it. If something is wrong (misspelled name, wrong outcome), only an ops manager or admin can fix it — and they do it via a correction, not an edit.

Correcting a POD

Where
/console/ops-manager/pod
  1. Open the finalized POD.
  2. Click Correct POD.
  3. Enter a correction reason (mandatory) and an optional note.
  4. Patch only the fields that need to change (recipient_name, delivery_outcome, photo_refs, etc.).
  5. Submit.

Trenvar writes a correction document. The original POD is unchanged. The "effective POD" is the original merged with the latest correction patch — and the audit trail shows every step.

PART FIVE

Air Cargo

Tracking and delivering air waybills (AWB) — from creation through carrier status updates to customer-facing visibility.

Chapter 23 — AWB Tracking and Setup

An air waybill (AWB) is an airline's tracking number for a cargo shipment. Trenvar normalizes the AWB format, fetches status from your carrier (or generates mock data), caches it, and surfaces it to your customers.

Picking a provider mode

ModeUse it when
mockYou're testing or you don't have a live carrier API yet. Trenvar generates deterministic mock statuses.
http_jsonYou have a live carrier with an HTTP API. Trenvar calls it on demand.

The provider is configured via environment variables (set by your platform admin):

VariablePurpose
AIR_AWB_PROVIDERmock or http_json
AIR_AWB_PROVIDER_NAMELabel stored on AWB records.
AIR_AWB_API_BASE_URLLive provider base URL.
AIR_AWB_API_PATH_TEMPLATEPath with {awb} placeholder.
AIR_AWB_API_KEY + AIR_AWB_API_AUTH_HEADERAuth header name + key.
AIR_AWB_WEBHOOK_SECRETShared secret for incoming push events.

Creating / checking an AWB (pull mode)

Where
/console/business/ground-ops/awb-check
  1. Type the AWB number (Trenvar normalizes "CX 1234 5678 90" to "CX1234567890" automatically).
  2. Click Check / Create.
  3. If Trenvar has a fresh cached record (under 15 minutes old), it returns that.
  4. Otherwise it calls the provider, stores the response, and shows you status, origin, destination, flight number, and the event timeline.

Push mode (carrier sends updates to you)

Carriers can POST events to /api/integrations/air-cargo/webhook with one of:

  • Header Authorization: Bearer {WEBHOOK_SECRET}, or
  • Header x-air-awb-webhook-secret: {WEBHOOK_SECRET}.

Optionally include x-air-awb-event-id for idempotency (Trenvar dedupes on this).

POST /api/integrations/air-cargo/webhook
{
  "tenantId": "tenant_acme",
  "provider": "cargo_provider_x",
  "awbNumber": "123-12345678",
  "status": "in_transit",
  "flightNo": "CX838",
  "origin": "HKG",
  "destination": "YVR",
  "events": [
    {
      "status": "in_transit",
      "eventAt": "2026-03-13T09:35:00Z",
      "location": "HKG",
      "details": "Departed origin station"
    }
  ]
}

AWB status lifecycle

StatusDisplayTerminal?
createdCreatedNo
bookedBookedNo
receivedReceivedNo
in_transitIn TransitNo
arrivedArrivedNo
available_for_pickupAvailable for PickupNo
deliveredDeliveredYes
cancelledCancelledYes
exceptionExceptionNo
unknownUnknownNo

Customer visibility

Customers with the customer_aircargo role can look up their AWBs from their portal. They can only see AWBs linked to their own pre-alerts or shipments — never another customer's.

PART SIX

Billing & Finance

Storage accrual, invoice creation, payment recording, and the reports your accountant will ask for.

Chapter 24 — Storage Accrual

Storage accrual is how Trenvar turns "this customer's stuff sat on your shelves" into money. It runs every day, measures the inventory held, and applies your storage rules.

Where
/console/business/storage/accrual

Three-layer model

Storage billing now uses tenant-defined free-form units. Three layers:

  1. Storage Rule — defines the contract: Unit Code, Quantity Source, cadence, price.
  2. Unit Code — the key (e.g., BARREL, CBM, LITRE) linking rule to SKU.
  3. Item Master / Customer Catalog — sets each SKU's Storage Billing Unit Code.

The accrual engine matches a SKU to a rule by their shared Unit Code (case-sensitive string match).

Quantity Source — how each rule measures the unit

Quantity SourceEngine measures
Quantity UnitsInventory unit count.
Volume (CBM)Cubic metres of space used.
Assigned SKU Storage UnitsSKU's Storage Billing Qty/Unit × stocked units. Use for free-form units like BARREL, LITRE, DRUM.
Handling UnitsTotal HU count.
PalletsPallet-typed HU count.
Occupied BinsBins in use.
Flat Rental1 per customer per period.

Item Master fields you'll need to set

  • Storage Billing Unit Code — must match the rule's Unit Code exactly.
  • Storage Billing Qty/Unit — how many of the unit one stocked unit equals (e.g., 1 = one barrel; 200 = 200 litres). Blank for Volume (CBM) rules.

Resolution priority — 5 layers, highest to lowest

  1. Inventory row's storage_rule_id / storage_rule_code (rare overrides).
  2. Customer Catalog assignment (per-client SKU override; reached via WMS → Item Master → 3PL context → Edit Rules; Unit Code is a dropdown of active rules).
  3. Client General Storage Billing Rule (set on Customers → [client] → General Storage Billing Rule; client-level fallback when the whole client is mostly billed one way).
  4. Item Master assignment (tenant-wide default for the SKU).
  5. Auto-match / default tenant rule (implicit fallback).

Decision guide — where to configure

  • Customer Details → General Storage Billing Rule — when the whole client is generally billed one way (e.g., mostly CBM).
  • WMS → Item Master — when the SKU normally bills the same way across all clients (e.g., a bulk liquid is always BARREL).
  • WMS → Item Master → 3PL context → Edit Rules — when one client needs a different unit for a specific SKU.
  • Inventory row override — only for rare one-off operational exceptions.

Optional fields per rule

  • Cadence — Daily or Monthly.
  • Free Days — first N days don't accrue.
  • Minimum Charge (Period) — floor amount per cadence period.
  • Effective From / To — date window.
  • Customer Scope — blank for tenant default, or pick a downstream client.

What triggers accrual

  1. Inventory item has quantity > 0 at snapshot time.
  2. A matching rule exists (Unit Code match, customer scope or default).
  3. Customer's billing profile says billable: true.
  4. Accrual window within the rule's effective dates.
  5. Required upstream data present (volume_cm3 for CBM; accurate HU types for Pallets; Storage Billing Qty/Unit for Assigned SKU; owner_customer_id tagged on inventory).

Mixed-unit example

A vape 3PL client with both liquid and solid goods can be billed in BARREL (Assigned SKU Storage Units, $20/mo) AND CBM (Volume CBM, $60/mo) in the same month. Two rules scoped to the same customer; SKUs assigned to the matching Unit Code in Item Master. See 3PL OS Chapter 5 for the full walkthrough.

Unit Code mismatch = no bill
If a SKU's Storage Billing Unit Code doesn't match any active rule, that SKU isn't billed. Check unit codes if expected revenue is missing.

What it produces

One AccrualEntry per item per day per rule. You can:

  • Export accrual entries to CSV.
  • Auto-append them onto a draft invoice (Chapter 25).
  • Adjust them manually if needed (with reason logged).

Chapter 25 — Creating & Sending Invoices

Invoices are how you actually ask for money. This chapter covers the full lifecycle — draft, finalize, send, paid.

Where
/console/accounting/billing

The lifecycle

StatusMeaning
DraftLines being added/edited. No tax, no number, customer not notified. Anything can change.
IssuedLines locked. Tax calculated. Number assigned (e.g., INV-2026-001234). Email sent if configured.
SentOptional explicit state for tracking email delivery.
PaidPayment received (Stripe webhook or manual entry).
OverdueAuto-flagged when current date passes due date and not paid.
VoidCancels an issued invoice. Replace with credit memo or new invoice.

Creating an invoice manually

  1. Click Create Invoice.
  2. Pick the customer.
  3. Set currency, invoice date, due date, optional period from/to.
  4. Click Add Line:
    • Pick a service from the catalog (drives unit, taxable flag).
    • Source type: manual / fulfillment / storage / shipping_label / etc.
    • Source ref if required (e.g., accrual entry ID, label ID).
    • Quantity, unit price (auto-fills from rule or service default), description.
  5. Click Add Adjustment for discounts, credits, or fees (positive or negative).
  6. Review subtotal → adjustments → tax → total.
  7. Click Save Draft.

Append accruals (the bulk shortcut)

Instead of typing every storage line by hand:

  1. Open a draft invoice for the customer.
  2. Click Append Accruals.
  3. Trenvar fetches all unappended accrual entries for the customer + window, groups them by rule, and adds them as lines.
  4. Recalculates totals.
Append doesn't double-charge
Trenvar remembers which accrual entries have been appended already and skips them on re-append. You can run it monthly without worrying.

Finalize an invoice

  1. Open a draft.
  2. Click Finalize.
  3. Trenvar calculates tax, locks lines, assigns the next invoice number, and (if configured) emails the customer via Resend.

Send (or resend) email

Open an issued invoice and click Send Invoice Email. Recipient resolves to the customer's billing email or primary contact. PDF attached. Subject "New invoice available: #INV-2026-123" (or "Overdue invoice reminder…" if past due).

Adjustments after issue

Need to add a discount or credit after issue? Use Add Adjustment on the issued invoice — it creates an adjustment line without breaking the lock on existing lines.

Chapter 26 — Recording Payments

Two paths: Stripe pays you automatically, or you record a payment manually (cheque, wire, ACH).

Stripe — automatic

  1. Customer pays through the Stripe link in the invoice email or portal.
  2. Stripe POSTs to /api/stripe/webhooks.
  3. Trenvar matches the charge to the invoice.
  4. Status flips to Paid; paidAt is recorded.

Manual payment entry

  1. Open the invoice detail.
  2. Click Record Payment.
  3. Enter amount, date, payment method (e.g., "Cheque #1234", "Wire Transfer", "ACH"), and an optional reference/note.
  4. Click Record.

Partial payments

If amount paid is less than total, Trenvar keeps the invoice in Issued status and tracks payments-to-date. Multiple payments can be recorded against one invoice. The PDF lists each payment.

Collections / dunning

Trenvar flags invoices as Overdue automatically. There's no fully-built dunning sequence yet, but you can:

  • Filter the invoice list by status = overdue.
  • Use Send Invoice Email with a reminder subject.
  • Run the A/R aging report (Chapter 27).

Chapter 27 — Reports & Exports

Three core reports today, with CSV/PDF/Excel-friendly exports.

Where
/console/accounting/reports

Available reports

ReportWhat it shows
Invoice SettlementAll invoices in a date range, grouped by status. Columns: Invoice #, Customer, Amount, Status, Issued, Paid.
Storage RevenueAccrual entries aggregated by customer, rule, date window. Columns: Customer, Rule, Period, Quantity, Rate, Total.
Tax ReportTax collected by region. Used for remittance filings.

Running a report

  1. Pick a report type.
  2. Set the date range (From → To).
  3. Optionally filter by customer or status.
  4. Click Run Report for preview, then Export as CSV.

QuickBooks export

Open an invoice and click Export to QuickBooks. Trenvar maps the invoice to QB's invoice object and posts via the connected OAuth account. Status fields:

  • quickbooks.exported: true — successfully posted.
  • quickbooks.lastExportAtMs — when.
  • quickbooks.lastError — if it failed; you can retry.

Xero

Not yet implemented. The exports framework has a placeholder for it.

Generic CSV invoice register

For accountants who want everything: invoice #, date, customer, amount, tax, total, status, due date, paid date — exported as comma-delimited CSV. Importable into Excel or any accounting tool.

PART SEVEN

The Customer Portal

What your customers see when they log in — inventory visibility, order placement, invoice payment, and ship-now labels.

Chapter 28 — Customer Portal Overview

The portal is a stripped-down, customer-scoped version of Trenvar. Customers only see their own data, only the screens that match their role.

Where
/console/customer/*

Screens at a glance

ScreenWhat it shows
InventoryThe customer's stock by SKU, lot, location, status (available / awaiting / reserved).
Incoming / Pre-alertsInbound shipments. Pre-alert codes, line items, expected vs received units.
OrdersStatus of each fulfillment order they've placed; live tracking once dispatched.
Ship-NowQuick-create a single shipping label without an order workflow.
InvoicesSelf-serve view + Stripe-powered self-payment.
IntegrationsConnect Shopify, etc.
AWB LookupFor customer_aircargo role only.

What each portal role sees

RoleCan do
customer_user / customer_buyerRead inventory, view orders, place ship-now jobs.
customer_adminAll of the above + invoice payment, integrations, settings, manage portal users for own company.
customer_ship_nowShip-now wizard only.
customer_aircargoAWB status only.

How a customer gets access

  1. You (the 3PL company_admin) go to /console/business/settings/users.
  2. Add a portal user — pick the right portal role and link them to the right customer.
  3. Trenvar emails them an invite. They set a password and log in to the portal.

Chapter 29 — B2B Storefront and Self-Serve Orders

If you've enabled the B2B Storefront module, customers with the customer_buyer role can browse a catalog and place orders directly.

Placing an order from the portal

  1. Customer logs in and goes to the Orders or Storefront screen.
  2. Browses available SKUs.
  3. Adds quantities and a delivery address.
  4. Submits.
  5. Trenvar creates a fulfillment order on your warehouse side, in the same queue your operators already work.

Ship-Now wizard

For one-off shipments without going through a full order:

  1. Customer opens Ship-Now.
  2. Picks a saved address (or types a new one).
  3. Picks carrier and service.
  4. Enters parcel details.
  5. Trenvar calls the carrier and returns a label.

Order tracking from the portal

Customers see live status: openpickingpickedpackingpackeddispatched → POD captured. Tracking numbers and carrier links are visible once a label exists.

Chapter 30 — Customer Self-Serve Payment

Customers with portal access can pay invoices themselves through Stripe Checkout — no chasing, no manual posting.

From the customer's side

  1. Customer opens an issued invoice from /console/customer/invoices/[invoiceId].
  2. Reviews lines, tax, and total due.
  3. Clicks Pay Now.
  4. Trenvar opens a Stripe Checkout session.
  5. Customer enters card details and pays.
  6. Stripe webhook fires; Trenvar marks the invoice Paid.

What you need configured

  • A Stripe account connected to your tenant.
  • The customer must have an email on file.
  • The invoice must be Issued (drafts can't be paid).
PART EIGHT

CRM & Communications

Customer records, contacts, support cases, and outbound notices.

Chapter 31 — Customers and Contacts

A customer is a downstream company you serve. Contacts are people inside that company.

Where
/console/customer-service/customers

The customer record

FieldNotes
Display NameWhat everyone calls them.
Customer SlugShort ID. Used in URLs and audit logs.
Statusactive or suspended.
Portal Module AccessToggles per-module access (3pl, tms).
Primary ContactEmail + phone of the main person.

Adding a customer

  1. Click Add Customer.
  2. Fill display name and slug.
  3. Set portal access toggles.
  4. Add a primary contact.
  5. Save. Now you can invite portal users for them (Chapter 28).

Chapter 32 — Cases (Customer Service Tickets)

A case is a ticket. Use it to track a customer issue from open to resolved with notes, attachments, and SLA.

Where
/console/customer-service/cases

Case fields

FieldNotes
Case NumberAuto-generated.
Title / DescriptionShort summary + details.
Statusopen → triaged → in_progress → waiting_customer → resolved → closed (or cancelled).
Prioritylow / normal / high / urgent.
Owner / AssigneeWho created it / who's working it.
Customer / Shipment / Job / InvoiceOptional links to the entities the case is about.
SLA DueWhen you're committed to resolving by.
Notes CountThreaded notes/comments live under the case.

Working a case

  1. Create the case from the customer record or directly from /console/customer-service/cases.
  2. Add notes as you investigate.
  3. Attach files (emails, screenshots, contracts).
  4. Update status as it progresses.
  5. Close it once resolved.

Chapter 33 — Notices and Outbound Comms

Notices let you send broadcast or targeted messages to customers — service updates, weather closures, billing reminders, policy changes.

Sending a notice

Where
/console/business/comms/notices
  1. Click Compose Notice.
  2. Pick recipients: all customers, a specific customer, or a role-based segment.
  3. Write subject and body.
  4. Pick channels (email, in-portal banner).
  5. Send (or schedule).

Customers receiving notices

Customers see notices at /console/customer-service/notices (when they have customer service or admin role) or as in-portal banners on their dashboards.

PART NINE

Integrations

API credentials for your own developers, webhooks for event-driven integrations, and one-click connectors for the third-party services Trenvar speaks to natively.

Chapter 34 — API Credentials

If your developers want to call Trenvar's API directly — to push orders from your own ERP, pull inventory into another system — they need an API credential.

Where
/console/business/settings/api-credentials

Creating a credential

  1. Click Create Credential.
  2. Enter a label (e.g., "ERP Sync").
  3. Pick scope: comma-separated tokens like orders.read,labels.write or just default.read.
  4. Click Create.
  5. Trenvar shows you a keyId and bearerToken once. Copy them now and store securely.
The bearer token shows once
Trenvar never shows the full token again. If you lose it, you have to rotate the credential to get a new one. The UI will only show the keyPreview after creation.

Rotating a credential

  1. Open the credential.
  2. Click Rotate.
  3. Trenvar revokes the old token and issues a new one. Old token stops working immediately.

Revoking a credential

Click Revoke, optionally enter a reason. Status moves to revoked; the token stops working immediately. The credential record stays for audit.

Required permission
tenant.settings.configure — typically held by company_admin only.

Chapter 35 — Webhooks

Webhooks let other systems get notified the moment something happens in Trenvar — a new order, a status change, an invoice issued.

Where
/console/business/settings/webhooks

Creating a webhook endpoint

  1. Click Create Endpoint.
  2. Enter a label.
  3. Enter the target URL (e.g., https://your-app.com/webhooks/vectra).
  4. Pick event types to subscribe to (comma-separated tokens like orders.created,labels.created).
  5. Click Create.
  6. Trenvar shows you a signingSecret once. Save it securely — you'll use it to verify incoming webhook payloads.

Inspecting deliveries

Open the endpoint and view the Deliveries tab. Each delivery shows status (queued / delivered / failed / dead_letter), attempt count, last HTTP status, last error, queued time, and next retry time.

Test a delivery

  1. From the endpoint detail, click Test Delivery.
  2. Pick an event type and paste a JSON payload.
  3. Click Send. Trenvar POSTs to your URL using the same retry policy as production.

Retry a failed delivery

From the deliveries list, click Retry on any failed entry. Trenvar requeues with backoff.

Rotate the signing secret

Click Rotate Secret in the endpoint detail. Old secret invalidates immediately; the new one is shown once. Update your receiver before this — there's no overlap window.

Disable / archive

Use Disable to pause deliveries without deleting. Archive when you're permanently done.

Chapter 36 — Third-Party Connectors

The integrations Trenvar knows how to talk to natively, today.

ConnectorWhat it doesHow to set up
ShopifyPulls orders from your or your customer's Shopify store.Visit /api/shopify/install?shop=yourstore.myshopify.com. Approve. Configure sync at /console/.../integrations/shopify.
QuickBooks OnlinePushes invoices into QB.Click Connect QuickBooks in integrations. OAuth flow. Then export per-invoice.
ResendSends transactional email.Chapter 5.
StripeCard payments + trial billing.Configured at signup; refine in tenant settings.
AWB carrier (HTTP JSON or mock)Air cargo tracking.Chapter 23.

EDI partners (planned)

EDI integration with SPS Commerce (transactions 850, 855, 856, 940, 945, 210, 214) is on the roadmap for a future phase. Not yet wired.

PART TEN

Platform Administration

The Owner Console — for the people who run Trenvar itself, not the tenants. If you don't have system_admin role, you can skip this part.

Chapter 37 — Owner Console Overview

The Owner Console is the platform's "control room." Only users with the system_admin role can access it. Tenants never see this.

Where
/console/owner/*

What lives here

  • Tenants — list, approve, suspend, archive every tenant.
  • Plans — pricing tiers, billing rules, subscription runs.
  • Modules — turn modules on/off per tenant; set module pricing.
  • Audit — every platform-wide action with timestamp and actor.
  • Analytics — financial rollups across tenants.

Chapter 38 — Tenant Lifecycle

Creating, suspending, resuming, and archiving tenants.

Where
/console/owner/tenants

The tenant record

FieldNotes
tenant_id, name, planIdentity.
statuspending_approval / active / suspended / rejected.
companySlug, taxId, address, domainTenant company info.
contactName, contactEmailPrimary contact.
ownerLoginUid, ownerLoginEmailThe provisioned admin user.
freePlatformAccessIf true, no platform billing.
subscriptionStatus, signupSourceTrial / paid / etc.
trialStartedAtMs, trialEndsAtMsTrial window.
stripeCustomerId, autoChargeEnabledPlatform billing config.
majorModulesMap of which modules this tenant has.
nextInvoiceAtMs, currentPeriodStartAtMs/EndAtMsBilling cycle.
userCount, roleCount, customerCountUsage stats.

Provisioning a tenant manually

  1. From the tenants list, click Create Tenant.
  2. Fill the company info (name, slug, address, contacts).
  3. Set plan and module bundle.
  4. Click Create Tenant.
  5. Open the tenant and click Set Up Owner Login:
    • Enter the admin's email.
    • Enter a password (or let Trenvar auto-generate one).
    • Trenvar returns a temporary password. Send it to the admin via secure channel.

Suspend / resume / archive

Open the tenant and change status:

  • activesuspended blocks access immediately.
  • suspendedactive restores it.
  • Archiving hides it from the default list (for tenants that have churned).
Required permission
platform.tenants.update — system_admin only.

Chapter 39 — Plans, Subscriptions & Module Enablement

Trenvar is sold as bundles of modules ("Operating Systems" — warehouse_os, 3pl_os, tms_os, ground_ops_os, b2b_os). Each tenant gets a plan that turns on a set of modules, with a monthly price per module.

Where
/console/owner/modules  ·  /console/owner/plans

The major modules

KeyPurpose
wms_coreWMS execution.
module_3pl3PL multi-customer features.
module_ground_opsGround transport extensions.
module_tmsFull TMS / dispatch / route plan.
module_crmSales CRM extension.
module_b2b_storefrontB2B portal ordering.

Configuring module pricing

From /console/owner/modules you set the monthly price (in cents) per module. PATCH /api/owner/modules-pricing writes the config:

{
  "modules": {
    "wms_core":              { "enabled": true,  "monthlyPriceCents": 19900 },
    "module_3pl":            { "enabled": true,  "monthlyPriceCents":  9900 },
    "module_tms":            { "enabled": true,  "monthlyPriceCents": 14900 },
    "module_b2b_storefront": { "enabled": false, "monthlyPriceCents":     0 }
  },
  "currency": "USD",
  "invoiceIssueDay": 1,
  "paymentDueDays": 14,
  "enforceSubscription": true
}

Running platform subscriptions

POST /api/owner/billing/subscriptions/run creates platform invoices for every active tenant in the current period. Returns counts of created vs skipped (free, no-charge, already-billed). Schedule this monthly or run it manually.

Chapter 40 — Audit Log & Platform Analytics

Every meaningful action across the platform is logged with actor, role, entity, and timestamp. Use the audit log for security, billing disputes, or just curiosity.

Where
/console/owner/audit

What's recorded

  • action — create / update / delete / revoke / rotate / transition / etc.
  • entity_type / entity_id — what was acted on.
  • tenant_id — scope.
  • actor_uid / actor_role — who did it.
  • created_at_ms — when.
  • metadata — extras (retry hints, throttle reasons, etc.).

Throttle awareness

The audit log surfaces rate-limit / abuse-protection events. Quick metrics on top of the page: throttles in the last hour, the last 24 hours, and the maximum retry-after hint observed.

Platform analytics

From /console/owner/analytics, view financial rollups: MRR, ARR, total tenants, churn, plan mix. Backed by /api/owner/analytics/financial-rollups.

PART ELEVEN

Operations & Support

Troubleshooting, runbooks for incidents, and where to find help when something breaks.

Chapter 41 — Troubleshooting Common Issues

A short list of things that go wrong and what to do.

"My webhook deliveries are stuck"

  1. Open /console/business/settings/webhooks/{endpointId}.
  2. Look at the Deliveries tab. What status are they in?
  3. If queued with no movement: check Trenvar status page.
  4. If failed repeatedly: look at lastErrorMessage. Common: TLS errors, 4xx from your endpoint, signature verification failure.
  5. Use Test Delivery to send a payload now and observe.
  6. If your signing secret has been compromised or you can't decode payloads, Rotate Secret and update your receiver.
  7. dead_letter deliveries can be force-retried via the API once the underlying issue is fixed.

"An API credential leaked"

  1. Open /console/business/settings/api-credentials.
  2. Click Revoke on the leaked credential. Add a reason like "key exposed in repository on 2026-05-02."
  3. Create a new credential with the same scope.
  4. Update the consuming system with the new bearer token.
  5. Audit the access logs for the time window the leak was live.

"Shopify isn't syncing"

  1. Open the integration in /console/customer/integrations (or business equivalent).
  2. Check the last sync timestamp.
  3. Click Sync Now (POST /api/integrations/shopify/sync).
  4. If failing: check the Shopify Partner dashboard for revoked OAuth or expired credentials. Disconnect and reinstall if needed.

"My invoice is missing storage charges"

  1. Confirm the customer has a billing profile with billable: true.
  2. Confirm the inventory items have a storageRuleId.
  3. Confirm the storage rule is active and within its effective window.
  4. Re-run accrual for the period.
  5. On the draft invoice, click Append Accruals.

"Fulfillment pricing fell back to the default amount"

  1. Open the linked shipping label.
  2. Check that the parcels array is populated, with weight per parcel.
  3. If parcels are missing, the operator skipped weight at pack. The fix is process: train the team to enter weight every time.
  4. Going forward, Trenvar will apply the tiers correctly.

Chapter 42 — Runbooks (Outages, Backlogs, Leaks)

Step-by-step actions for higher-severity incidents. Written so any on-call admin can follow them under pressure.

Provider outage (Resend, Stripe, AWB carrier, Shopify)

  1. Confirm: check the provider's status page.
  2. Check audit log for related throttle/error events.
  3. If sustained, post a notice to affected tenants (/console/owner → notices).
  4. Disable auto-retry loops if they're aggravating the provider.
  5. Once the provider is back, resume retries; failed deliveries may need manual replay.

Webhook delivery backlog

  1. Open the affected webhook endpoint.
  2. Inspect the deliveries queue. How many are queued? failed?
  3. If your endpoint is the bottleneck, scale it before retrying.
  4. Use the API to retry in batches; avoid thundering-herd retries.

Credential leak

  1. Revoke the leaked credential immediately. (Section above for steps.)
  2. Rotate the webhook signing secret if there's any chance it was leaked too.
  3. Audit the platform audit log for unusual access during the leak window.
  4. If the leak was a Resend or Stripe key, rotate at the provider as well.
  5. Document the incident for compliance.

Replay storm

  1. Identify the source from the audit log throttle events.
  2. Disable the misbehaving endpoint or revoke the credential.
  3. Communicate with the integration owner.
  4. Re-enable once the loop is fixed.

Chapter 43 — Where to Get Help

When the docs aren't enough.

Inside the app

  • Audit log — your first stop for "what just happened?" questions. Tenant-scoped at /tenants/{tenantId}/auditLogs; platform-wide at /console/owner/audit.
  • Cases — internal tracking of customer issues (/console/customer-service/cases).
  • Notices — broadcast to customers when something they care about happens.

Outside the app

  • Your platform admin (the person who set up your tenant).
  • Trenvar support (contact details to be provided by your platform admin).
  • The other docs in /docs: TENANT_EMAIL_PROVIDER_SETUP, TRIAL_BILLING_WORKFLOW, AIR_AWB_INTEGRATION, PHASE_06_RUNBOOKS, plus per-module smoke-test checklists.
APPENDICES

Quick Reference

Console paths, permissions, and a glossary you can flip to without reading a chapter.

Appendix A — Quick Reference: All Console Paths

Business Console (company_admin)

PathScreen
/console/business/Module switcher / dashboard
/console/business/settings/companyCompany profile, branding
/console/business/settings/emailEmail provider (Resend) setup
/console/business/settings/usersManage users + roles
/console/business/settings/api-credentialsAPI keys
/console/business/settings/webhooksWebhook endpoints
/console/business/wms/item-masterItem Master / SKUs
/console/business/wms/locationsLocations + capacity rules
/console/business/wms/handling-unitsHandling units
/console/business/wms/fulfillmentFulfillment orders
/console/business/wms/cycle-countCycle counts
/console/business/billing/servicesService catalog
/console/business/billing/pricing-rulesPricing rules
/console/business/storage/accrualStorage accrual runs
/console/business/storage/rulesStorage rules
/console/business/storage/agingStorage aging report
/console/business/billing/taxTax regions
/console/business/billing/paymentsPayments
/console/business/billing/exportsBilling exports
/console/business/dispatch/jobsDispatch jobs
/console/business/dispatch/trackingRoute plans + live tracking
/console/business/ground-ops/awb-checkAWB lookup / create
/console/business/comms/noticesOutbound notices

Operations Manager

PathScreen
/console/ops-manager/pre-alertPre-alert queue
/console/ops-manager/receivingReceiving manager view
/console/ops-manager/putawayPutaway manager view
/console/ops-manager/inventoryInventory lookup + adjustments
/console/ops-manager/fulfillmentFulfillment manager view
/console/ops-manager/handling-unitsHandling units
/console/ops-manager/locationsLocations
/console/ops-manager/podPOD review + corrections

Operator

PathScreen
/console/operator/locationsDefault 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

Driver

PathScreen
/console/driver/jobsAssigned jobs
/console/driver/podPOD capture
/console/driver/trackingRoute plan view

Customer Service

PathScreen
/console/customer-service/customersCustomer list
/console/customer-service/casesCases
/console/customer-service/noticesNotices
/console/customer-service/pre-alertPre-alerts (read)
/console/customer-service/shipmentsShipments (read)
/console/customer-service/podPOD (read)

Accounting

PathScreen
/console/accounting/billingBilling dashboard
/console/accounting/billingInvoices
/console/accounting/reportsReports + exports

Customer Portal

PathScreen
/console/customer/inventoryInventory visibility
/console/customer/ordersOrders + tracking
/console/customer/ship-nowShip-now wizard
/console/customer/invoicesInvoices + self-pay
/console/customer/integrationsConnect Shopify, etc.

Owner Console (system_admin)

PathScreen
/console/owner/tenantsTenant list + lifecycle
/console/owner/plansPlans + subscriptions
/console/owner/modulesModule enablement + pricing
/console/owner/auditPlatform audit log
/console/owner/analyticsFinancial rollups

Appendix B — Permissions Catalog

Permissions are grouped by domain. A wildcard * grants everything in the domain.

DomainExamples
tenant.*tenant.settings.read, tenant.settings.configure, tenant.users.list, tenant.users.create
wms.*wms.shipments.read, wms.shipments.create, wms.inventory.update, wms.locations.update, wms.receiving.update, wms.putaway.update, wms.picking.update, wms.packing.update, wms.fulfillment.create, wms.fulfillment.update, wms.prealert.create
dispatch.*dispatch.jobs.list, dispatch.jobs.create, dispatch.jobs.update, dispatch.jobs.cancel, dispatch.routes.create, dispatch.routes.update, dispatch.tracking.read, dispatch.tracking.update, dispatch.pod.read, dispatch.pod.update
billing.*billing.services.read, billing.services.configure, billing.pricing.read, billing.pricing.configure, billing.invoices.read, billing.invoices.update, billing.invoices.finalize, billing.payments.record, billing.exports.export, billing.reconciliation.read
storage.*storage.rules.read, storage.rules.update, storage.accrual.read, storage.accrual.run, storage.accrual.adjust, storage.aging.read
tax.*tax.regions.read, tax.regions.configure
crm.*crm.customers.read, crm.customers.update, crm.contacts.read, crm.cases.read, crm.cases.update, crm.notices.send
customer.*customer.orders.create, customer.orders.view, customer.invoices.view, customer.invoices.pay, customer.integrations.manage
reports.*reports.financial.read, reports.operational.read, reports.export.export
platform.*platform.tenants.list, platform.tenants.create, platform.tenants.update, platform.entitlements.configure, platform.billing.run, platform.analytics.read, platform.audit.read, platform.impersonation.use

Appendix C — Glossary

3PL — Third-party logistics. A company that warehouses and ships goods on behalf of other companies.

AWB — Air Waybill. The airline's tracking number for a cargo shipment.

Accrual — Storage charges that build up day by day before being invoiced.

Append — Bulk-adding accrual or fulfillment lines onto a draft invoice.

Capacity Rule — Limits on what fits in a location (units, volume, weight, mixed-SKU policy).

Console — A role-specific surface inside Trenvar (business console, ops-manager console, etc.).

Dispatch Job — The execution unit for delivering a shipment.

Effective Date — Not supported on pricing rules. Use the Active toggle instead.

Fulfillment Order — The warehouse's record of executing a customer order.

Handling Unit (HU) — A physical container — carton, pallet, tote.

Item Master — Your catalog of every product / SKU.

POD — Proof of Delivery. Photo + signature + recipient name captured by the driver.

Pre-Alert — Advance notice of an inbound shipment.

Putaway — Moving received goods from the dock to their storage location.

Resend — The transactional email service Trenvar uses.

Service Catalog — The list of things you charge for. Every invoice line references one.

Slug — A short, URL-safe identifier (tenant slug, customer slug). Lowercase, no spaces.

SKU — Stock Keeping Unit. A unique product identifier.

Tenant — One company using Trenvar. Multi-tenant isolation prevents tenants from ever seeing each other's data.

Tier — A weight band in a pricing rule (e.g., "up to 5kg = $4.25").

Webhook — A POST from Trenvar to your URL when an event happens.

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

End of guide  ·  Trenvar User Guide v1.0  ·  May 2026
For corrections or additions, please file a case at /console/customer-service/cases.