Production scheduling & stamp runs

Production is the heart of EMS — the module where excise stamps actually get applied to inventoried units. This guide walks through scheduling a PO, executing the run, verifying counts, and completing — with stamp consumption tracked per region (Federal, Ontario, Quebec, Alberta, Manitoba) automatically.

Two modules: Production Orders vs Production

EMS splits production into two related modules:

Both read and write the same production order data — they're two views of the same workflow. The split exists because supervisors and stampers have different jobs and need different ergonomics.


PO status lifecycle

How a production order moves through the system

Open (created, not yet started) → In Production (scanner is working through boxes) → Pending Verification (awaits second-user sign-off) → Completed (stamps consumed, outbound auto-created; status freezes for audit purposes)

POs can also be Cancelled at any pre-completion stage; this releases their reserved units back to availability and reverses any provisional stamp reservations.


Creating a Production Order

From Production Orders → + New PO. The form is structured around the source shipment:

  1. Pick the source shipment — only shipments in Inventoried status are selectable.
  2. Optional PO number — auto-generated if you leave it blank. Custom numbers must be unique within the consignee.
  3. Add lines: one row per (product, region) combination, with quantity. EMS shows live availability per product on the right of each row.
  4. Optional urgent toggle — promotes the PO to the top of the next available production day.
  5. Optional notes — surfaces in the production workspace for the stamper.
  6. Click Save PO. It enters Open status and appears on the production calendar (unscheduled).

How availability is calculated

The available quantity for each product on the source shipment is calculated by taking the total good quantity across all received boxes for that product, then subtracting the quantities already allocated to any of this shipment's existing production orders (whether open, in production, pending verification, or completed).

Three things to notice:

Why this matters

Before EMS v2.5, availability was based on the raw quantity regardless of damage. A 1000-unit shipment with 100 damaged would surface 1000 available, then run short of stamps when the run actually executed. v2.5 fixed this — now allocation respects damage from the start. See v2.5.0 release notes.


The production calendar

The Production Orders page leads with a calendar showing scheduled POs. Defaults to the current week; toggle to month view for capacity planning.

Daily capacity caps

Each weekday has a units stamped cap so you don't oversubscribe the line. The cap is configurable per warehouse in Settings → Production. When you schedule a PO that would exceed the cap:

Auto-overflow handling

For very large POs (e.g. 30,000 units when daily cap is 12,000), EMS can split the PO across consecutive days automatically. From the PO scheduling dialog tick Auto-split if over capacity and the PO becomes a parent with N child PO segments scheduled across N days.

Auto-split example

A 30,000-unit PO for Norwood (Ontario) with a daily cap of 12,000 would be split into three segments: the first two days handle 12,000 units each, and the third day handles the remaining 6,000 units.

Each segment runs as its own production order; the parent rolls up status (parent shows Completed only when every segment is). Stamp deduction happens per segment per day.


Executing a stamp run

On production day, the stamper opens the Production module (workspace, not Production Orders). The page shows:

Click Start Run on the active PO. The PO moves to In Production and the workspace switches to scanning mode:

  1. Each box that needs stamping in this PO is queued in the box list.
  2. Scan the box → its contents and the per-region stamp count are shown.
  3. Stamp it physically; click Confirm when done.
  4. The box leaves the queue; live counters update.
  5. Repeat for every box in the PO.

Stamp deduction per region

EMS maintains a per-region stamp ledger that tracks, for each region (Federal, Ontario, Quebec, Alberta, Manitoba), how many stamps have been received, how many have been used, and what the current balance is.

Example stamp balances

Federal — 30,000 received, 12,000 used, 18,000 remaining
Ontario — 20,000 received, 8,000 used, 12,000 remaining
Quebec — 10,000 received, 4,000 used, 6,000 remaining
Alberta — 7,000 received, 3,000 used, 4,000 remaining
Manitoba — 5,000 received, 2,000 used, 3,000 remaining

When you Confirm a box during a run, EMS deducts the appropriate stamps based on the PO's region attribution and the box's unit count. If you'd run short, EMS warns you before the deduction.

Insufficient stamps warning

If you need more stamps than are available (for example, you need 100 Ontario stamps but only 87 remain), EMS will give you three options: cancel the confirmation, skip the box, or override and proceed (which is logged for audit purposes).

The Stamp Orders module is where you log incoming stamp inventory; see the Stamp Orders guide for that flow.

Variant-aware scanning

A "flavour" alone isn't enough — Blueberry Raspberry 10mg and Blueberry Raspberry 20mg are different products with different excise treatment. v3.5.5 surfaces mL + mg as first-class data everywhere the operator looks:

When you scan a box whose flavour matches the PO but in a different variant, EMS shows a Variant mismatch chip on the picker card with an explanation line — for example: "PO has Grape Ice but in a different variant — 30mL · 20mg. This box is 30mL · 10mg, which the customer didn't request." The operator can pick a different flavour, change the PO via an admin edit, or clear the filter to see all lines.

Sticky stamp region

Production lines typically stamp one region at a time — Ontario for a morning batch, Federal in the afternoon. The stamp-region dropdown on the box-scan form now remembers the last region you used on this PO and pre-selects it on every subsequent box. Operators can still override per box from the dropdown; the sticky default just saves the click that 99% of scans don't need.

Brand filter on mixed shipments

A multi-brand shipment may have two brands using the same physical box numbers (Orbito #1–50 and Linvo #1–50). The Filter by brand dropdown above the box-scan input narrows the candidate set: scan "10" and EMS resolves it to the Orbito box, not the Linvo box. A mixed box that carries both brands shows only the filter-matched lines, with a notice that says how many other-brand lines are hidden and how to see them (clear the filter).


Building skids during a run

As you confirm boxes, they stage into the Current Skid panel on the right. When you've packed a full skid (or finished a run), click Complete Skid. EMS commits the staged boxes, assigns them a skid label (SK-PO-NN), accounts the stamps, and writes the put-away location.

Add to existing or new

If the PO already has at least one completed skid and you've staged a small remainder (e.g. five boxes after a forty-five-box skid), the Complete Skid button opens a chooser:

Skid numbers reuse deleted slots. If you delete SK-XX-02 out of 01/02/03, the next completion goes to 02 — not 04 — and labels never collide with an existing skid.

Multi-select transfer between skids

Open a completed skid's detail modal. Each box card has a checkbox + a "Select all" toolbar. Tick the boxes you want to move, click Transfer Selected, pick a destination (existing skid on this PO, or a brand-new one) + a reason once, and the batch transfers. Audit trail records one amendment entry per box on both source and destination skids, plus a single po:skid-transfer-batch event on the shipment.


Verification step

When the last box in a PO is confirmed, the PO moves to Pending Verification. The stamper cannot complete it themselves — a second user must verify. This is the equivalent of a four-eyes principle for excise compliance.

The verifier:

  1. Opens the PO from the queue.
  2. Reviews the actual scanned-and-stamped count vs the original estimate. Differences are highlighted.
  3. If actual < estimate (some boxes skipped), reduces the stamp deduction to match. EMS releases the unused stamps back to inventory.
  4. If actual = estimate, just clicks Verify & Complete.
  5. If actual > estimate, EMS rejects — you can't stamp more than the PO authorized. The verifier must edit the PO to increase the line, which requires a re-verification.

The verify table also shows mL and Nic columns alongside Brand / Product / Flavour — same variant signal as the box-scan dropdown, so the verifier confirms the correct variant got stamped before approving.

Found-Damaged column

Verification distinguishes three damage types on every line:

The Found-Damaged total sums the receiving-stage damage records (damageType: 'found-damaged') attributed to each scanned production box. It's persisted on Approve so the audit trail keeps the distinction.


Completion & auto-outbound generation

On Verify & Complete:

The PO is now read-only. You can still view its history and reports, but no edits.


Customer-portal PO requests

Multi-tenant deployments give consignees a portal where they can submit PO requests directly:

  1. Customer logs into the portal, picks an inventoried shipment.
  2. Allocates quantities by region × variant — the request grid shows mL + mg as separate columns so 10mg and 20mg Blueberry Raspberry submit as distinct lines, not a merged "Blueberry Raspberry" total. Live good-qty availability per variant prevents over-allocating damaged units.
  3. Picks a production date from the calendar slot picker (only weekdays, only days under capacity).
  4. Optionally fills in a Requested Delivery Date and free-text Delivery Details (see below).
  5. Submits the request. EMS waits for the server to confirm the write before showing success — see the durability callout below — then creates a customer-request record with Pending status.

Admins see incoming requests in the Production Orders page under "Pending Customer Requests". They can:

The customer's portal updates in real-time at every step. The admin Customer Requests inbox has an expandable per-line panel showing Brand / Product / Flavour / mL / Nic / Region / Qty for every line, so the reviewer can confirm which variant the customer ordered before approving.

Server-confirmed submission (3.5.5.038)

Submitting a PO now calls the API directly and blocks on the server response. If the write doesn't reach the server, the customer sees a red error toast with the specific failure (HTTP code, network timeout, etc.) instead of a misleading "submitted!" message. The receipt PDF is only generated on confirmed server success, and the draft stays in the local cache for retry. No more PO requests that "looked submitted" but never reached the admin inbox.

Requested delivery date & details

Two optional fields on the PO request form let the customer specify delivery up front:

Both surface on the admin Customer Requests inbox (a blue truck chip) and on the Customer PO Review approval screen (a dedicated panel) — so admins approve with delivery context in hand instead of chasing customers for it after the fact.


Best practices