Skip to main content
iVentureTeam

many2manyattendee

Attendee avatars with a tick, a cross or a question mark on each, plus flags for missing emails and people who are already busy. All of it from one server call the widget makes itself.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 27, 2026Updated September 8, 20266 min read
Technical namemany2manyattendee
Field typesmany2many
Viewsform, calendar side panel
Modulecalendar, the Meetings app
Used in core1 occurrence, the attendees field on the meeting form in calendar
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0
No-code setupNo. It depends on calendar-specific server methods and companion fields
Alternativesmany2many_tags_avatar, many2many_avatar_user, many2manyattendeeexpandable, many2many_tags

What the attendee tags field does

A meeting's attendee list has to answer more than who was invited. Who accepted, who declined, who has not replied, who has no email address to be invited at all, and who is already busy at that time. Rendering that as a plain list of names loses all of it.

This widget puts the answers on the avatars. It extends Odoo's avatar tags widget, so each attendee is a small round picture with their name, and adds a status icon to those who have responded: a tick for accepted, a cross for declined, a question mark for tentative. Attendees who have not replied simply have no icon.

Two further flags come from companion fields on the meeting: attendees whose email is invalid, and attendees who are unavailable because they already have something in the diary. The organizer is sorted to the front, so the first avatar is always the person who owns the meeting.

What this means for your team

The value is entirely in the glance. Before a meeting, the question is usually whether enough of the right people have accepted, and answering it from a list of names means opening something. Icons on avatars answer it without a click, which is why this is the one place in Odoo where attendee status is rendered rather than reported.

The missing email flag is the operationally important one. An attendee with no valid address is not going to receive the invitation, and without a flag that only becomes apparent when they do not turn up. Surfacing it on the avatar puts the problem in front of the person who can fix it, at the moment they are already thinking about the invitee list.

The availability flag, added in Odoo 19, is the scheduling equivalent. It does not stop you inviting someone who is busy; it tells you before you send.

Supported options in Odoo 19

The widget declares no options of its own. It spreads the avatar tags descriptor, so the options below are inherited. What it adds instead are a server call and two companion fields, described in the note. Read from many2many_attendee.js and the avatar tags field, Odoo 19.0.

OptionTypeWhat it does
no_createbooleanInherited from the tags widget. Removes creation from the attendee input entirely.(default: false)
no_quick_createbooleanInherited. Removes creation from the typed text while keeping the popup form path.(default: false)
create_name_fieldfieldInherited. Field the typed text is written into when quick-creating a contact.
invalid_email_partner_idscompanion fieldRead by literal name, not declared. Attendees appearing in it are flagged as having no valid email address.
unavailable_partner_idscompanion fieldRead by literal name, not declared. Attendees appearing in it are flagged as already busy. New in Odoo 19.(since Odoo 19.0)

Three data sources, none of them options. The status icons come from a server call the widget issues for the current attendee ids. The missing email flag and the unavailable flag are read from two fields on the meeting record, by literal name and with no declared dependency, so the view has to load them. When those fields are absent, the flags simply never appear.

Working examples

The core usage

<field name="partner_ids" widget="many2manyattendee"/>

No options. Everything the widget shows beyond the avatars comes from its own server call and from companion fields on the meeting.

The companion fields it reads

<field name="invalid_email_partner_ids" invisible="1"/>
<field name="unavailable_partner_ids" invisible="1"/>

Both are read by literal name with no declared dependency. Without them the avatars render, just without those two flags.

Restricting who can be added

<field name="partner_ids" widget="many2manyattendee"
       options="{'no_quick_create': True}"/>

Inherited from the tags widget. Useful where attendees should be existing contacts rather than typed names.

Where the status icons actually come from

The status data does not come from the record. The widget registers a special data loader that calls a dedicated method on the partner model with the attendee ids and the meeting id, and gets back a list of attendee details including each one's response and whether they are the organizer. That is why the icons appear without any status field being present in the view.

The tags getter then decorates the inherited tag list. For each tag it finds the matching entry from that call and copies the status onto the tag, along with an icon class chosen from a small fixed map. It then checks the two companion fields and sets a no-email flag and an unavailable flag where the attendee appears in them.

The last step is the sort. If one of the returned entries is marked as the organizer, the list is reordered so that attendee comes first. The comparison used is a simple two-way test rather than a full ordering, so the remaining attendees keep whatever order they arrived in.

One small curiosity in the Odoo 19 source, shared with a couple of other widgets in core: the class spreads its own static components list inside its own class body. That resolves through static inheritance to the parent's value, which is what was intended, and the development branch replaces the whole components arrangement anyway.

The unavailable flag is the one genuine feature difference between Odoo 18 and Odoo 19: the second companion field and its handling are new in 19.

Version compatibility

VersionStatusNotes
Odoo 20.0Partial / changedNot released. Rebased onto the user avatar tags widget with a dedicated tag component and the new icon set.
Odoo 19.0VerifiedVerified against the shipped source. Adds the unavailable-attendee flag.
Odoo 18.0VerifiedStatus icons and the missing email flag, without the unavailable flag.
Odoo 17.0VerifiedSame core behavior with the older component conventions.
Odoo 16.0VerifiedSame core behavior with the older component conventions.

Upgrade note. No view change is needed between Odoo 16 and Odoo 19. Odoo 19 added the unavailable-attendee flag, which requires the second companion field on the meeting; the core meeting form provides it, so an upgraded database gains the flag with the standard views. Custom meeting forms that list attendees should add that field to pick the flag up.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. The development branch is unstable and the notes below can still change; we re-verify the page after release.

A different base. The widget is rebased from the generic avatar tags field onto the user avatar tags field from the Discuss module, which brings user-aware behavior such as opening a chat from an avatar.

A dedicated tag component. The custom attendee tag list is replaced by an attendee tag built on the shared avatar tag component, and the three status icons move from the older icon font to Odoo's own icon set.

Error handling. The development branch imports the connection-lost error type in this file, which suggests the attendee detail call is being made resilient to a dropped connection rather than failing the render.

Common problems and fixes

SymptomCause and fix
No status icons on the avatarsThe attendees have not responded yet, or the server call returned nothing. Expected before anyone replies. Check the browser network tab if you believe responses exist.
No missing email flagThe meeting form does not load the companion field the widget reads by literal name. Add that field to the form, invisible is enough.
No unavailable flagEither the database is on Odoo 18 or earlier, or the second companion field is not in the view. Upgrade, or add the field to the meeting form.
The organizer is not firstThe server call did not mark anyone as organizer for that meeting. Check the meeting has a valid organizer; the sort only runs when one is returned.
Avatars render but nothing elseThe widget fell back to plain avatar tag behavior because its data call failed. Check the browser console; the status call is separate from the record load.
Missing widget errorThe calendar module is not installed in that database. Install Calendar, or use the avatar tags widget instead.

Attendee tags field vs the alternatives

WidgetBest forKey difference
many2manyattendeeMeeting attendee lists where acceptance status matters at a glanceAvatar tags decorated with response icons from a dedicated server call, plus email and availability flags
many2many_tags_avatarAny list of people shown as avatarsNo status icons, no server call and no calendar-specific flags
many2many_avatar_userLists of internal usersUser-aware, with chat from the avatar, but no attendee status
many2manyattendeeexpandableThe same list in a constrained spaceAdds a collapsed summary with accepted and declined counts
many2many_tagsPlain tags with no picturesText only, and no per-tag state

Outside the calendar, the avatar tags widget is the right base for any list of people, and the user variant adds chat and presence. This one only makes sense on a meeting, because its status call and its two companion fields are calendar-specific. If you need attendee status in a report rather than on a form, query the attendee model directly; the widget is a display, not a data source.

Frequently asked questions

Where do the attendee status icons come from?+
A server call the widget makes itself, asking the partner model for attendee details for the current attendee ids and meeting. No status field has to be present in the view.
Why is one attendee flagged as having no email?+
Because they appear in a companion field on the meeting listing attendees with invalid email addresses. The widget reads that field by literal name, so a custom form has to load it.
What does the unavailable flag mean?+
That the attendee already has something scheduled at that time. It is new in Odoo 19 and comes from a second companion field on the meeting.
Why is the organizer always first?+
The widget sorts the returned attendee whose entry is marked as organizer to the front of the list. The rest keep their existing order.
What changes in Odoo 20?+
The development branch rebases the widget onto the user avatar tags field, replaces the tag list with a dedicated attendee tag component, and moves the three status icons to Odoo's newer icon set.

Scheduling that respects everyone's calendar

Meeting availability, resource booking and the integrations that keep external calendars in step are where scheduling projects succeed or quietly fail. We implement Odoo Calendar and its integrations on versions 16 through 19.

Book a free consultation

How this page was produced

The attendee detail call, the icon map, the two companion fields and the organizer sort were read from many2many_attendee.js on the Odoo 19.0 branch, with the inherited option set read from the avatar tags field in web. The usage comes from calendar/views/calendar_views.xml. The unavailable flag was confirmed as new by comparing the file on the 18.0 branch, and the Odoo 20 notes come from the public development branch. Spotted an error? Tell us and we will correct the page.