Boxes & Fulfillment
Boxes are outbound packing units — one Box = one customer-bound carton. State machine: open → sealed → shipped → delivered, forward-only. Pack items off the warehouse floor with your phone (scan the item → enter qty → save), seal when done, print a packing slip + 4×6" thermal label, ship. Backend writes a StockMovement per pack/unpack so inventory and audit stay in lockstep. Lives at Inventory > Boxes.
Steps
- On web (Inventory > Boxes) click "+ Create box" — pick a customer (optional), link to a PO (optional, for inbound→outbound traceability), give it a note, save. Auto-box-number ("BOX-YYMM-NNN") and QR are generated.
- On mobile (Inventory > Boxes > the box) tap "Pack (scan)". Scan an item, type qty, save. Repeat. The screen lists what's packed so far.
- When the box is done, tap "Seal Box". Items can no longer be added or removed. Sealed boxes carry a sealedAt timestamp.
- Tap "Mark Shipped" (or do it from web). Then "Mark Delivered" once the customer confirms receipt. Forward-only — no "unship."
- From the box detail page, click "🏷 Print Label" for a 4×6" thermal label (centered QR + big box number + customer name + accent band), or "📄 Packing Slip" for a US-Letter slip with FROM/TO + items + totals. Both render server-side and return a 1-hour presigned R2 URL.
- "✉ Email Slip" opens a compose modal pre-filled with the customer email, subject, and body. The PDF is attached automatically. Sandbox orgs intercept the send so test workflows can't leak to real customers.
Good to know
- Multi-box shipments: when a single PO spawns multiple boxes, the label automatically reads "BOX N OF M" in brand accent color below the box number. Position is the createdAt-ordered index among PO siblings.
- Packing decreases inventory immediately, not on seal. Unpacking (only available while open) restores it. This keeps quantity-on-hand accurate the moment the picker scans an item.
- Open boxes can be deleted; the deletion reverses every pack as a stock movement so inventory returns to its pre-box state. Sealed/shipped/delivered boxes are immutable and can't be deleted.
- Over-packing (packing more than on-hand) is allowed — real warehouses sometimes do this intentionally (consign, demo unit, etc.). The UI doesn't warn but inventory can go negative.
Example: A subscription-box company ships 200 boxes a week. The packing line scans each item into the box on a phone, seals when full, prints a 4×6" thermal label, and slides the carton onto the conveyor. Customer support gets the packing slip emailed automatically once shipped, attached as PDF — no manual export, no missed sends.
Troubleshooting
Print Label button doesn't generate a PDF
Could be R2 outage, missing brand logo URL, or the box has no items.
Fix: Check Settings > Customize > Brand Colors has a primary color set. Try again. If R2 is down (rare), the error response surfaces it explicitly.
Email Slip says "Customer has no email on file"
The box's linked customer Contact has no email field, or the box has no linked customer (ad-hoc shipment).
Fix: Open the modal anyway — there's a "To" override field. Type the recipient address, send. Or edit the Contact to add an email.
Packing slip cuts off after item 28
Phase 4 single-page guard. Phase 5 added pagination — if you're still seeing this you may be on a stale render.
Fix: Re-trigger Packing Slip. The current renderer paginates cleanly with continuation headers + page numbers.
Plans
Enterprise suite required.
Related
- Inventory & Fulfillment — Overview
- Inventory Documents — PDFs & Email
- Visual Lookup AI