Odoo Accounting / Localization widgets
Accounting and localization widgets carry Odoo's money handling: monetary fields, tax grids, reconciliation lines, payment terms and the country-specific pieces fiscal localizations bolt on.
They are also where version drift bites hardest — amounts, rounding and grid behaviour shift between releases — so every page's version table is worth reading before an upgrade.
Every accounting / localization widget, by use in Odoo core
| Widget | What it does | Field types | Uses in core |
|---|---|---|---|
| many2many_tax_tags | many2many_tax_tags is the tags widget tuned for accounting: identical options, one deliberate change, the dropdown always offers Search More, because tax grids are long and picking the wrong one is a filing error. | many2many, one2many | 35 |
| analytic_distribution | The field that splits a journal item across analytic accounts by percentage is one widget: analytic_distribution. Eight options, a tag-based editor, and a type change in 19 worth knowing about. | json | 22 |
| list_activity | The Next Activity column in Odoo list views, the little clock with a summary next to it, is the list_activity widget. It has no options at all; everything it shows comes from six activity fields it loads for you. | one2many | 21 |
| dynamic_selection | A selection field always offers every value it declares, unless you render it with dynamic_selection, the small account-module widget that shows only the options another field on the record allows. Odoo's e-invoicing localizations run on it. | selection | 19 |
| actionable_errors | The actionable errors widget turns a computed JSON field into a stack of ranked alert boxes, each with a button that jumps the user straight to the fix. | json | 11 |
| x2many_buttons | The x2many buttons widget renders a relation as a short row of clickable record buttons. It powers the "this document might be a duplicate of" banner on invoices. | many2many, one2many | 11 |
| char_with_placeholder_field | A char field that never looks empty: char_with_placeholder_field shows the placeholder as a muted value, so users see the default Odoo will apply before it is applied. | char, text | 7 |
| section_and_note_text | On sale orders and invoices, one widget decides how the description cell edits: section_and_note_text, a tiny dispatcher that reads the line's display_type. The Odoo 20 branch removes it. | char, text | 6 |
| account-tax-totals-field | The untaxed, tax and total block at the bottom right of every Odoo invoice is one widget: account-tax-totals-field. It renders a JSON payload, and it quietly lets you type over a computed tax amount. | json | 3 |
| account_type_selection | The Type dropdown on an Odoo account is not a flat list. The account_type_selection widget buckets every account type under Balance Sheet and Profit & Loss headings so accountants pick from a structured tree instead of a 15 item flat list. | selection | 3 |
| mail_composer_template_selector | The small three dot Templates button in Odoo's email composer footer is the mail_composer_template_selector widget. It loads your templates first, shared ones second, and quietly hides its management entries when a context key says so. | many2one | 3 |
| product_label_section_and_note_field | On an Odoo invoice line the Product column secretly edits two fields at once: the product_id many2one and the line description. The product_label_section_and_note_field widget is what stitches them together, and it also styles section, subsection and note lines. | many2one | 3 |
| account_document_state | Government e-invoicing replies rarely fit in a status column. account_document_state renders the selection state and, whenever the record carries a message, adds an info icon whose popover shows the full text with a copy button. | selection, many2one | 2 |
| grouped_view_widget | The grouped_view_widget renders a read-only, grouped table from a JSON string, and it is how the Accrued Orders wizard shows you the entries it is about to book before you commit. | text | 2 |
| line_open_move_widget | A many2one field whose internal-link arrow does not open the record you expect, on purpose: line_open_move_widget routes analytic lines to the journal item's real business document. | many2one | 2 |
| many2many_tags_journals | The many2many_tags_journals widget is the Tags field with one accounting-specific trick: when a Multi-ledger group belongs to no company, every journal pill spells out which company it comes from. | many2many | 2 |
| open_move_widget | The open_move_widget turns the Journal Entry number in an items list into a link that jumps straight to the entry's best business view, an invoice, a payment or the raw journal entry. | char | 2 |
| 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. | binary | 2 |
| product_label_section_and_note_field_o2m | The one2many widget that renders invoice and bill lines in Odoo 19: sections, notes, merged product labels, and a column layout that reconfigures itself depending on document type. | one2many | 2 |
| PaymentWizardCopyClipboardButtonField | The Copy button on a payment link, with one addition: it waits for the record to finish updating before it copies. Without that, a fast click copies the previous link. | char, text | 1 |
| account_batch_sending_summary | Before Odoo sends fifty invoices, it tells you how each one will go out. This widget is the read-only panel that shows that answer, and it reads the value exactly once. | json | 1 |
| account_merge_wizard_lines_one2many | Merging duplicate accounts means reading groups of candidates and ticking the ones to keep. This widget is the sectioned list that makes those groups legible, down to keeping one column deliberately visible. | one2many | 1 |
| account_move_statusbar_secured | A padlock next to Posted, green when the entry is hash-secured and orange when it is not. One inherited status bar, three template edits, and an audit story you can see at a glance. | selection | 1 |
| account_payment_register_html | The line of text in the Register Payment wizard that offers to pay just the installment instead. It is server-generated HTML with one clickable class, and Odoo 19 threw away the editor it used to run through. | html | 1 |
| account_resequence_widget | Renumbering posted journal entries is not something you want to guess at. This widget draws the before and after list so the wizard can be read before it is run. | text | 1 |
| account_tax_repartition_line_factor_percent | Tax distributions sometimes have to be a third of something. This widget keeps twelve decimals so the arithmetic survives, then hides the trailing zeros so the screen stays readable. | float | 1 |
| auto_save_res_partner | A child list that saves its parent before letting you add a row. Seven lines of code for a problem that otherwise produces confusing errors on brand new contacts. | one2many, many2many | 1 |
| autosave_many2many_tax_tags | Taxes on a journal entry line are not just a value, they generate other lines. This widget saves the whole entry the moment they change, so the tax lines appear immediately instead of at the end. | many2many | 1 |
| confirm_boolean | A switch that stops and asks before it loses data. It only asks in one direction, and once you confirm it saves straight away rather than waiting for the form. | boolean | 1 |
| l10n_in_hsn_autocomplete | Type three characters and Odoo asks India's GST portal for matching HSN codes. The request goes from the user's browser, not from your server, and that has consequences worth knowing before you deploy it. | char, text | 1 |
| mail_attachments | The attachment list on Odoo's invoice send wizard. It knows the difference between a file you added, a file the system generated, and a file that must not be deleted, and it cleans up after itself when you close the wizard. | json | 1 |
| mail_attachments_selector | The upload control on Odoo's document send wizard. It routes files through the messaging layer rather than creating attachments directly, and every file it adds is marked so it can be cleaned up later. | json | 1 |
| many2many_tags_banks | Partner bank accounts rendered as tags, each showing whether outgoing payments are allowed. It also saves the partner behind your back, and there is a good reason for that. | many2many, one2many | 1 |
| many2one_account_account | Picking an account is the most repeated action in Odoo accounting. This widget makes one change to the dropdown: it stops offering Search more unless you typed a number. | many2one | 1 |
| nemhandel_verification_code | Six single character boxes for the code sent by SMS, with focus that moves as you type and a paste handler that fills the rest from wherever you started. | char | 1 |
| open_decimal_precision_button | A field that is not really a field: a button in a warning panel that throws away your unsaved currency change and sends you to the setting you actually wanted. | any | 1 |
| payment_term_line_ids | Sixteen lines of code to fix one annoyance: a new payment term line vanishing because the user clicked somewhere else before typing anything. | one2many, many2many | 1 |
| peppol_non_focusable_selection | A selection widget whose entire purpose is to not take focus. One attribute changed in an inherited template, so the Peppol registration form can put the cursor where a user actually types. | selection | 1 |
| receipt_selector | The small Invoice or Receipt toggle at the top of a journal entry. It rewrites its own labels, filters its own choices, and disappears entirely unless your database has sales receipts turned on. | selection | 1 |
Each widget page has the usage XML, Studio steps, every developer option, and a per-version compatibility table verified against the shipped Odoo source.
Other widget categories
Need these working in your Odoo?
The team that documented every widget also builds with them — custom views, upgrades and performance work by senior Odoo developers.
