Part 4 · Finance
Operating budgets
Set an operating budget on the chart of accounts, compare it to actuals without re-entry, and redo a rolling forecast every month, comparable to the last.
Watch it

The Budgets application sets an operating budget on your chart of accounts and compares it to actuals with no prior data entry. It is for the management of a small organization, for the person who keeps the books, and for whoever answers for a department's spending. What you get: at any hour, an item-by-item view of what was planned, what was spent, what is already committed, and what should have been spent by now. A rolling forecast comes on top, redone each month in a few minutes, where every version keeps its figures for good.
Overview#
This family of modules is published but absent from the Boréal demo. This chapter describes it from its documentation and its declared screens, with no screenshots (published module, not illustrated).
The main axis is the budget item: a named group of general ledger accounts, not an analytic account. That is what makes a budget work from day one, even if no invoice carries an analytic key yet. The item is deliberately coarse: three to five items explain most of the variance, and beyond that the budget becomes a table nobody reads.
A budget covers a fiscal year and carries one line per item. Each line shows four amounts, in the vocabulary Odoo uses. Planned is entered, then spread by month. Actual is read from the books every time it is displayed, never copied. Committed adds to the actual the commitments that are known but not yet posted. Theoretical says what should have been spent by now. Two variances follow: Variance from plan, the planned amount minus the committed amount, and Variance from theoretical, the committed amount minus the theoretical amount.
A line reads one source only. In accounting mode, it reads the posted entries on the item's accounts. In internal cost mode, it reads only the analytic lines with no accounting document behind them, that is, timesheets and analytic entries made by hand. The two sets never overlap, which rules out counting a dollar twice.
A budget goes through four states: draft, open, revised and closed. An open budget can no longer be edited: you revise it, and the revision is a new numbered record, while the original stays readable.
The rolling forecast is the other half of the application. It does not cover a fiscal year but a horizon of twelve to eighteen months that crosses fiscal years. Each monthly version is a numbered vintage that keeps its own figures. An actuals cut-off date separates the closed months, read from the books, from the open months, which carry the forecast.
Configuration#
Access and permissions#
Two permission groups are offered in Settings › Users.
| Group | What it opens |
|---|---|
| Read-only | Viewing the application, the budgets, budget tracking, the flagged lines and the forecasts |
| Manager | Everything above, plus creating and revising budgets, the Configuration menu, the budget items and the dialogs |
Only members of the Manager group see the Configuration menu.
Settings#
Two settings come with the family, in the Budgets section of the general settings.
| Setting | Effect |
|---|---|
| Hide budget menus from third-party modules | Several accounting add-ons ship their own budget menu, usually empty. This setting hides them in favour of this one. Nothing is deleted: clearing the box brings them back. |
| Default cost rate | Used only to estimate the hours Odoo could not value, for lack of an hourly cost on the employee's form. The starting value is $50.00. The estimate is shown separately and never enters actual spending. |
Base data#
Only one thing has to be created before the first budget: the budget items. Each item carries a name, a short code that sets the display order, the list of general ledger Accounts it covers, and a Rationale, that is, why the item exists and what it does not cover.
No catalogue of items is supplied: charts of accounts differ from one organization and one localization to the next, and a ready-made list would suit only one of them. The Suggest budget items dialog starts from your real chart of accounts and proposes a breakdown that you correct.
If you keep a subscription register, link the subscriptions to their item afterwards: that is what lets the committed and theoretical amounts follow the renewal schedule.
Getting started#
This walkthrough opens a first annual budget, from the breakdown into items to the first reading of the variance.
- Open Budgets › Configuration › Suggest budget items.
- Read the What will be created field, which describes the breakdown proposed from your chart of accounts.
- Select Create budget items.
- Open Budgets › Budgets › Budgets, then select New.
- Enter the Fiscal year start and the Fiscal year end, then the Alert threshold (%) and the Alert floor.
- Select One line per budget item: a line is created for each item that has none.
- Enter the Planned amount of each line, then select Open budget.
Result: the budget is open, so frozen. The Totals tab shows the planned, actual, committed and theoretical amounts for the whole budget, and the Coverage tab lists the accounts that no item covers. The actual updates by itself, every time you open the form.
Common tasks#
Create a budget item by hand#
The dialog proposes a general breakdown; an item that matters to you is created by hand.
- Open Budgets › Configuration › Budget items, then select New.
- Enter the name of the item and its short code.
- In the Accounts tab, add the general ledger accounts this item covers.
- In the Rationale tab, write why this item exists and what it does not cover.
- Save.
Result: the item is offered in every new budget and every new forecast version. The shortcut button at the top of the item's form opens the list of its accounts.
Spread the planned amount over the months#
An annual expense is not smoothed over twelve months: the monthly breakdown is what gives an honest theoretical amount.
- Open the budget, then the line concerned in the Lines tab.
- Open the Monthly breakdown tab.
- Enter the amount expected in each month.
- To put one twelfth in each month instead, select Spread evenly, then correct the months that carry a renewal.
- Save.
Result: the line's theoretical amount now rests on this schedule. The line shows the Theoretical basis, which says whether it used the schedule or a prorating of elapsed time.
Check the coverage of the accounts#
A budget can look respected simply because an item is missing.
- Open the budget.
- Open the Coverage tab.
- Read the Uncovered accounts: operating accounts that no item of this budget reads.
- Read the Accounts counted twice: accounts covered by more than one item, whose entries are therefore counted as many times.
- Correct the items concerned in Configuration › Budget items.
Result: both lists empty out. Until they do, read the budget total with that reservation in mind.
Read the flagged lines#
A line is flagged when its drift exceeds both the percentage and the dollar floor of the budget. Both, never one alone.
- Open Budgets › Budgets › Flagged lines.
- For each line, read the Variance from theoretical and the Variance from theoretical (%).
- Open the line to see its monthly breakdown and its linked subscriptions.
- Check the Uncosted hours: hours logged whose cost is zero.
- Decide: correct the spending, correct the plan, or accept it.
Result: the list shows only what deserves a decision. It is empty when nothing drifts, and the screen's help text says so.
Accept an overrun#
An overrun that is known and accepted should stop waking anyone up.
- Open the budget line concerned.
- Check Accepted overrun.
- Enter the Overrun reason.
- Save.
Result: the line stops being flagged, and the reason stays attached to the budget. The other lines keep raising alerts as usual.
Revise an open budget#
An open budget is not touched up: you draw a revision from it.
- Open the budget in Budgets › Budgets › Budgets.
- Select Revise.
- On the new record, adjust the planned amounts and their monthly breakdown.
- Select Open budget.
Result: a new numbered record replaces the previous one, which changes to the revised state and stays readable. The Revision of field links the two, and the original keeps the figures reality was first compared against.
Close a budget#
At the end of the fiscal year, the budget is closed without being erased.
- Open the budget.
- Select Close.
Result: the budget changes to the closed state. Its amounts stay readable, and its report stays printable. Reset to draft exists to go back as long as nothing has been communicated; Cancel closes a budget that should never have been opened.
Link subscriptions to items#
Upcoming renewals are known, dated and contractual: they do not have to wait for the invoice to count.
Prerequisite: the subscription register is filled in (see Subscriptions).
- Open Budgets › Configuration › Link subscriptions.
- Leave Only those without a budget item checked for a first pass.
- Read the What will be done field: the dialog infers each subscription's item from the dominant account of its own vendor bills.
- Select Link.
Result: each subscription carries its Budget item. When two items fit, or none does, the dialog says so and leaves the field empty rather than guessing. The item's budget lines then show the Due to date, the Upcoming renewals and the Subscriptions without a schedule.
Open a forecast version#
A forecast is redone every month, over a horizon that moves with the calendar.
- Open Budgets › Budgets › Rolling forecasts, then select New.
- Enter the Horizon start and the Horizon end, twelve to eighteen months later.
- Enter Actuals through: months that end on or before this date are actuals.
- Select One line per budget item.
- Select Seed the open months.
- Correct the months where you know better, in the Months tab.
- Select Publish the version.
Result: the version is frozen and carries its vintage number. The Totals tab shows the Actual to date, the Forecast over the open months and the Horizon total.
Run next month's version#
This is the central act of a rolling forecast, and it takes one button.
- Open the published version of the previous month.
- Select Roll forward one month.
- On the new version, select Seed the open months.
- Correct what you know, then select Publish the version.
Result: the horizon has moved forward a month, the actuals have gained a month, and every figure already entered has been carried over as is. The previous version stays readable exactly as it was made.
Compare two versions#
It is the comparison between two versions that teaches you something, not the figure of one version on its own.
- Open the current version.
- Select Compare with the previous one.
- Read the variance item by item and month by month.
Result: a sentence that did not exist before becomes available. You forecast one amount for the year, you now forecast another, and the difference has a name: the real month that has just closed.
Track the cost of a campaign#
A marketing campaign already knew what it brought in; it knows what it cost as soon as it carries an analytic account.
- Open the campaign in Outreach.
- Select Create the analytic account.
- Open the Budget tab.
- Read the Posted spend, the Internal cost and the Total spend.
- Check the Uncosted hours and, if there are any, the Estimated internal cost.
Result: the campaign shows its spending next to the return Odoo already calculates. The Budget lines that name this account appear in the same tab, with their cumulative planned amount. Spending enters through the normal accounting path: a vendor bill or an expense report that carries the analytic distribution, with no double entry.
The menus, one by one#
These menus are the ones the modules declare. The application is called Budgets in the main menu.
Budgets › Budgets: a grouping menu for the tracking screens.
Budgets › Budgets › Budgets: the list of budgets, with their fiscal year dates, their state, their four amounts and their number of flagged lines. On an empty screen, the help text recalls that a budget compares a plan to actuals, item by item, and that the actual is never copied.
Budgets › Budgets › Budget tracking: every budget line, across all budgets, in list, pivot, graph or form view. This is the cross-cutting reading screen: by item, by fiscal year or by source.
Budgets › Budgets › Flagged lines: only the lines whose drift exceeds both the percentage and the floor of the budget. The help text on the empty screen explains why both conditions are required.
Budgets › Budgets › Rolling forecasts: the forecast versions, with their horizon, their actuals cut-off date, their vintage and their totals. The help text recalls that a forecast is redone every month, and that it is the comparison between versions that teaches you something.
Budgets › Budgets › Forecast by month: the monthly cells of every version, in pivot or list view. Useful to read one given month across several vintages.
Budgets › Configuration: a grouping menu, for the Manager group only.
Budgets › Configuration › Budget items: the list of items, with their code and their accounts. The help text advises aiming for three to five items and points to the suggestion dialog.
Budgets › Configuration › Suggest budget items: the dialog that proposes a breakdown from the company's real chart of accounts.
Budgets › Configuration › Link subscriptions: the dialog that infers each subscription's item from its own vendor bills.
Reference#
Fields of the Budget form#
| Field | Description | Required or default |
|---|---|---|
| Fiscal year start, Fiscal year end | Boundaries of the budget year. | Required |
| Alert threshold (%) | Variance beyond which a line is flagged. No market practice sets this figure: it is a choice. | To enter |
| Alert floor | Below this amount, a variance is not flagged, even as a percentage. | To enter |
| Planned, Actual, Committed, Theoretical | The four amounts for the whole budget. | Calculated |
| Variance | Planned minus committed, for the whole budget. | Calculated |
| Flagged lines | Number of flagged lines. | Calculated |
| Uncovered accounts, Accounts counted twice | Coverage check against the chart of accounts. | Calculated |
| Revision of, Revisions | Chain of successive revisions; the original carries number zero. | Empty |
| Lines, Coverage, Totals tabs | The budget lines, the coverage check, the totals. |
Fields of the Budget line form#
| Field | Description | Required or default |
|---|---|---|
| Budget item | The item this line reads. | Required in accounting mode |
| Source | Accounting reads the posted entries; Internal cost (outside accounting) reads only the analytic lines with no accounting document. | Accounting |
| Analytic accounts | Restricts reading to entries whose distribution names one of these accounts. Required in internal cost mode. | Empty |
| Planned | Amount planned for the year. | $0.00 |
| Monthly breakdown tab | Amount expected in each month; Spread evenly puts an equal share everywhere. | Equal by default |
| Actual, Committed, Theoretical | The three amounts read or calculated. | Calculated |
| Theoretical basis | Says what the theoretical amount rests on: the schedule or a prorating. | Calculated |
| Variance from plan | Planned minus committed. Positive: budget is left. | Calculated |
| Variance from theoretical, Variance from theoretical (%) | Committed minus theoretical. Positive on an expense: you are spending faster than planned. | Calculated |
| Uncosted hours | Hours logged whose cost is zero, for lack of an hourly rate on the employee's form. | Calculated |
| Accepted overrun, Overrun reason | Removes the line from the alerts, keeping the reason. | Cleared |
| Linked subscriptions, Subscriptions without a schedule | Subscriptions whose item is the line's item, and those that spend with no schedule. | Calculated |
Fields of the Budget item form#
| Field | Description | Required or default |
|---|---|---|
| Name | Name of the item, as it appears in the budgets. | Required |
| Code | Short code, which sets the display order and serves the reports. | Empty |
| Accounts tab | General ledger accounts whose entries feed this item. | At least one |
| Rationale tab | Why this item exists, and what it does not cover. | Empty |
Fields of the Rolling forecast form#
| Field | Description | Required or default |
|---|---|---|
| Horizon start, Horizon end | Boundaries of the horizon, which crosses fiscal years. | Required |
| Actuals through | Months ending on or before this date are actuals; the following ones are forecast. | Required |
| Vintage | Number of the version. | Assigned |
| Previous version, Next versions | Chain of monthly versions. | Empty |
| Actual to date, Forecast over the open months, Horizon total | The three totals of the version. | Calculated |
| Lines, Months, Totals tabs | One line per item, the monthly cells, the totals. |
Each monthly cell carries the Forecast amount (what you decided to forecast, kept even after the month closes), the Actual, the Closed month box, the Retained amount, which is the actual if the month is closed and the forecast otherwise, and the Variance from forecast.
Reports and exports#
A printable report, Budget vs. actual, outputs the budget item by item with its four amounts and its variances. The Budget tracking and Forecast by month screens offer pivot and graph views, which export to a spreadsheet. See Common actions in every application.
Automations#
Nothing runs overnight in this family, and that is on purpose. The actual, committed and theoretical amounts and the variances are recalculated every time they are displayed, from the books, so there is never a stale figure to refresh. What happens without you is assistance: the linking dialog infers a subscription's item from its own bills, seeding fills the open months of a version, and the roll copies existing figures from one month to the next.
Public pages and portal#
This application has no public page and no portal: a budget is not shown to a client.
Modules that extend this application#
The base works on its own. Each satellite installs when both applications it links are present, and adds one thing.
The rolling forecast comes from a second satellite.
A third satellite links the first two.
The last one links the budget to marketing.
Understanding#
The item is a group of accounts, not an analytic account. Most budget tools require an analytic key on every invoice. Until that entry is made, the budget shows zero against very real spending. Here, analytics stays available as a second axis, line by line, when it is filled in.
A line reads one source only. A posted invoice that carries an analytic distribution produces both an accounting entry and an analytic line. Adding them would count every dollar twice, silently, with nothing looking wrong on screen. That is why each line declares its source, and why the two sources are disjoint by construction.
The actual is never stored. The module records only the plan and the decisions. Go back to accounting, correct an entry, and the budget follows on the next reading. A forecast obeys the same rule seen from the other side: it stores the decision, that is, what was planned, and keeps calculating the fact.
An open budget can no longer be edited. A budget touched up on the quiet no longer measures anything, because nobody can say what reality was compared against. A revision costs one step and answers the question.
The alert threshold is a choice, not a truth. No market practice sets these numbers. That is why the percentage and the dollar floor are settings, and why both conditions are required together: a percentage alone screams on small items, an amount alone stays silent on big ones.
Zero-cost hours are flagged, not hidden. Odoo values time from the employee's hourly cost. When that rate is missing, which is common on a new payroll, the amount is zero while the hours are very much there. The line would read “nothing spent” and look perfectly normal. So the module counts those hours and displays them. On a campaign, it goes further and puts a figure on them at the default rate, in separate fields: an estimate blended into a posted amount would be worse than no estimate.
An on-demand subscription has no schedule. It spends all the same. The module displays it instead of counting it as zero, because a partial schedule taken for a complete one underestimates the theoretical amount and manufactures false alerts. In the forecast, it falls into the averaged share: better to spread it than to lose it.
No advertising spend is pulled from an external interface. Publishing connectors talk to publishing interfaces; spending would require the advertising ones, which are other products, with their own access review. Accounting entry stays the path, and the fallback: an advertising access can be refused or revoked, and budget tracking does not have to stop for that.
No drivers, on purpose. No formulas, no quantities multiplied by a rate. A forecast by item and by month, seeded automatically, corrected by hand where you know better. Everything is set up so the monthly version takes a few minutes, because a forecast nobody redoes goes on looking authoritative while it rots.
Troubleshooting#
| Symptom | Likely cause | Fix |
|---|---|---|
| A line's actual stays at zero although the spending exists. | The account carrying the spending is in no item, or the line is in internal cost mode. | Open the budget's Coverage tab, then add the account to the right item. |
| An amount seems to be counted twice. | Two items of the same budget cover the same account. | Read the Accounts counted twice in the Coverage tab and remove the account from one of the two items. |
| A line cries overspending every renewal month. | The planned amount is spread evenly although the spending falls in one go. | Enter the real Monthly breakdown, or link the subscription to its item. |
| A line shows a zero internal cost despite logged hours. | The employee forms have no hourly cost. | Read the Uncosted hours, then fill in the hourly cost in Employees. |
| The linking dialog leaves a subscription with no item. | Two items cover the dominant account of its bills, or none does. | Choose the Budget item by hand on the subscription. |
| The budget refuses every change. | It is open, revised or closed. | Select Revise to draw a new version from it. |
| The open months of a version stay empty. | Seeding was not run, or no closed month exists to calculate it. | Select Seed the open months, or enter the first months by hand. |
| A campaign's spending stays at zero. | The campaign has no analytic account, or the invoices do not name it. | Select Create the analytic account, then set the analytic distribution on the invoices. |
See also#
- Invoicing: the chart of accounts, the entries and the analytic accounts the budget reads.
- Purchase: the purchase orders that come before the spending.
- Expenses: the expense reports that carry their analytic distribution.
- Subscriptions: the register of renewals, source of the commitment schedule.
- Timesheets: the hours that feed the internal cost.
- Outreach: the campaigns whose spending the budget tracks.
- Employees: the hourly cost that values the hours.