Skip to main content
iVentureTeam

many2many_tags

The Odoo Tags field: what it does, how to set it up in Studio without code, and every option it supports.

Siddharth JambukiyaSiddharth JambukiyaVerified on Odoo 19.0 · Updated August 10, 2026
Odoo 19 contact form showing the Tags field rendered by the many2many_tags widget as colored pills reading Consulting Services, Vendor and iVentureTeam, each with a remove cross.
Odoo 19 contact form showing the Tags field rendered by the many2many_tags widget as colored pills reading Consulting Services, Vendor and iVentureTeam, each with a remove cross.

Quick summary

  • The Tags field, called many2many_tags in code, shows a many2many or one2many relation as removable, searchable pills instead of a list.
  • Enable colors in Odoo Studio with the Use colors checkbox, or in XML with options="{'color_field': 'color'}".
  • Studio covers the display. Restricting the tag list, blocking tag creation, or making tags depend on another field needs view-level work.
  • The color picker appears only in form views and only when a color field is set. That is the cause of nearly every "picker not working" report.
  • Colors save straight to the tag record, so recoloring a tag on one record changes it everywhere.
  • It is the most-used relational widget in Odoo core, with 391 uses across 77 modules.
  • Behavior is unchanged from Odoo 16 through 19. Odoo 20 changes it, and we are tracking the development branch.
Studio nameTags
Technical namemany2many_tags
Field typesmany2many, one2many
Viewsform, list, kanban, calendar, settings
Form variantform.many2many_tags, which adds the color picker and edit_tags
Also registered ascalendar.one2many, calendar.many2many
Moduleweb, present in every Odoo database
Used in core391 occurrences across 77 modules, including point_of_sale, mail, im_livechat, product, account, project
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0
No-code setupYes, via Odoo Studio (Enterprise)
Alternativesmany2many_tags_avatar, many2many_checkboxes, selection_badge, Default one2many list

What the Tags field does

By default, Odoo renders a many2many field as an embedded list or kanban of related records. That works, but it is heavy for something that is really just a set of labels. The Tags field replaces it with a single inline row of pills. Each pill shows the related record's name and carries a small cross that detaches it. Clicking into the empty space opens an autocomplete that searches the related records as you type.

Because the widget only ever reads the display name, plus one color value if you configure it, it stays fast even when a record carries a dozen tags. That efficiency is why it is the most-used relational widget in Odoo core, appearing 391 times across 77 modules.

What this means for your team

Tags are where data quality is won or lost in an Odoo rollout. Get them right and your team can filter a pipeline by segment, group a kanban by category, and pull a report leadership actually trusts. Get them wrong, with everyone free-typing their own variants, and you end up with VIP, Vip customer and vip-client as three separate tags, and every report built on them is quietly wrong.

The Tags field is the control that decides which of those you get. Left at its defaults it lets any user invent a new tag mid-conversation, which is exactly right for a sales team capturing nuance and exactly wrong for a finance team that needs a fixed set of segments. Both behaviors are one configuration change apart, and the decision belongs to whoever owns the process, not to whoever builds the form.

Our own rule on implementations: let users create tags freely during the first month after go-live so the real vocabulary surfaces, then review what they created, consolidate it, and lock the list down. Deciding the taxonomy in a workshop before anyone has used the system almost always produces a list nobody uses.

Setting it up in Odoo Studio (no code)

Most of what teams need from this field can be done without a developer. Odoo Studio is available on Enterprise plans.

  1. Open the form you want to change and click Studio in the top menu.

  2. From the Add a field panel, drag Tags onto the form. Studio asks which model the tags come from, for example Contact Tags, and creates the underlying many2many field for you.

  3. Select the field and open Properties on the right. Set Widget to Tags for the pill row shown above, Checkboxes to list every related record as a tickbox instead, or Many2many for the classic embedded list.

  4. Tick Use colors. Studio creates the color field on the related model and wires it up. Clicking a tag now opens a color palette, and those colors carry through to kanban views.

Tip: turn on developer mode before adding the field if you want to see and set its technical name. Studio generates one otherwise, and generated names are unpleasant to live with once reports and integrations start referencing them.

What Studio cannot do here

Studio covers the display. It does not cover the rules. Four common requirements need a developer.

Restricting which tags appear, such as showing only tags belonging to the current company or only active ones, requires a domain on the field. Studio's filter options do not reach this.

Preventing users from creating new tags requires the no_create option. There is no Studio toggle for it, and this is the single most requested change once a taxonomy has been agreed.

Showing colors but stopping users changing them needs no_edit_color. Studio gives you all or nothing.

Making the tag list depend on another field on the same record, such as product tags filtered by the selected category, needs a dynamic domain.

If you are hitting any of these, you have moved past what Studio was built for. That is a normal place to be, not a failure of the tool, and it is the point at which most teams bring in Odoo customization support.

Supported options in Odoo 19

Verified against many2many_tags_field.js in the Odoo 19.0 web module rather than from release notes. Several of these appear nowhere in the official documentation.

OptionTypeWhat it does
color_fieldfield nameName of an integer field on the related model storing the color index, 0 to 11. Enables colored pills and, in form views, the color picker.
no_createbooleanRemoves creation entirely, so the dropdown offers only existing records. Overrides no_quick_create and no_create_edit.
no_quick_createbooleanRemoves the inline Create "typed text" entry. Creation through the popup form still works.
no_create_editbooleanRemoves the Create and Edit entry that opens a popup form. Inline creation still works.
createdomainA domain string enabling creation conditionally, evaluated against the current record.
search_thresholdnumberMinimum characters typed before the search fires. Without it, the dropdown searches on focus.
placeholder_fieldfield nameA char field on the current record supplying a dynamic placeholder.
create_name_fieldfield nameWhich field receives the typed text on inline creation. Read in extractProps; it appears in no options panel or documentation.(default: name)
no_edit_colorbooleanForm views only. Colors stay visible, but the picker is disabled.
edit_tagsbooleanForm views only. Clicking a tag opens its form in a dialog. Takes priority over the color picker.

The three "no_create" options are not interchangeable. no_quick_create removes the entry that creates a record straight from typed text, while no_create_edit removes the one that opens a popup form. Using the wrong one is the most common misconfiguration on this widget: teams set no_create_edit to lock down a taxonomy, then find users still creating tags by typing. Use no_create when the intent is a closed list.

Working examples

Minimal, plain tags

<field name="tag_ids" widget="many2many_tags"/>

Colored tags, the standard Odoo pattern

<field name="tag_ids"
       widget="many2many_tags"
       options="{'color_field': 'color'}"/>

The related model must define that integer field:

class ProjectTag(models.Model):
    _name = "project.tag"

    name  = fields.Char(required=True)
    color = fields.Integer(string="Color")  # 0 = no color, 1 to 11 = palette

Locked-down taxonomy, no creation and a filtered list

<field name="tag_ids"
       widget="many2many_tags"
       domain="[('active','=',True), ('company_id','in',[company_id, False])]"
       options="{'color_field': 'color', 'no_create': True, 'no_edit_color': True}"/>

Users pick from an approved, company-scoped list, see the colors, and can change neither the list nor the colors. This is the configuration to reach for after the post-go-live tag cleanup described above.

Large tag tables, delay the search

<field name="tag_ids"
       widget="many2many_tags"
       options="{'search_threshold': 3}"/>

Nothing is queried until three characters are typed. Worth setting on any tag model above a few thousand records, where searching on focus is a wasted round trip on every click.

Editable tags instead of colors

<field name="tag_ids"
       widget="many2many_tags"
       options="{'edit_tags': True}"/>

Clicking a pill opens that tag's form in a dialog. Note that edit_tags wins over the color picker, so if you set both, users get the edit dialog and no picker.

How the color field really works

Three details catch teams out, and none are in the official documentation.

The picker is form-view only. Odoo registers a separate, extended version of the widget for form views. In list and kanban views you get the colors but no picker.

No color field means no picker at all. Clicking a grey pill simply does nothing. Almost every "the color picker isn't working" report we see turns out to be a missing color_field, or in Studio an unticked Use colors box.

Colors save immediately, to the tag itself. The color is written to the tag record, not to the record you are editing, and it saves the moment you pick it. Recoloring a tag on one customer recolors it on every customer, and discarding the form does not roll it back. This surprises users often enough to be worth covering in training, or worth setting no_edit_color to avoid entirely.

The palette holds eleven colors, indexed 1 to 11. Index 0 means "no color", which the picker exposes as a visibility toggle, and setting a tag to 0 is how Odoo hides that tag's color band in kanban views. If your custom tag model needs to match core styling, define the field exactly as color = fields.Integer(string="Color"), because Odoo's palette is keyed on that integer rather than on a stored hex value.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. Changes visible in the development branch are described below, and this page will be re-verified after launch.
Odoo 19.0VerifiedAll options in the table above confirmed against the shipped source and tested on a clean database.
Odoo 18.0VerifiedSame option names and behavior. No XML changes needed.
Odoo 17.0VerifiedSame option names and behavior. No XML changes needed.
Odoo 16.0VerifiedSame option names and behavior. No XML changes needed.

Upgrade note for 16 to 19. Your existing XML keeps working, but the color-editable variant is registered separately as form.many2many_tags. Any JavaScript patch written against the base component may therefore no longer affect form views. Patch Many2ManyTagsFieldColorEditable instead. This is a common source of "our customization stopped working" tickets after an Odoo migration.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026, with general availability a few weeks later. Odoo develops in the open, so the changes below are read directly from the public development branch rather than from anyone's predictions.

Read this before you act on it. The development branch is unstable and will keep moving until feature freeze. Nothing here is a released behavior. We re-verify this page against the shipped release before we change the option table above.

Four changes are visible in the Tags widget at the time of writing.

Two new options appear: tag_limit and on_tag_click. tag_limit caps how many pills render before the rest collapse behind a counter, with a default of 8 and 0 meaning show all. on_tag_click is a selection between edit_color and open_form, generalising what edit_tags does today.

The color-editable variant disappears from the file. no_edit_color and edit_tags no longer appear in the development version of many2many_tags_field.js, and neither does the form.many2many_tags registration. Click behavior is now governed by on_tag_click on the single unified component.

The calendar registrations were renamed from calendar.one2many and calendar.many2many to card.one2many and card.many2many. If you have patched or overridden either of the calendar variants, that override will need updating.

The conditional-create option changes shape. The create domain option moves to a create attribute read as an expression (createExpression internally), so views relying on options="{'create': ...}" will need review.

If you are planning an upgrade, our Odoo migration team can assess which of your customizations these changes touch.

Common problems and fixes

SymptomCause and fix
Tags render grey, clicking does nothingNo color field configured, or the named field is not an integer on the related model. In Studio, tick Use colors. In XML, add color_field.
Color picker works on the form but not in the list viewExpected. The picker belongs to the form-view variant only. No fix needed; this is the designed behavior.
Users still create tags despite no_create_editThat option only removes Create and Edit. Use no_create to block creation completely.
Dropdown appears emptyUsually a field domain or record rule excluding everything, or an inactive-record filter. Test as an admin with no domain to isolate it.
Not all matching records appear in the dropdownThe dropdown is capped, and Search More opens the full list. Narrow with a domain rather than expecting an exhaustive dropdown.
Color reverts after discarding the formIt does not. The color was already saved to the tag record. Restore it from the tag's own form.
Duplicate near-identical tags accumulatingCreation is open by default. Merge the duplicates, then apply no_create.

Tags field vs the alternatives

WidgetBest forKey difference
many2many_tagsLong or user-extensible tag listsSearch-based, so unselected options are hidden
many2many_tags_avatarPeople, such as followers, assignees, attendeesShows each record's avatar inside the pill
many2many_checkboxesShort fixed sets users must see in fullRenders every option, with no search and no creation
selection_badgeSelection fields rather than relationsWorks on selection and many2one, single value
Default one2many listChild records with several attributesFull editable grid, for when a name is not enough

The practical test: if a user must compare the available options before choosing, use checkboxes. If they already know what they want and just need to find it, use tags.

Frequently asked questions

Can I add a Tags field in Odoo without a developer?+
Yes, for the basics. Odoo Studio (Enterprise) lets you drag a Tags field onto any form, point it at a tag model, and enable colors with the Use colors checkbox. What Studio cannot do is restrict which tags appear, stop users creating new ones, or make the list depend on another field. Those need a domain or widget options set in the view, which is developer work.
Why is the color picker not showing on my tags?+
The picker only appears when a color field is configured, and only in form views. Without it the tags render grey and clicking does nothing. Setting edit_tags also suppresses the picker, because tag editing takes priority over color editing.
How do I stop users creating new tags?+
Add options="{'no_create': True}" to the field. There is no Studio equivalent. Be aware that no_quick_create and no_create_edit each remove only one of the two creation routes, so only no_create closes both.
Can many2many_tags be used on a one2many field?+
Yes. In Odoo 19 the widget supports both many2many and one2many. On a one2many the pills represent the child records, and removing one detaches or deletes the child depending on the inverse field's ondelete behavior, so keep it to lightweight children that a name fully describes.
How do I limit which tags appear in the dropdown?+
Use the field's domain attribute, which the widget merges into its search. Add context keys such as default_ values to pre-fill anything created from the dropdown. The dropdown lists a capped number of matches and offers Search More for the full list.
When should I use checkboxes instead of tags?+
Use many2many_checkboxes when the related model holds a short, fixed set that users must see all of at once, such as a handful of configuration flags. Use tags when the list is long or user-extensible, because it searches rather than listing everything.
Does the Tags field work the same in Odoo 16, 17 and 18?+
Yes. Option names and behavior are unchanged from Odoo 16 through 19, so existing XML keeps working after an upgrade. What changed underneath is that the color-editable variant is registered separately as form.many2many_tags, so a JavaScript patch written against the base component may no longer affect form views.
Will the Tags field change in Odoo 20?+
The Odoo development branch shows two new options, tag_limit and on_tag_click, the calendar registrations renamed to card.one2many and card.many2many, and the color-editable variant removed from the file. None of this is final until Odoo 20 is released in September 2026, and we re-verify this page against the shipped release before changing the option table.
Do tag color changes save immediately?+
Yes. Picking a color writes the integer to the tag record and saves it right away, independently of the record you are editing. The change applies to that tag everywhere it is used and is not undone by discarding the parent form.

Past what Studio can do?

Restricted tag lists, locked taxonomies, tags that depend on another field: small changes that need view-level work. We build custom Odoo views, fields and modules for teams running Odoo 16 through 19, and we are already testing against the Odoo 20 development branch.

Book a free consultation

How this page was produced

Every option in the table above was read from the Odoo 19.0 web module source (many2many_tags_field.js) and confirmed on a clean Odoo 19 database, where the screenshot was captured. The Studio steps were performed on an Odoo 19 Enterprise database. The Odoo 20 section is read from the public development branch and is clearly marked as unreleased. Where behavior differs from the official documentation, such as the form-view-only color picker and the immediate save of color changes, we say so explicitly. Spotted an error or a version difference? Tell us and we will correct the page.

Siddharth Jambukiya

Written by Siddharth Jambukiya

Get our monthly Odoo & automation digest

One short email per month with practical insights, version updates, and field-tested tips. No fluff, unsubscribe anytime.