Collections Workbench
Turn the aged receivable report into an active dunning workflow that creates, chases, and escalates a case per overdue customer on its own.
Why this module
Collections Workbench
The report that chases for you
One GROUP BY SQL pass builds a case per overdue customer from open AR and refreshes it nightly. The follow up cron picks the next due level per case and sends it, so the queue moves whether or not a collector logs in.
A history you cannot rewrite
Every call, email, follow up, and broken promise escalation writes a row to an action log that blocks write and unlink at the model level. Auto creation is idempotent and de duplicated by a partial EXCLUDE constraint, so re running the cron never doubles a case.
Yours to keep
LGPL-3 source on disk. No activation key, no phone home, no recurring licence. Configure the ladder per company, swap in your own templates, and extend the workflow. Free today, free at renewal, because there is no renewal.
Day in the life
A credit controller starts the morning with the cases already moved.
Overnight the aging refresh cron rebuilt every case from open AR, and a customer who paid down their balance dropped to a zero total instead of showing a stale figure. The follow up cron sent the 30 day firm reminder to three accounts and scheduled a call activity on each. One customer who promised to pay last week missed the date, so the broken promise cron already bumped its priority, moved it to Escalated, and queued the next level, all without re escalating a promise it had handled the day before. The controller opens one account that disputes its invoice, drags it to Disputed, and prints a Statement of Account PDF listing every open invoice and the full contact history on the shared suite letterhead. For a chronic late payer, the late fee wizard previews a prorated percent per month charge to the cent and posts it as a normal customer invoice in one click.
Edge cases
The cases most modules quietly ignore.
In the shipped code today, each one a place where a cheaper module silently does the wrong thing.
The nightly aging refresh zeroes the total on cases whose partner paid down their balance, so a customer who drops out of the overdue aggregation never lingers with a stale figure until someone clicks Refresh.
A resolved case is never reopened. A new overdue invoice spins up a fresh case so the resolution history stays intact. The EXCLUDE constraint only forbids two open cases for the same partner, not a closed one plus a new one.
Broken promise escalation is idempotent. A 24 hour cool off plus a computed broken promise filter stops the cron re escalating the same lapsed promise on every tick, and a fresh promise dated today or later auto clears it.
Follow up counters increment with an atomic SQL UPDATE then a cache invalidation, so a manual send and the scheduled cron hitting the same case at once cannot clobber each other with a read modify write race.
The late fee wizard computes flat or prorated percent per month fees in Decimal with ROUND_HALF_UP, so the preview and the posted invoice agree to the cent, and it raises a named error when the partner has no overdue receivable.
A single GROUP BY aggregation per company and partner bounds the work by distinct partner pairs instead of loading every overdue ledger line into Python, so large receivables ledgers stay fast.
What is inside
Built to do the job, end to end.
- Idempotent auto case creation. A single GROUP BY SQL pass over open receivable lines creates one case per overdue customer per company. The nightly cron updates totals rather than duplicating, and a partial EXCLUDE constraint guarantees one open case per partner.
- Configurable follow up ladder. A per company days overdue ladder firing on shipped defaults of 7, 30, 60, and 90 days. Each level sends a branded HTML dunning email and schedules a call activity, advanced by a savepoint isolated daily cron so one mail failure does not stop the queue.
- Promise to pay and broken promise escalation. Promises are captured as an amount plus a date on the case card. When a promised date lapses, a separate cron escalates the case overnight with a priority bump, a move to Escalated, and the next level, idempotent via a 24 hour cool off.
- Append only action log. Every call, email, SMS, meeting, note, follow up, and escalation writes a row that is blocked from write and unlink at the model level, with a contact made flag and promise capture, so the contact history cannot be edited or deleted.
- Late fee invoicing wizard. Flat or prorated percent per month fee computed in Decimal to the cent, posting a standard customer invoice in one transaction. It raises a named error when there is no overdue receivable to charge against.
- Statement of Account PDF. A per case PDF listing open invoices plus action history, rendered through the shared suite brand header and footer, registered as a report so it prints, downloads, or attaches to the case.
- Mail templates included. Default mail templates ship bound to eh.collections.case: three wired into the default ladder as courteous reminder, firm reminder, and final notice, plus three additional brand styled dunning variants you can swap in.
Honest about the edges
What this does not do, so nothing surprises you.
- Pausing a case is a single tracked toggle. The follow up cron skips paused cases and manual sends are still permitted, but there is no pause reason field and no automatic resume date. Resuming is a manual action.
- A recorded promise to pay does not pause or roll back the follow up timer. Promises are surfaced and a lapsed promise is escalated overnight, but the next follow up date is driven by the level and last send date, not by the promise.
- Follow up levels are days overdue thresholds, not the kanban stages. Activities and emails are driven by levels, not by dragging a card between columns.
- The dunning ladder is configurable and override able, but there is no built in LLM next action suggestion in this module. That feature exists only if the separate AI Agent Layer module is installed.
- The follow up engine sends branded HTML emails, not rendered PDF letters. The only PDF is the per case Statement of Account, which is not tied to the ladder levels.
odoo 19 collections management, accounts receivable follow up, dunning automation odoo, overdue invoice reminders, promise to pay tracking, aged receivables workflow, collections kanban, automated payment reminders, late fee invoicing odoo, days sales outstanding DSO, credit control odoo community, broken promise escalation
Languages
Available in 19 languages
The interface ships translated out of the box. Switch language in Odoo and the fields, menus, and messages follow.
Please log in to comment on this module