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:
- Production Orders — the planning surface. Create POs, schedule them on the calendar, edit lines and quantities, see capacity. This is where supervisors live.
- Production — the execution surface. The actual workstation view: pick today's PO, scan boxes through the stamping line, watch real-time stamp deduction, verify, sign off.
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
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:
- Pick the source shipment — only shipments in Inventoried status are selectable.
- Optional PO number — auto-generated if you leave it blank. Custom numbers must be unique within the consignee.
- Add lines: one row per (product, region) combination, with quantity. EMS shows live availability per product on the right of each row.
- Optional urgent toggle — promotes the PO to the top of the next available production day.
- Optional notes — surfaces in the production workspace for the stamper.
- 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:
- It's based on the good quantity, not the raw quantity — damaged and missing units don't count toward availability
- It subtracts ALL non-cancelled POs (Open, In Production, Pending Verification, Completed) — so you can't double-allocate the same units
- If receiving hasn't started yet (no boxes scanned), it falls back to the packing-list quantities so PO planning can happen pre-arrival
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.
- Each weekday is a slot with a daily capacity cap (configurable in Settings — default 12,000 units / day across all POs)
- POs appear as colored chips on their scheduled day, color-coded by region
- Drag and drop a PO between days to reschedule
- Click a day to see all POs scheduled for it
- Calendar tiles are read-only after v2.5 — clicking surfaces info but doesn't navigate
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:
- The day's tile gets a warning border
- A toast warns "Day capacity exceeded by N units"
- You can either reduce the PO, move part of it to another day, or accept and let auto-overflow handle it
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.
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:
- Today's queue, ordered by drag-sequence then time
- The currently-active PO at the top with a Start button
- Live stamp counters per region for the day
Click Start Run on the active PO. The PO moves to In Production and the workspace switches to scanning mode:
- Each box that needs stamping in this PO is queued in the box list.
- Scan the box → its contents and the per-region stamp count are shown.
- Stamp it physically; click Confirm when done.
- The box leaves the queue; live counters update.
- 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.
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.
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:
- Flavour dropdown on the box-scan form — every option reads Flavour — Brand · 30mL · 20mg so you can't pick the wrong variant by mistake.
- Allocation cards on the right of the production workspace — each card header includes the variant chip, so the operator stamping a 10mg run never confuses it with the 20mg row above.
- Mixed-box picker — when a single physical box carries multiple flavours, each row shows the variant inline.
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:
- Create new skid — pick zone + slot, commit as
SK-PO-NN+1(the default). - Append to existing skid — each existing skid shows label + box count + zone/slot. Click one to top it up; EMS keeps that skid's zone/slot, rolls up damage/missing/stamped counters across the merge, and logs a
po:skid-extendedevent.
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:
- Opens the PO from the queue.
- Reviews the actual scanned-and-stamped count vs the original estimate. Differences are highlighted.
- If actual < estimate (some boxes skipped), reduces the stamp deduction to match. EMS releases the unused stamps back to inventory.
- If actual = estimate, just clicks Verify & Complete.
- 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:
- Damaged — units damaged during production (the operator caused it). Counts against variance.
- Missing — units that didn't physically arrive. Counts against variance.
- Found Damaged — units that were already damaged on arrival (supplier or transit damage flagged during receiving). Does not count against variance — the production line shouldn't be penalised for damage it inherited.
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:
- PO status moves from Pending Verification to Completed
- Stamp inventory is permanently deducted
- An audit-log entry captures the verification
- EMS automatically creates Outbound records grouped by consignee — one outbound per consignee whose PO completed today
- The customer (if portal-enabled) sees their PO move to Completed in real time, and the new outbound appears in their dispatch view
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:
- Customer logs into the portal, picks an inventoried shipment.
- 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.
- Picks a production date from the calendar slot picker (only weekdays, only days under capacity).
- Optionally fills in a Requested Delivery Date and free-text Delivery Details (see below).
- 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:
- Approve — converts the request to a real PO scheduled on the requested date
- Modify — propose changes (different date, reduced quantity); the customer reviews
- Reject — with a required reason that surfaces in the customer's portal
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.
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:
- Requested Delivery Date — when they want the finished stock delivered (leave blank for "flexible").
- Delivery Details — short free-text for the address, carrier, or special instructions (e.g. "deliver to dock B, call on arrival", "pickup by our courier on Friday").
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
- Schedule capacity-balanced weeks. Don't pile every Monday with POs and leave Friday empty — spread the load. The drag-and-drop calendar exists to make balancing fast.
- Use the urgent toggle sparingly. If everything is urgent, nothing is. EMS's queue ordering respects urgency, so abusing it just shifts the queue.
- Verify same-day, never next-day. Verification is the audit gate. Same-day verification keeps fresh memory of any anomalies; next-day verification means you're rubber-stamping.
- Check stamp inventory before scheduling. The Stamp Orders dashboard shows live ledger balances. If Ontario stamps are at 4,000 and a customer wants a 5,000-unit Ontario PO next week, log a stamp re-order now — not the morning of.
- For multi-day overflow POs, communicate the schedule to the customer. The portal shows the parent PO and child segments separately, so customers can see exactly which day each chunk completes — but a heads-up email avoids surprises.
