See it in action
An over-limit order is blocked, the manager overrides, and your exposure is clear at a glance.
A warning nobody reads is not control
Odoo shows a credit-limit warning — then lets the order through anyway. This app stops it: orders that would push a customer over their limit can't be confirmed until a manager decides, so bad debt doesn't sneak past. And it doesn't stop at the point of sale — a daily cron watches each customer's OVERDUE receivables and automatically holds and releases them as aging crosses your configured threshold, so risk gets caught even between orders.
Your whole AR exposure on one screen
Every customer's limit, outstanding balance, available credit and exposure — over-limit in red, near-limit in orange.
Everything you need for credit control
Overdue-based auto-hold
A daily cron checks each customer's overdue receivables and puts them on hold once the amount, or the oldest unpaid invoice, crosses your configured threshold.
Auto-release
Once the overdue balance drops back under the threshold, the same cron lifts the hold automatically — no one has to remember to check.
Credit-Manager-only release
A salesperson cannot self-release their own customer's hold, by cron or by hand — releasing (and forcing a hold) requires the Credit Manager group.
Hard block
Orders that push a customer over their credit limit cannot be confirmed — not just a warning.
Credit hold
Flag a risky customer to block all of their orders, whatever the amount.
Manager override
A Credit Manager can clear a specific order to confirm, with the decision logged.
Exposure overview
One dashboard of limits, outstanding AR, available credit and exposure percentage.
Colour-coded risk
Over-limit rows in red, near-limit in orange, on-hold customers muted — risk jumps out.
Projected exposure
The check counts current balance plus the order being confirmed, so you never tip over unseen.
Toggle hold inline
Put a customer on or off hold straight from the overview list.
Per-customer thresholds
Override the company's overdue amount and days-overdue thresholds per customer, or force a permanent hold or release.
Optional invoicing block
Turn on Block Invoicing While On Hold to also stop customer invoices being created from sales orders while the hold is active.
Built on Odoo
Uses Odoo's standard credit limit and outstanding-balance fields — nothing duplicated.
Multi-company
The block is per company and exposure reflects each company's balance.
Up and running in three steps
Enable the block
One setting in Invoicing.
Set limits
A credit limit per customer.
Sell safely
Over-limit orders wait for approval.
Watch exposure
The dashboard shows risk live.
Real screens, real data
Every screenshot below is the actual app running on Odoo 19 — no mockups.
The block in action
An over-limit quotation shows Credit Blocked with a clear reason, and only a manager's override clears it.
One switch to turn it on
Enable Block Over-Limit Orders alongside Odoo's standard credit-limit option.
Keep bad debt from sneaking past
Install in seconds. No Enterprise, no external libraries, no lock-in. Works on Odoo 19 Community and Enterprise.
Full manual included. The app ships with a complete in-app documentation page (Apps > this module > Documentation) covering setup, the overview, the block workflow and FAQs. Questions? bambooforge.labs@gmail.com
BambooForge Credit Limit & Hold
Odoo warns you when a customer is over their credit limit — then lets the order through anyway. This app turns that warning into real control: it blocks confirmation of orders that would push a customer over the limit, lets you put a customer on hold, and gives you a live credit-exposure overview.
This page is the complete manual. Follow it top to bottom and you can install, set limits and run the workflow without contacting support.
Overview
- Hard block — a quotation that would bring a customer's outstanding balance over their credit limit cannot be confirmed until a Credit Manager overrides.
- Credit hold — flag a customer to block all of their orders, regardless of the limit.
- Exposure overview — one screen listing every customer with a limit, their outstanding AR, available credit and exposure, with over-limit rows in red.
It builds on Odoo's standard credit fields (the customer's credit limit and outstanding balance), so nothing is duplicated.
Requirements
- Odoo 17.0 with Sales (sale_management). Installing this app pulls it and Invoicing in automatically.
No Enterprise modules and no external Python libraries are required.
Installation
- Copy bambooforge_credit_limit into your addons path.
- Update the apps list (Apps > Update Apps List).
- Search for Credit Limit and click Install.
Setting it up
- Turn on Settings > Invoicing > Customer Invoices > Credit Limit (Odoo's standard credit-limit feature) and, just below it, enable Block Over-Limit Orders (added by this app).
- On each customer, set their Credit Limit (Accounting tab).
- Assign the Credit Manager role (Settings > Users) to whoever may override blocks.
The exposure overview
Open Sales > Reporting > Credit Overview for a live table of every customer with a credit limit: their limit, outstanding balance, available credit and exposure percentage. Rows over the limit show in red, near-limit in orange, and on-hold customers are muted. Toggle Credit Hold straight from the list.
How the block works
When a quotation's projected exposure — the customer's current outstanding balance plus this order's total — exceeds their credit limit, the order is marked Credit Blocked and confirmation is refused with a clear reason. A customer on Credit Hold is blocked regardless of amounts.
A Credit Manager opens the order and clicks Override Credit Block; the order is then cleared to confirm, and the override is logged on the chatter.
Frequently asked questions
- It only warns, it doesn't block.
- Make sure Block Over-Limit Orders is enabled in Settings. Odoo's own credit-limit option only shows a warning; this app adds the block.
- Who can override?
- Only users with the Credit Manager role. Others see the block but cannot clear it.
- What counts towards the limit?
- The customer's outstanding receivable balance plus the order being confirmed.
- Can I block a specific customer entirely?
- Yes — tick Credit Hold on the customer (or from the overview) to block all their orders.
- Does it work with multiple companies?
- Yes. The block setting is per company, and exposure is the customer's balance in that company.
Support
Questions or ideas: bambooforge.labs@gmail.com.
Troubleshooting
This section lists the problems administrators run into most often, with the cause, how to confirm it, and how to fix it. Every item refers only to fields and roles this app actually adds.
An order is blocked and nobody expected it
Cause. A quotation is blocked in two situations: the customer is on Credit Hold, or the projected exposure (their current outstanding balance plus this order's total) exceeds their Credit Limit while Block Over-Limit Orders is on.
Diagnosis. Open the order and read the Credit Blocked warning; its reason line tells you which case applies. If it mentions "credit hold", check the customer form — the hold may have been applied automatically by the nightly cron because their overdue receivables crossed the configured threshold or days past due. If it mentions the limit, compare the customer's outstanding balance plus the order total against their limit on the Credit Overview.
Resolution. Have the customer pay down their balance, raise their limit, or ask a Credit Manager to click Override Credit Block on the order. For a hold, a Credit Manager releases the customer.
A user who should be able to override cannot
Cause. The Override Credit Block action and the customer hold/release buttons are restricted to the Credit Manager group. A salesperson also cannot clear the block with a direct write — credit_override on the order and the hold fields on the customer are guarded and raise an access error.
Diagnosis. Under Settings > Users, open the user and check the Credit Control section for the Credit Manager role. If clicking the override raises "Only a Credit Manager can override a credit block", the role is missing.
Resolution. Grant the Credit Manager role. Note that a member of Odoo's Accounting / Full Rights group may additionally maintain a customer's hold directly, but only Credit Managers can override a blocked order.
The limit is not enforced — it only warns
Cause. Blocking is opt-in per company. If Block Over-Limit Orders is off, you get Odoo's standard warning only. A block also never fires when the customer has no Credit Limit set, or when the limit is 0.
Diagnosis. Check Settings > Invoicing for both Odoo's Credit Limit feature and this app's Block Over-Limit Orders toggle. Then open the customer's Accounting tab and confirm a non-zero Credit Limit. Remember the block only evaluates orders still in Quotation or Quotation Sent — a confirmed order is never retroactively blocked.
Resolution. Enable Block Over-Limit Orders and set a credit limit on the customer. To also stop invoicing held customers, enable Block Invoicing for Held Customers.
Overdue / aging figures look wrong
Cause. Overdue Receivables counts only posted, unreconciled receivable journal items whose maturity date is already past, in the company currency. Draft invoices, future-dated instalments, and already-reconciled entries are excluded by design.
Diagnosis. If a customer looks overdue but the figure is 0, confirm their invoices are posted (not draft) and past their due date. If a paid invoice still counts, check that the payment is reconciled against it.
Resolution. Post the invoices, set correct payment terms/due dates, and reconcile payments. The value recomputes against today's date, so it updates on its own once the underlying entries are correct.
A customer keeps getting auto-held (or won't auto-release)
Cause. The nightly Credit: Apply Overdue Holds cron holds a customer when their overdue amount exceeds the threshold or their oldest invoice is more than the configured days past due, and it auto-releases only holds it applied itself. A manager's Forced Hold or Forced Release decision always wins and is never overruled by the cron.
Diagnosis. On the customer, check Manual Credit Decision: Forced Hold keeps them held, Forced Release keeps them off. Confirm the company (or per-customer) Auto-Hold Overdue Amount and Auto-Hold Days Overdue thresholds — both 0 disables the feature entirely.
Resolution. Use Reset to Automatic to hand control back to the cron, or adjust the thresholds. A manually held customer is only released by a Credit Manager, never by the cron.
Upgrading & version compatibility
This build targets Odoo 19.0. Each Odoo major series (17.0, 18.0, 19.0) has its own dedicated build of this module — always install the build that matches your Odoo version. Mixing a build with a different Odoo series is not supported.
Patch upgrades (same series, e.g. 19.0.1.0.0 → later)
Back up your database and filestore first.
Replace the module folder with the newer build.
Restart Odoo with the module updated:
./odoo-bin -c your.conf -u bambooforge_credit_limit -d your_db
Odoo applies any schema/data changes automatically. Your existing records and configuration are preserved.
Cross-version migration (e.g. Odoo 17 → 18)
Upgrading Odoo itself is a database migration handled by Odoo's standard upgrade tooling. When you migrate the database to the next Odoo series, install the matching build of this module for that series. Data created by this module carries over with the database migration.
After any upgrade the module's scheduled actions resume on their normal cadence — no manual re-activation is required.
Uninstallation
You can remove this module at any time from Apps → (this module) → Uninstall, or from the command line. Uninstalling is clean and reversible by reinstalling — but note what is and is not deleted.
What is removed
- The fields, views and analysis definitions this module added.
- The menus, actions, views and reports this module installed.
- Its scheduled actions (cron jobs) — they stop immediately on uninstall.
- The security groups this module defined (user assignments to them are dropped).
What is preserved
- Your standard Odoo data (partners, products, sales, invoices, inventory moves) is not deleted — this module only reads and annotates it; the underlying records stay.
- Attachments and chatter messages on standard records are kept.
As always, take a database backup before uninstalling in production.
Changelog
19.0.1.0.0
Current release for Odoo 19.0. This build includes:
- Automatically put customers on credit hold based on their overdue receivables.
- And release them again once they pay down.
- On a daily schedule, no manual watching required. Also turns Odoo's credit-limit warning into real control: block confirmation of sales orders that would push a customer over their credit limit, put risky customers on hold by hand, and watch your whole AR exposure on one dashboard.
Feature additions and fixes ship as new builds on the Odoo Apps store; this page and the module's version reflect the current published release. Always keep the build matched to your Odoo series (see Upgrading & version compatibility).
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module