NOVUS / RESTAURANT

Working with sources

Budget Scenarios: Ask What If Without Rewriting the Budget

A scenario is a second plan for the same month, read against the same actuals. It copies the budget lines and leaves the agreed plan untouched, even locked.

Published
Checked against the release
Read
8 min
By
Novus Stream Solutions

A budget answers one question: what do we intend to spend this month. The question a kitchen actually asks in a bad month is a different one. What if covers drop by a fifth. What if the fish price holds where it is. What if we drop the lunch service on Mondays. The obvious way to answer it is to open the budget and change the numbers, and that is the one way that destroys something. The figure the original decision was made against is gone, and it is usually the figure somebody is later asked to explain.

Budget scenarios are the answer to that. A scenario is a second plan for the same month, drawn beside the budget rather than written over it, and compared against exactly the same record of what was spent. This article describes how it works in the signed-in product as released, including the one thing the page does not yet let you do.

Sets of actuals every plan is read against
1
A scenario cannot carry spending of its own.
Dates a scenario accepts when created
None
Window, site and currency are copied from the base.
Levels of scenario allowed
1
A scenario of a scenario is refused.
Behaviour cases in the scenario test file
15
Including another organization's period and a locked base.

Checked Sep 22, 2026 against the budgets release, src/lib/budgets/store.ts, drizzle/0020_budget_scenarios.sql and tests/unit/budget-scenarios.test.ts. These describe the release on that day, and a later release can change them.

A scenario is a period, not a column

It would have been simple to add a second number beside each budget line. The release does something more useful. A scenario is stored as a budget period in its own right, marked as belonging to the base period it answers and carrying a short label that says what it assumes, such as covers down a fifth. Because it is a period, it gets everything a period already has: its own lines, its own lock and its own variance report, computed by the same code that computes the budget's.

That matters for trust. There is no second implementation of the variance arithmetic that could drift away from the first. The price effect and the usage effect on a scenario line are worked out by the same formula as on the budget, and they still sum exactly to the total variance.

The actuals are not a variable

This is the rule the feature is built around. A scenario changes what was planned. It cannot change what was spent. Every plan in the comparison is read against the same window of dates, the same site and the same purchase and operating cost records, so the only thing that differs between two rows of the comparison is the plan.

The rule is enforced by what the release refuses to accept. When a scenario is created it takes no dates at all. The window, the site and the currency are read off the base period and copied. Two plans read against different months of actuals are not being compared, and a date field on the scenario form would be an invitation to do exactly that. A scenario that could carry its own actuals would let anyone produce whatever variance they wanted.

It starts as a copy, on purpose

The scenario form has one option: start from this budget's lines. It is ticked by default, and the reason is printed right under it. An empty plan reports every line as a full underspend against real actuals, and an underspend reads as a saving. A blank scenario beside a real month would look like the cheapest plan on the page for no reason except that nothing was written in it.

In practice a scenario is the base plan with two or three numbers changed, so starting from a copy is also simply less work. You can untick the box when a blank plan is genuinely what you want, and the release fixed a defect on the way that would have ignored you: an unticked checkbox sends nothing, and an earlier reading of the form treated nothing as yes. The broader point about missing figures dressed up as savings is the subject of what a saving on this site actually claims.

Locking protects the plan that was agreed

A budget period can be locked, and a locked period refuses changes to its lines. That is what you want once the month's plan has been agreed with an owner or a head chef. It is also exactly when the what if questions start, because the month is now under way and the numbers are moving.

So a scenario can be drawn beside a locked period, and it starts unlocked. Locking the base protects the plan that was agreed. Asking what would happen under different assumptions is not a change to that plan, and making someone unlock the budget to ask the question would put the agreed number at risk for no reason.

One level, one name per question

  • No scenario of a scenario. A plan drawn from another plan has no answer to which one is the base, and the side by side comparison needs one. The release refuses it with a message telling you to draw another scenario beside the base instead.
  • One scenario per label per period. Two scenarios called the same thing on the same month would make the comparison table ambiguous. The name comparison ignores capitals, so Covers down and covers down count as the same.
  • A label is required. The form asks what the scenario assumes. A plan with no stated assumption is a number nobody can argue with, because nobody knows what it claims.
  • Scenarios stay out of the period list. They are periods in the same table, but the period selector at the top of Budgets lists only base periods. Otherwise a restaurant would see two Septembers and have to guess which is real.

Reading the comparison

Once a period has at least one scenario, the What if section shows a table. The base plan comes first, then each scenario in the order it was created. Each row gives the budgeted total, the actual total, the variance and a count of lines that could not be compared. The note above the table says it plainly: every plan below is read against the same actuals.

Because the actual column is the same on every row, the differences you see are differences in planning. If the scenario for covers down a fifth shows a smaller variance than the budget, that is not the kitchen doing better. It is a statement that the lower plan fits the spending you have so far more closely, which is a different and more useful thing to know.

Where a total cannot be computed, for example because a line has a price but no quantity, the cell says Unknown rather than printing a nought. Unknowns are counted in their own column so they cannot hide inside a total that looks complete. The same refusal runs across the whole site, as what this site refuses to add up explains for public market data.

Who can do what

Budgets are part of the signed-in product and belong to an organization. Anyone in the organization can read the comparison. Only members with edit access see the form that adds a scenario, and the server action that creates one checks that access again rather than trusting the page. A scenario cannot be drawn from another organization's period, and another organization's scenarios never appear in your list.

Scenarios are ordinary budget periods in storage, so they travel with the rest of your budget data. Your data and how to export it describes what is kept for an organization and how to take it with you.

When to use one

  1. Before the month is agreed, draw a blank scenario and build the cautious version of the plan in it, so the conversation compares two stated plans instead of one plan and a worry.
  2. Once the budget is locked, draw a copy for each question you are asked, and give each a label that states its assumption in plain words.
  3. At the end of the month, read the comparison. The plan closest to the actuals is not the winner; it is the one whose assumptions turned out closest to what happened, and that is worth writing down for next month.

The budget you agreed stays exactly as you agreed it throughout. That is the whole promise of the feature, and it is the part the release goes out of its way to protect.

Reproducing these figures

Every number above was checked against the release on September 22, 2026. A later release can change them, which is why they carry that date.

  • Signed in with edit access, open Budgets, select a period and use What if to add a scenario with Start from this budget's lines ticked. Confirm the comparison table shows the base plan first and the scenario beneath it.
  • Lock the base period, then add a second scenario beside it. Confirm the scenario is created, and that the base still refuses line changes.
  • Try to add a second scenario with the same name on the same period and confirm it is refused.
  • Confirm the period selector at the top of Budgets lists only base periods, never a scenario.
  • Read createScenario, listScenarios and compareScenarios in src/lib/budgets/store.ts, the migration in drizzle/0020_budget_scenarios.sql, and the cases in tests/unit/budget-scenarios.test.ts.

Sources

Working with sources

The Kitchen Notebook Stays on the Device

Cost a dish in this browser with no account and no server call, then export the notebook to a file you own. What it keeps, what it refuses, and where it stops.

Published
Checked against the release
Read
9 min

Working with sources

The invoice lines an importer quietly drops

A comma in a price is the most expensive punctuation in a supplier export. Why the rows it dropped were never a random sample of your invoice.

Published
Figures measured
Read
3 min