Unpaid invoices in Odoo: find the ones nobody is chasing
In short, An unpaid invoice only becomes dangerous once nobody is following it. In Odoo you find them from the customer invoice list (filter on past due dates, group by customer) or from the aged receivable report, depending on your edition. Three situations need attention right away: invoices more than 60 days overdue, customers placing new orders while they are behind, and customers above their credit limit. The fix is a short weekly review with a named owner.
Nobody in a small business decides to let an invoice slip. It slips on its own. Sales assumes accounting is chasing it, accounting assumes the salesperson "has a good relationship" with the customer, and the CEO only sees a total receivables figure that barely moves from month to month. Meanwhile, a March invoice drifts quietly towards "we'll deal with it at year end".
The problem isn't missing information. Odoo knows exactly which invoices are past due and for how much. The problem is that this information never reaches anyone in a form that forces action. No standard screen tells you "this invoice is overdue AND nobody has touched it in a month". This article gives you the method to see it, chase in the right order, and put a routine in place that holds.
Why unpaid invoices go unchased#
The causes are rarely accounting ones. They are organisational, and Odoo reflects them faithfully.
Nobody owns the invoice. An order has a salesperson, an invoice often inherits that salesperson, but collections is assigned to no one. Without a scheduled activity on the invoice, nothing lands in anyone's inbox.
Payment follow-up isn't set up. Odoo offers a structured reminder mechanism (follow-up levels, reminder emails and letters), but it depends on your edition and installed modules. Many companies go live without configuring it and never come back to it.
Payments aren't reconciled. The customer paid, but the payment was never matched to the invoice. The overdue list fills up with false positives, people stop trusting it, and they stop opening it. The real arrears get lost in the noise.
Sales can't see accounting. A customer two months behind can place a new order without the salesperson knowing. The quote is confirmed, the goods ship, and the exposure doubles.
The credit limit is empty, or ignored. You can set it on the customer record, but it is often blank or hasn't been reviewed since the account was opened.
What it costs#
The most visible cost is cash. Every overdue invoice is money you have already earned and are now financing on your customer's behalf. If your working capital is tight, you may well be paying overdraft interest for them.
The second cost is less visible: the odds of collecting fall over time. An invoice chased at two weeks often gets paid after a simple reminder. The same invoice at four months needs a call, a negotiation, sometimes a payment plan, and part of it ends up written off. The older the debt, the more effort the chase takes, for a less certain result.
The third cost is commercial. Continuing to deliver to a customer who doesn't pay means growing an exposure that is already at risk. And on the day you finally have to hold their orders, the conversation is much harder than it would have been at the first missed due date.
Finally, there's the cost to steering the business: receivables of unknown age make your cash forecast unreliable. That is exactly why customer payment delay is one of the KPIs an SMB CEO should read every Monday.
Finding them by hand in Odoo, step by step#
The simplest path, whatever your Odoo version, is the customer invoice list, available in every edition. The aged receivable report comes on top if you have it.
1. List overdue invoices. Go to Invoicing (or Accounting, depending on your edition), Customers, Invoices. Clear the default filters, then filter on invoices with the "Posted" status whose payment status is "Not Paid" or "Partially Paid", with a due date before today. The predefined "Overdue" filter does this in one click.
2. Show the amount actually due. In the list view, enable the "Amount Due" column if it's hidden. That is the figure that matters, not the invoice total: a partially paid invoice only exposes its balance.
3. Group by customer, then sort. Group by customer (Partner) to see each one's total exposure, and sort by amount due. To isolate serious arrears, add a condition on due dates more than 60 days in the past. You now have the short list of receivables that deserve a phone call rather than an email.
4. Check who's handling it. This is where standard Odoo helps least. Open the invoices at the top of the list and read the message history at the bottom of the form: is there a scheduled activity, a reminder sent, a note from a conversation with the customer? There is no "last follow-up" column in the invoice list. If your team tracks reminders on the customer rather than the invoice, check the customer record too. Be realistic: across fifty overdue invoices this takes time, and it is exactly the step that gets skipped.
5. Open the aged receivable report, if you have it. Under Accounting, Reporting, the Aged Receivable report (sometimes filed under partner reports) splits each customer's balance into age buckets. It belongs to the accounting reports of the Enterprise edition: on Community you'll need to rebuild the buckets from the export in step 3. It answers "how much, and since when" well, but not "who is chasing".
6. Cross-check with recent orders. Note the customers in arrears, then go to Sales, Orders, filter on orders confirmed in the last two or three weeks and look for those names. There is no standard view combining overdue invoices and new orders: it's a manual cross-check, or an export of both lists into a spreadsheet.
7. Check credit limits. The "Sales Credit Limit" option is enabled in the Invoicing or Accounting settings, depending on your edition (Customer Invoices section). Once active, the customer record shows a credit limit on its invoicing or accounting tab, and Odoo displays a warning on the quote or invoice when it's exceeded. Key point: in standard Odoo that's a warning, not a block. To spot overruns, compare each customer's "Total Receivable" with their credit limit. You can't filter the customer list on that total: an export is the simplest route.
Chasing them, in order#
Once you have the list, the order of actions matters more than their volume.
- Clear false arrears first. Before chasing anyone, reconcile payments received but not matched. Chasing a customer who has already paid damages the relationship and undermines every reminder that follows.
- Handle new commitments first. A customer in arrears who just confirmed an order is the most urgent case: the goods may not have left yet. Decide with the salesperson: hold the delivery, require the overdue balance before shipping, or ask for a deposit.
- Call on anything over 60 days. At that stage an automated email won't do. A call, a named contact, a payment date agreed and logged in the invoice history. If the customer is struggling, a written payment plan beats a verbal promise.
- Schedule a follow-up on every overdue invoice with no activity. Create an activity on the invoice, assigned to a person, with a date. That is what turns "we should chase this" into a visible task in someone's inbox.
- Use follow-up levels if your edition has them. Payment follow-up (with the full Accounting app, Enterprise edition) lets you define levels (friendly reminder, firm reminder, formal notice) triggered after a set number of days. Its location and behaviour vary with your Odoo version, and some localisations add their own letter templates: check it on your own database before rolling it out to the team. For formal notices or late payment penalties, have the wording checked by your advisor, as the rules vary by country.
- Review exceeded credit limits. For each customer above their limit: either the limit was too low and you raise it knowingly, or it is right and sales wait for payment. Both decisions are valid. Not deciding isn't.
Keeping it from coming back#
A one-off chase empties the list once. A routine keeps it from filling up again.
A 20-minute weekly review. Same day, same person. Three questions, always the same: which overdue invoices have no scheduled activity, which customers in arrears ordered this week, which customers are above their credit limit.
A named owner. Not "accounting" or "sales". A name. If collections is shared, spell out when it moves from one person to the other (for example, reminders by accounting, a call from the salesperson beyond a threshold you set).
Thresholds decided in advance. After how many days an unchased invoice becomes an alert, after how many days you pick up the phone, beyond what delay deliveries are held. Write them down. As with any indicator, consistency is what makes the tracking usable.
A credit limit for every active customer. An imperfect limit beats no limit: at least it triggers the warning at quote time. Review it once or twice a year for your main customers.
Clear rules on the sales side. If a customer is behind beyond a certain point, the salesperson has to know before confirming. Standard Odoo won't block the order, so this is a team rule that has to be made visible.
What the UpBoard scan checks on this topic#
So you know exactly what gets looked at, here are the four checks related to unpaid invoices, read-only on your Odoo:
- Unpaid invoices with no recent follow-up: posted customer invoices, unpaid or partially paid, more than 14 days past due, with no activity created on them in the last 30 days. A useful nuance: the check looks at activities attached to the invoice itself. A follow-up tracked only on the customer record won't show up there.
- Customer payments more than 60 days late: the same invoices, with a due date more than 60 days past, ranked by amount due.
- Customer arrears plus new orders: customers with an invoice more than 30 days overdue and a sales order confirmed in the last 14 days.
- Customers above their credit limit: customers whose total receivable exceeds the credit limit set on their record. Customers with no limit aren't covered by this check.
The scan detects and quantifies; it doesn't chase anyone and writes nothing to Odoo without human approval.
Conclusion#
Unpaid invoices are almost never a software problem: Odoo knows every due date and every balance. What's missing is the question asked every week, "which ones is nobody following?", and someone to answer it. The manual method works, as long as you keep it up. If gathering the data is what holds you back, the UpBoard scan reviews your Odoo for free, read-only, with 92 checks including the ones described here, and shows you your score before asking for your contact details. Results come back in a few minutes: enough to start your next review with the right list.
Read next
- The 7 KPIs every SMB CEO should track each MondaySMB CEO KPIs: cash, DSO, margin, pipeline, stock, overdues, support. The 7 numbers to read every Monday morning, with concrete action thresholds.
- Odoo invoicing compliance in Belgium: the 2026 checklistMandatory Peppol, legal mentions, sequential numbering: the Odoo invoicing compliance checklist Belgian companies need to get through 2026.
- AI agents for Odoo: the complete guide for SME leadersWhat AI agents connected to Odoo are, how they work read-only, what they cost, and how they turn your ERP data into decisions. The reference guide for an SME.
See what your Odoo data has to tell you
A few minutes, read-only, no card. Then a trial on your real data: 14 days, or until the trial credit is used up.
Rather talk it through? Book a demo