Skip to main content

Products & inventory

Everything you sell — at the register, on the storefront, in club releases — lives in the Catalogue at /admin/catalogue ("What you have, where it is, and how much of it is already promised."), and its stock lives in Inventory at /admin/inventory. High-value write-offs pause in the approvals queue at /admin/inventory/approvals until a second pair of eyes signs off.

Who can use it​

  • Browse products and stock — products.read (every staff role).
  • Create, edit, and publish products — products.create, products.update, products.publish: Managers and Admins only.
  • Adjust inventory — inventory.adjust (Managers and Admins).
  • Approve write-offs — inventory.approve (Managers and Admins). Approvers without company.update must be a different person than the submitter ("Approver must be a different user than the submitter"); default Managers and Admins hold company.update and may self-approve.

The catalogue​

/admin/catalogue (Catalogue) lists your products in a table under two tabs, Products and Audit. The columns are Product, Type, Brand, State, Where, On hand, Reserved and Available; click a column heading to sort. A product row can carry a Club badge (released to club) or a Sample badge. Expanding a row shows its stock per location and what is held against it, with a View in the ledger link to the inventory movements.

Search with "Search name or SKU…". The Filter button opens the filters: Product type, State, Brand and Location, plus Club eligibility (All products, Club eligible, Not club eligible) and Collection. Each filter you apply shows as a chip you can remove, and Clear all resets them.

The Catalogue — the product table, filters, and bulk club eligibility.

The Catalogue — the product table, filters, and bulk club eligibility.

Header actions: Add Product, Manage Lists (the shared attribute lists, below), and Bulk Select, which adds checkboxes and a bulk bar — Mark as Club Eligible / Remove Club Eligibility — the switch that feeds the release wizard's Bottle Selection. Exit Bulk Mode puts the table back.

Create a product​

Add Product (/admin/catalogue/new — "Choose a product type to get started.") starts from a type card: Wine (sub-types Bottle / Case), Merchandise, Food, Tasting, Bottle-to-Glass, Promotion, Event ("Ticketed events and gatherings"), Gift Card, or Package ("Bundled products sold together"). Then:

  • Product Name (required — e.g. "2022 Cabernet Sauvignon Reserve") and an optional Brand.
  • Tax classification: Tax Category (Wine, Food, General Merchandise, Non-Taxable) — or, with TaxJar connected, a Tax Code ("Override the automatic tax code used for TaxJar tax calculation").
  • Brand Availability — Available to all brands or Specific brands.
  • Optionally Add opening inventory — a location and an Opening quantity, recorded as an audited initial-stock adjustment. If that part fails you'll see "Product created, but opening stock failed" — "You can record the adjustment from the Inventory page."

Create Product (toast: "Product created") drops you into the editor.

The product editor​

Opening a product from the catalogue takes you to its editor at /admin/catalogue/products/:productId. The header shows the product type, a Published or Draft badge, and the Publish / Unpublish button (toasts: "Product published", "Product unpublished"). The sections are listed after the state notes below.

What state a product is in​

The catalogue's State column shows one value per product, and it is what decides whether the product can be seen and bought online. The register works on a different rule — see The till does not read the state below.

StateCustomers see itCan be bought onlineHow it gets there
DraftNoNoA new product, or one you Unpublish
LiveYesYesPublish in the editor header

You may also see Unavailable (shown to customers, cannot be bought) or Retired (off sale and hidden) in the State column and its filter. The editor has no control for choosing either of them; Publish and Unpublish move a product between Draft and Live.

Product state — one value that decides what customers see and what they can buy.

The state control in the product builder, which is not switched on by default.

Picture being updated

This picture shows an earlier version of this screen. The steps on this page are current.

The till does not read the state​

Everything above is the online rule. The POS does not consult a product's state or whether it is published — it offers whatever is active and sits in a collection bound to the register's cart profile. A Draft wine that has been put into a till collection can be rung up and sold today, even though no customer can buy it on the website.

That is deliberate, not a bug: it is how a wine can be poured in the tasting room before it is ready to go live online.

Taking something off the website does not take it off the register

If you need a wine to stop selling in the room as well, remove it from the till's collection. Unpublishing alone only closes the web channel.

The editor sections​

The product editor — Basics through Wine Details, with the publish toggle.

The product editor — Basics through Wine Details, with the publish toggle.

  • Basics — name, description, SKU (e.g. "CAB-2022-750"), Taxable, Requires Kitchen, Alcohol Product ("Requires age verification before purchase"), and club eligibility.
  • Pricing & Variants — Retail Price ($) and Cost ($) per variant in the Variants & Costs table (Variant, SKU, Price, Cost, GP%, Override). Cost is your COGS; GP% is computed for you. Deleting a variant warns: "Deleting it will remove its pricing data permanently. This cannot be undone."
  • Wine Details — Bottle Size (mL) (quick picks from "187ml (Split)" to "3L (Double Magnum)"; "Required before publishing."), Vintage (or Non-Vintage (NV)), Classification (Red, White, Rosé, Sparkling), Varietals with percentages (warned when they don't total 100%), Appellation, ABV (%) (required before publishing), Designation, Tasting Notes, and Series / Tier.
  • Media — drag-and-drop images and video ("JPEG, PNG, WebP, GIF, MP4, WebM • up to 10 MB. Recommended 2:3 portrait — videos upload without cropping."), with drag-to-reorder. Imported media from upstream catalogs is read-only: "Edit them in the source system."
  • Inventory — the per-location stock grid (On hand, Reserved, Available, Value), a Low stock threshold ("Items at or below this on-hand count are flagged Low Stock. Leave blank to use the system default of 5."), an Adjust stock button, and an Adjustment History sub-tab.
  • Collections and Brand Availability — which collections the product sits in, and which brands can sell it.
Commerce7 costs arrive for review

With the Commerce7 integration connected, synced cost changes don't overwrite yours silently — the variants table flags "Cost changes pending review" with the incoming "C7:" value, and you either accept it ("Accept C7 value & unlock") or keep your manual override locked.

Shared attribute lists​

Manage Lists opens /admin/catalog/attributes (Catalog Attributes — "Manage suggestion lists for product attribute values."). These are the pick lists behind the editor's autocompletes, organized by type tab: Wine (Appellation, Designation, Closure, Vineyard — the varietal list is built in and is not edited here), Food (Allergen, Dietary Tag, Kitchen Station, Visibility Tag), Merchandise (Category, Material, Vendor, Color, sizes, and more), Tasting, B2G, Gift Card, and Package. Values can be reordered, deactivated, and scoped Global or per-Brand ("Showing brand-specific and global values.").

Inventory​

/admin/inventory (Inventory) is the per-location stock ledger, with tabs for Inventory, Movements, Transfers, Counts, Receiving, Valuation, and Audit, and KPI cards for Total SKUs, Locations, Low Stock, and On-Hand Value.

Inventory — per-location stock with low-stock flags and Adjust actions.

Inventory — per-location stock with low-stock flags and Adjust actions.

The main table shows Product (with a red Low badge at or below the threshold), SKU, On Hand, Reserved, Available, In Transit, Value, Low Stock @, As Of, and Source — plus a per-row Adjust action (locked without inventory.adjust — "Inventory Adjust permission is required"). Search, a Low stock only switch, a location picker, and Export CSV round out the toolbar.

Record an adjustment​

Adjust opens Adjust stock:

  1. Pick the Location and a Reason — Count correction, Breakage / damage, Comp / sample, Theft / shrinkage, Transfer out, Transfer in, Return to vendor, or Restock / receiving.
  2. Pick the Mode — Adjust by (delta) or Set to (absolute) — enter the Quantity and an optional note.
  3. Record adjustment. Small adjustments apply instantly — "Inventory updated successfully". Big write-offs queue instead (below) — the dialog warns you first, e.g. "…exceeds the … auto-approval cap. This will be queued for approval — on-hand will not change until approved."

Commerce7-sourced items carry an extra caution: "This item is sourced from Commerce7. Local adjustments may be overwritten on the next sync."

The Transfers tab moves stock between locations: New transfer (product, Origin, Destination), then the receiving location confirms with Receive — rows track Sent, Received, In transit / Received status, and any variance.

The approvals queue​

High-value write-offs — comps, theft, breakage, and count corrections above your auto-approval cap — don't touch on-hand immediately. They wait at /admin/inventory/approvals (Inventory Approvals — "High-value write-offs (comps, theft, breakage, count corrections) waiting for sign-off."). Pending items show a banner on the Inventory page ("…waiting for approval and have not yet changed on-hand counts." with Review queue →) and a badge on the header bell.

Inventory Approvals — pending write-offs with Approve and Reject.

Inventory Approvals — pending write-offs with Approve and Reject.

  • The Auto-approval threshold card sets the cap — "Adjustments with an estimated value at or above this cap are held here for sign-off. Adjustments below the cap apply to on-hand immediately." The default is $1,000; changing it needs company.update, and "New cap applies to future adjustments."
  • Each pending row shows the product, reason, location, quantity, value, and submitter, with Approve and Reject:
    • Approve — "Approving will apply the adjustment to on-hand inventory… This is auditable." Toast: "Inventory adjustment applied."
    • Reject — "Rejecting will close this request without changing inventory…" Notes are required to reject. Toast: "Adjustment was not applied to inventory."
  • Approvers who don't hold company.update can't approve their own submission; holders of company.update (default Managers and Admins) may — small teams often need to both submit and approve.

An empty queue reads "No pending inventory approvals."

Reference​

ControlWhereWhat it does
Add ProductCatalogue headerThe type-first create flow at /admin/catalogue/new.
Bulk SelectCatalogue headerBulk Mark as Club Eligible / Remove Club Eligibility.
Manage ListsCatalogue headerShared attribute pick lists at /admin/catalog/attributes.
Publish / UnpublishProduct editor headerMoves the product between Draft and Live.
FilterCatalogue toolbarFilters by product type, state, brand, location, club, collection.
Adjust (stock)Inventory rowThe reason-coded adjustment dialog (needs inventory.adjust).
Export CSVInventory toolbarDownloads the current stock view.
New transferTransfers tabMoves stock between locations; Receive confirms arrival.
Approve / RejectInventory ApprovalsApplies or discards a queued write-off (needs inventory.approve).
Auto-approval thresholdInventory ApprovalsThe cap above which write-offs queue (default $1,000).

Troubleshooting​

  • "Required before publishing." — wine products must have a bottle size and ABV before Publish will take.
  • "Percentages total N% (should be 100%)" — the varietal blend doesn't add up; fix the percentages.
  • The Adjust button is a lock icon — "Inventory Adjust permission is required"; ask a Manager or Admin.
  • An adjustment "submitted for approval" hasn't changed on-hand — that's by design; it applies only when it's approved in the queue.
  • "Approver must be a different user than the submitter" — your role has inventory.approve but not company.update; have another approver (or a Manager/Admin) take it.
  • Stock keeps reverting on a Commerce7 item — the sync owns that item's counts; the adjust dialog warns "Local adjustments may be overwritten on the next sync."
  • "No products are currently marked as 'Released to Club'…" (in the release wizard) — use the catalogue's club-eligibility toggles first.