payment
Every Paid on line and every Outstanding credits box on an Odoo invoice is one widget: payment, a JSON-driven display with two faces, an info popover, and an Unreconcile button.
August 25, 2026Updated August 25, 20267 min read
| Technical name | payment |
|---|---|
| Field types | binary (JSON payload) |
| Views | form |
| Module | account, installed with Invoicing or Accounting |
| Used in core | 2 occurrences in 1 module: invoice_payments_widget and invoice_outstanding_credits_debits_widget on the invoice form |
| Versions | Odoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0 |
| No-code setup | No. It is wired into the invoice form; Studio cannot add or configure it |
| Alternatives | open_move_widget, account_document_state, one2many |
What the payment info widget does
What this means for your team
Working examples
Reloads, exchange rows and a dead attribute
Version compatibility
| Version | Status | Notes |
|---|---|---|
| Odoo 20.0 | Partial / changed | Not released. Field and widget switch to the json type, exchange rows become one aggregated clickable line. Re-verified after launch. |
| Odoo 19.0 | Verified | Behavior verified against the shipped source; declared type corrected to binary. |
| Odoo 18.0 | Verified | Identical component; descriptor still declared supportedTypes char while rendering the binary JSON field. |
| Odoo 17.0 | Verified | Functionally identical to 19 apart from the char type declaration; first version on the modern popover API. |
| Odoo 16.0 | Partial / changed | Same features, but with value caching, the old popover API and a parallel legacy-view implementation that was removed in 17. |
What is changing in Odoo 20
Common problems and fixes
| Symptom | Cause and fix |
|---|---|
| No Unreconcile button in the popover | The button is gated by the account.group_account_invoice group, and never renders on exchange difference lines. Grant invoicing access, or remove the reconciliation from the full entry for exchange rows. |
| Outstanding credits box never appears despite open credits | The compute only lists entries matching the invoice's partner, company and eligible accounts; the visibility also depends on invoice_has_outstanding. Check partner and currency on the credit entry; confirm it sits on a receivable or payable account. |
| Clicking Add throws a discard-changes dialog | Assigning reloads the whole record, and the form has unsaved edits. Save the invoice first, then apply credits. |
| Amounts show in the wrong currency format | Each line is formatted client side using the currency_id inside the JSON, not the invoice currency. Fix the currency_id emitted by the compute if you customized it. |
| Widget renders nothing at all | The field value is false; core hides it via invisible="not invoice_payments_widget" and the compute returns false for unposted or unpaid states. Post the invoice; the payload only exists in states where it is meaningful. |
| Custom model: clicks raise missing-method errors | The widget calls js_assign_outstanding_line, js_remove_outstanding_partial and action_open_business_doc on the record's own model. Implement those methods or strip the interactive parts from a subclassed template. |
Payment info widget vs the alternatives
| Widget | Best for | Key difference |
|---|---|---|
payment | Reconciliation state rendered inline on invoice forms | Renders a computed JSON payload with actionable Add, Unreconcile and View links; not a relational field at all |
| open_move_widget | Jumping from an entry number to its business document | Pure navigation link on a char column, no payment logic |
| account_document_state | Status fields with an explanatory popover | Selection label plus message popover; displays state instead of acting on reconciliations |
| one2many | Listing payment records as an editable grid | Real relational rows without assign or unreconcile shortcuts |
Frequently asked questions
What field type does the payment widget expect?+
What is the difference between the Paid on lines and the Outstanding credits box?+
What exactly does Unreconcile do?+
Why does the whole invoice reload when I click Add?+
Can I use the payment widget on my own model?+
How are refunds and exchange differences shown?+
Does the widget have any options?+
Payments not matching invoices the way they should?
Reconciliation UX is only as good as the data feeding it: partners, currencies, outstanding accounts and custom payment flows all end up in this one widget. We debug and extend Odoo payment and reconciliation flows across versions 16 to 19.
Sort out my reconciliation