account_json_checkboxes
The checkbox rows on Odoo's invoice Send wizard are not boolean fields: account_json_checkboxes renders a whole JSON dict as a group of checkboxes, each with its own label, lock and help icon.
August 25, 2026Updated August 25, 20266 min read
| Technical name | account_json_checkboxes |
|---|---|
| Field types | json |
| Views | form (wizard) |
| Also registered as | json_checkboxes, the canonical name since 19 |
| Module | web since 19 (moved from account); template namespace still account.* |
| Used in core | 2 occurrences in 1 module: sending_method_checkboxes and extra_edi_checkboxes on the invoice send wizard |
| Versions | Odoo 20.0, Odoo 19.0, Odoo 18.0 |
| No-code setup | No. Requires a json field and view XML; Studio does not expose it |
| Alternatives | many2many_checkboxes, boolean, checkbox |
What the JSON checkboxes widget does
What this means for your team
Supported options in Odoo 19
| Option | Type | What it does |
|---|---|---|
stacked | boolean | Declared in supportedOptions since 19. When set, each checkbox renders as a block on its own line instead of the inline row. The help text in the source spells out exactly this and nothing more.(default: false)(since Odoo 19.0) |
Name your widget by version. account_json_checkboxes works everywhere from 18 onward but is formally a deprecated alias since 19, with a source comment scheduling its removal. New 19+ views should use json_checkboxes; 18 databases have no choice, the alias is the only name.
Working examples
A web widget with an account accent
Version compatibility
| Version | Status | Notes |
|---|---|---|
| Odoo 20.0 | Verified | Not released. Reactive-proxy and typed-props migration only; the deprecated alias is still registered. Re-verified after launch. |
| Odoo 19.0 | Verified | Component moved to web as json_checkboxes with this name kept as an alias; stacked option and field-level readonly handling added. |
| Odoo 18.0 | Partial / changed | Introduced in the account module under this name only. No stacked option, field-level readonly not applied to the boxes, and a nonexistent jsonb type declared. |
| Odoo 17.0 | Not available | The widget does not exist; the earlier mass-send wizard had no JSON checkbox UI. |
| Odoo 16.0 | Not available | The widget does not exist. |
What is changing in Odoo 20
Common problems and fixes
| Symptom | Cause and fix |
|---|---|
| Checkboxes do not lock when the whole field is readonly on Odoo 18 | The 18 template computed disabled from the per-key readonly only. Set readonly: true per key in the compute, or upgrade; 19 respects the field state. |
| Nothing renders at all | The field value is falsy or not a dict of entry dicts. Return {} instead of False from the compute and check the {key: {checked, label}} shape. |
| A help icon shows no tooltip text | question_circle must be a non-empty string; it doubles as the tooltip content. Put the help sentence directly in the question_circle value. |
| Rapid clicks only save the final state | Updates are debounced by 100 ms and coalesced into one record update. Expected; the last state wins and nothing is lost. |
| Widget not found warning on Odoo 17 or earlier | The widget first shipped in 18. Backport the component or model the choices as boolean fields on older versions. |
| Unsure which widget name to use in new views | Two names register the same descriptor since 19. Use json_checkboxes on 19+; account_json_checkboxes is a deprecated alias the source plans to remove. |
JSON checkboxes widget vs the alternatives
| Widget | Best for | Key difference |
|---|---|---|
account_json_checkboxes | Dynamic, per-record choice sets stored in one json field | Whole checkbox group driven by a JSON dict, with per-key labels, locks and help tooltips |
| many2many_checkboxes | Choice sets that are records of a related model | One checkbox per related record; the set comes from a name_search, not a computed dict |
| boolean | A single fixed yes/no on the model | One real field per choice, visible to filters and reports but frozen in the schema |
| checkbox | Nothing, in practice | A phantom widget name with no registered component; the type fallback renders the default boolean |
Frequently asked questions
What is the difference between account_json_checkboxes and json_checkboxes?+
What JSON shape does the widget expect?+
How do I read the selected values server side?+
Can I lock individual checkboxes while leaving others editable?+
Why do my checkboxes update by themselves when I change the customer?+
Does the widget work on regular forms outside wizards?+
Dynamic configuration screens without schema migrations?
Choice sets that change per record, per country or per integration do not belong in hardcoded boolean fields. We design JSON-driven configuration UIs on core widgets like this one, keeping your Odoo 16 to 19 database clean and upgrade-friendly.
Plan my configuration UI