Skip to main content
iVentureTeam

properties

The Properties field lets end users bolt their own fields onto records, per project, per team, per parent, without Studio, without a developer, and without touching the database schema.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 16, 2026Updated August 16, 20267 min read
Odoo 19 task form with the properties widget open on a property definition popover showing label, field type Text, default value, suffix and Display in Cards settings.
Studio nameProperties
Technical nameproperties
Field typesproperties
Viewsform, kanban, calendar, hierarchy
Form variantThe base registration; the cog menu's Add Properties entry talks to it over the form bus
Also registered askanban.properties, hierarchy.properties, calendar.properties, all read-only for definitions
Moduleweb, present in every Odoo database
Used in core9 occurrences across 8 modules, including stock, fleet, mass_mailing, crm, product, hr_recruitment
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0
No-code setupYes, entirely: defining properties is itself the no-code feature
Alternativesfield_selector, many2many_tags, html, Studio custom fields

What the Properties field does

Most custom-field requests are not really development requests. A project manager wants a "Review deadline" date on tasks of one project; the fleet manager wants "Winter tires" on vehicles of one model. Studio would add that field to every task in the database. The Properties field adds it only where it belongs: definitions attach to a parent record, and all children of that parent grow the same set of extra fields, stored as JSON in a single column.

The widget renders those properties as if they were real fields, grouped under separators, split into up to two columns, drag-sortable in edit mode, with a definition popover for label, type, default value and per-type settings. Odoo 19 offers 14 property types, from text and checkbox through dates, selection and tags up to relational many2one and many2many, plus monetary with a currency, HTML and multiline text, the last three being 19 additions.

What this means for your team

Properties are the pressure valve that keeps a deployment maintainable. Every field a department adds through Studio is global schema the whole company carries forever; every property is scoped to the parent that needed it and disappears with it. Our rule on implementations: schema fields for what the company shares, properties for what a team owns. Task metadata per project, vehicle details per model, candidate criteria per job position, all properties.

The governance story is what makes this safe to hand to users. Because definition editing requires write access on the parent record, the project manager can reshape task properties for their own project and nobody else's, with no new security groups to invent. And because properties are searchable, groupable and displayable on kanban cards, the data teams put in them stays reportable instead of dying in a notes field.

The one discipline to enforce: deleting a property definition deletes that data for every child record, and renaming is safe but retyping is not. Treat definition editing as a small-blast-radius admin action, not a daily habit.

Setting it up in Odoo Studio (no code)

No Studio license is needed; defining properties is the built-in no-code path.

  1. Open a record whose model has properties, for example a task, and make sure it belongs to a parent (a project): properties cannot exist without one.

  2. Click the cog menu of the form and choose Add Properties.

  3. In the definition popover, set the Label and pick the Field Type from the 14 available, then fill the type-specific settings: default value, selection options, related model for relational types, currency for monetary.

  4. Tick Display in Cards to surface the property on kanban and list contexts, and drag properties to reorder or group them under separators.

What Studio cannot do here

The natural limits are the flip side of the scoping. Properties exist only on models whose Python declares a fields.Properties with its definition_record; you cannot add a Properties container itself without a developer (or Studio, which can add one). They cannot be made required, they carry no compute or onchange logic, and record rules cannot key on them.

The access model is also fixed: definition editing follows write access on the parent record, full stop. If "who may define task properties" should differ from "who may edit the project", that needs custom access design on the parent, which is developer work.

Working examples

Two-column layout, as the fleet form uses

<field name="vehicle_properties" columns="2"/>

No widget attribute needed: fields.Properties resolves to this widget automatically.

The Python side that makes properties possible

task_properties = fields.Properties(
    string="Properties",
    definition="project_id.task_properties_definition",
)

The definition path names the parent field and the PropertiesDefinition field on the parent model. That pair is the entire wiring: the widget discovers the parent through it and checks definition-edit rights against that record.

Opening a wizard field in definition mode

<field name="template_properties" editMode="True"/>

Useful on configuration wizards where the whole point is editing the definition, so users land directly in edit state instead of finding the cog menu.

Access rules and the machinery behind the cog menu

The source answers the questions admins actually ask about properties.

Who can edit definitions, precisely? The widget calls the access-rights check for write on the definition record, the concrete parent, not the parent model. No parent set means no definition editing at all, which is why properties on an unassigned record show values but refuse the edit pencil. The result is cached in component state and re-checked when the parent field changes.

How does the cog menu reach the field? The form controller broadcasts a PROPERTY_FIELD:EDIT event on the model bus; the widget listens only on form views, runs the access check, warns politely on failure, and if the field has no properties yet, immediately opens creation of the first one.

Why do kanban and calendar never offer definition editing? The variant registrations, kanban.properties (also registered for hierarchy views) and calendar.properties, override the access check to a hard false. Definition editing is a form-view activity by design.

Ordering and grouping are implemented with the sortable machinery over separator groups, and the two-column split distributes groups, not individual properties, unless there is only one group, which is then split across the columns to use the width.

Version compatibility

VersionStatusNotes
Odoo 20.0Partial / changedNot released. Core stable; kanban registration renamed to card.properties and a new properties_definition widget appears. Details below.
Odoo 19.0VerifiedVerified against the shipped source. 14 property types including monetary, HTML and multiline text.
Odoo 18.0Partial / changed11 property types; showAddButton attribute instead of editMode and the cog-menu flow.
Odoo 17.0Partial / changedProperties available with the earlier type set and add-button UI.
Odoo 16.0Partial / changedFirst release with Properties, introduced for Knowledge and project tasks.

Upgrade note for 18 to 19. The showAddButton attribute is gone in 19; adding properties moved to the form cog menu, and views that passed it get nothing back. In exchange, 19 added the editMode attribute and three property types: monetary, HTML and multiline text. Stored property values migrate untouched since the JSON layout is unchanged.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. The notes below compare the shipped 19.0 sources against the public development branch, which is unstable until feature freeze; we re-verify after release.

The field's core is remarkably stable: the property engine's changes are internal API migrations, with columns and editMode still the only attributes. Two structural moves are visible around it. The kanban registration follows the great rename and becomes card.properties, with hierarchy.properties kept, so view inheritance targeting kanban.properties needs review. And a new sibling widget appears, properties_definition, giving definition editing its own dedicated field UI on parent models rather than piggybacking on the child's widget.

Common problems and fixes

SymptomCause and fix
No Add Properties entry in the cog menuThe record has no parent set, or the model has no fields.Properties at all. Assign the parent first (for example, put the task in a project); the definition lives there.
Users see values but cannot edit definitionsDefinition editing requires write access on the parent record and the check failed. Grant write on the parent (for example, the project) to whoever owns its property set.
columns="3" does nothingThe component validates columns to 1 or 2 only. Use 2, and remember phones force a single column regardless.
A property disappeared from every record at onceSomeone deleted the definition on the parent, which removes it for all children. Restore the definition; the values it held are gone, so treat definition deletes as admin actions.
Properties do not show on kanban cardsDisplay in Cards is off for those properties, or the card view lacks the properties field. Tick Display in Cards in the definition popover.
showAddButton stopped working after upgrading to 19The attribute was removed; adding properties moved to the form cog menu. Drop the attribute and use editMode where a wizard should open in definition editing.

Properties field vs the alternatives

WidgetBest forKey difference
propertiesTeam-owned extra fields scoped to a parent: per project, per model, per positionUsers define the fields themselves; storage is JSON, access follows the parent
field_selectorStoring a path to an existing field rather than defining new onesPicks fields, does not create them
many2many_tagsOne flexible categorization axis instead of many typed fieldsSingle tag dimension, no types or defaults
htmlFree-form notes when structure is not neededRich text blob, invisible to filters and grouping
Studio custom fieldsCompany-wide fields every record must carryReal schema columns, global, with compute and required support

The comparison that matters is not with other widgets but with Studio: schema fields are global, properties are parent-scoped. Once that decision is made, this widget has no real alternative; it is the only renderer for fields.Properties.

Frequently asked questions

What is the properties field in Odoo?+
A field type (fields.Properties) rendered by the properties widget that lets end users define extra typed fields at runtime. Definitions attach to a parent record, such as a project, and apply to all its children, with values stored as JSON so the database schema never changes.
How do I add a property to a task in Odoo?+
Open a task that belongs to a project, click the form's cog menu and choose Add Properties, then set the label and type in the popover. You need write access on the project, because that is where the definition lives.
What property types does Odoo 19 support?+
Fourteen: text, multiline text, HTML, checkbox, integer, decimal, monetary, date, date and time, selection, tags, many2one, many2many and separator. Monetary, HTML and multiline text are new in 19.
Who can create or edit property definitions?+
Anyone with write access on the parent record. The widget checks this live against the concrete parent, so a manager of project A can reshape its task properties while having read-only properties on project B. Kanban and calendar views never allow definition editing.
Are Odoo properties searchable and groupable?+
Yes. Properties appear in search filters and can be used for grouping, and each property can be shown on kanban cards via Display in Cards. This is the practical difference between properties and stuffing extra data into a notes field.
Properties or Studio custom fields: which should we use?+
Properties when a team owns the field and it only makes sense under one parent, such as per-project task data. Studio when the whole company needs the field on every record, or when you need required, computed or rule-relevant fields, which properties cannot be.
Does the properties system change in Odoo 20?+
The development branch keeps the field's behavior and attributes, renames the kanban variant to card.properties, and introduces a dedicated properties_definition widget for editing definitions on the parent model. Unreleased until late September 2026; this page is re-verified after launch.

Custom fields multiplying out of control?

Half of most Studio backlogs should have been properties, and half of most property sprawl should have been schema. We audit your field landscape, migrate misplaced customizations, and set up the governance that keeps Odoo fast and upgradable.

Audit your custom fields

How this page was produced

This page was verified by reading properties_field.js (1,012 lines) and property_definition.js on the Odoo 19.0 branch, diffing both against 18.0 and the development branch, and exercising definition editing, access denial and the cog menu flow on a clean Odoo 19 database. The 14-type list is read from the definition component's availablePropertyTypes, not from marketing material. Corrections are welcome via our contact page.