Documentation

Stock control

Mapping products to ingredients

Link menu items and modifiers to the ingredients they consume, accept suggestions, and create ingredients on the fly.

Mapping products to ingredients

Product Mapping is where you tell Stock what each thing you sell actually consumes. A sale only reduces your stock numbers once the product behind it is mapped — so this is the one screen worth setting up properly before you rely on the rest of Stock.

One list, products and modifiers together

Product Mapping lists everything you sell in a single table — products and modifier options side by side, whether or not they have a mapping yet, so the page is never empty even on day one.

Modifier options are the extras a customer adds to a base product: extra shots, milk alternatives, syrups, upsizes. They are not a lesser kind of thing, and they are not on a separate screen. A modifier is treated exactly like any other item — it can be mapped directly to an ingredient, or given a whole recipe of its own, with the same choices and the same quantity box.

That matters more often than it sounds. A sauce, a side salad or a garnish is a modifier that is genuinely made from several ingredients, so it needs a recipe. And tap beer is usually one product called "Tap beer" at one price with a list choosing which beer — the modifier is the only thing that says what actually left the cellar.

Use the filter chips to narrow the table:

  • Products and Modifiers control which kinds of row appear. One of the two always stays on, so the table can never be empty by accident.
  • Stock items, Bookable items and Other narrow the products by type. These don't apply to modifiers, which have no type of their own.
  • Unmapped shows only rows that have no mapping at all yet.
  • Needs review shows only rows that have one but still need a decision — an AI suggestion waiting to be accepted, or a mapping something has since called into question. It and Unmapped are alternatives to each other, so turning one on turns the other off.

The search box matches an item's name and, for a modifier, the name of the list it belongs to — so searching for the list finds every option on it.

Each modifier row shows the list it belongs to under its name, so two options called "Regular" from different lists are never confused with each other.

Three ways to map a row

For each product or modifier option, choose how it's tracked:

  • Direct 1:1 — the item consumes a fixed quantity of one ingredient every time it sells (a canned drink consuming exactly one can). Set the ingredient, then say how much under Depletes as.
  • Recipe — the item is made from a combination of ingredients (a burger consuming a bun, a patty, cheese and sauce). Build or accept an AI-drafted recipe with the quantities for each ingredient. Available for modifier options too, not just products.
  • Ignored — the item doesn't consume stock at all (a gift card, a cover charge, a service fee). Marking it ignored clears it from your outstanding list without pretending it's mapped to something.

Depletes as: how much one sale takes

For a row mapped Direct, the Depletes as column is where you say how much of the ingredient a single sale draws down — a number, the unit it's measured in, and "per sale".

The unit is the point. A 30 ml nip of spirit is entered as 30 and ml, not as a bare "30" whose meaning you have to remember. The unit list offers only units that make sense for that ingredient: grams or kilograms for something stocked by weight, millilitres or litres for something stocked by volume, and nothing to choose at all for something counted in whole units.

You can enter it whichever way is natural. Type 0.03 and l against an ingredient stocked in millilitres and it's understood as 30 ml — and it reads back as "0.03 l", the way you typed it, next time you open the screen.

If you pick a unit that can't be converted to how the ingredient is measured — an amount in millilitres against an ingredient stocked by weight — the entry is refused, not converted. There is no sensible number of grams in 30 ml without knowing what the liquid is, so the row tells you what it's measured in and asks you to re-enter it, rather than quietly storing a figure that would be wrong every time that item sold.

When you're not sure

Beside the quantity is a Not sure tick. Use it when you're estimating — you know roughly how much sauce goes on, but nobody has measured it.

It blocks nothing. The mapping saves, the item sells, and stock is drawn down using the number you gave. All it does is add the row to the Needs review filter, and mark it "amount not sure", so a guess stays easy to find and come back to instead of hardening into a fact nobody remembers estimating.

This is deliberate: a flag that costs you something is a flag nobody ticks, and an unrecorded guess is worse than a recorded one.

Accepting suggestions

Unmapped rows show a greyed suggestion based on how closely the product name matches an existing ingredient — for example a product called "Coke 375ml" suggested against an ingredient called "Coca-Cola 375mL Can". These suggestions appear instantly, with no AI call needed, and you can accept one with a single click, or select several and accept them in bulk.

For anything left over, tick the rows you want and press Auto-map with AI. It proposes a mapping for each — including full recipes for combination items — with a confidence level attached. Low-confidence suggestions are flagged needs review rather than applied automatically; how much of this AI does without you asking is controlled from AI and automation in Stock.

Anything you've already confirmed yourself is left alone, even if you select it: auto-mapping never overwrites a person's decision. If your selection included confirmed rows, the message afterwards tells you how many were skipped, so the count you pressed and the work actually done always agree.

Telling apart what you decided and what a machine did

There is no longer a Classified by column taking up space on every row to say the same thing about most of them. In its place, a row that was mapped by automation rather than by a person carries a small sparkle beside its name.

Hover the sparkle to see what mapped the row, how confident it was, and why — everything the old column showed, on the rows where it actually says something.

The sparkle clears the moment you save the row yourself. No sparkle means a person decided it, which is also what stops later automatic mapping from overwriting your work.

When one sale would deplete something twice

The classic case is tap beer: one product called "Tap beer" at one price, with a required list choosing which beer. If the product is mapped to the lager and the "Lager" option is mapped to the lager, every pint sold takes two pints off your stock — and nothing in your reports will look wrong, your stock will just drain faster than reality.

When that happens, a warning appears above the table naming both the product and the option, with a one-click fix: set the product to Ignored, so the option carries the depletion on its own. Both rows are also marked, each one naming the other, and Show only the rows involved narrows the table to them so you can see the pair together without hunting.

This only fires where it can be sure. A list that makes you choose exactly one option is a choice of which item you're buying, so mapping both really is counting one thing twice. An optional extras list is different — a coffee that uses 18 g of beans plus an optional extra shot that uses 9 g more is correct, and is never flagged.

Creating an ingredient without leaving the screen

If an item doesn't match anything in your ingredient list yet, you don't have to go and set one up elsewhere and come back. Choose Direct, then press New ingredient on the row: a small panel opens in place, on that row, without the table reloading or losing your position.

It's pre-filled with the item's name, and you can set everything the ingredient needs while you're there:

  • Name — pre-filled from the item, and editable, since what you sell and what you stock are often named differently.
  • Base unit — whether it's stocked by weight, by volume, or counted. This is the one to get right: it decides which units the quantity box will offer afterwards.
  • Category and tags — including allergens, so a new ingredient is filed properly from the start rather than landing in an uncategorised pile.
  • Folder — where it sits in your ingredient tree.
  • Depletes as — how much of it one sale takes, in the units you just chose.

Save, and the row updates in place with the new ingredient selected. The ingredient becomes available to every other row immediately, so you can map the next item to it straight away.

Press Escape, or Cancel, to close the panel without creating anything.

Editing without losing your place

Saving a row no longer reloads the table. The row you edited flashes to confirm it saved and stays exactly where it is, so you can work down a long list without the row you just touched jumping somewhere else and making you find your place again.

Bulk actions — accepting several suggestions at once, or auto-mapping a selection — do refresh the list, which is what you want when a whole set of rows has changed at once.