A baker at her shop counter after closing, writing up the day’s figures under the pendant lights.

Business intelligence

Buzora reads the trading records your business already keeps and forecasts the week ahead, with error bars earned on days it never saw.

Photograph: Alina Belogolova, Unsplash. The forecast is Buzora’s generated sample business, not the business pictured.

Next week came from a file this business already had.

It reads the file you already have.

  1. 02/01/2024becomes 2024-01-02A day-first date
  2. $1,810.53becomes 1810.53Currency and thousands
  3. 22,53becomes 22.53A comma for a decimal point
  4. 2.21%becomes 2.21A percent sign
  5. ST-01becomes set asideThe same on every row, so nothing to learn from

CSV, Excel, OpenDocument, JSON, a till’s zip export or a text-based PDF. Bring it as it comes. Read against 1,770 pages of a restaurant’s weekly PDF reports, it matched 31 of 31 overlapping days exactly.

The sample export’s own rows. Footage: Taryn Elliott, Pexels.

Every column is something real in your business.

About twenty business concepts are matched by meaning, so your headers never have to follow anyone’s schema. Other numeric columns still feed the model.

Gross Sales ($)

A customer paying by card at a café table.
revenueVitaly Gariev, Unsplash

Units Sold

A bakery counter stacked with loaves and pastries.
units soldElisha Terada, Unsplash

Avg Wait-Time (min)

A busy espresso machine on a café counter.
customer wait timeJoey Zhou, Unsplash

Spoilage %

A baker checking racks of bread.
wasteSayla Brown, Unsplash

Stock On Hand

A shop owner counting stock on a tablet beside a clothes rail.
stock on handVitaly Gariev, Unsplash

Payroll

Chefs at work on the pass of a dark restaurant kitchen.
labour costZoren Tan, Unsplash

Supplier Lead Time

A man holding a tray of fresh fruit from a delivery.
supplier lead timeBernie Almanzar, Unsplash

Store ID

Notes

Constants and empties are set aside, and you are told which.

One clean row per day.

Till logs are totalled to one row per day, with voided and declined payments left out first. Long exports are pivoted and day-across-the-top grids turned on their side. A missing day gets a blank row, so every real day sits in its right place.

messy_export.csv semicolon-delimited · 1,095 rows
Business Date;Store ID;Gross Sales ($);Units Sold;Avg Wait-Time (min);Spoilage %;Stock On Hand;Payroll;Supplier Lead Time;Notes
01/01/2024;ST-01;$0.00;0.0;0,00;0.00%;500.0;$0.00;0.0;
02/01/2024;ST-01;$1,810.53;151.0;22,53;2.21%;341.3;$241.50;1.46;
03/01/2024;ST-01;$2,106.62;175.5;21,60;3.34%;571.7;$273.00;1.8;
04/01/2024;ST-01;$2,108.32;175.6;8,84;0.67%;393.5;$325.50;1.43;
05/01/2024;ST-01;$3,159.04;321.4;21,67;0.27%;506.1;$462.00;1.51;
06/01/2024;ST-01;$2,664.66;222.3;4,65;0.97%;281.0;$623.28;1.07;
07/01/2024;ST-01;$1,977.61;165.2;6,02;3.90%;763.7;$470.40;0.28;
08/01/2024;ST-01;$1,384.19;115.6;3,87;0.50%;644.8;$315.00;1.72;
Columns recognised by the importer
In your fileBuzora reads it as
Business Datethe date of each row
Store IDset aside: the same on every row
Gross Sales ($)revenue
Units Soldunits sold
Avg Wait-Time (min)customer wait time
Spoilage %waste
Stock On Handstock on hand
Payrolllabour cost
Supplier Lead Timesupplier lead time
Notesset aside: empty
The first rows after import
daterevenueunitswait (min)waste %stocklabour
2024-01-010.000005000.00
2024-01-021,810.5315122.532.21341.3241.50
2024-01-032,106.62175.521.63.34571.7273.00
2024-01-042,108.32175.68.840.67393.5325.50
2024-01-053,159.04321.421.670.27506.1462.00
2024-01-062,664.66222.34.650.97281623.28
2024-01-071,977.61165.26.023.9763.7470.40
2024-01-081,384.19115.63.870.5644.8315.00
Buzora’s deliberately messy sample export, and what the engine made of it. 1095 rows x 9 columns, 2024-01-01 to 2026-12-30, 7 numeric, 8 recognised metrics.
  1. One model, every day ahead.

    A direct multi-horizon gradient-boosting model predicts each of the next seven days on its own, using only what was known on the day the forecast is made. One bad day never snowballs into the next.

  2. Graded against the simplest rule.

    Before it quotes a figure, Buzora tests itself on days it never saw, in time order, and scores every target against the best simple rule: yesterday’s value, the same weekday last week, the running average, or the average or median of the last four weeks. Where it cannot beat that rule, it is blended back toward it.

  3. Error bars it has earned.

    The 80% band is checked forward: its width is chosen on earlier held-out stretches and graded on later ones, so it widens the further out it looks. On a real restaurant’s record it held 87% of what actually happened. The fan behind these words is next week for the sample business, one thread per possible week. All of which is worth something only if the figures are true.

Seven-day revenue forecast for Buzora’s sample business, with the 80% interval
DayLow (10th percentile)ForecastHigh (90th percentile)
Thu 31 Dec$1,480$2,491$3,622
Fri 1 Jan$0$768$1,908
Sat 2 Jan$2,453$3,490$4,638
Sun 3 Jan$1,265$2,297$3,418
Mon 4 Jan$844$1,863$2,982
Tue 5 Jan$687$1,746$2,889
Wed 6 Jan$1,325$2,411$3,557
The sample business’s takings drawn as a line of light, ending at today; beyond it, next week fans out into many possible weeks, densest where the forecast is most likely.

What the accuracy figure means.

A forecast is worth nothing if the number it advertises is not the number it delivers. So Buzora is scored the way it is served, graded against the best simple rule instead of the most convenient one, and blended back toward that rule wherever it cannot beat it.

89.39%

Held-out accuracy of the model shipped for a real restaurant: 200 trading days over eight months, eleven targets, seven days ahead. Gross receipts 89.8%, guest count 89.0%.

1.04×

The worst gap between the error Buzora advertises and the error it delivers, rolling a fourteen-day forecast through held-out data. Two rounds of fixes ago it was 107×.

13–21%

How far ahead of the best simple rule Buzora finished on every target of a real four-year wholesale payout record: 6,139 orders from 2,024 retailers.
Rolling a fourteen-day forecast forward through held-out data
Two rounds agoLast roundNow
Worst optimism (error advertised against error delivered)107×1.09×1.04×
Worst result against the best simple rule−21%−6.8%−2.4%

There is a ceiling, and Buzora says where it is. On the synthetic data an oracle that knows every knowable driver exactly scores 89.3%; the model scores about 77% at fourteen days. The rest is the day’s own randomness, which has not happened when the forecast is made. A model claiming 99% has been handed the answer.

The real restaurant, rolled forward from four cut-off dates
ErrorBiasBand heldLosing to a rule
Before14.5%3.9%85%1
Shipped13.8%2.0%87%0

Error and bias are a share of the business’s own level; the band is the 80% band. Refitting on the pinned data with the pinned engine reproduces the same forecasts exactly. One target, total cash deposits, was left out because no model beat “the same weekday last week” on it. Real-world validation still rests on two records; every further business narrows that.

What it learned the hard way

  1. Scored the way it is served. A labour-cost model once advertised an error of 0.89 and delivered 94.89, because its holdout was handed next week’s real rota. Every holdout is now scored with the guess the live forecast will actually make.

  2. Bands that mean what they say. A band labelled 80% once held 24% of real outcomes with nothing reporting a problem. Widths are now chosen on earlier folds and graded on later ones, and coverage is shown beside every chart.

  3. Stockouts. On a series that is zero on most days, chasing the average invents a stockout every day. Chasing the median took stockout skill on real data from −0.03 to +0.47.

  4. Weekends. For a business that never trades on a Saturday, a two-part model, one for whether anything happens and one for how much, took the Saturday forecast from about 4,795 to 9.

  5. Drift. A tree cannot predict a level it has never seen, so a drifting price is forecast as its departure from a 28-day trailing median. The share of days under the actual fell from 92% to 41% and the error halved.

  6. The day being forecast. Feeding in the calendar of the target day, not the day the forecast is made, stopped a 1.74× weekend swing being flattened to 1.03×.

  7. Less is more. Eighty boosting rounds beat 150 and 300 on held-out data, in 37–60% of the time. The extra rounds were fitting noise.

  8. The first day. Ninety days in, a business forecast from a model pooled across synthetic businesses errs by 22.7% of its level, against 27.7% from its own history alone. That reference model is built from synthetic businesses only, never from another customer’s data, and the accuracy card says when it is in use.

The Model page of the Buzora desktop app for the real restaurant: 89.4% accuracy, trained on 248 rows, predicting 11 metrics seven periods ahead, with a table giving each target’s accuracy, quality, error measures, gain over the same-weekday rule and how much of its 80% band held.
The Model page in the desktop app, on the real restaurant above: 89.4% across eleven metrics, each read beside how far it beats repeating the same weekday (gross receipts +31.4%, guest count +19.0%) and how much of its 80% band actually held.

This page’s own forecast, graded

The forecast you scrolled through was made by the current engine on Buzora’s sample business. Here is how it scored on 1,505 held-out points. Revenue ties the same-weekday-last-week rule, so the engine calls it weak and plans against the low edge rather than pretending otherwise.

Accuracy and skill per target on the sample business
TargetAccuracySkillAgainstRated
Revenue83.5%+0.00same weekday last weekweak
Units sold83.4%+0.09same weekday last weekuseful
Customer wait time48.0%+0.16running averageuseful
Profit margin52.5%+0.07running averageuseful
Waste52.9%+0.00running averageweak

Accuracy is 100 minus WAPE on held-out days. Skill is the share of the simple rule’s error the model removes, measured without being told the future values of its own levers.

So the forecast has earned a hearing. The next question is what to do about it.

Only what it can stand behind.

The Decisions page sweeps each lever across the range your business has actually run and reports a setting only when four guards pass: it is inside that range, the outcome tracks the lever across the sweep, the effect is larger than the model’s own error, and the mechanism makes sense (staffing can shorten a queue; it cannot raise demand). Each recommendation says plainly that it is a learned association, not proof of cause. If nothing passes, that is the answer.

Anything consequential then gets a second look: is the forecast inside what the business has ever recorded, has the model earned a move this big, and does the finding also come out of an earlier stretch of history? A check can pass, caution or block, and a block never hides the number; it says why it is not safe to plan on.

Try it on the sample business. Move the staffing lever and watch what the model predicts for customer wait time.

17.5 h
Predicted customer wait time across the staffing range this business has run a change must clear ±1.15 min to count6 min7 min8 min12 h16 h20 h24 h28 h32 htoday, 17.5 h

At 17.5 staff hours, today’s setting, the model predicts an average wait of 6.93 min next week.Across the whole range this business has run, no setting moves it by more than 1.15 min, so the Decisions page makes no recommendation.

Engine output for Buzora’s sample business: 24 settings between the 10th and 90th percentile of staff hours ever rostered. Settings it has never run are not on the slider, because the model has no opinion about them.

Levers, pulled gently

On top of the forecasts, PID control loops watch five measures against setpoints drawn from your own better-quartile days, and suggest how hard to pull each lever. A loop appears only when your data supports it. Readings are smoothed so one noisy day cannot flip the advice, the integral forgets after about ten periods, and output and rate limits mean a suggestion is never “cut staff by 40 hours tomorrow”. Nothing is actuated automatically.

The five control loops
LoopWatchesSuggests a change to
Stock coverinventoryreorder quantity
Service speedcustomer wait timestaff hours
Wastespoilageorder quantity
Marginprofit marginprice or cost
Availabilitystockout ratesafety stock

Increase staff-hours adjustment by 6.00. Smoothed wait time is 8.36 min against a target of 4.71 min. The loop is at its limit, so this is capped.

The service-speed loop on the sample business today, from the engine’s own output.

A built-in till, stock and order system records trading as it happens and feeds it back into the models, so next week’s forecast learns from this week’s till. Stock is the sum of its movements, never an overwritten number. Orders are suggested from reorder points and projected demand, and nothing is ordered until someone ticks and confirms. Every email Buzora writes is a draft until a person sends it.

And when the question is not on any page, you can ask.

Ask. It does the arithmetic.

Ask Buzora is an optional analyst that runs on your own ChatGPT, Claude or Gemini key, over any page with Ctrl/Cmd+J. It answers by calling the engine’s own read-only tools, what_if, sweep_lever and summarize_data, never by guessing or adding up figures itself. “Show exactly what is sent” opens everything it was given.

Keys live in your system keychain, never in the data bank. Your data reaches the model fenced as data, so a column name can never become an instruction, and the transcript follows no link.

Sample exchange. The figures are the engine’s, from a real what-if on the sample business; the wording is illustrative.

If I add four staff hours a day next week, what happens to wait times?

what_if

target customer_wait_time_min

plan   staff_hours: 17.5 → 21.5

Predicted wait time per day, current staffing against the plan
DayNowPlan
Thu 31 Dec6.96.5
Fri 1 Jan7.37.2
Sat 2 Jan7.87.7
Sun 3 Jan7.57.4
Mon 4 Jan6.76.1
Tue 5 Jan7.76.7
Wed 6 Jan7.16.2

With 21.5 staff hours a day, the engine puts next week’s average wait at 6.8 minutes, against 7.3 on today’s 17.5. That is 0.5 minutes, well inside the model’s typical error of 4.6 minutes, so treat it as a lean, not a finding.

This conversation was about the sample business. The next one can be about yours.

Bring your export. Leave with next week.

Buzora runs on your desktop, in seven languages, and keeps its data bank on your machine: copy the folder and you have moved the whole business. Early access is opening to small businesses with at least a year of trading records.