Field ReferenceProducts
Batch-firstTTB-awareRev. 2026.06
Manual / Core / Products

Products

A Product is the SKU you sell. The Catalog page lists every product grouped by Line, surfaces the ones that need work, and is the starting point for everything downstream — formulas, BOMs, manufacturing orders, sales orders, MRP.

The Catalog always belongs to your active organization. Organization is taken from your signed-in session; it is not a field you choose on a product. A SKU may therefore be reused by another organization without mixing its recipes, owners, clients, or inventory with yours. If a saved link points to a product owned by another organization, vestl shows it as not found.


What’s a Product?

A Product has two halves:

  • Identity — who it’s for and what it is. Client (the brand owner), Brand (the brand under that client), Compliance regime (TTB-regulated alcohol vs. non-alc), Container type (bottle, can, keg, pouch).
  • Spec — how it’s made and packed. The Spec’s required chain is three layers: A · Formula (the liquid), B · Vessel BOM (the primary container — bottle, can, keg, pouch), C · Case BOM (how vessels are grouped into a sellable case). An optional D · Pallet BOM adds a fourth tier — pallet-level packaging and cases-per-pallet — when you ship by the pallet.

A product without all three Spec layers in a Ready state is not plannable: MRP won’t generate proposals against it and you can’t open a manufacturing order from it. The Catalog page tells you exactly which layer is missing.

Vocabulary check. Formula is the liquid. Vessel BOM is the primary container, such as a bottle, can, keg, or pouch. Case BOM is how filled vessels become a sellable case.


Product catalog

The Product catalog is a flat operational table. Each row shows the SKU, product name, client, pack volume, compliance regime, and whether its required Spec chain is complete. Choose a row to open the product detail. Use Duplicate to start a new size or variant from an existing product and its Spec.

Search and filters

Search matches SKU or product name across the full catalog, not just the rows visible on the current page. The Client and Complete / Incomplete filters also run across the full catalog. Filters combine: for example, choosing a client and Incomplete shows every incomplete product for that client, even when those products were not on the page you started from.

Changing search or a filter returns you to the first matching page. The active search and filters stay in the page URL, so a bookmarked or shared catalog view opens with the same scope.

Pages

The catalog loads 50 products at a time. Use Next to continue until Next is disabled, which means you have reached the final matching page. Use Prev to return through pages you already visited. Next and Prev retain the active search, Client, and Complete / Incomplete filters.

The line below the table shows the visible range and the full number of matching products. While a new page or filter result loads, the current rows remain visible; wait for the range to update before acting on a newly requested page.

Complete and incomplete rows

A product is Complete when its Formula, Vessel BOM, and Case BOM are all published and linked. Incomplete rows carry an additional warning label and cannot be scheduled into a manufacturing order. The Pallet BOM is shown elsewhere as an optional fourth layer and does not determine catalog completeness.

Export page downloads the 50-or-fewer products currently visible. Move to another page and export again when you need that page’s rows.


Spec readiness

Every product has three independent Spec layers. Each layer follows the same lifecycle:

StateMeaning
EmptyThe layer has not been started.
DraftThe layer is being edited and is not ready for planning.
ReadyThe layer is approved for planning and manufacturing orders.

Rules:

  • A Product is plannable by MRP and shippable from a manufacturing order only when all three layers are Ready.
  • Ready versions are locked. Editing a ready layer creates a new draft only when you save a change; opening a layer to read it does not create a new version.
  • MRP and new manufacturing orders use the latest Ready version of each layer. Drafts are never used for planning.
  • Promotion is an explicit action (“Promote v2 → v3”) — never implicit from save.

The lifecycle is per-layer. A product can have a ready Formula, a ready Vessel BOM, and a draft Case BOM. That product is incomplete and the row will carry an attention dot, but the ready Formula and ready Vessel BOM are still valid for any other product that uses them.

The setup strip

The Formula, Vessel BOM, Case BOM, and Pallet BOM each have their own page, but they describe one product. When you open any of those pages for a product, a strip along the top shows the whole chain:

Kostner Ginger Mule  ·  Formula REC-1 ✓  ·  Vessel BOM VB-1  ·  Case BOM  ·  Pallet BOM   [Next: Case BOM →]

Each layer shows its state — a check for Ready, a filled dot for Draft, a hollow dot for not started — with the version reference beside it. The layer you’re editing is highlighted in amber. Pallet BOM sits quieter than the rest because it’s optional: a product is plannable without one.

The strip is there so you can see what’s done without leaving the form. It doesn’t move you anywhere on its own:

  • Saving still returns you to the product page, on the tab for the layer you just finished. That hasn’t changed.
  • “Next” is a shortcut you can take if you want to keep going down the chain. It skips Pallet BOM, and it never points backwards at a layer you’ve already passed.
  • The product name on the left goes back to the product.

The strip appears whenever the page knows which product you’re working on — either you arrived from a product, or you picked one in the form. It won’t appear on the Formula page: a formula belongs to a client and can be used by several products, so there’s no single product to show.


Creating a product

The new-product wizard (Products → New Product) is the only way to create a product. It walks five steps:

#StepPurpose
1IdentityPick the Client, Line (or ”+ New line” inline), display name, container type, and compliance regime. SKU is auto-suggested from line + pack.
2Spec — A · FormulaAuthor the liquid: ingredients, baseline qty, loss model, process steps. Saves as a v1 draft of the Formula.
3Spec — B · Vessel BOMAuthor the primary container: vessel type (bottle/can/keg/pouch), fill volume, vessel components (the can or bottle, lid, label, neckband). Saves as a v1 draft of the Vessel BOM.
4Spec — C · Case BOMAuthor the case: bottles per case, case components (tray, ring, tape). Saves as a v1 draft of the Case BOM.
5ReviewConfirm everything reads correctly. Submit creates the product and lands you on the new product’s detail page with the Formula tab active.

Within the Formula, Prerequisites describe the process steps that must finish before another step can begin. A step may wait for several prerequisites; steps with no dependency between them may run in parallel. Prerequisites must stay within the same formula, cannot point back to the same step, and cannot form a loop. Publishing freezes the dependency graph, and every physical Batch created from that version receives the same task links.

MiniMap rail

The wizard’s right rail carries a permanent system map — a small diagram of Product → Spec ⇒ A · Formula → B · Vessel BOM → C · Case BOM → (Cased product → Batch). The currently-active layer is bold and outlined; future layers are dimmed with “comes next” labels.

Unfinished wizard input persists on refresh

The wizard auto-saves your in-progress entries to local storage on every step change. If you refresh the page mid-wizard, you land back on the step you left with all entered fields intact. It clears on submit.

This is only about not losing typing — it is unrelated to a draft product, which is a saved product with no client yet. See Drafts.


Product detail

Land here after creating a product, or by clicking any row on the catalog. The detail page is a tab strip + two-column body.

Tab strip

TabWhat it showsCarries an attention dot when…
OverviewLayer cards + Where it’s running + Identity card— never
Spec — A · FormulaThe Formula version history — open to edit in-placethe Formula is Empty or Draft
Spec — B · Vessel BOMThe Vessel BOM version historythe Vessel BOM is Empty or Draft
Spec — C · Case BOMThe Case BOM version historythe Case BOM is Empty or Draft
HistoryAudit log scoped to this product— never
ComplianceTTB filings + COLAs scoped to this product— never

The dot rule is strict: only the Spec layer tabs that are incomplete carry a dot. Overview, History, and Compliance never do — the sub-tabs already say where to look.

Overview tab

The Overview body is three layer cards stacked vertically — one for Formula, one for Vessel BOM, one for Case BOM. Each card shows:

  • The layer letter (A, B, or C) as a small label on the left.
  • The layer title, current version, and ready/needs-work status.
  • A one-line summary of contents (e.g. “5 ingredients · 12 process steps” for the Formula card).
  • A timestamp (“edited 2 weeks ago” or “missing — finish to ship”).
  • An Open → button that takes you to the Spec tab for that layer.

Below the layer cards, a Where it’s running card surfaces three production stats:

  • Open manufacturing orders for this product
  • Last-30-day batches (with running yield average)
  • On open sales orders (with cases committed)

The right rail carries an Identity card (Line / Client / Compliance / Container / Selling unit) and, when any layer isn’t ready, a What’s blocking card:

Case BOM is a draft.

MRP plans from v2 until you promote v3. New manufacturing orders default to v2.

[Open Case BOM →]

The blocking rail is decisive — it tells you exactly which layer needs work and what MRP will do until you fix it.

Spec tabs

Clicking a Spec tab opens the editor for that layer’s latest version. The tab itself shows the version history and a button to open the layer editor. Editing happens in the existing layer screens — see Formula, Vessel BOM, and Case BOM — but the version history you’re editing is always scoped to this Product.

History tab

A reverse-chronological audit log scoped to this Product. Entry types include version drafts, promotions, identity changes (line reassignments, name edits), and Spec-layer state changes. The log is capped at the most recent 100 entries.

Compliance tab

Surfaces TTB-related artifacts for this product. Today the tab lists associated COLAs (Certificate of Label Approval); production records and monthly reports are joined indirectly through the production batches that pin this product’s Case BOM.

Top action row

The detail page’s action row carries three buttons:

  • Duplicate — see “Duplicate” below.
  • Promote v2 → v3 — promotes the latest draft when one is ready. Disabled when there is no draft to promote.
  • + New manufacturing order — opens the new-production-order wizard with this product pre-selected.

Duplicate

Duplicate creates a new Product whose Spec is a fresh draft of every layer copied from the source. It’s how you spin a new flavor or a new pack of an existing SKU without rebuilding the Spec from zero.

What duplicate copies:

  • Identity — Client, Line, Container type, Compliance regime. The new product gets a fresh display name (you’ll be prompted) and a new auto-generated SKU.
  • Formula — the full ingredient list, baseline qty, loss model, and process steps from the source’s current published Formula. Copied as a new v1 draft of a new Formula.
  • Vessel BOM — the full vessel components and fill volume from the source’s current published Vessel BOM. Copied as a new v1 draft of a new Vessel BOM.
  • Case BOM — the full case components and bottles-per-case from the source’s current published Case BOM. Copied as a new v1 draft of a new Case BOM.

What duplicate doesn’t copy:

  • Audit history. The new product has no history — it starts fresh.
  • Production-batch links. The new product has no batches.
  • Compliance filings (COLAs, production records). New product, new filings.

The duplicated product lands in a draft state on every layer — you’ll see all three attention dots on the detail page until you promote each layer.


Drafts

Sometimes you need to spec a product before you have a customer for it — prototyping a recipe, or shopping a spec to a prospect. Choose Set client later · saves as draft on the wizard’s Identity step.

A draft is a real, saved product with two differences:

  • It has no client yet, and
  • its SKU is temporary. It reads DRAFT-XXXXXX rather than a real code, because the SKU’s client segment cannot be worked out until you pick one.

A draft cannot be produced. It won’t accept manufacturing orders, batches, or lots — vestl will tell you to complete it first rather than fail with a confusing BOM error. That is deliberate: a batch or compliance record filed against a draft would reference a SKU that is about to change.

You can only save a draft with no spec layers attached. As soon as you add a formula, vessel BOM, or case BOM, the product is being specced for somebody, and vestl asks who.

Completing a draft

Open the draft and assign a client (or one of a client’s brands). At that moment vestl mints the real SKU — KOST-FG-0031, say — and the product becomes a normal finished good.

This is the only time a product’s SKU changes, and it isn’t really a change: the draft never had a real SKU, only a placeholder. Once minted, a SKU is permanent, even if the product later moves to a different client.

Moving a product to another client

A product can change hands — a brand is sold, a contract novates, or it was filed under the wrong client to begin with. Open the product, find the Client / Brand card, and choose Move to another client.

Moving is allowed at any time. vestl does not block it when the product has open sales orders, manufacturing orders, batches, or stock on hand. Those records stay attached to the product and move with it, so the new client becomes the owner of that history. Every move is recorded in the audit log with who made it and when, and you can add a reason.

Two consequences worth knowing before you confirm:

  • The SKU does not change. A product minted as ACME-FG-0007 keeps that code after moving to Kostner. This keeps existing lot, batch, and TTB references valid — but it means the SKU no longer matches the owning client’s code. Read the Client field to know who owns a product.
  • Any brand assignment is cleared. Brands belong to exactly one client, so the old brand cannot follow the product. Assign one of the new client’s brands afterward if you need it.

If you only want to move a product between brands within the same client, use Move to different brand instead — that leaves the client untouched.

Cross-references

  • Formula — the per-layer editor for Spec A.
  • Vessel BOM — the per-layer editor for Spec B.
  • Case BOM — the per-layer editor for Spec C.
  • Components — the catalog for ingredients, vessel parts, and case parts that BOMs reference.
  • Companies — clients (who own products) and vendors (who supply raw materials).
  • Batches — the manufacturing orders and physical batches that pin a Product’s Spec versions.
  • Planning — MRP, demand, and the schedule view that consumes the Catalog as input.

Field reference

The fields below appear on the product detail page and the new-product wizard. Tooltip copy in the UI mirrors this section — keep them in sync.

Display name

Free-text, customer-facing. The name shown on labels, COLAs, sales orders, and packing slips. Distinct from the internal SKU.

SKU code

Auto-generated at create time. Finished goods use BRAND-FG-NNNN when anchored to a Brand or CLIENT-FG-NNNN when standalone under a client. Raw materials use the organization-owned ORG-RM-NNNN sequence regardless of supplier or default inventory owner. A draft carries a temporary DRAFT-XXXXXX until you assign a client. Cannot be edited.

The SKU is stable for the life of the product. It keeps the code it was minted with even if the product later moves to a different Brand — or to a different client. That means the SKU is a permanent identifier, not a live pointer to the current owner: a product created for Acme and later moved to Kostner still reads ACME-FG-0007. This is deliberate. Every lot, batch, production record, and TTB filing that already names that SKU keeps resolving. Read the Client field, not the SKU, when you need to know who owns a product today.

Client

The client that owns this SKU. Required on every finished good you can produce. Drives which Brands are pickable in the wizard’s Identity step and which sales-order surfaces the product appears on.

The one exception is a draft — see Drafts below. A draft may be created before the customer is known, and gets its client (and its real SKU) when you complete it.

Raw materials are different: they have no client. Their default owner is a custody default for inventory, not their commercial supplier and not part of their SKU. Add one or more vendors in the material’s Sourcing section.

Brand

The brand this product belongs to. Optional — leave empty to create a standalone product. A standalone product can be promoted to a Brand later from the products list.

Container type

Bottle (glass), Can (aluminum), Keg, or Pouch. Drives the Vessel BOM’s vessel-component picker (a bottle vessel won’t list neckbands intended for cans). Set on the Product itself for the catalog Container facet.

Compliance regime

TTB · alcohol = federally regulated; requires a TTB Formula # and a production record on every batch. None · non-alcoholic = not TTB-regulated.

Batch size

The liquid batch size the Formula scales to, such as 100 gal or 1,000 L. The unit selector only lists volume units because this field is about liquid volume; weight and count units belong on ingredient or packaging lines instead.

Proportional loss and fixed loss

Proportional loss is the percentage lost from every physical batch and scales with its size. Fixed loss is dead volume lost once per physical batch, such as liquid left below a tank outlet. Effective yield is the batch size after both losses, and must remain greater than zero.

Ingredient amounts repeat per physical batch by default. Choose Use once per Manufacturing Order only for an order-level amount such as one starter culture or a minimum dose. vestl. assigns that amount to the first physical batch instead of repeating it for every vessel run.

Cost snapshots use that same physical rule. Ordinary ingredient cost repeats for each batch, while a Use once per Manufacturing Order ingredient is costed once and assigned to the first batch. Planned cost per yielded unit uses the effective yield after proportional and fixed loss, so dead volume is not treated as saleable output.

Selling unit

Almost always case for finished goods. Drives planning math (MRP plans cases; manufacturing orders target cases).

Target ABV % (TTB products only)

The label-claim alcohol-by-volume. Used as the spec target for QC and the value referenced on production records.

TTB Formula # (TTB products only)

The TTB-issued formula number this product was approved against. Required on every production record for this product.

Status

Active products show in pickers (sales orders, manufacturing orders, formulas, COLAs, lot receives). Archived products are hidden from creation flows but kept for historical lookups. Never delete a product that’s been used in a batch — the audit trail and production records reference it.

Planned by-products

Use a planned by-product for an intentional secondary stock output. Record its product, entered unit, expected quantity from one physical Batch, and the formula step that produces it. The unit must convert to the product’s base inventory unit. Cost share is a percentage of actual Batch cost; the combined share for all secondary outputs cannot exceed 100 percent.

Publishing freezes these outputs with the formula version. Fork and duplicate copy them and reconnect each output to its copied operation.