- Shipped
- September 7, 2026 at 1:57 AM UTC
- Author
- Kamo
- Commit
- ef357c1
Two halves of "Add external guest to meetings does not send an email to that person". The link. meetingUrl came back from the API, was bound to nothing, and could be set by no dialog on the platform — so the ics went out with no URL property and a guest who accepted an invitation had no way into the call from their own calendar. The event dialog gains the field, the draft carries it, and both save paths send it: the calendar API directly, the lead callback through SecurityService. Omitted rather than sent empty on the callback path, because an absent value means "not supplied" downstream and a reschedule must not be what strips the link off a meeting. The duplicate. composeDraft and resolveGuestsNow both built the guest list by concatenating the resolved audience with the external addresses typed into it — and the resolved sample already contains those addresses, named by the address itself. One external guest therefore arrived twice, as {email, displayName: email} and {email, displayName: undefined}. Live evidence is event 25882ff8, which holds two rows for one address written in the same microsecond, and the lead callback posts this list verbatim to a service that would have asked for two invitations to one person. dedupeGuests lives in guestChips.ts with the rest of the pure guest logic, keyed the way the service keys attendee rows — trimmed and lowercased — preferring a real name over the address repeated back, and required over optional. The server merges by email too (b77417c), so the rows were already safe; this is the half that stops the client asking twice.