Operating Budgets
An operating budget built on your chart of accounts, compared against reality with no prior data entry.

Odoo Community ships no budget module.
This one puts your budget items on groups of ledger accounts, not on analytic accounts: a budget therefore works on day one, even if no vendor bill carries an analytic key yet.
Four amounts, in Odoo's own vocabulary: planned, actual, committed and theoretical. The actual is never copied, it is re-read from your books every time it is displayed.
⚠️ The theoretical follows the calendar, not the clock. A yearly expense does not spread over twelve months: the monthly split is editable, and when your subscriptions provide a dated schedule, the theoretical is built on it and says so. A flat time-elapsed prorata would report an overrun every renewal month, and an alert nobody trusts protects nothing.
An open budget is not edited: it is revised, and the original stays readable. A coverage check reports the accounts no budget item covers and the ones two budget items count twice. Alerts fire when a drift passes a percentage and a currency floor: a percentage alone screams about small items, an amount alone stays silent about large ones.
And the rolling forecast: a twelve to eighteen month horizon that crosses fiscal years, re-made every month with one button, where each revision keeps its figures forever. It is the comparison between two revisions that teaches you something: “we forecast 28,896, we now forecast 27,666, and the difference is what August actually did”.
Comparable to Odoo Enterprise's Budgets module, in open source, following the calendar rather than the clock
1 add-on module
Campaign BudgetsA marketing campaign already knew what it earned. It finally knows what it spent.
Odoo knows what a campaign returned: invoiced amount, leads, quotations, all computed on utm.campaign. None of its thirty-three fields is a cost. The campaign therefore measures a return whose denominator it does not have.
This module does not build a parallel spend register, which would eventually diverge from the accounting. It attaches one analytic account per campaign, with a uniqueness constraint so an account never serves two campaigns, and splits the spend between what went through accounting and what is internal time.
⚠️ Time is valued by Odoo from the hourly cost. When that rate is missing, the module counts the unvalued hours and says so, rather than displaying “nothing spent”: a zero cost reads as a profitable campaign.

Shall we look at your case together?
Tell us what you run today. We will tell you honestly whether Symbifox helps or not.
The catalog grows almost every month.
What gets added, what we learn deploying it, and nothing else. You leave whenever you want.
One confirmation email, and nothing before you follow its link. Then 10 welcome emails, one a week, then the updates. No tracker, no resale.