Field ReferenceInventory
Batch-firstTTB-awareRev. 2026.06
Manual / Core / Inventory

Inventory

Inventory is what you have on hand right now — every drum of base, every case of bottles in the packaging room, every drop in a tank. vestl tracks inventory by lot so you always know which specific receipt or production run a unit came from.


Core concepts

Lot. A specific receipt or production run of a product. Lots have a lot number, received date, quantity, location, and remaining quantity. Two batches of the same SKU received on different days are two separate lots.

Location. Where the inventory physically lives inside a facility. Locations are typed through the location registry: room, rack, shelf, bin, tank, zone, or a custom storage spot.

On-hand. The sum of remaining quantity across all available lots of a product. Different from “received” because production batches consume from lots and decrement remaining.

Status. Each lot is Available, On hold, Quarantine, Consumed, or Expired. Only Available lots are pickable for production. On hold and Quarantine lots are visible but blocked from being consumed.


Where inventory comes from

A lot is created in three ways, and the lot type field records which:

  • Purchased — created by a purchase receipt. The receipt line that created the lot is linked back so you can audit “where did this lot come from” with one click.
  • Produced — created when a production batch packages out. The batch’s order, recipe, vessel BOM, and case BOM are locked to the lot, so traceability flows forward to the finished case.
  • Adjusted — created by a manual inventory adjustment (cycle-count discoveries, found inventory, write-ons). Adjusted lots require a reason note.

Most lots are Purchased or Produced. Adjusted lots are an exception path and should be rare.


Inventory pages

On-hand by product

The main inventory landing page. Shows one row per product with the on-hand quantity rolled up across all available lots. Click into a row to see the lots that make up that on-hand number.

Filters: location, product type (finished goods only / raw materials only), low-stock (below reorder point — see the reorder dashboard).

Lots

The lot-level view. Use this when you need to find a specific lot — debugging traceability, looking up a lot that was flagged in QC, hunting for an expired lot to write off. Sortable by received date, expiry date, status.

Receive raw materials

Used for raw material receipts (finished goods are received by closing a production batch, not through this page). Two flows:

  1. PO-anchored receive — you have an open purchase order; pick the PO line and confirm quantity, lot, and location. Most receipts go this way.
  2. Unplanned receive — material arrived without a PO (samples, returns, vendor errors). Requires a reason note in the lot’s notes — operators want to know why later.

Adjustments

Manual quantity changes outside the receive / produce / consume flow. Cycle-count discrepancies, write-offs, found inventory. Every adjustment requires a reason and is audit-logged.

Transfers

Move inventory between locations. Common case: a tank has been emptied and the remainder was siphoned into a different tank — record the transfer so the lot’s location stays accurate.

Cycle counts

Periodic physical counts. The page generates a count sheet for a location, you fill it in, and the system records adjustments for any variance.

Reorder dashboard

Surfaces products that are below their reorder point (set per-product on the product detail page). MRP also feeds this view — anything MRP says you’ll need that you don’t have shows up here.

Expiry report

Lots that are within N days of their expiry date. Filter by lookahead window (7 / 30 / 90 days). Used for FEFO (first-expiry-first-out) picking and to prevent compliance issues with aged stock.

Raw material turnover

Turnover ratio per raw material over a selected period:

Turnover = Period COGS / Average inventory value

Higher means faster-moving — the material is being consumed and replenished frequently. Lower means it’s sitting. The Days on hand column converts the ratio into a more concrete number (“at this consumption rate, current stock lasts N days”).

Pick a date range (defaults to last 90 days) and optionally narrow by vendor. The table shows one row per raw-material product with COGS for the window, average inventory value, turnover, and days on hand.

Mechanics:

  • Period COGS comes from finalized batch cost records — only batches whose costs have been closed contribute, so in-progress batches don’t skew the number.
  • Average inventory value is reconstructed from the ledger at the start and end of the window and averaged. Lots held at each boundary are valued at their unit cost.
  • A product with no consumption in the window but a non-zero inventory balance shows up with turnover and days on hand (the math is undefined).

Finished-goods turnover isn’t here yet — it requires a sales fulfillment ledger to know when FG actually left inventory. Tracked separately.

Dead stock

Lots with on-hand quantity that haven’t moved in the lookback window (30 / 60 / 90 / 180 days). “Moved” means any ledger activity — receipt, batch consumption, transfer, adjustment, cycle count. A lot whose last activity is older than the window shows up here.

The page splits results into two buckets:

  • Dead — no movement and no open production batch claims the lot. These are candidates for write-off or redeployment to another product.
  • Reserved by stale batch — the lot is linked to a production batch that’s still planned, in progress, or ready, but the batch itself hasn’t closed in a long time. Inventory looks stagnant from the ledger but is actually waiting on a stalled MO. Chase the open batch before writing the inventory off.

Quarantined and on-hold lots appear with a badge so you can tell intentional holds apart from neglect.


Field reference (lot detail)

Lot number

The identifier for this specific lot. For purchased lots, you can match it to your vendor’s lot or batch number; for produced lots, it is auto-generated from the batch ID.

Supplier lot number

The vendor’s own lot or batch identifier from their packaging or COA. Optional, but strongly recommended for raw materials — TTB traceability requires being able to walk from a finished bottle back to the supplier lot of every ingredient.

Received date

The date the lot was actually received (not the PO date, not the day someone got around to entering it). Drives FEFO and aging reports.

Expiry date

When the lot becomes unusable. Optional for non-perishable materials. The expiry report flags lots within a configurable lookahead window.

Removal date

When the lot was fully consumed or written off. Set automatically when remaining quantity hits zero.

Quantity / Remaining quantity

Quantity is what you received; remaining quantity is what’s left after consumption. Production batches and adjustments decrement remaining; you cannot edit it directly.

Unit cost

The cost per unit at the time of receipt. Used by inventory valuation reports and batch costing. Pulled from the PO line for purchased lots; computed from input costs for produced lots.

Location

Where the lot physically lives. Move it via the Transfers page.

Lot status

  • Available — pickable for production. Default.
  • On hold — visible but blocked from consumption. Use this when QC has flagged the lot pending an investigation.
  • Quarantine — segregated for a compliance reason (failed QC, recall, regulatory hold). Requires a quarantine reason note. Cannot be consumed without manual unblock.
  • Consumed — fully drawn down to zero remaining.
  • Expired — past expiry date, blocked from consumption.

Quarantine reason

Required when status is Quarantine. Free-text, but should be specific enough to audit later (“Failed micro test 2026-04-12, retain for retest”). Visible in the audit trail.

Notes

Free-text. Especially useful for unplanned receives (“Vendor sent extra by mistake — kept per email with rep on 2026-04-15”).


Locations

Locations are configured under Settings → Locations. The default type registry includes:

  • Tank — has capacity. Used for liquid in process (mash tuns, fermenters, blending tanks). When capacity is set, the system warns if a transfer would exceed it.
  • Room — a bounded space inside a facility, such as receiving, cold storage, packaging staging, or a bonded vault.
  • Rack / Shelf / Bin / Zone — nested addressable storage spots used for dry goods, packaging, or finished cases.

A location can be flagged to allow negative on-hand if you want to permit it for that location (rare; usually only for transit or virtual locations).


Inventory and production

A production batch reads inventory the same way you would: it picks Available lots of each ingredient and decrements remaining quantity as it consumes them. Lot selection follows FEFO by default — earliest-expiring lot first — but operators can override during batch creation if they need to clear a specific lot.

When a batch packages out, vestl creates a new Produced lot for each finished SKU at the configured packaging location. The new lot’s traceability chain links forward through the manufacturing order → batch → recipe / vessel BOM / case BOM, and backward through every consumed input lot.


Inventory and compliance

For TTB-regulated products, lot traceability is legally required. vestl never deletes a lot — Consumed and Expired lots stay on the books indefinitely so the trail from finished bottle to source ingredient can be reconstructed years later.

Quarantine status and quarantine reasons are also part of the audit trail. If a lot was held for a compliance reason and then released, the audit log shows the hold, the reason, the release, and who released it.