Revenue Recurring Bridge
Link a recurring invoice template to an IFRS 15 revenue contract, and every generated invoice lands as deferred revenue on the balance sheet instead of immediate income, released to revenue by the contract's recognition run.
Why this module
Recurring billing that respects the five-step model.
Billing lands as deferred revenue
A linked template routes every generated invoice line to the contract's contract liability account instead of the line income account, so recurring billing shows as deferred revenue on the balance sheet, not immediate income, and the recognition run releases it as performance obligations are satisfied.
Mirrors Record Billing exactly
On posting, the invoice registers itself as billing on the contract. If the contract carries a contract asset (revenue recognised ahead of billing), a balanced reclassification clears that asset first, so the ledger shows exactly the split the contract's own Record Billing convention would have produced.
Nothing changes until you link
The link is optional per template. Unlinked templates are untouched and post to income exactly as before, a byte-identical default, so adding the bridge does not disturb any billing already running.
Day in the life
A subscription that recognises revenue properly.
You have a recurring invoice template that bills a customer each month and an active IFRS 15 revenue contract for the same engagement. You set the revenue contract on the template. From then on, every invoice the template generates credits the contract liability account rather than income, and when the invoice posts it registers the billed amount on the contract, clearing any contract asset first. The receivable is still debited by the invoice as normal. As you run the contract's recognition, the liability releases to revenue in line with the satisfaction of the performance obligations, so the monthly cash billing and the revenue you report move on separate, correct schedules.
Edge cases
A thin bridge, built carefully.
Each one is in the shipped code today.
Registration is idempotent per invoice: a flag records that a generated invoice has already registered its billing, so a reset and repost cannot count the same billing twice on the contract.
Generation refuses to run if the linked contract is not active or has no contract liability account configured, with a clear message, rather than silently posting the billing to the wrong account.
The contract-side bookkeeping runs as superuser, because a billing user may have no access to the revenue contract models; the registration is a deterministic consequence of a manager-approved template link, not a discretionary action.
A constraint requires the linked revenue contract to belong to the template's company, so a cross-company link can never be saved.
What is inside
Small on purpose, complete where it counts.
- An optional contract link. A Revenue Contract field on the recurring invoice template, filtered to the template's company, with a same-company constraint.
- Invoice routing on generation. When a template is linked, every generated invoice line is routed to the contract's contract liability account and the invoice is stamped with the contract, after the active-contract and configured-account checks pass.
- Billing registration on posting. A posted, template-generated invoice registers its untaxed amount as billing on the contract, clearing any contract asset first with a balanced reclassification, guarded by an idempotency flag.
- Automatic install. The bridge auto-installs whenever both the Revenue Recognition (IFRS 15) and Recurring Invoices Pro modules are present, and does nothing until a template is actually linked.
Honest about the edges
What this does not do, so nothing surprises you.
- It is a bridge, not a standalone engine: it needs both the Revenue Recognition (IFRS 15) and Recurring Invoices Pro modules, and it relies on their contracts, accounts and recognition run.
- It does not auto-register credit notes or manual reversals of a linked invoice; correct the contract position through the contract's own billing flow instead.
- It does not create performance obligations or schedule recognition; the contract owns that, and the bridge only feeds it the billing.
- It registers the untaxed amount as billing; tax handling on the invoice is unchanged and stays on the invoice.
Installing this module
A standard Odoo addon, installed the standard way.
This is a standard Odoo addon that ships Python models, not a data-only package. Install it by placing the module folder, together with its dependency modules, into a directory on your Odoo addons_path, then open Apps, update the apps list, and install it from there. Do not use the Apps to Import Module upload screen: that path does not load Python code, so a module with models will not run when installed that way. Once the folder is on the addons_path the usual Apps install and later upgrades work exactly as they do for any other addon.
odoo recurring invoice deferred revenue, subscription revenue recognition IFRS 15, contract liability billing, deferred revenue recurring billing, recurring billing revenue contract bridge, contract asset reclassification, five step model revenue, odoo 19 revenue recognition bridge, performance obligation revenue release
Modules teams pair with this one.
Premium ERP Heritage modules that extend the same stack, each built to the same engineering bar.
The Australia country pack for the ERP Heritage Employment Hero integration
Sync certifications, qualifications and employee document metadata from the Employment Hero people platform into...
Sync Employment Hero leave categories, leave requests and leave balances into the standard Odoo Time Off app, wit...
Show the Hijri (Umm al-Qura) date alongside Gregorian dates across Odoo 17
Connect Odoo partner records to the Saudi SPL National Address service and the Wathq commercial registry
Please log in to comment on this module