Framework: size, direction, persistence, correction
Why a single accuracy number hides the problem
Most finance teams report forecast accuracy as one percentage. "We were 94% accurate on cash this quarter." It sounds like a verdict. It is a size, with no direction.
A forecast that is 6% off in random directions is noisy. Over a year the misses cancel, and a better model or more detail will help. A forecast that is 6% high every month is something else. It is predictable. Anyone who knew the habit could have used it, and nobody did, because the accuracy score never showed it.
Accuracy tells you how wrong you were. Bias tells you which way to correct.
The cost sits in the decisions made on the forecast. If the receipts forecast runs high, you plan to pay suppliers, make a payroll or skip a draw on the credit line on money that arrives late or not at all. The report shows the miss afterward. Nothing in it is responsible for what changes before the next forecast.
The measures
Take each period (or each line and period), a forecast made before it started, and what actually happened. Positive error means the forecast ran above actual.
| Measure |
Formula |
What it tells you |
| Error |
Forecast − Actual |
Size and direction, one row at a time |
| Bias |
Σ (Forecast − Actual) ÷ Σ Actual × 100 |
Which way you lean, as a percent of actuals |
| WMAPE |
Σ |Forecast − Actual| ÷ Σ |Actual| × 100 |
The size of the miss, weighted so large rows count more |
| Accuracy |
100% − WMAPE |
The same thing, framed the way people report it |
| MAPE |
Average of |Forecast − Actual| ÷ |Actual| × 100 |
A simple average of row errors; rows with a zero actual drop out |
| Tracking signal |
Σ (Forecast − Actual) ÷ average |Forecast − Actual| |
Whether the misses keep leaning one way |
WMAPE leads here because MAPE gives a small line the same weight as a large one and cannot use a zero actual at all. A common rule of thumb treats a tracking signal beyond about plus or minus 4 as bias worth acting on. It is a prompt to look, not a verdict.
Score the forecast you committed to before the period, at the lead time your decisions depend on. A reforecast made with the result in sight measures how well you read last month, not how well you can see the next one.
Where a lean comes from
In finance forecasts the usual sources are few, and most of them are habits, not mistakes.
Receipts timed to terms, not to behavior. A forecast that assumes every customer pays on day 30 will run high whenever customers pay on day 40. If your customers' pattern has moved, the customer payment terms drift check shows who and by how much.
Targets mixed in with forecasts. What the team hopes will happen and what it expects to happen are different numbers. When the forecast quietly absorbs the target, it leans optimistic every period.
Costs held flat. An expense forecast that carries last month forward misses hires, price increases and annual renewals as they land, and leans low. Unplanned hiring is the version I have seen most: positions are approved outside the forecast, and headcount cost runs below plan until someone reconciles it.
Two more are quieter. An assumption set in January and never revisited, such as a growth rate or a collection pattern, will be wrong by the same amount in the same direction until someone looks. And a forecast owned by the person judged on the result tends to drift toward the result that person wants to report. That is rarely dishonesty. A number that is also a promise behaves that way.
Pipeline forecasts have a related problem with stage probabilities. That case is covered in pipeline coverage and forecast accuracy.
Step-by-step process
The monthly routine is five steps after each close: score, name, correct, record, check.
- Score. Compare the forecast made before the period with what happened. Compute bias, WMAPE and the tracking signal, overall and by line. The scorecard does this from pasted rows.
- Read bias first. Look at the sign and size by line, and whether it has held across periods. Accuracy second.
- Name the habit. One sentence, confirmed by the person who owns the forecast: "Receipts run high because large customers have moved from 30 to 40 days." A habit nobody can name is probably noise.
- Apply a stated correction. Be specific: "Move 25% of receipts from large customers out by 10 days." The person who owns the forecast approves the correction by name before it goes into the next cycle.
- Record it, then check it next month. Put one row in the bias log (see Templates). Next month, did the bias shrink? Keep the correction, adjust it, or drop it, and write down which.
Sometimes the right correction sits upstream of the forecast. If the lean comes from decisions the forecast never sees, such as hires approved outside the plan, change the path the decision takes (who must approve it, and what must reach finance) before you change the formula.
The routine takes a short meeting, ideally inside the monthly review, and it is cheap compared with a forecast that leans for a year.
Worked example: six months of cash receipts
This example is illustrative. Figures are in thousands of dollars. Forecast A and Forecast B are two different ways of forecasting the same six months.
| Month |
Actual |
Forecast A |
Error A |
Forecast B |
Error B |
| Jan |
480 |
520 |
+40 |
520 |
+40 |
| Feb |
505 |
540 |
+35 |
470 |
−35 |
| Mar |
530 |
560 |
+30 |
560 |
+30 |
| Apr |
540 |
580 |
+40 |
500 |
−40 |
| May |
575 |
600 |
+25 |
600 |
+25 |
| Jun |
590 |
620 |
+30 |
560 |
−30 |
| Total |
3,220 |
3,420 |
+200 |
3,210 |
−10 |
Total absolute error is 200 for both. WMAPE is 200 ÷ 3,220, or 6.2%, so both forecasts score 93.8% accurate.
Here is what the accuracy score does not show:
- Forecast A has a bias of +6.2% (200 ÷ 3,220) and a tracking signal of +6.0 (the net error of 200 divided by an average miss of 33.3). Every month ran high. Over six months the forecast promised $200,000 of receipts that did not arrive.
- Forecast B has a bias of −0.3% and a tracking signal of −0.3. It misses by about the same amount each month, in alternating directions. Month by month it is as wrong as A, and over the half-year it is almost exactly right.
The two need different fixes. Forecast A needs a correction, such as moving part of each month's receipts later, and the correction should be written down and checked next month. Forecast B needs a different kind of work: more detail on the large customers, or a shorter horizon where the swings are largest. An accuracy score of 93.8% sends both to the same meeting and says nothing about what to do there.
A is also the cheaper one to fix. As an illustration: suppose that after March someone had named the habit and taken A's average January-to-March overstatement, 35 (105 ÷ 3), off each later month. April becomes 545 against 540 (+5), May 565 against 575 (−10), June 585 against 590 (−5). For April to June, absolute error falls from 95 to 20, WMAPE from 5.6% to 1.2% of 1,705 in actuals, and net error from +95 to −10. One written sentence would have removed most of the $95,000 that A promised for the second quarter and never delivered. No sentence does that for B, because there is no habit to name.
The adjustment that lived in one person's head
Here is a case from my own experience, with the company left unnamed.
At a contract development and manufacturing company (a CDMO) where I worked, the revenue and cost forecasts carried an adjustment of about 10% that sat in no model and no file. It lived with one person. The result came out close, so nobody asked why it was there.
It ran for about six months before anyone noticed. What brought it to light was headcount. Cost had been underestimated because hiring was happening outside the plan, and the forecast never saw those hires.
The correction was not a better formula. The lean did not come from the forecast. It came from decisions made before the forecast saw them. So the fix went upstream: the finance controller and the FP&A team were added to the hiring approval chain, and a hire could no longer be approved without its cost reaching the forecast.
This is where recording is not enough. The ledger recorded every payroll run and the forecast file every version. Neither recorded the sentence that mattered: the forecast runs low on headcount, by about this much, and here is why.
Templates
The bias log
| Period |
Line |
Bias |
Tracking signal |
Habit named |
Correction applied |
Approved by |
Result next period |
| (month) |
(line or "all") |
(%) |
(number) |
(one sentence) |
(specific change) |
(name) |
(held / adjust / drop) |
Keep one log per forecast: cash, revenue, and each major cost line that matters.
Scoring input layout
| Line |
Period |
Forecast (made before the period) |
Actual |
| (line name) |
(month) |
(number) |
(number) |
One row per line and period. Keep the forecast file dated, so the version scored is the one that was used.
Metrics and KPIs for forecast quality
| Metric |
Formula |
Data source |
Target by method |
| Bias, by forecast |
Σ (Forecast − Actual) ÷ Σ Actual |
Saved forecasts and the ledger |
Near zero; your own trailing best |
| WMAPE, by forecast |
Σ |Forecast − Actual| ÷ Σ |Actual| |
Same |
Your own trailing best |
| Periods over or under |
Periods with forecast above actual ÷ periods scored |
Scorecard |
Four or five of six is a lean |
| Tracking signal |
Cumulative error ÷ average absolute error |
Scorecard |
Inside about ±4 (rule of thumb) |
| Leans with a named habit and approver |
Leans logged with both ÷ leans found |
Bias log |
100% |
| Correction hold rate |
Corrections that reduced bias next period ÷ corrections applied |
Bias log |
Your own trailing best |
Hold rate is the most useful and the least common. If you record whether each correction held, you learn which of your habits you understand and which you are guessing at.
Common mistakes
Scoring the reforecast. Scoring a forecast revised mid-period flatters it. Score the one you committed to before the period began.
Averaging percentages across lines of different size. A 30% miss on a line worth 1% of the total should not outweigh a 5% miss on the line worth half of it. Use WMAPE for the headline.
Reading one period. One month tells you almost nothing about bias. Look at six, and at the sign.
Correcting before checking. If the misses alternate, a correction makes things worse. Check the tracking signal and the count of over and under periods first.
Setting a single accuracy target. A target of 95% accurate says nothing about direction and invites a team to hit the number while leaning on it. Set a target for bias too, near zero, and review it with the same rigor.
Not writing the correction down. The lesson lives in one person's head until they leave or forget. A quiet haircut before the forecast reaches the CEO counts: it is a correction, it works, and it leaves the day its owner does.
AI prompt assistance
AI is a calculation checker and a drafting aid here, not a source of causes. Give it the rows and the facts you have, and do not paste confidential data into a tool your company has not approved.
1. Score the rows and show the work.
Here are rows of line, month, forecast (made before the month) and actual. Compute, overall and by line: bias as a percent of actuals, WMAPE, accuracy as 100% minus WMAPE, and the tracking signal. Show every calculation. List any row with a zero actual and say how you treated it.
Check: recompute two lines by hand, or paste the same rows into the free scorecard. If the figures differ, find the break before you use either.
2. Generate hypotheses to test, not conclusions.
Here is the by-line bias table, and a list of what changed in the business over the period: customer terms, price changes, hires, renewals. For each line with a consistent lean, list up to three possible causes and what evidence in our records would confirm or rule out each. Do not state any cause as fact.
Check: confirm each cause with the person who owns the line. Keep only the ones the records support.
3. Draft the log row.
Using only the facts below, write one bias log row: period, line, bias, tracking signal, the habit in one sentence, the correction in one sentence, and the result to check next month. Leave "Approved by" blank.
Check: the forecast owner reads it, edits it and approves it by name before it is applied.
Implementation guide
| Phase |
Days |
Owner |
Exit criteria |
| Save and score |
1-30 |
FP&A lead or controller |
The forecast is saved before each period; cash and revenue scored with the scorecard; first bias log started |
| Name and correct |
31-60 |
Forecast owners, CFO |
Each lean has a named habit and a correction approved by name; corrections applied in the next forecast |
| Check and extend |
61-90 |
CFO |
Hold rate measured; cost lines added; the log is a standing item in the monthly review |
In the first month, score one past quarter of cash and revenue from the forecasts you kept, and compare with what the team believed. In the second, require a named habit and an approver for every lean. In the third, start measuring whether corrections held. Where the review already uses a variance narrative, add one line per major forecast: bias, habit, correction.
Governance: the CFO owns the standard and reads the log. The forecast owner owns the habit and the correction, and approves it by name. Whoever builds the next forecast starts from the log.
Downloadable assets
The bias log and the scoring input layout above are designed to be copied into a spreadsheet. The free forecast accuracy scorecard calculates every measure in this guide from pasted rows, in your browser.
Related resources
Frequently asked questions
What is forecast bias?
Forecast bias is the tendency of a forecast to miss in the same direction. If a forecast runs above actual in most periods, it has a positive bias. If it runs below, the bias is negative. Random misses that cancel over time are noise, not bias.
How do you calculate forecast bias?
Add up the forecast minus actual for every row, divide by the total of the actuals, and multiply by 100. A result of +6.2% means the forecast ran 6.2% above what happened over the period. In the worked example, $200,000 of net error on $3,220,000 of actuals gives +6.2%.
What is the difference between forecast bias and forecast accuracy?
Accuracy measures the size of the miss and ignores direction. Bias measures the direction and keeps the sign. A forecast can be accurate by size and still lean, as in the example, where two forecasts both score 93.8% and only one is consistently high.
What is a tracking signal?
It is the running total of forecast errors divided by the average size of the error. A value that keeps growing in one direction means the misses lean one way. A common rule of thumb treats values beyond about plus or minus 4 as a sign of bias worth acting on.
How much forecast bias is acceptable?
There is no universal figure. It depends on the line, the lead time and how lumpy the thing is. Use your own history: a bias near zero is the aim, and any lean that shows the same sign over several periods is worth a named cause and a recorded correction.
How often should you score a forecast?
Every cycle, using the same lead time each time. Monthly is typical for revenue and cost, weekly for a cash forecast. The value comes from comparing this cycle with the last few, so keep the method the same.
How this works in a System of Performance
A forecasting tool shows the tracking signal, and a one-off review finds the lean once. Neither keeps the correction. A Performis routine can take on a recurring job like this, with the scope and fit agreed with you: it works from the records your team supplies, prepares the work for your named reviewer, and keeps each approval on record. To see where your own numbers stand first, bring it to us as a launch partner.