Foundations
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
| Area | What 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 & Invoicing | Service catalog, pricing rules, storage accrual, invoicing, payments, tax, reports. |
| CRM | Customer records, contacts, cases, notices, communications. |
| Customer Portal | Self-serve view of inventory, orders, invoices, payment, AWB tracking. |
| Owner Console | Platform-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).
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
| Role | Lives at | Can 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. |
["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:
| Role | What they get |
|---|---|
| customer_admin | Manages users for their own company. Can place orders, view invoices, pay invoices, manage integrations. |
| customer_user | Standard portal user. Place orders, view invoices, pay invoices. |
| customer_buyer | B2B Storefront role. Can browse and place orders against the customer's catalog. |
| customer_ship_now | Light-touch role. Create labels and look up shipments only. |
| customer_aircargo | Air 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.
How a company_admin invites someone
- Go to
/console/business/settings/users. - Click Add User.
- Enter their email and display name.
- Tick the role boxes (you can pick more than one).
- Save. Trenvar sends them an email invite.
- The user clicks the link, sets a password, and they're in.
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
- 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. - Enter your email and password.
- Click Sign In.
- You'll land on your role's home screen (see table below).
Where you land after login
| Your role | You 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
- On the login screen, click Forgot password.
- Enter your email.
- Check your inbox for a reset email from Firebase.
- Click the link, set a new password, log back in.
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.
Setup
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
- Go to the public signup URL (provided by your sales contact or via the Trenvar website).
- Fill in: Company name, email, password.
- Click Continue. You're forwarded to a Stripe page.
- Enter a payment card. Stripe runs a setup-only authorisation — no charge yet.
- You're returned to
/trial/activationwith a success message.
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
- Open your tenant URL (Trenvar emails it to you, or use the link on the activation page).
- Sign in with the email and password you just created.
- 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.
- Complete your company profile (Chapter 5).
- Upload your logo and branding (Chapter 5).
- Set up your email provider (Chapter 5).
- Invite your team (Chapter 2).
- Create your warehouse locations (Chapter 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.
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
Fill in:
| Field | What to enter |
|---|---|
| Company Name | Your full legal or trading name. Appears on invoices. |
| Tenant Slug | Locked at signup. Read-only here. |
| Logo | Upload PNG/SVG. Used on portal, invoices, transactional emails. |
| Contact Email / Phone | Where customers can reach you. |
| Address | Street, city, state/province, zip, country. |
| Industry / Business Type | Helps 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:
| Mode | What happens |
|---|---|
| platform_default | Trenvar sends from a generic platform sender. No setup needed. Looks less professional. |
| tenant_sender | Email comes from your domain (e.g., support@yourcompany.com). Looks professional. Requires DNS setup. |
Setting up tenant_sender
- Sign up at resend.com and create an API key.
- Paste the API key into Trenvar. Only the last 4 characters will be visible afterwards.
- Choose tenant_sender mode.
- Enter From Name (e.g., "Acme Logistics"), From Email (e.g.,
support@acme.com), and an optional Reply-To. - Add your domain (e.g.,
acme.com). - Trenvar shows you SPF, DKIM, and return-path DNS records. Copy these.
- Add the DNS records at your domain registrar (GoDaddy, Cloudflare, etc.).
- Wait. Status moves from not_started → pending → verified. DNS can take 24–48 hours.
- Once verified, send a test email from the same screen.
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
- Click Create Location.
- Start with the warehouse. Enter a code like
WH-01and a name like "Main Warehouse". - Save. Now add zones under it (e.g.,
RCV-01for "Receiving Zone"). - Add aisles, bays, levels, bins — drilling down as deep as you need.
- For each leaf-level bin, optionally assign a capacity rule (next section).
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.
| Field | What it does |
|---|---|
| Code / Name | Identifier (e.g., "PICK-STD") and label. |
| Node Types | Which location types this rule applies to (e.g., bin, pick_face). |
| Max Units / Volume / Weight / Pallets | Hard limits per location. |
| Allow Mixed SKU | If false, only one SKU may live in a location at a time. |
| SKU Restrictions | Optional 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.
The fields that matter
| Field | What it means |
|---|---|
| SKU | Unique code. A–Z, 0–9, dot, dash, slash, colon, underscore. Required. |
| Product Name | What operators see on screen. |
| Barcodes | Comma-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 Measure | Each, case, pallet — and conversions between them. |
| Lot / Serial / Expiry flags | If true, receiving must capture the lot, serial, or expiry per unit. |
| Fulfillment Billing | inherit, package, sku, picked_unit. Drives how this SKU is billed in fulfillment orders. |
| Ship Alone | If true, this SKU must be packaged on its own — no co-packing. |
| Default Storage Type | Suggests 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.
Step-by-step: create a SKU
- Click Create SKU.
- Enter a SKU code and product name.
- Fill in weight and dimensions if known.
- Tick lot/serial/expiry only if you actually need to track them.
- Set Fulfillment Billing = package if this SKU should bill by parcel.
- Set Ship Alone = true if it cannot share a carton.
- 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.
What's in a service
| Field | Notes |
|---|---|
| Code | Uppercase ID. Auto-generated from name if blank. |
| Name | What appears on invoices. |
| Category | fulfillment, qc, storage, extra_work, additional_work, shipping_label, other. |
| Unit | order, hour, day, label, kg — whatever you bill by. |
| Default Unit Price | Used when no pricing rule matches. |
| Taxable | Tick if tax applies. |
| Active | Untick 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.
The rule types you can build
| Source Type | Used for |
|---|---|
| fulfillment | Per-order, per-package, per-SKU, or per-picked-unit charges. |
| qc | Quality-check labour. |
| storage | Daily/monthly accrual-based storage charges. |
| extra_work | One-off labour (kitting, repacking, etc.). |
| additional_work | Project fees. |
| shipping_label | Per-label charges. |
| manual | Anything else added by hand at invoice time. |
| transport_rate / transport_accessorial / transport_fuel / transport_contract | If 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.
- Click Create Rule.
- What are you pricing? → "Billing: Fulfillment".
- Rule Name → "3PL Fulfillment Package Pricing".
- Customer → leave blank for all customers, or pick one for a negotiated rate.
- Billable Fulfillment Unit → package (per carton).
- Default Amount → fallback per-package rate (e.g., $5.00).
- Weight Basis → Exact package weight.
- 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:
- Finds completed, uninvoiced fulfillment work for the customer + window.
- Reads the linked shipping label parcel rows.
- Evaluates each parcel's weight against your tiers.
- Creates one invoice line per group.
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.
Creating a tax region
| Field | Example |
|---|---|
| Code | ON_SALES_TAX |
| Name | Ontario Sales Tax (HST) |
| Country | CA |
| State / Province | ON |
| Tax Rate % | 13.0 |
| Inclusive | Off (tax adds on top); on if your prices already include tax. |
| Effective From / To | Optional date range. |
| Active | On. |
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.
Daily Warehouse Operations
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
| Field | Notes |
|---|---|
| Prealert Code | Auto or manual (e.g., PA-20260501-001). |
| Source | wms (you created it), customer_portal (a customer notified you), unknown. |
| Purchase Order | Optional link. |
| Expected Lines | SKU + expected units + lot/serial/expiry if required. |
| Expected Arrival | When the truck shows up. |
| Status | open → partially_received → received, or cancelled. |
Creating a pre-alert as ops manager
- Click Create Pre-Alert.
- Fill the code (auto OK), optional PO link, expected arrival.
- Add expected lines: search SKU → enter expected units → fill lot/serial/expiry if the SKU requires them.
- Save. The pre-alert appears in the receiving queue when the truck arrives.
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.
The flow
- Pick a pre-alert from the queue (or search by code).
- 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).
- Repeat for every line.
- 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.
Chapter 13 — Putaway
Putaway is moving the goods from the receiving dock to their permanent storage location.
The flow
- Open the putaway queue. Trenvar has already generated a putaway task per handling unit.
- Click on a handling unit. The screen shows recommended destinations based on capacity, default storage type, and zone rules.
- Either accept the recommendation or scan a different bin barcode.
- Trenvar validates: is the bin active, will the unit fit, does the SKU restriction allow it?
- Click Confirm Placement.
The handling unit's status flips to stored and the location's occupancy updates immediately.
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
| State | Meaning |
|---|---|
| on_hand | Physically in the warehouse, any owner. |
| allocated | Reserved for an open pick task. |
| available | on_hand minus allocated. Free to pick. |
| quarantine | On QC hold. |
| owned_units | Belongs to a specific customer (3PL). |
| unassigned_units | Internal stock, no owner. |
Looking up stock
- Enter or select a SKU.
- Optionally filter by lot, serial, location, or owner customer.
- Trenvar lists every matching inventory item with its location, on-hand/allocated/available/quarantine counts, and last movement.
- 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)
- From the inventory screen, click Adjust Inventory.
- Pick the SKU, lot/serial if applicable, location.
- Enter a positive (gain) or negative (loss) quantity.
- Choose a reason: physical count variance, damaged goods, donation, etc.
- 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
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.
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
open → picking → picked → packing → packed → dispatch_ready → dispatched
Creating one manually
- Click Create Order.
- Enter (or auto-generate) a fulfillment code.
- Pick the customer (or fill recipient details directly).
- Choose an allocation strategy:
- manual — operator chooses what to pick.
- fifo — first-in-first-out.
- fefo — first-expiry-first-out (perishables).
- Add lines: SKU + requested units + lot/serial if applicable.
- Enter recipient address and shipping info.
- 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.
Picking
- Click on a pick task in the work queue.
- Trenvar shows the requested lines and source locations.
- 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).
- When done, click Complete Pick.
Picking creates an immutable picked_lines array, marks inventory as allocated, and pushes the order into picked status.
Packing
- Open the pack queue.
- Click on a picked order.
- For each carton:
- Add the picked items going into it.
- Enter the carton's weight (kg) and dimensions (cm).
- Click Complete Pack.
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
- From a packed fulfillment order, click Generate Shipping Label.
- Pick a carrier (FedEx, UPS, DHL, etc.) and service (Ground, Express).
- For each parcel: confirm weight (kg), dimensions, and contents summary.
- Click Request Label from Carrier.
- 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
| Origin | Meaning |
|---|---|
| tenant_generated | You generated it through Trenvar. |
| customer_generated | A portal customer generated it for their order. |
| customer_provided_external | The 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.
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
- Click Create Handling Unit.
- Enter HU code, pick a type (carton, pallet, tote, case, generic).
- Optionally link to a shipment or customer.
- Add contents: SKU + lot/serial/expiry + quantity.
- Save.
Transport & Delivery
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.
Job statuses
open → assigned → in_progress → completed, with cancelled available at any point.
Creating a dispatch job
- Click Create Job.
- Enter (or auto-generate) the Job Code.
- Pick the Shipment the job is delivering.
- Customer is inherited from the shipment.
- Pick a Transport Mode (trucking, rail, ocean, air, parcel) — optional.
- Save. Job lands in status open.
dispatch.jobs.create — operations_manager and company_admin.
Assigning a driver
- Open a job in status open.
- Click Assign Driver.
- Pick from the list of tenant drivers.
- 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.
Building a route plan
- Click Create Route Plan.
- Pick a driver.
- Pick a vehicle from your fleet.
- Add stops (jobs or shipments) in the order you want them delivered.
- Optionally enter a capacity envelope (max weight and volume the truck can carry).
- 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.
Chapter 21 — The Driver Console
Drivers have a stripped-down console that shows only their own jobs and only the actions they can take.
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
- Driver opens
/console/driver/jobsand sees today's assignments. - Click Accept on a job — status moves to in_progress. If location publishing is enabled, the driver's GPS pings start.
- Drive to the stop. Click Arrived when at the dock.
- Capture the POD (Chapter 22).
- Click Complete. Status moves to completed.
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
- From an in-progress job, click Create POD Draft.
- Choose the Delivery Outcome: delivered, partial, or failed.
- Type the recipient name.
- Capture a signature on the touch screen.
- Take one or more photos (parcel at the door, signed paperwork, damage if any).
- Click Finalize POD.
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
- Open the finalized POD.
- Click Correct POD.
- Enter a correction reason (mandatory) and an optional note.
- Patch only the fields that need to change (recipient_name, delivery_outcome, photo_refs, etc.).
- 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.
Air Cargo
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
| Mode | Use it when |
|---|---|
| mock | You're testing or you don't have a live carrier API yet. Trenvar generates deterministic mock statuses. |
| http_json | You 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):
| Variable | Purpose |
|---|---|
AIR_AWB_PROVIDER | mock or http_json |
AIR_AWB_PROVIDER_NAME | Label stored on AWB records. |
AIR_AWB_API_BASE_URL | Live provider base URL. |
AIR_AWB_API_PATH_TEMPLATE | Path with {awb} placeholder. |
AIR_AWB_API_KEY + AIR_AWB_API_AUTH_HEADER | Auth header name + key. |
AIR_AWB_WEBHOOK_SECRET | Shared secret for incoming push events. |
Creating / checking an AWB (pull mode)
- Type the AWB number (Trenvar normalizes "CX 1234 5678 90" to "CX1234567890" automatically).
- Click Check / Create.
- If Trenvar has a fresh cached record (under 15 minutes old), it returns that.
- 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
| Status | Display | Terminal? |
|---|---|---|
| created | Created | No |
| booked | Booked | No |
| received | Received | No |
| in_transit | In Transit | No |
| arrived | Arrived | No |
| available_for_pickup | Available for Pickup | No |
| delivered | Delivered | Yes |
| cancelled | Cancelled | Yes |
| exception | Exception | No |
| unknown | Unknown | No |
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.
Billing & Finance
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.
Three-layer model
Storage billing now uses tenant-defined free-form units. Three layers:
- Storage Rule — defines the contract: Unit Code, Quantity Source, cadence, price.
- Unit Code — the key (e.g.,
BARREL,CBM,LITRE) linking rule to SKU. - 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 Source | Engine measures |
|---|---|
| Quantity Units | Inventory unit count. |
| Volume (CBM) | Cubic metres of space used. |
| Assigned SKU Storage Units | SKU's Storage Billing Qty/Unit × stocked units. Use for free-form units like BARREL, LITRE, DRUM. |
| Handling Units | Total HU count. |
| Pallets | Pallet-typed HU count. |
| Occupied Bins | Bins in use. |
| Flat Rental | 1 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
- Inventory row's
storage_rule_id/storage_rule_code(rare overrides). - Customer Catalog assignment (per-client SKU override; reached via WMS → Item Master → 3PL context → Edit Rules; Unit Code is a dropdown of active rules).
- 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).
- Item Master assignment (tenant-wide default for the SKU).
- 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
- Inventory item has quantity > 0 at snapshot time.
- A matching rule exists (Unit Code match, customer scope or default).
- Customer's billing profile says
billable: true. - Accrual window within the rule's effective dates.
- 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.
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.
The lifecycle
| Status | Meaning |
|---|---|
| Draft | Lines being added/edited. No tax, no number, customer not notified. Anything can change. |
| Issued | Lines locked. Tax calculated. Number assigned (e.g., INV-2026-001234). Email sent if configured. |
| Sent | Optional explicit state for tracking email delivery. |
| Paid | Payment received (Stripe webhook or manual entry). |
| Overdue | Auto-flagged when current date passes due date and not paid. |
| Void | Cancels an issued invoice. Replace with credit memo or new invoice. |
Creating an invoice manually
- Click Create Invoice.
- Pick the customer.
- Set currency, invoice date, due date, optional period from/to.
- 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.
- Click Add Adjustment for discounts, credits, or fees (positive or negative).
- Review subtotal → adjustments → tax → total.
- Click Save Draft.
Append accruals (the bulk shortcut)
Instead of typing every storage line by hand:
- Open a draft invoice for the customer.
- Click Append Accruals.
- Trenvar fetches all unappended accrual entries for the customer + window, groups them by rule, and adds them as lines.
- Recalculates totals.
Finalize an invoice
- Open a draft.
- Click Finalize.
- 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
- Customer pays through the Stripe link in the invoice email or portal.
- Stripe POSTs to
/api/stripe/webhooks. - Trenvar matches the charge to the invoice.
- Status flips to Paid;
paidAtis recorded.
Manual payment entry
- Open the invoice detail.
- Click Record Payment.
- Enter amount, date, payment method (e.g., "Cheque #1234", "Wire Transfer", "ACH"), and an optional reference/note.
- 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.
Available reports
| Report | What it shows |
|---|---|
| Invoice Settlement | All invoices in a date range, grouped by status. Columns: Invoice #, Customer, Amount, Status, Issued, Paid. |
| Storage Revenue | Accrual entries aggregated by customer, rule, date window. Columns: Customer, Rule, Period, Quantity, Rate, Total. |
| Tax Report | Tax collected by region. Used for remittance filings. |
Running a report
- Pick a report type.
- Set the date range (From → To).
- Optionally filter by customer or status.
- 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.
The Customer Portal
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.
Screens at a glance
| Screen | What it shows |
|---|---|
| Inventory | The customer's stock by SKU, lot, location, status (available / awaiting / reserved). |
| Incoming / Pre-alerts | Inbound shipments. Pre-alert codes, line items, expected vs received units. |
| Orders | Status of each fulfillment order they've placed; live tracking once dispatched. |
| Ship-Now | Quick-create a single shipping label without an order workflow. |
| Invoices | Self-serve view + Stripe-powered self-payment. |
| Integrations | Connect Shopify, etc. |
| AWB Lookup | For customer_aircargo role only. |
What each portal role sees
| Role | Can do |
|---|---|
| customer_user / customer_buyer | Read inventory, view orders, place ship-now jobs. |
| customer_admin | All of the above + invoice payment, integrations, settings, manage portal users for own company. |
| customer_ship_now | Ship-now wizard only. |
| customer_aircargo | AWB status only. |
How a customer gets access
- You (the 3PL company_admin) go to
/console/business/settings/users. - Add a portal user — pick the right portal role and link them to the right customer.
- 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
- Customer logs in and goes to the Orders or Storefront screen.
- Browses available SKUs.
- Adds quantities and a delivery address.
- Submits.
- 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:
- Customer opens Ship-Now.
- Picks a saved address (or types a new one).
- Picks carrier and service.
- Enters parcel details.
- Trenvar calls the carrier and returns a label.
Order tracking from the portal
Customers see live status: open → picking → picked → packing → packed → dispatched → 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
- Customer opens an issued invoice from
/console/customer/invoices/[invoiceId]. - Reviews lines, tax, and total due.
- Clicks Pay Now.
- Trenvar opens a Stripe Checkout session.
- Customer enters card details and pays.
- 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).
CRM & Communications
Chapter 31 — Customers and Contacts
A customer is a downstream company you serve. Contacts are people inside that company.
The customer record
| Field | Notes |
|---|---|
| Display Name | What everyone calls them. |
| Customer Slug | Short ID. Used in URLs and audit logs. |
| Status | active or suspended. |
| Portal Module Access | Toggles per-module access (3pl, tms). |
| Primary Contact | Email + phone of the main person. |
Adding a customer
- Click Add Customer.
- Fill display name and slug.
- Set portal access toggles.
- Add a primary contact.
- 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.
Case fields
| Field | Notes |
|---|---|
| Case Number | Auto-generated. |
| Title / Description | Short summary + details. |
| Status | open → triaged → in_progress → waiting_customer → resolved → closed (or cancelled). |
| Priority | low / normal / high / urgent. |
| Owner / Assignee | Who created it / who's working it. |
| Customer / Shipment / Job / Invoice | Optional links to the entities the case is about. |
| SLA Due | When you're committed to resolving by. |
| Notes Count | Threaded notes/comments live under the case. |
Working a case
- Create the case from the customer record or directly from
/console/customer-service/cases. - Add notes as you investigate.
- Attach files (emails, screenshots, contracts).
- Update status as it progresses.
- 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
- Click Compose Notice.
- Pick recipients: all customers, a specific customer, or a role-based segment.
- Write subject and body.
- Pick channels (email, in-portal banner).
- 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.
Integrations
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.
Creating a credential
- Click Create Credential.
- Enter a label (e.g., "ERP Sync").
- Pick scope: comma-separated tokens like
orders.read,labels.writeor justdefault.read. - Click Create.
- Trenvar shows you a keyId and bearerToken once. Copy them now and store securely.
Rotating a credential
- Open the credential.
- Click Rotate.
- 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.
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.
Creating a webhook endpoint
- Click Create Endpoint.
- Enter a label.
- Enter the target URL (e.g.,
https://your-app.com/webhooks/vectra). - Pick event types to subscribe to (comma-separated tokens like
orders.created,labels.created). - Click Create.
- 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
- From the endpoint detail, click Test Delivery.
- Pick an event type and paste a JSON payload.
- 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.
| Connector | What it does | How to set up |
|---|---|---|
| Shopify | Pulls 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 Online | Pushes invoices into QB. | Click Connect QuickBooks in integrations. OAuth flow. Then export per-invoice. |
| Resend | Sends transactional email. | Chapter 5. |
| Stripe | Card 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.
Platform Administration
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.
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.
The tenant record
| Field | Notes |
|---|---|
| tenant_id, name, plan | Identity. |
| status | pending_approval / active / suspended / rejected. |
| companySlug, taxId, address, domain | Tenant company info. |
| contactName, contactEmail | Primary contact. |
| ownerLoginUid, ownerLoginEmail | The provisioned admin user. |
| freePlatformAccess | If true, no platform billing. |
| subscriptionStatus, signupSource | Trial / paid / etc. |
| trialStartedAtMs, trialEndsAtMs | Trial window. |
| stripeCustomerId, autoChargeEnabled | Platform billing config. |
| majorModules | Map of which modules this tenant has. |
| nextInvoiceAtMs, currentPeriodStartAtMs/EndAtMs | Billing cycle. |
| userCount, roleCount, customerCount | Usage stats. |
Provisioning a tenant manually
- From the tenants list, click Create Tenant.
- Fill the company info (name, slug, address, contacts).
- Set plan and module bundle.
- Click Create Tenant.
- 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:
- active → suspended blocks access immediately.
- suspended → active restores it.
- Archiving hides it from the default list (for tenants that have churned).
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.
The major modules
| Key | Purpose |
|---|---|
| wms_core | WMS execution. |
| module_3pl | 3PL multi-customer features. |
| module_ground_ops | Ground transport extensions. |
| module_tms | Full TMS / dispatch / route plan. |
| module_crm | Sales CRM extension. |
| module_b2b_storefront | B2B 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.
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.
Operations & Support
Chapter 41 — Troubleshooting Common Issues
A short list of things that go wrong and what to do.
"My webhook deliveries are stuck"
- Open
/console/business/settings/webhooks/{endpointId}. - Look at the Deliveries tab. What status are they in?
- If queued with no movement: check Trenvar status page.
- If failed repeatedly: look at
lastErrorMessage. Common: TLS errors, 4xx from your endpoint, signature verification failure. - Use Test Delivery to send a payload now and observe.
- If your signing secret has been compromised or you can't decode payloads, Rotate Secret and update your receiver.
- dead_letter deliveries can be force-retried via the API once the underlying issue is fixed.
"An API credential leaked"
- Open
/console/business/settings/api-credentials. - Click Revoke on the leaked credential. Add a reason like "key exposed in repository on 2026-05-02."
- Create a new credential with the same scope.
- Update the consuming system with the new bearer token.
- Audit the access logs for the time window the leak was live.
"Shopify isn't syncing"
- Open the integration in
/console/customer/integrations(or business equivalent). - Check the last sync timestamp.
- Click Sync Now (POST
/api/integrations/shopify/sync). - If failing: check the Shopify Partner dashboard for revoked OAuth or expired credentials. Disconnect and reinstall if needed.
"My invoice is missing storage charges"
- Confirm the customer has a billing profile with
billable: true. - Confirm the inventory items have a
storageRuleId. - Confirm the storage rule is active and within its effective window.
- Re-run accrual for the period.
- On the draft invoice, click Append Accruals.
"Fulfillment pricing fell back to the default amount"
- Open the linked shipping label.
- Check that the parcels array is populated, with weight per parcel.
- If parcels are missing, the operator skipped weight at pack. The fix is process: train the team to enter weight every time.
- 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)
- Confirm: check the provider's status page.
- Check audit log for related throttle/error events.
- If sustained, post a notice to affected tenants (
/console/owner→ notices). - Disable auto-retry loops if they're aggravating the provider.
- Once the provider is back, resume retries; failed deliveries may need manual replay.
Webhook delivery backlog
- Open the affected webhook endpoint.
- Inspect the deliveries queue. How many are queued? failed?
- If your endpoint is the bottleneck, scale it before retrying.
- Use the API to retry in batches; avoid thundering-herd retries.
Credential leak
- Revoke the leaked credential immediately. (Section above for steps.)
- Rotate the webhook signing secret if there's any chance it was leaked too.
- Audit the platform audit log for unusual access during the leak window.
- If the leak was a Resend or Stripe key, rotate at the provider as well.
- Document the incident for compliance.
Replay storm
- Identify the source from the audit log throttle events.
- Disable the misbehaving endpoint or revoke the credential.
- Communicate with the integration owner.
- 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.
Quick Reference
Appendix A — Quick Reference: All Console Paths
Business Console (company_admin)
| Path | Screen |
|---|---|
| /console/business/ | Module switcher / dashboard |
| /console/business/settings/company | Company profile, branding |
| /console/business/settings/email | Email provider (Resend) setup |
| /console/business/settings/users | Manage users + roles |
| /console/business/settings/api-credentials | API keys |
| /console/business/settings/webhooks | Webhook endpoints |
| /console/business/wms/item-master | Item Master / SKUs |
| /console/business/wms/locations | Locations + capacity rules |
| /console/business/wms/handling-units | Handling units |
| /console/business/wms/fulfillment | Fulfillment orders |
| /console/business/wms/cycle-count | Cycle counts |
| /console/business/billing/services | Service catalog |
| /console/business/billing/pricing-rules | Pricing rules |
| /console/business/storage/accrual | Storage accrual runs |
| /console/business/storage/rules | Storage rules |
| /console/business/storage/aging | Storage aging report |
| /console/business/billing/tax | Tax regions |
| /console/business/billing/payments | Payments |
| /console/business/billing/exports | Billing exports |
| /console/business/dispatch/jobs | Dispatch jobs |
| /console/business/dispatch/tracking | Route plans + live tracking |
| /console/business/ground-ops/awb-check | AWB lookup / create |
| /console/business/comms/notices | Outbound notices |
Operations Manager
| Path | Screen |
|---|---|
| /console/ops-manager/pre-alert | Pre-alert queue |
| /console/ops-manager/receiving | Receiving manager view |
| /console/ops-manager/putaway | Putaway manager view |
| /console/ops-manager/inventory | Inventory lookup + adjustments |
| /console/ops-manager/fulfillment | Fulfillment manager view |
| /console/ops-manager/handling-units | Handling units |
| /console/ops-manager/locations | Locations |
| /console/ops-manager/pod | POD review + corrections |
Operator
| Path | Screen |
|---|---|
| /console/operator/locations | Default landing / scan hub |
| /console/operator/receiving | Receiving execution |
| /console/operator/putaway | Putaway execution |
| /console/operator/fulfillment | Pick & pack |
| /console/operator/inventory | Inventory (read) |
| /console/operator/shipments | Shipments |
| /console/operator/tools/fulfillment-scan | Manual scan entry |
Driver
| Path | Screen |
|---|---|
| /console/driver/jobs | Assigned jobs |
| /console/driver/pod | POD capture |
| /console/driver/tracking | Route plan view |
Customer Service
| Path | Screen |
|---|---|
| /console/customer-service/customers | Customer list |
| /console/customer-service/cases | Cases |
| /console/customer-service/notices | Notices |
| /console/customer-service/pre-alert | Pre-alerts (read) |
| /console/customer-service/shipments | Shipments (read) |
| /console/customer-service/pod | POD (read) |
Accounting
| Path | Screen |
|---|---|
| /console/accounting/billing | Billing dashboard |
| /console/accounting/billing | Invoices |
| /console/accounting/reports | Reports + exports |
Customer Portal
| Path | Screen |
|---|---|
| /console/customer/inventory | Inventory visibility |
| /console/customer/orders | Orders + tracking |
| /console/customer/ship-now | Ship-now wizard |
| /console/customer/invoices | Invoices + self-pay |
| /console/customer/integrations | Connect Shopify, etc. |
Owner Console (system_admin)
| Path | Screen |
|---|---|
| /console/owner/tenants | Tenant list + lifecycle |
| /console/owner/plans | Plans + subscriptions |
| /console/owner/modules | Module enablement + pricing |
| /console/owner/audit | Platform audit log |
| /console/owner/analytics | Financial rollups |
Appendix B — Permissions Catalog
Permissions are grouped by domain. A wildcard * grants everything in the domain.
| Domain | Examples |
|---|---|
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.
End of guide · Trenvar User Guide v1.0 · May 2026
For corrections or additions, please file a case at /console/customer-service/cases.