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.
Start
On the dashboard, in the Start a new analysis band, choose Compare budget to actual.
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.
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.
Review
The year page shows each period with its status: Awaiting actuals, In review or Finalized.
Explain
Explain mode walks you through the material accounts one at a time, with driver lines for each.
Finalize or generate
Generate draft writes a report from the period as it stands. Finalize & generate locks the period and then writes the report.
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.
| Column | Needed? | What it is |
|---|---|---|
| Account_Code | Optional | If present, it identifies the account. |
| Account | Required | The account name. |
| Account_Type | Required | Revenue, Expense, Asset, Liability or Equity. |
| Budget_USD | Required | The budget for the period. |
| Actual_USD | Required | The actual for the period. |
| Recurrence | Optional | one-time or recurring. |
| Reason | Optional | Free-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.
| Where | Message you see (example values) | What to do |
|---|---|---|
| Account blank | Row 4 (blank account): Account is required and blank. | Fill in the account name. |
| Account_Type | Row 4 (Cash): Account_Type "Income" is not one of Revenue | Expense | Asset | Liability | Equity. | Use one of the five types. |
| Actual_USD blank | Row 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 amount | Row 4 (Travel): Budget_USD "n/a" does not parse as a number. | Type a number. The same message names Actual_USD. |
| Recurrence | Row 4 (Travel): Recurrence "sometimes" is not one of one-time | recurring. | Use one-time or recurring, or leave it blank. |
| Same account twice | Row 9 (Travel): duplicate identity key "6100" (first used at row 4). | Keep one row per account. |
| After the list | Fix 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.
Versions, exports and read-only share links
Every analysis ends in the same report page.
- Versions. Every generation is saved as a new version of the report. The report page has a version switcher, each version has its own address, and a version can be deleted after a confirmation that names it. The Publish button appears on the current version only, and a published report can be reverted to unpublished.
- Exports. The Exports menu offers Download .docx, Export .md, Download PDF, Export facts .csv and Print. A Draft carries a draft marker in the Word and Markdown exports. The analysis pages have no export; exports are on the report page.
- Read-only share links. From the report page's Actions menu, Share creates a read-only link for someone outside your account. A link always expires (1 to 90 days) and can be password-protected. The share panel shows how many times a link has been viewed.
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.
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.
| Account | Budget | Actual | Variance | % |
|---|---|---|---|---|
| Product RevenueMATERIAL | $4,000,000 | $4,310,000 | +$310,000Fav | 7.8% |
| Marketing ExpenseMATERIAL | $300,000 | $470,000 | +$170,000Unfav | 56.7% |
| Cost of Goods SoldMATERIAL | $2,050,000 | $2,180,000 | +$130,000Unfav | 6.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,000Unfav | NM |
| Travel and EntertainmentMATERIAL | $60,000 | $38,000 | −$22,000Fav | -36.7% |
| Professional Fees | $150,000 | $150,000 | $0 | 0.0% |
| Interest Expense | $55,000 | $55,000 | $0 | 0.0% |
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.
Budget vs actual questions
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.
Upload prior and current balances by account. ReportForge computes the variance, you explain the material moves, and it writes a fact-checked report.
Bridge a revenue change between two periods into price, volume and mix effects by product, with a fact-checked report.
Flux analysis, budget vs actual or price-volume-mix: the question each one answers, the file you upload and what you get, side by side.
How a ReportForge report is made: numbers computed from your file, your explanations, and every cited figure checked against your data. What it does not do.
Single Report $20 a month, All Reports $40 a month, monthly add-ons, and a free trial of 10 AI Credits with no card. Invite-only beta.