Products & inventory
The Products module is the inventory catalogue and real-time stock tracker at the heart of EMS. Products are organised in a four-level hierarchy — Consignee, Category, Brand, and Product Name — with flavour variants at the leaf level. Every unit that enters the warehouse through Receiving flows into the inventory calculation automatically, so what you see on screen always reflects what is physically on the floor.
Product hierarchy
EMS organises your entire product catalogue into four collapsible levels. Each level rolls up totals (units and litres) from the levels below it, so you can see aggregate inventory at any granularity:
- Consignee (e.g. "Vape Co Ltd.")
- Category (e.g. "Disposables")
- Brand (e.g. "CloudBar")
- Product Name (e.g. "CloudBar 5000")
- Blueberry Ice - 15 mL - 20 mg
- Mango Tango - 15 mL - 20 mg
- Watermelon - 15 mL - 10 mg
- Product Name (e.g. "CloudBar 5000")
- Brand (e.g. "CloudBar")
- Category (e.g. "Disposables")
The six standard categories are:
- Disposables — single-use vape devices with integrated liquid
- Pods — replaceable pod cartridges
- E-Liquid — bottled nicotine liquid
- Batteries — standalone device batteries
- Packaging — boxes, sleeves, and outer cartons (non-stampable)
- Promotional Material — point-of-sale displays, signage, samples (non-stampable)
Click any level in the tree to expand or collapse it. The rollup totals at each level update in real time — if a receiving session adds 500 units of Blueberry Ice, the Brand, Category, and Consignee totals all increment immediately.
Typing a flavour name or brand in the search field at the top of the Products page auto-expands the tree to the matching nodes, so you don't need to click through four levels manually.
Adding a product
To register a new product in the catalogue:
- Click the + New Product button in the top-right corner of the Products page.
- Select a consignee (optional). If you leave this blank the product lands in the "Unassigned" group. You can reassign later, but it is cleaner to assign now.
- Enter the brand. As you type, a datalist offers suggestions from existing brands in your catalogue. Selecting an existing brand keeps naming consistent and avoids duplicates like "CloudBar" vs "Cloud Bar".
- Enter the product name. The suggestions list filters by the brand you selected, so you'll see only names already associated with that brand. If you're adding a genuinely new product, type the name fresh.
- Set defaults:
- Default mL — the liquid volume for this product line (e.g. 15 mL). Individual variants can override this.
- Default nicotine — the nicotine concentration in mg/mL. Maximum allowed is 20 mg to comply with Canadian regulations.
- Select a category from the dropdown (Disposables, Pods, E-Liquid, Batteries, Packaging, or Promotional Material).
- Add variant rows. Each variant requires at minimum a flavour name. The mL and nicotine fields default to the product-level values you set above, but you can override them per variant. Add as many rows as you need — one per flavour or flavour/strength combination.
- Click Save. EMS creates one product record per variant. A product with three flavour variants becomes three records sharing the same brand and product name.
Under the hood, each flavour+mL+nicotine combination is a distinct inventory record. This is what lets EMS track stamp allocations, aging, and production at the variant level rather than lumping everything under one product name.
Inventory calculation
Every variant's inventory is calculated from three sources:
Available inventory equals imported units plus adjustments minus produced units.
Unstamped inventory equals imported units plus adjustments minus units used in completed production.
- Imported — the sum of good units from all received boxes containing this variant. This traces back to specific shipments and individual box records created during the Receiving flow.
- Adjustments — the net total of manual inventory adjustments (positive or negative) made through the quick-adjust feature.
- Produced — the total units consumed by completed production orders. When a PO is verified and closed, the produced units are deducted from available inventory.
The Available count tells you how many units of this variant are physically in the warehouse and eligible for production orders. The Unstamped count tells you how many of those units have not yet been through a stamping run — this is the number that drives your production planning.
Each source is fully traceable. Click the imported count to see which shipments and boxes contributed. Click the adjustments count to see the adjustment log with reasons and operators. Click the produced count to see which POs consumed inventory.
Stamp breakdown
For categories that require excise stamps (Disposables, Pods, E-Liquid, and Batteries), each variant shows a per-region stamp count. The regions tracked are:
- Federal — the base Canadian federal excise stamp
- Ontario — Ontario provincial stamp
- Alberta — Alberta provincial stamp
- Manitoba — Manitoba provincial stamp
- Quebec — Quebec provincial stamp
The stamp counts come from completed production orders. When a PO targeting "Ontario" is verified, the Ontario stamp column for each variant in that PO increments by the produced quantity. This gives you an at-a-glance view of your stamp distribution across regions without needing to open individual POs.
The stamp breakdown shows how many stamps have been applied to this variant, not how many blank stamps you have in stock. For blank stamp inventory, see the Stamp Management section in Settings.
Aging alerts
EMS tracks how long inventory has been sitting in the warehouse and flags variants that are getting stale:
- Yellow alert at 60+ days — the variant has been in the warehouse for at least 60 days since its earliest source shipment was received. This is a heads-up to prioritise it in upcoming production orders.
- Red alert at 90+ days — the variant has been sitting for 90 days or more. At this point it should be your top production priority. Extended storage increases risk of damage, regulatory complications, and customer dissatisfaction.
The age is calculated from the earliest source shipment date — meaning the oldest batch of that variant still in unstamped inventory. If you received 200 units on January 1st and another 300 on March 1st, and none have been produced, the age is calculated from January 1st.
Once the oldest batch is consumed by production, the age recalculates against the next-oldest remaining batch. This means aging alerts naturally clear as you work through older stock.
The aging system is designed around a first-in-first-out principle. When creating production orders, prioritise variants with yellow or red aging alerts. The Products page sorts aged variants to the top by default to make this easy.
Quick inventory adjustment
Sometimes the physical count doesn't match the system count — a box was miscounted during receiving, stock was damaged after the fact, or a sample was pulled for testing. The quick-adjust feature lets you correct the record without going back through receiving.
- Find the variant in the Products list and click the slider icon on its row.
- Enter a positive number (e.g. +12) to add units, or a negative number (e.g. -5) to remove them.
- Enter a reason in the text field. This is required — EMS won't save an adjustment without an explanation.
- Click Confirm.
The adjustment is recorded immediately as an inventory adjustment record with a full audit trail: the operator, timestamp, quantity change, reason, and the resulting new inventory total. These records are permanent and cannot be deleted — if you make an adjustment in error, create a second adjustment to reverse it.
After a physical cycle count, use quick-adjust to reconcile any discrepancies. The reason field is your documentation: "Cycle count Zone A — found 3 extra units behind shelf" gives auditors the context they need.
Editing a product group
To edit a product's details, click the pencil icon on any variant row. The edit dialog lets you change the brand name, product name, default mL, default nicotine, and category.
Changes apply to all variants in the product group. If you change the brand from "CloudBar" to "CloudBar Pro", every flavour variant under that product name updates. This is intentional — the brand and product name are group-level attributes, not per-variant attributes.
To edit a single variant's flavour, mL, or nicotine independently, use the variant-level edit controls within the product detail view.
If you rename a product to a brand+name combination that already exists in the catalogue, EMS detects the collision and offers you a choice: cancel the rename, or proceed with a merge. See the next section for how merges work.
Merge and rename
When a rename results in a collision with an existing product group, EMS offers a merge. Merging combines two product groups into one. Here is exactly what happens:
- Variant matching. EMS compares the variants in both groups by flavour + mL + nicotine. Variants that match on all three fields are considered duplicates.
- De-duplication. For duplicate variants, EMS keeps a single record and combines the inventory totals. Source shipments and adjustment logs from both sides are preserved and repointed to the surviving record.
- Non-matching variants are moved. Variants that exist in the source group but not the target group are simply moved over — they become part of the target product group with all their data intact.
- Reference repointing. All references in shipments, production orders, batch IDs, and inventory adjustments that pointed to the old product records are updated to point to the merged records. Nothing is lost.
- Rename history. EMS logs the merge in the product's history: "Merged from [old brand + name] into [new brand + name] by [operator] at [timestamp]".
Once a merge completes, it cannot be undone. The original product group no longer exists, and all references have been repointed. Double-check the brand and product name before confirming a merge. If you are unsure, cancel and rename to something unique instead.
Non-stampable categories
Two categories are excluded from stamp calculations entirely:
- Packaging — boxes, sleeves, outer cartons, and other packaging materials. These items are tracked in inventory (imported, adjusted, produced) but never appear in stamp breakdowns, production stamp counts, or excise duty calculations. They exist in the catalogue so you can track packaging stock alongside finished goods.
- Promotional Material — point-of-sale displays, shelf talkers, branded signage, and sample packs. Like Packaging, these are inventory-tracked but stamp-exempt. Promotional Material records get an additional sub-type field where you can classify items (e.g. "POS Display", "Banner", "Sample Kit") for filtering and reporting.
All other categories — Disposables, Pods, E-Liquid, and Batteries — are stampable. Products in these categories are included in stamp breakdowns and are eligible for production orders that require excise stamp application.
This sometimes surprises new operators. Under Canadian excise regulations, standalone vape batteries are subject to excise duty and require stamps. EMS treats them the same as liquid-containing products for stamp tracking purposes.
Best practices
- Seed the product catalogue before creating shipments. When you register products before the first shipment arrives, the Receiving flow can match scanned boxes to existing products instead of creating ad-hoc entries. This eliminates duplicates and keeps the hierarchy clean from day one.
- Use consistent brand naming. "CloudBar", "Cloud Bar", and "Cloudbar" will create three separate brand groups in the hierarchy. Use the datalist suggestions when adding products to stay consistent, and merge promptly if duplicates slip through.
- Assign consignees early. Products without a consignee land in the "Unassigned" group, which makes filtering by customer impossible. Assign the consignee at product creation time rather than cleaning up later.
- Check aging alerts weekly. Make it part of your Monday routine: open the Products page, sort by age, and review any yellow or red flags. Create production orders for the oldest stock first. A 5-minute weekly check prevents 90-day inventory from stacking up.
- Document every adjustment. The reason field on quick-adjust is your audit trail. "Short 3 units" is not helpful to a future auditor. "Cycle count 2026-01-15 Zone B — physical count 47, system showed 50, difference -3" tells the full story.
- Review merges carefully. A careless merge can combine two genuinely different products. If "CloudBar 5000" and "CloudBar 5000 Pro" are different devices, renaming one to match the other will merge their inventory and stamp histories permanently. When in doubt, keep them separate.
