> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.meetstream.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.meetstream.ai/_mcp/server.

# Calendar Emails on Participants

> How calendar_email is added to observed participants after a meeting, where to find it, and how invitee names are matched.

# Calendar emails on participants

When a bot joins a meeting that is on a calendar connected to your MeetStream account, each person the bot actually saw can be labeled with the email address from that calendar invite. The field is `calendar_email`.

Meeting platforms do not give the bot other participants' account emails. `participant.email` stays whatever the platform reported (usually `null`). `calendar_email` is a separate field, filled from your calendar after the meeting.

## Where to read it

After the bot is done, `calendar_email` is on every observed participant in:

- `GET /bots/{bot_id}/get_participants`
- `participants.json`
- `participant_events.json` (on the `participant` object of each event)

```json
[
  {
    "deviceId": "abc123def456",
    "fullName": "Jane Smith",
    "displayName": "Jane",
    "calendar_email": "jane.smith@acme.com"
  },
  {
    "deviceId": "xyz789",
    "fullName": "Walk-in Guest",
    "displayName": "Walk-in Guest",
    "calendar_email": null
  }
]
```

Real-time `participant_events.join` webhooks sent while the meeting is still running do not include `calendar_email`. Read it after post-call processing has finished.

## What is matched

MeetStream only labels people the bot observed. Someone who was invited but never joined is not added. Someone who joined but was not invited stays in the file with `calendar_email: null`.

The name taken from the meeting, in order, is `fullName`, then `displayName`, then `name`. That name is compared with each invitee on the calendar event, including the organizer.

| Calendar | Email | Name used for matching |
|---|---|---|
| Google | `email` | `displayName`, when the invite has one |
| Outlook | `emailAddress.address` | `emailAddress.name` |

The local part of the email is also used as a name (`jane.smith@acme.com` can match "Jane Smith") so an invite that has an address and no display name can still match.

These are never used as invitees:

- Meeting rooms and other calendar resources
- The bot's own tile (the bot username is never given an email)

The same person rejoining on another device keeps the same `calendar_email`. One invitee email is given to at most one distinct name in the meeting.

## Which calendar event

1. The event the bot was scheduled from, when that event still belongs to your account.
2. Otherwise, if the bot joined by meeting link, the event on your connected calendar with the same link whose start time is closest to when the bot joined. For Zoom, the link is compared by meeting id, so extra query parameters do not matter.

An event on another MeetStream account is never used. If no event is found, or the event was removed before processing, every `calendar_email` is `null`.

## How a name becomes an email

Names are compared after light cleanup: case and accents are ignored, digits are dropped, and tags such as `(Guest)` or `[Acme]` are removed. Word order does not matter (`Doe, Jane` and `Jane Doe` are the same name).

An email is written only when one invitee is a clear match and is clearly ahead of every other invitee. Otherwise the field is `null`.

A match is clear in these cases:

| What the meeting shows | What the invite has | Result |
|---|---|---|
| The invitee's email address | `jane.smith@acme.com` | `jane.smith@acme.com` |
| The same words as the invite display name | `Jane Doe` | that invitee's email |
| First name and last name, including a short first name or nickname | Invite says `Robert Smith`, meeting shows `Bob Smith` | that invitee's email |
| A name built from the email | `jane.doe@acme.com` or `jdoe@acme.com` | that invitee's email |
| A close spelling of the display name | `Jonathan Smithson` on the invite, `Jonathon Smithson` in the meeting | that invitee's email |
| A first name or short form only | `Chris` and the only fitting invitee is `christopher@acme.com`, or `Sam Lee` and the only fitting invitee is `samantha.lee@acme.com` | that invitee's email |

Short forms have to be at least three letters and have to be the start of the name (`Chris` matches Christopher; `Al` does not match Alexandra). Common English nicknames that are not a prefix are also recognized, such as Mike for Michael, Bob for Robert, and Bill for William.

A first-name-only match is kept only when no other invitee fits as well. `Dan` stays `null` when both `daniel@acme.com` and `danielle@acme.com` are invited. `Mike` stays `null` when both Michael Foo and Mike Bar are invited.

If two different names in the meeting both point at the same invitee, only the stronger name gets the email. `Jane Doe` wins over a bare `Jane` when the invite has a single Jane Doe.

## When `calendar_email` stays null

- The person was not on the invite.
- The meeting name does not clearly match any invitee.
- Two invitees match about equally well.
- The only clue is a one- or two-letter fragment.
- The calendar event has no display name and the email local part does not resemble the meeting name.
- There is no calendar event for this bot.
- The row is the bot itself, a room, or a resource.

## How to invite so the match succeeds

Put a display name on the guest when you add them. The meeting name is compared with that display name first, and with the email local part when no display name was saved.

Google Calendar often stores only the email when a guest is added by typing an address. It does not fill in that person's Google or Meet profile name later. Set the display name on the invite itself:

```json
{ "email": "jane.smith@acme.com", "displayName": "Jane Smith" }
```

Outlook invites already carry `emailAddress.name` next to `emailAddress.address`. The organizer is included, so the organizer's meeting name can match the organizer address.

A group address such as `team@acme.com` matches only if someone in the meeting is named like that address. It does not expand into the group's members.

## What this does not change

- `participant.email` is still the email from the meeting platform, not the calendar.
- People who never joined are not inserted into the participant list.
- Emails come only from the calendar connected to your account and are returned only with that bot's participant data. They are removed when that bot's data is deleted.