# Credit Limit & Credit Hold for Sales Orders

> Put customers on credit hold automatically from their overdue receivables and release them when they pay down - on a daily schedule.

- **What it is:** Put customers on credit hold automatically from their overdue receivables and release them when they pay down - on a daily schedule.
- **For:** Sales
- **Odoo versions:** 16.0, 17.0, 18.0, 19.0, 20.0 - Community and Enterprise
- **Runs on:** Odoo.sh or Odoo you host yourself - not Odoo Online, which accepts no third-party apps
- **Price:** 99 EUR, one-time, on the Odoo Apps Store
- **Technical name:** bambooforge_credit_limit
- **Not for:** 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.
- **Manual:** https://docs.bambooforge.dev/bambooforge_credit_limit/
- **Live demo:** https://demo20.bambooforge.dev/odoo/action-bambooforge_credit_limit.credit_overview_action
- **Store page:** https://apps.odoo.com/apps/modules/20.0/bambooforge_credit_limit
- **Manual last updated:** 2026-10-15

---
# Credit Limit & Credit Hold for Sales Orders

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 20.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

1. Copy `bambooforge_credit_limit` into your addons path.
2. Update the apps list (Apps > Update Apps List).
3. Search for **Credit Limit** and click *Install*.

## Setting it up

1. 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).
2. On each customer, set their **Credit Limit** (Accounting tab).
3. 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.

## How we make sure it works

Before every release, **30 automated checks** run against this app on Odoo 16, 17, 18, 19 and 20.
Among them:

- Non manager cannot set override via create.
- Non manager cannot write override directly.
- Salesperson cannot write hold directly.
- Non manager cannot override.
- Rep can create normal order no regression.

The complete list is in the source you receive.

## Support

Questions or ideas: **support@bambooforge.dev**.

## What it does not do

Said before you buy, because it is the half that decides whether the app fits:

- Only warn: the hard block stops confirmation over the limit until a Credit Manager overrides - unless you leave blocking off in Settings.
- Let anyone override: only the Credit Manager role can.

## Questions people ask

****Which Odoo versions does it run on?****

Odoo 16.0, 17.0, 18.0, 19.0, 20.0, on the series you buy it for; each series is its own listing.

****Community or Enterprise?****

Both. It needs no Enterprise app.

****What does it need?****

The standard Sales app. No extra Python package.

****Where does it show up?****

Under the **Credit Overview** menu (Credit Holds).

****Does anything leave my server?****

No. It makes no call outside your Odoo server: no telemetry, no licence check, no third-party service.

****What happens if I uninstall it?****

Odoo drops the app's own tables and fields; the standard records it worked on (contacts, orders, products) stay as they are.

## 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 20.0**. Each Odoo major series (16.0, 17.0, 18.0, 19.0, 20.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. 20.0.1.0.0 → later)

1. **Back up** your database and filestore first.
2. Replace the module folder with the newer build.
3. Restart Odoo with the module updated:
   
   ```
   ./odoo-bin -c your.conf -u bambooforge_credit_limit -d your_db
   ```
4. Odoo applies any schema/data changes automatically. Your existing records and
   configuration are preserved.

### Cross-version migration (moving to a newer Odoo)

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

### 20.0.1.2.4

- Built for Odoo 20: record rules and access rights rewritten onto Odoo 20's single ir.access model, the screens rebuilt on Owl 3, and every icon moved to the icon set Odoo 20 ships.

### 20.0.1.2.4

- A salesperson without invoicing rights can confirm orders again: the credit
  block reads the customer's receivables and limit with the rights it needs,
  instead of the salesperson's, which raised an access error on *credit*.

### 20.0.1.0.0

Current release for Odoo 20.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*).
