Receiving & box-scan
Receiving is where your warehouse takes physical custody of every unit. EMS tracks it box-by-box with granular damaged and missing counts per line, multi-skid building in parallel, and a strict two-phase gate so a manager confirms physical arrival before the floor team can start scanning.
The two-phase gate
EMS separates "the truck arrived at our dock" from "we're starting the receiving flow". This matters because:
- Managers need a checkpoint where they sign off that the freight is physically here, undamaged at the macro level, and ready to enter the warehouse
- The receiving flow needs to be locked once a box has been scanned, so confirm-received acts as the no-going-back signal
So a shipment in Ready for Receiving status shows up under "Arrived — Confirm Receipt" with an action button. Until you click Confirm Received at Warehouse, you cannot start the box-scan flow.
Ready for Receiving (not yet confirmed) → click Confirm Received at Warehouse → Ready for Receiving (confirmed) → click Start Receiving → Received (scanning in progress) → click Finish Receiving (once every box is on a completed skid) → Inventoried
The box-scan flow
Once the shipment is confirmed and you click Start Receiving, you land in the receiving workspace. The page is split:
- Box Scanner (left) — a scan / lookup field, the confirm card for the most recently scanned box, and a Current Skid list of boxes already accepted
- Skid Builder (right) — zone + slot pickers, capacity hints, the Complete Skid action, and the list of completed skids
For each box:
- Scan the QR / barcode, or type the box number, then click Lookup.
- The confirm card shows every product line in the box per the packing list. Each line gets:
- The product name + flavour + mL + nicotine
- An editable Damaged input
- An editable Missing input
- An auto-calculated Good units display (= quantity − damaged − missing)
- Adjust as needed for what the box actually contains.
- Click Accept to Skid. The box appears in Current Skid below.
Damaged + missing — what gets stored
When you Accept a box with damage, EMS stores the following information for each product line in that box:
- Product — which product the line refers to (for example, Blueberry 30ml)
- Total quantity — the number of units expected according to the packing list (stays unchanged)
- Damaged quantity — the number of units that are physically damaged
- Missing quantity — the number of units that were expected but are absent
- Good quantity — calculated automatically as total minus damaged minus missing
This data is the contract between Receiving and every downstream module:
- Production reads the good quantity when calculating availability — damaged units don't get allocated to PO runs
- Customer portal shows the good quantity as available inventory, so customers don't request POs against damaged stock
- Reports can show packing-list quantity (what arrived) or good quantity (what's sellable) — both are first-class
If the driver flagged a box at pickup (see Shipping → Damage), the receiving page shows a red banner naming the flagged box numbers, and asks you to verify those boxes first before accepting anything else to a skid.
Editing a box already on a skid
Made a typo or found new damage after scanning? Click the Edit pencil on the box's row in Current Skid. The edit form mirrors the scan UI exactly:
- Product dropdown (lets you swap the variant if scanned wrong)
- Quantity field
- Damaged input (pre-filled from the damaged count)
- Missing input (pre-filled from the missing count)
- Good units display (recalculated live as you type)
- A trash icon to remove the row entirely
- An "+ Add item" button to add another line if the box turns out to have more variety than the packing list expected
When you click Save Changes, the box stays on the same skid but its contents update everywhere — the skid product summary, the box's history, and downstream availability calculations.
If any line on a box has damage or missing units, the box's row in Current Skid switches from sage-green to alert-red, with a chip showing how many good units out of the total. Per-line chips show the flavour name alongside the good-versus-total count for affected lines, and warning badges sum up the total damaged and missing units.
Multi-skid building in parallel
Some shipments arrive on multiple skids and you'll receive them in parallel rather than one-after-the-other. The Skid Builder supports this:
- Each box you Accept goes onto the currently selected skid
- Click the skid number in the Skid Builder to switch which skid you're building
- The Current Skid list updates to show only the boxes on that skid
- You can have any number of in-progress skids open at once
Zone & slot assignment
Before completing a skid, pick where it goes:
- Zone — A, B, C, D, F, or H (configured per warehouse in Settings)
- Slot — auto-suggested as the next available slot in the zone, or pick manually
The Skid Builder shows live next-available info: "Next available in Zone A: A1-2 — confirm or override above". The slot suggestion respects your warehouse's racking layout (rows × columns × shelves) which is configured per zone.
If a slot is in use, EMS won't let you double-book — pick a different slot or a different zone.
Completing a skid
When every box for the skid is in Current Skid:
- Confirm the zone + slot.
- Click Complete Skid (N boxes).
- The skid moves to the Completed Skids list with a generated SKD-NNNN-NN identifier.
- You can Print Label for the skid (4×6 thermal-printer-friendly PDF) or remove it back to Current Skid if you made a mistake.
SKD identifiers are unique per shipment — even if you delete a completed skid and rebuild, the new skid gets the next number, never a reused one.
Damage photos
For any box with damage / missing flagged, you can attach photos as forensic evidence. From the box edit form:
- Click Add Photo in the Damage Photos section.
- On mobile this opens the camera; on desktop it opens the file picker.
- The photo is stored in IndexedDB-backed BlobStore (so it doesn't bloat localStorage), with a metadata reference on the box record.
- Photos can be removed individually if you re-shoot a better angle.
Photos surface in:
- The box's history tab (with operator and timestamp)
- The shipment's chain-of-custody report
- Damage-specific reports for insurance / supplier claims
Finishing receiving
The Finish Receiving button at the bottom of the workspace stays disabled until every box in the shipment is on a completed skid. The disabled state shows you exactly what's blocking -- for example, how many boxes still need scanning and how many are sitting on the current skid waiting to be completed.
Once you click Finish Receiving:
- Shipment status moves from Received to Inventoried
- Every box's current location is set to its skid's zone and slot
- The shipment becomes available to Production for PO creation
- An entry is appended to the shipment's history with the operator
- Customer portal updates in real-time (cross-tab sync)
Flagged-at-pickup boxes
If the driver tagged any boxes during pickup, the receiving page shows a prominent red banner at the top listing the flagged box numbers and asking you to re-open and inspect each one before accepting it to a skid.
Damage flagged at pickup -- verify 3 boxes (for example, boxes #042, #043, and #050). Re-open and inspect each flagged box before accepting to skid.
Each flagged box number is a chip you can click to jump straight to that box. EMS reminds you to verify them but doesn't force you — your operator can decide whether driver-tagged damage was actual or just over-cautious.
Best practices
- One operator per skid. Multi-skid in parallel is fine for a team, but each skid should have one operator scanning to keep accountability clean. EMS logs the user on every Accept, and audit reports surface any skid with more than one user.
- Always set damaged + missing at scan time, not afterward. Edit-after-the-fact is supported but slower, and downstream production sees the wrong availability until you save the edit.
- Photograph damage liberally. Storage is cheap; supplier disputes are expensive. Attach a photo for any damaged box even if the damage looks small.
- Don't reuse skid numbers. If you delete a skid, EMS issues a new SKD identifier on rebuild — don't try to manually re-mint the old one. The audit log relies on identifier uniqueness.
- Configure your zones first. The slot auto-suggest only works as well as your zone configuration in Settings. Take 20 minutes during onboarding to map your real racking layout — it pays off immediately and forever.
