[Cotlet](https://cotlet.dev/index.md) · [Integrations](https://cotlet.dev/integrations.md) · [How it works](https://cotlet.dev/how-it-works.md) · [Use cases](https://cotlet.dev/use-cases.md) · [Security](https://cotlet.dev/security.md) · [For developers](https://cotlet.dev/for-developers.md) · [For automation agencies](https://cotlet.dev/for-agencies.md) · [Blog](https://cotlet.dev/blog.md) · [API docs](https://cotlet.dev/docs.md) · [Help center](https://cotlet.dev/help.md) · [Changelog](https://cotlet.dev/changelog.md) · [Contact](https://cotlet.dev/contact.md) · [Pricing](https://cotlet.dev/pricing.md) · [Sign up](https://cotlet.dev/signup)

# Chase overdue Odoo customer invoices

> List unpaid Odoo invoices past their due date and resend them by email on a weekly schedule, with your OK on each send. Hosted, nothing to maintain.

Source: https://cotlet.dev/integrations/odoo-api-mcp-server/chase-overdue-invoices

Every Monday someone opens the Odoo invoices list, works out which posted invoices are past due, and resends them one by one, often from a spreadsheet of who was already nudged.

Cotlet does it in your own Odoo account with list\_invoices, get\_invoice and send\_invoice, called by your AI agent, an n8n workflow or a script.

[Sign up free](https://cotlet.dev/app/signup?app=odoo) [All Odoo tools](https://cotlet.dev/integrations/odoo-api-mcp-server.md)

Hosted · nothing to install or maintain

## Can Odoo do this on its own?

Odoo has follow-up levels and the Send button for this job inside the app (checked 14 Oct 2026), so there is no gap in the app itself. The gap is outside it: the external API is Custom-plan only on Odoo Online, and the development-version MCP server has no tool that sends an invoice. A scheduled agent run that picks the overdue invoices and resends them needs one of those routes.

## How you do it in Odoo today

1. Open Accounting > Customers > Invoices and find the unpaid ones; Odoo's Aged Receivable report (Accounting > Reporting > Aged Receivable) shows outstanding customer invoices with their due dates.
2. Open an overdue invoice and click Send. In the Send window, choose the sending method (Email or Download); a customer's preferred sending method set on the contact is selected by default.
3. If follow-up levels are set up, Odoo bundles its follow-up actions by how many days an invoice is overdue, and with several overdue invoices the actions apply to the most overdue one.
4. Repeat for every overdue invoice, then check next week which of them turned Paid.

## How to chase overdue Odoo customer invoices

Prompt

```
List the customer invoices in Odoo that are posted, unpaid and past their due date. For each one older than 14 days, resend the invoice by email and give me a list of what you sent, sorted by amount.
```

1. 01  
### Pull the unpaid invoices  
The agent calls list\_invoices with status posted, payment\_status not\_paid and overdue true, so drafts and already paid invoices never enter the list. It pages with offset until the list is empty.
2. 02  
### Apply your age rule  
Each invoice is compared with the cut-off in your prompt, for example more than 14 days past the due date. Younger ones are left alone and listed as "not yet due for a nudge".
3. 03  
### Check the contact  
For each invoice the agent calls get\_invoice and reads the contact email. An invoice whose contact has no email address is skipped and reported, because there is nobody to send to.
4. 04  
### Resend with your OK  
send\_invoice runs once per invoice and reaches your customer, so each call waits for your OK until you switch confirmation off for send\_invoice. The agent never changes the invoice itself.
5. 05  
### Report the list  
The agent returns what it sent, what it skipped and why, sorted by amount, so you can phone the largest accounts yourself.

### What you get back

Example data

```
Overdue and unpaid: 9 invoices, total 14,820.00 EUR
Resent by email: 6 (older than 14 days)
- INV/2026/00412 Northwind Studio, 3,200.00 EUR, 31 days late
- INV/2026/00398 Harbor Print, 2,150.00 EUR, 22 days late
Skipped: 3 (2 under 14 days late, 1 contact without an email)
```

### Other ways to ask

- Every Friday, list invoices more than 30 days overdue and only report them, do not send anything.
- Resend overdue invoices only for contacts in the Retail tag, and leave Wholesale to me.
- Show me the five largest overdue invoices with the date each was last sent.

## What Odoo allows, and what to know first

- Odoo marks an invoice Posted when you click Confirm and assigns it a unique number from a sequence, so only posted invoices can be sent.
- The Send window in Odoo offers Email and Download, and a customer's preferred sending method is selected by default.
- Odoo's Aged Receivable report lists outstanding customer invoices with their due dates and lives under Accounting > Reporting.
- Odoo bundles its follow-up actions into follow-up levels that trigger by how many days an invoice is overdue.

send\_invoice asks for your OK by default. To run it weekly without you, switch confirmation off for that tool in your dashboard.

Sources: [Odoo documentation: Customer invoices](https://www.odoo.com/documentation/19.0/applications/finance/accounting/customer%5Finvoices.html) · [Odoo documentation: External API](https://www.odoo.com/documentation/18.0/developer/reference/external%5Fapi.html) · [Odoo documentation: Available MCP tools](https://www.odoo.com/documentation/master/applications/productivity/ai/mcp%5Fserver/mcp%5Ftools.html)

## Call send\_invoice from a script

curl

```
curl -X POST https://cotlet.dev/api/v1/odoo/invoices/4182/send-invoice \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"method":"email"}'
```

Example response

```
{
"invoice_id": 4182,
"number": "INV/2026/00412",
"method": "email",
"sent_to": "billing@northwind.example",
"status": "posted"
}
```

MCP: add https://cotlet.dev/mcp/v1 with the same key; the call is odoo\_write → send\_invoice. Example data.

[Schedule it in n8n, Make, Zapier or cron](https://cotlet.dev/integrations/odoo-api-mcp-server.md#automations)

## Odoo tools this automation uses

__Cotlet Odoo tools used to chase overdue Odoo customer invoices__
| Tool | Parameters |
| -------------- | --------------------------------------------------------------------------------- |
| list\_invoices | status, payment\_status, overdue, contact\_id, invoice\_date\_from, limit, offset |
| get\_invoice | invoice\_id, number |
| send\_invoice | invoice\_id, method |

[All 12 Odoo tools with descriptions](https://cotlet.dev/integrations/odoo-api-mcp-server.md#tools)

## Frequently asked questions

### Is it safe to connect Odoo to Cotlet?

Yes. You sign in to Odoo yourself, in your own Cloud Browser in the EU, and we never save your password. Your agents only get Odoo once you enable it, every background request is listed, and the browser profile is stored encrypted with AES-256-GCM, the cipher 1Password uses for its vaults. The AI model never sees a login, posts and messages wait for your OK, and Disable for agents cuts access in one click. Independent scanners grade cotlet.dev A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory; live results are on https://cotlet.dev/security.

## More Odoo automations

- [Register payments on Odoo invoices](https://cotlet.dev/integrations/odoo-api-mcp-server/register-invoice-payments.md)
- [Create Odoo invoices from a client list](https://cotlet.dev/integrations/odoo-api-mcp-server/create-invoices-from-a-list.md)
- [Odoo API and MCP server: every tool](https://cotlet.dev/integrations/odoo-api-mcp-server.md)
- [All use cases](https://cotlet.dev/use-cases.md)

## Give your agent access to Odoo.

Free 7-day trial with 2,000 credits, no card needed. Cotlet is independent and not affiliated with Odoo.

[Sign up free](https://cotlet.dev/app/signup?app=odoo)

---

Give your AI agents your signed-in browser.

**Product:** [Integrations](https://cotlet.dev/integrations.md) · [Use cases](https://cotlet.dev/use-cases.md) · [How it works](https://cotlet.dev/how-it-works.md) · [Pricing](https://cotlet.dev/pricing.md) · [Security](https://cotlet.dev/security.md)

**Resources:** [Blog](https://cotlet.dev/blog.md) · [API docs](https://cotlet.dev/docs.md) · [Help center](https://cotlet.dev/help.md) · [Changelog](https://cotlet.dev/changelog.md) · [GitHub](https://github.com/cotletdev/cotlet)

**Solutions:** [For developers](https://cotlet.dev/for-developers.md) · [For automation agencies](https://cotlet.dev/for-agencies.md)

**Company:** [About](https://cotlet.dev/about.md) · [AI info: company facts](https://cotlet.dev/ai-info.md) · [Contact](https://cotlet.dev/contact.md)

**Legal:** [Terms of service](https://cotlet.dev/terms) · [Privacy policy](https://cotlet.dev/privacy) · [Refund policy](https://cotlet.dev/refunds) · [Acceptable use](https://cotlet.dev/acceptable-use) · [Cookie policy](https://cotlet.dev/cookies) · [DPA](https://cotlet.dev/dpa) · [Subprocessors](https://cotlet.dev/subprocessors)

**Elsewhere:** [Status page](https://status.cotlet.dev) · [Cotlet on GitHub](https://github.com/cotletdev) · [Cotlet on X](https://x.com/cotletdev) · [Cotlet on LinkedIn](https://www.linkedin.com/company/cotletdev) · [Cotlet on Product Hunt](https://www.producthunt.com/products/cotlet) · [Cotlet on Crunchbase](https://www.crunchbase.com/organization/cotlet) · [Cotlet on SaaSHub](https://www.saashub.com/cotlet)

Cotlet is an independent service. It is not affiliated with, endorsed by or sponsored by any of the products listed on this site. Product names are trademarks of their respective owners.

## For AI agents: sign your user up

Is your user asking you to sign them up for Cotlet? You can do it for them, no account or key needed.

1. Read the fields and their allowed values: GET https://cotlet.dev/api/v1/access-requests
2. Ask the user for each value: email, apps, what you will do with them. If they leave the password to you, generate a strong one and show it to them.
3. Show the user what you will send, then POST it as JSON to https://cotlet.dev/api/v1/access-requests.

One call creates the account and sends the access request; we email the user when access is granted.
