Online meetings
Give every online appointment its own video room, scheduled under the team member who runs the call
Online meetings
A booking widget set to Video call can hand out one of three things:
| Provider | What the visitor gets | Needs |
|---|---|---|
| Fixed link | The same URL for every appointment, typed into the widget once | Nothing |
| Zoom | A meeting scheduled per appointment, hosted by the team member it was assigned to | A server-to-server app in the customer's Zoom account |
| Microsoft Teams | A Teams meeting on the appointment's calendar event | The Outlook integration, and a Teams licence on the host's mailbox |
The fixed link is fine for a single shared room. It stops working as soon as appointments are shared out across colleagues: two calls at the same hour land in the same room, and no call has a recording of its own. Pointing the widget at a provider fixes both.
Connecting Zoom
Zoom is connected per tenant, with a server-to-server OAuth app that lives in the customer's own Zoom account. There is no marketplace install and no app review.
- In the Zoom Marketplace, choose Build App → Server-to-Server OAuth. This needs a Zoom account with admin rights.
- Under Scopes, add at least
meeting:write:admin(the granular equivalents, e.g.meeting:write:meeting:admin, work too). - Activate the app and copy the Account ID, Client ID and Client Secret.
- In Alpha, open Settings → Integrations → Zoom, paste the three values, tick Enable Zoom meetings and save.
- Press Test connection. The test mints a token and checks the granted scopes: an app without a meeting-write scope fails here rather than on the first customer booking.
Without a meeting-write scope everything looks connected. The failure only shows up when a customer receives a confirmation mail with no meeting link in it, so run the connection test.
Connecting Teams
Teams needs no integration of its own. It rides on the Outlook connection under Settings → Integrations: the same Azure app, the same Calendars.ReadWrite application permission. If Outlook is on and the team member's mailbox has a Teams licence, Teams is ready.
The meeting is created as part of the appointment's calendar event rather than as a standalone meeting. That is deliberate; the standalone route (/users/{id}/onlineMeetings) additionally requires OnlineMeetings.ReadWrite.All plus a Teams application access policy that an administrator has to grant per customer over PowerShell. It also means the meeting has no separate lifecycle: moving the appointment moves it, cancelling the appointment cancels it.
One consequence to know about: a Teams meeting belongs to the mailbox its event lives in. Reassigning an appointment does not move the meeting to the new colleague; the join link keeps working and they can open it, but the original host stays the organiser. Zoom does hand the meeting over.
Pointing a widget at a provider
Open the widget under CRM → Booking widgets, set Appointment type to Video call and pick the Video provider. The form warns you when the provider it points at is not connected.
Keep a value in Video link as well. It is the fallback: if the provider cannot be reached, or the host's mailbox turns out to have no Teams licence, the appointment still gets booked and falls back to that link. A booking is a commitment between two people, and a conferencing API having a bad minute must not cost the tenant that booking.
When someone's conferencing account is not their work address
A meeting is hosted under the address of the team member the appointment was assigned to. That address has to be one the provider actually knows. It often is not: Alpha may hold thimo@yourcompany.nl while Zoom knows that person as thimo@theirownbrand.nl. Hosting on an address the provider cannot resolve yields no room at all, and the visitor quietly gets the widget's fixed link instead of that colleague's own meeting.
Fill in Zoom/Teams email on the employee (HR → Employees, under the contact details) whenever the two differ. Leave it empty when they are the same; an empty value simply falls back to the work email, so there is no need to duplicate it.
What happens over the life of an appointment
| Event | Effect on the meeting |
|---|---|
| Visitor books | A meeting is scheduled for the assigned team member; the join link goes into the confirmation mail, the calendar invite and the ICS attachment |
| Visitor reschedules | The same meeting moves. The join link the visitor already has keeps working |
| Visitor or team cancels | The meeting is deleted from the host's Zoom account, or with the Outlook event |
| Appointment is reassigned | Zoom hands the meeting to the new host, keeping its join link; the visitor's link is never invalidated. Teams keeps the original organiser |
| Booking is deleted | The meeting is deleted with it |
For Zoom the host also gets a Start as host link on the booking detail. That link carries an embedded host credential, so it is shown inside Alpha only and is never mailed to the visitor.
Recording and note-taking
A per-appointment room is what makes a note-taker such as Fathom usable: the tool joins one specific call rather than a shared room. Recordings and summaries come back into Alpha through the call-recording webhook and appear on the appointment (see Sales call report).
Troubleshooting
| Symptom | Cause |
|---|---|
| Appointments keep getting the fixed link | The integration is off, or the widget's provider is still Fixed link |
| "Zoom has no user …" in the logs | The team member's Alpha email address differs from their Zoom login; set Zoom/Teams email on their employee record |
| Connection test reports a missing scope | The server-to-server app was created without meeting:write:admin; add it in the Marketplace and activate the app again |
| Reconnect required badge | Zoom rejected the stored credentials: the app was deleted or its secret rotated |
| Teams widget produces no link | Outlook is not connected, or the host's mailbox has no Teams licence |