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.
August 16, 2026Updated August 16, 20266 min read
| Technical name | actionable_errors |
|---|---|
| Field types | json |
| Views | form |
| Module | account |
| Used in core | 11 occurrences across 6 modules, including account, l10n_in, l10n_gr_edi, account_peppol, l10n_tr_nilvera_edispatch, l10n_fr_pdp |
| Versions | Odoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0 |
| No-code setup | No. The widget consumes a computed JSON structure, which is developer territory. |
| Alternatives | x2many_buttons, list_activity, text |
What the actionable errors widget does
What this means for your team
Working examples
The JSON contract, precisely
Version compatibility
| Version | Status | Notes |
|---|---|---|
| Odoo 20.0 | In development | The development branch file is byte-identical to 19.0 at the time of writing. Re-verified after release. |
| Odoo 19.0 | Verified | Verified against the shipped source. action_call entries and soft reload are supported. |
| Odoo 18.0 | Partial / changed | Severity sorting and action entries work. The action_call route does not exist in 18. |
| Odoo 17.0 | Partial / changed | Bare version: renders action entries only, with no severity levels and no sorting. |
| Odoo 16.0 | Not available | The widget does not exist in the 16.0 account module. |
Upgrade note for 18 to 19. The action_call route and the automatic soft_reload after it are new in 19. An 18 compute method producing only action entries works unchanged in 19, but backporting a 19 localization that uses action_call to 18 will break on click.
What is changing in Odoo 20
Common problems and fixes
| Symptom | Cause and fix |
|---|---|
| The field renders nothing at all | The JSON value is empty, or not a dictionary of entry objects. Return {} when there are no errors and hide the wrapper with invisible, as core views do. |
| Alerts appear in the wrong order | Levels are missing, so everything sorts as warning. Set level explicitly on each entry: danger, warning or info. |
| Clicking the fix button does nothing in Odoo 18 | The entry uses action_call, which only exists from Odoo 19. Provide an action dictionary instead, or upgrade. |
| The list view opened by an error shows the wrong columns | The action falls back to the model's default list view. Pass a specific view via views or a list_view_ref context key in the action. |
| The alert does not disappear after fixing the problem | The compute method's dependencies do not cover the field you changed, so the JSON is stale. Add the missing field to the api.depends of the compute method. |
Actionable errors widget vs the alternatives
| Widget | Best for | Key difference |
|---|---|---|
actionable_errors | Computed pre-flight checks where every error has a concrete fix | Severity-sorted alerts with buttons wired to actions or server calls |
| x2many_buttons | Pointing at a set of related records, such as possible duplicates | Renders record links, not messages, and discards edits before navigating |
| list_activity | Chasing scheduled activities rather than validation errors | Driven by the activity system, not a computed JSON field |
| text | Static warnings that never change per record | No severity sorting and no fix buttons |
Frequently asked questions
What is the actionable_errors widget in Odoo?+
What structure does the JSON field need?+
Can I use actionable_errors on my own model?+
What is the difference between action and action_call?+
Does the widget change in Odoo 20?+
E-invoicing mandates on your calendar?
Peppol, myDATA, GST, KSeF: every mandate turns invoice validation into a daily workflow. We configure Odoo e-invoicing end to end and build custom pre-flight checks on this exact widget so your accountants fix issues themselves instead of filing tickets.
Get your compliance checklist built