[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)

# Register payments on Odoo invoices

> Match bank receipts to open Odoo invoices and register each payment on the right journal, with your OK on every payment. Runs daily from your agent.

Source: https://cotlet.dev/integrations/odoo-api-mcp-server/register-invoice-payments

When customers pay by bank transfer, someone matches each receipt to an open invoice in Odoo and registers the payment, one invoice window at a time.

Cotlet does it in your own Odoo account with get\_invoice, list\_payment\_journals and register\_payment, 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 registers payments in the app through the Pay window (checked 14 Oct 2026), and it can also reconcile bank transactions. From outside the app, the external API is Custom-plan only on Odoo Online, and the development-version MCP server offers generic Create Records and Update Records but no payment tool. A script has to drive the payment wizard itself.

## How you do it in Odoo today

1. Open the posted customer invoice from Accounting > Customers > Invoices and click Pay.
2. In the window, choose the Journal and the Payment Date, then check the Payment Method; if the contact has a preferred method, Odoo selects it.
3. Check the Amount. With payment terms, Odoo sets it to the current installment; click full amount to pay the whole balance. Edit the Memo if you want a reference such as a check number.
4. Click Create Payment. The invoice shows In payment, and becomes Paid after the payment is reconciled with a bank transaction.

## How to register payments on Odoo invoices

Prompt

```
Here are today's bank receipts: Northwind Studio 3,200.00 EUR for INV/2026/00412 and Harbor Print 2,150.00 EUR for INV/2026/00398. Find each invoice in Odoo and register the payment on my Bank journal, dated today.
```

1. 01  
### Find the invoice  
For each receipt the agent calls get\_invoice by number and checks that the invoice is posted and not already Paid. A receipt for a draft or paid invoice is parked in the report, not booked.
2. 02  
### Compare the amounts  
The amount in your message is compared with the amount due on the invoice. An equal amount is booked in full; a smaller amount is booked as a partial payment only if your prompt says partial payments are fine.
3. 03  
### Pick the journal  
list\_payment\_journals returns the bank and cash journals you can pay into. The agent uses the journal you named, and stops to ask when the name matches more than one.
4. 04  
### Register with your OK  
register\_payment records money against your books, so each call waits for your OK until you switch confirmation off for register\_payment. The agent never edits the invoice lines.
5. 05  
### Report the status  
The agent reports each invoice as In payment or Paid, as Odoo shows it, plus every receipt it could not match.

### What you get back

Example data

```
Receipts received: 2
Registered: 2 on Bank journal, dated 14 Oct 2026
- INV/2026/00412 Northwind Studio, 3,200.00 EUR, now In payment
- INV/2026/00398 Harbor Print, 2,150.00 EUR, now In payment
Not matched: 0
```

### Other ways to ask

- Register payments from this CSV of bank lines only where the memo contains an invoice number, and list the rest.
- Each evening, list invoices marked In payment so I can reconcile them in the bank screen.
- Register the full amount on every invoice I name in this message, on the Cash journal.

## What Odoo allows, and what to know first

- Odoo's Pay window has the fields Journal, Payment Date, Payment Method, Amount and Memo, and the button that books the payment is Create Payment.
- After a payment is created Odoo shows the invoice as In payment; it becomes Paid once the payment is reconciled with a bank transaction.
- When the main bank account is set as the outstanding account on the journal's payment method, a full payment marks the invoice as Paid at once, without reconciliation.
- With payment terms on the invoice, Odoo proposes the amount of the current installment, and the full amount button pays the whole balance.

register\_payment asks for your OK by default. To run it daily without you, switch confirmation off for that tool in your dashboard.

Sources: [Odoo documentation: Payments](https://www.odoo.com/documentation/19.0/applications/finance/accounting/payments.html) · [Odoo documentation: Customer invoices](https://www.odoo.com/documentation/19.0/applications/finance/accounting/customer%5Finvoices.html) · [Odoo documentation: Available MCP tools](https://www.odoo.com/documentation/master/applications/productivity/ai/mcp%5Fserver/mcp%5Ftools.html)

## Call register\_payment from a script

curl

```
curl -X POST https://cotlet.dev/api/v1/odoo/invoices/4182/payments \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"journal":"Bank","amount":3200,"payment_date":"2026-10-14","memo":"Bank transfer Northwind"}'
```

Example response

```
{
"payment_id": 5120,
"invoice_id": 4182,
"number": "INV/2026/00412",
"journal": "Bank",
"amount": 3200,
"payment_date": "2026-10-14",
"memo": "Bank transfer Northwind",
"payment_status": "in_payment"
}
```

MCP: add https://cotlet.dev/mcp/v1 with the same key; the call is odoo\_write → register\_payment. 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 register payments on Odoo invoices__
| Tool | Parameters |
| ----------------------- | ------------------------------------------------- |
| get\_invoice | invoice\_id, number |
| list\_payment\_journals | none |
| register\_payment | invoice\_id, journal, amount, payment\_date, memo |

[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

- [Chase overdue Odoo customer invoices](https://cotlet.dev/integrations/odoo-api-mcp-server/chase-overdue-invoices.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.
