Pre-production beta: a work in progress and a study of AI for real-world reporting. Review every output before you rely on it. About this beta
REPORT · BUDGET VS ACTUAL

Budget vs actual

See where actual results diverged from budget, and why. Upload one row per account with the budget and the actual. ReportForge computes the variance, you explain the material ones, and it writes the report for each period of the fiscal year.

What it is and when to use it

Budget vs actual answers one question for each account in a period: how did actual results compare with the budget, and why?

The work is organised by fiscal year: a year has up to 12 periods, each period is analysed on its own, and a year page lists them.

Use it when you have a budget and an actual for each account in a period and need to explain the material variances.

Step by step in the app

The screens use these names.

01

Start

On the dashboard, in the Start a new analysis band, choose Compare budget to actual.

02

Set up the year

The setup page asks for the analysis name, how to start, the default materiality, the month your fiscal year starts (locked once created) and the first period. Choose Create analysis.

03

Upload actuals

Upload one month, or load a full-year budget first and then add actuals each month. On the year page, Upload <period> actuals adds the next period.

04

Review

The year page shows each period with its status: Awaiting actuals, In review or Finalized.

05

Explain

Explain mode walks you through the material accounts one at a time, with driver lines for each.

06

Finalize or generate

Generate draft writes a report from the period as it stands. Finalize & generate locks the period and then writes the report.

07

Read the report

The report page shows the Fact check panel and the trust score. Exports and Actions (including Share) are on that page.

The file

You choose either to upload one month (details, upload, explain), or to load a full-year budget first (details, budget, then actuals each month, then explain). Each period's file is one row per account, as CSV or Excel (.xlsx or .xls), up to 10 MB.

Columns in a budget vs actual file
ColumnNeeded?What it is
Account_CodeOptionalIf present, it identifies the account.
AccountRequiredThe account name.
Account_TypeRequiredRevenue, Expense, Asset, Liability or Equity.
Budget_USDRequiredThe budget for the period.
Actual_USDRequiredThe actual for the period.
RecurrenceOptionalone-time or recurring.
ReasonOptionalFree-text reason.

Type 0.00 for no budget or no spend; do not leave a cell blank. The one exception: if the fiscal year already has a full-year budget loaded, a blank Budget_USD cell takes the stored budget.

The setup page offers a sample CSV and a button labelled "view an example report".

If something is wrong

Row problems are listed the same way as for flux: the page lists the row and tells you to fix it. A file with problems never creates an analysis. These are the messages, as the code writes them.

Messages the budget vs actual upload shows
WhereMessage you see (example values)What to do
Account blankRow 4 (blank account): Account is required and blank.Fill in the account name.
Account_TypeRow 4 (Cash): Account_Type "Income" is not one of Revenue | Expense | Asset | Liability | Equity.Use one of the five types.
Actual_USD blankRow 4 (Travel): Actual_USD is blank. If nothing was spent or received on this account, type 0.00 — do not leave the cell empty.Type 0.00.
An amountRow 4 (Travel): Budget_USD "n/a" does not parse as a number.Type a number. The same message names Actual_USD.
RecurrenceRow 4 (Travel): Recurrence "sometimes" is not one of one-time | recurring.Use one-time or recurring, or leave it blank.
Same account twiceRow 9 (Travel): duplicate identity key "6100" (first used at row 4).Keep one row per account.
After the listFix these rows and re-upload the file.Correct the rows and upload again.

Loading a full-year budget

Load it once and each month's budget is filled in. Three ways:

Monthly

Account, Account_Type and twelve period columns in fiscal-year order.

Annual, even split

Account, Account_Type, Annual_Budget. The annual amount is spread across the months, rounded to a unit you choose, with the remainder in the last month.

Annual, manual

The same file, then you set each month in a grid. If the months do not add up to the annual amount, you must type an explanation, which is logged.

Full-year budget sample files

The sample files also carry an Account_Code column. In the monthly sample the period columns are named Period_1_Jan to Period_12_Dec; in the annual sample the amount column is Annual_Budget. The budget can be reviewed, replaced, or edited month by month later. A change after loading is a budget revision and must be acknowledged before the affected period can be finalized.

Materiality: what needs an explanation

An account is material when its change is at least $50,000, or when it moved at least 10% and by at least $10,000, the same rule as flux. The year's default carries to its periods, and a period can override it and reset to the default.

The year page shows, for each period, how many accounts are material and still need an explanation.

Explain mode

Budget vs actual uses the same driver-lines editor and Explain mode as flux: driver lines for each material account, with a named driver and a one-time or recurring answer.

  • There is no Ignore, and there is no per-account Confirm.
  • An explained account is flagged for review if its budget or actual later changes, and clear all flagged resolves them together.
  • Numbers you type are handled as in flux: checked against that account's own figures, and otherwise treated as your number.
  • Outside reason links are not available for budget vs actual.

What is in the report

The example report further down this page is built from the sample file bva-sample.csv by the real engine. It shows:

  • three summary figures: revenue, expense and net, each against budget;
  • a table of every account with its budget, actual, variance and percent, with the material accounts marked;
  • a short written summary that states the figures. The example text is fixed and gives no reasons; in your own report, the reasons are the ones you wrote.

From the second period on, your report includes a year-to-date section.

Checks and the trust score

Each figure in the prose is checked back to your data in the Fact check panel, which shows a summary ("N need attention" or "Every cited figure checks out"). The report page also shows a trust score from 0 to 100. A report with unverified figures shows the Draft banner, a signal to review, not a failure of your data.

A report cannot be published while any of these is true, and the page says which:

  • the report has no trust score;
  • a must-pass check has failed;
  • a number in the report is not tied to one of your figures yet. You resolve it in the Fact check.

Numbers you typed in your own explanations do not block Publish; they are treated as yours.

Unlike flux, a budget vs actual report generated before finalizing is not blocked from Publish for that reason alone. Older versions, generated before this check was introduced, are not held to the three rules above.

How the numbers are checked

The AI is not allowed to state any number, name, date, category or ranking that is not in your uploaded data.

Variances and other comparison figures are computed from your data and given to the AI as facts to restate, not to calculate.

After the report is written, a validation pass reads each cited figure back against your data. Figures that match are marked verified; a report with unverified figures is shown as a Draft so you know to review it.

If you type a number in an explanation, it is checked against that line's own figures. If it matches none, it stays as you typed it and is treated as your number, not as a checked figure.

The narrative can still contain errors, so review every report before you rely on it.

Periods

A fiscal year has up to 12 periods, and each period is analysed on its own. The year page shows each one with its status (Awaiting actuals, In review, Finalized), how many accounts still need an explanation, the net variance and its reports.

Finalizing a period is blocked until all of these hold:

  • every material account has an explanation, a named driver and a one-time or recurring answer;
  • no account is flagged for review;
  • the period label is filled in;
  • any budget revision, and any correction from an earlier period, has been acknowledged;
  • every earlier period in the fiscal year is finalized (periods can be started in parallel but must be finalized in order);
  • actuals have been loaded.

Correcting a finalized period never rewrites its snapshot; later periods whose year-to-date depended on the figure are flagged and must acknowledge it.

The free trial covers one analysis covering one period. More analyses need a paid plan.

Working with others

Each analysis, and the reports made from it, has people who can look at it and people who can change it.

  • Account owner. Can always do everything on every analysis and report in the account, and can change who has access to anything. Only the owner manages billing, users, downgrading and closing the account.
  • Writers. Chosen per analysis. They can edit, upload, explain, finalize, generate reports, publish, delete versions and start the next period. They can also change who the writers and readers are, and they can always read.
  • Readers. Chosen per analysis. They can only look: they see finalized analyses and published reports, and nothing in progress. The page says "View only".
  • Choosing people. Open Sharing on the fiscal-year page. There are two choices, Who can write and Who can read. Each is the default, All users of the account, or Selected users picked from the people active on your account. An analysis always keeps at least one writer.
  • Published reports. Once published, a report has its own setting, Who can read this report: All users of the account (the default), Selected users, or Writers only. The home page has a section, Reports shared with you, for published reports other people made and you may read.
  • Notifications. The bell in the top bar tells you when someone makes you a writer or a reader of an analysis, or picks you by name for a published report. There is no email for these.
  • Comments. On the report page, Actions then Comments opens a panel where you can add a comment, reply to one, and resolve or reopen a thread.
  • Extra users. Each plan is for one user. The account owner can add users at $5 a month each.
  • People outside your account. Share creates a read-only link for the report. Asking someone outside to explain an account is not available for budget vs actual. The sharing settings belong to the fiscal year and apply to every period under it.

The example and the sample files

The figures were built from the sample file bva-sample.csv by the real engine, and the text is fixed. No AI was used to produce this example.

Example · illustrative numbers

Budget vs Actual — Jan 2026

Built from the sample CSV you can download on this page, by the same engine your own upload runs through. An account is material when its change is at least $50,000, or when it moved at least 10% and by at least $10,000 — your own analysis uses the materiality you set. The written summary below is neutral, fixed text that only states the figures; it is not model output and gives no reasons.

+$250,000
Revenue vs budget
+$240,000
Expense vs budget
+$10,000
Net vs budget
Budget vs actual example: each account's budget, actual and variance
AccountBudgetActualVariance%
Product RevenueMATERIAL$4,000,000$4,310,000+$310,000Fav7.8%
Marketing ExpenseMATERIAL$300,000$470,000+$170,000Unfav56.7%
Cost of Goods SoldMATERIAL$2,050,000$2,180,000+$130,000Unfav6.3%
Contract LaborMATERIAL$80,000$0−$80,000Fav-100.0%
Service RevenueMATERIAL$750,000$690,000−$60,000Unfav-8.0%
Software Subscriptions$0$42,000+$42,000UnfavNM
Travel and EntertainmentMATERIAL$60,000$38,000−$22,000Fav-36.7%
Professional Fees$150,000$150,000$00.0%
Interest Expense$55,000$55,000$00.0%
This example compares actual to budget for Jan 2026. Total revenue was $5.0M against a budget of $4.8M, a variance of $250K. Total expense was $2.9M against a budget of $2.7M, a variance of $240K. Net (revenue minus expense) was $2.1M against a budget of $2.1M, a variance of $10,000. Product Revenue was $4.3M against a budget of $4.0M, a variance of $310K (7.8%), over budget. Marketing Expense was $470K against a budget of $300K, a variance of $170K (56.7%), over budget. Cost of Goods Sold was $2.2M against a budget of $2.0M, a variance of $130K (6.3%), over budget. Contract Labor was $0 against a budget of $80,000, a variance of -$80,000 (-100.0%), under budget. Service Revenue was $690K against a budget of $750K, a variance of -$60,000 (-8.0%), under budget. Travel and Entertainment was $38,000 against a budget of $60,000, a variance of -$22,000 (-36.7%), under budget. This text is illustrative: it states only figures from the comparison of actual to budget, and carries no explanation of why anything moved.
↓ Download bva-sample.csv

Plans and credits

Budget vs actual is one of the three report types. The free trial (10 AI Credits, one analysis covering one period, no card, no time limit) opens all three. Single Report ($20 a month, 200 AI Credits a month) covers one report type, chosen when you first buy it. All Reports ($40 a month, 500 AI Credits a month) covers all three.

Every analysis uses at least 5 credits, and you need at least 5 available to run one. Extra users are $5 a month each, and AI Credit packs add +100 credits for $5 a month. More analyses than the trial need a paid plan.

QUESTIONS

Budget vs actual questions

Do I need a full-year budget?
No. When you start a year you choose either to upload one month, or to load a full-year budget first.
Can I finalize periods in any order?
No. Periods can be started in parallel but must be finalized in order.
What do I type when there is no budget or no spend?
Type 0.00; do not leave a cell blank. The one exception: if the fiscal year already has a full-year budget loaded, a blank Budget_USD cell takes the stored budget.
What are the period statuses?
The year page shows each period as Awaiting actuals, In review or Finalized.
What blocks finalizing a period?
An unexplained material account, an account flagged for review, an empty period label, an unacknowledged budget revision or correction, an earlier period that is not finalized, or actuals that have not been loaded. The checklist shows which.
What is a budget revision?
A change to the budget after it was loaded. It must be acknowledged before the affected period can be finalized.
Does the report include year-to-date figures?
From the second period on, the report includes a year-to-date section.
What happens if I correct a finalized period?
Correcting a finalized period never rewrites its snapshot. Later periods whose year-to-date depended on the figure are flagged and must acknowledge it.
Can I publish a draft?
A budget vs actual report generated before finalizing is not blocked from Publish for that reason alone. The three checks still apply: a trust score, no failed must-pass check, and no number that is not yet tied to one of your figures.
Can I ask someone outside my account to explain an account?
Not for budget vs actual. Outside reason links are currently available for price-volume-mix only.

Not the right report?

Flux compares one period with another, by account. Budget vs actual compares actual with budget, by account, for each period of a fiscal year. Price-volume-mix bridges a revenue change into price, volume and mix, by product.

KEEP EXPLORING
INVITE-ONLY BETA

Request an invite.

Invite-only beta · No credit card required