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:

Product hierarchy (four levels)
  • 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

The six standard categories are:

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.

Use the search bar to jump deep

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:

  1. Click the + New Product button in the top-right corner of the Products page.
  2. 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.
  3. 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".
  4. 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.
  5. 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.
  6. Select a category from the dropdown (Disposables, Pods, E-Liquid, Batteries, Packaging, or Promotional Material).
  7. 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.
  8. 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.
One record per variant

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:

How inventory is calculated

Available inventory equals imported units plus adjustments minus produced units.

Unstamped inventory equals imported units plus adjustments minus units used in completed production.

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:

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.

Stamps are consumption-side, not supply-side

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:

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.

Produce oldest stock first

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.

  1. Find the variant in the Products list and click the slider icon on its row.
  2. Enter a positive number (e.g. +12) to add units, or a negative number (e.g. -5) to remove them.
  3. Enter a reason in the text field. This is required — EMS won't save an adjustment without an explanation.
  4. 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.

Use adjustments for cycle counts

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.

Collision detection

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:

  1. Variant matching. EMS compares the variants in both groups by flavour + mL + nicotine. Variants that match on all three fields are considered duplicates.
  2. 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.
  3. 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.
  4. 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.
  5. Rename history. EMS logs the merge in the product's history: "Merged from [old brand + name] into [new brand + name] by [operator] at [timestamp]".
Merges are irreversible

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:

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.

Batteries are stampable

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