Your sub-account is connected. The next step is connecting a Zoom account, which is step 2 below.
The app is installed and the rest of your sub-accounts are ready to use. The ones that did not connect will be retried the first time a workflow runs in them, so this often resolves itself. If it does not, reinstall from the marketplace listing.
Nothing was connected, so there is nothing to undo. Start the install again from the marketplace listing — if it fails a second time, the app's install link may have expired.
Triggers
All 9 triggers and the variables each one hands to your workflow.
A trigger's fields are available anywhere in the workflow it starts, as {{trigger_key.field}} — so the attendance flag from Meeting Ended is {{zwa_meeting_ended.attended}}.
Triggers fire for anything that happens on the connected Zoom account, not only for calls this app created. That is deliberate, and it is what catches a rep booking directly in Zoom. It also means two of them can start a loop if you are not careful — see the note on Meeting Created.
Choosing a filter
The builder's trigger filters offer String, Select, Multi-select and Dynamic
field types. None of them is a boolean. A filter comparing
against a true/false field compares the text "false" to a real
false and matches nothing — which, on a trigger, is
indistinguishable from the trigger never firing.
Where that matters, there is a string spelling of the same fact:
participantRole is host or guest, and
it is the one to filter on. Use the true/false fields in workflow
conditions, where they behave normally.
- Meeting Created — A meeting appeared on the connected Zoom account, including one booked directly in Zoom.
- Meeting Started — The host opened the call.
- Meeting Updated — A meeting was rescheduled or edited, including in Zoom.
- Meeting Ended — The call finished, with who joined and for how long.
- Participant Joined — Someone entered the call, while it is still running.
- Webinar Created — A webinar was scheduled on the account.
- Webinar Updated — A webinar was rescheduled or edited.
- Recording Completed — A cloud recording is ready.
- Transcript Completed — The audio transcript is ready.
Meeting Created
A meeting appeared on the connected Zoom account, including one booked directly in Zoom.
zwa_meeting_created
Variables
| Variable | Type | What it is |
|---|---|---|
meetingId | text | Zoom's numeric id. |
meetingUuid | text | The per-occurrence id. A recurring meeting reuses meetingId but not this. |
topic | text | The title. |
startTime | text | When it starts. |
scheduledMinutes | number | Booked length. |
timezone | text | The meeting's timezone. |
joinUrl | text | The attendee link. |
hostEmail | text | Which Zoom user hosts it. |
createdByThisApp | true/false | True when this app created it. The field that prevents a loop. |
contactId | text | The contact it was created for, when we created it. Empty otherwise. |
Worth knowing
- Read before wiring this up. It fires for meetings the Create Meeting action makes, so a workflow triggered by Meeting Created whose action is Create Meeting will create a meeting, hear about it, and create another, indefinitely. Gate the workflow on createdByThisApp being false.
- The event is reported rather than filtered because a customer may legitimately want to react to meetings the app created, and swallowing those silently would make that impossible with no way to tell why.
- Its real value is the meetings you did not create: a rep booking directly in Zoom, or a Zoom scheduler outside the CRM. Those never reach the CRM otherwise.
Meeting Started
The host opened the call.
zwa_meeting_started
Variables
| Variable | Type | What it is |
|---|---|---|
meetingId | text | Zoom's numeric id. |
meetingUuid | text | The per-occurrence id. |
topic | text | The title. |
startedAt | text | When Zoom says the host opened it. |
scheduledStart | text | When it was booked to start, from our own record. |
minutesLate | number | Minutes after the booked start that the host opened it. Negative when early, 0 when the meeting was not one of ours. |
scheduledMinutes | number | Booked length. |
hostEmail | text | Which Zoom user hosts it. |
contactId | text | The contact, when known. |
joinUrl | text | The attendee link. |
Worth knowing
- Fires once per occurrence. A host who leaves and rejoins does not re-fire it.
- A late host is a real operational fact and nothing else in either platform reports it.
Meeting Updated
A meeting was rescheduled or edited, including in Zoom.
zwa_meeting_updated
Variables
| Variable | Type | What it is |
|---|---|---|
meetingId | text | Zoom's numeric id. |
meetingUuid | text | The per-occurrence id. |
topic | text | The new title. |
startTime | text | The new start. |
scheduledMinutes | number | The new length. |
timezone | text | The new timezone. |
joinUrl | text | The attendee link. |
changedFields | text | Comma-joined names of what changed, such as start_time,duration. |
timeChanged | true/false | True when the start time moved. The change customers actually act on. |
previousStartTime | text | The old start, or empty when Zoom sent no previous state. |
hostEmail | text | Which Zoom user hosts it. |
contactId | text | The contact, when known. |
Worth knowing
- Branch on timeChanged rather than on the field list. changedFields is empty when Zoom sends no previous state, which is not the same as nothing having changed.
- This is the trigger that catches a host moving a call in Zoom without telling the CRM. Use it to text the client on a time change and stay quiet for a renamed topic.
Meeting Ended
The call finished, with who joined and for how long.
zwa_meeting_ended
Variables
| Variable | Type | What it is |
|---|---|---|
meetingId | text | Zoom's numeric id. |
meetingUuid | text | The per-occurrence id. |
topic | text | The title. |
startedAt | text | When it began. |
endedAt | text | When it finished. |
scheduledMinutes | number | What it was booked for. |
actualMinutes | number | How long it actually ran, computed from the start and end times. |
attended | true/false | True if anyone joined at all. The blunt instrument, and often enough. |
attendedMinutes | number | The longest single attendance. |
attendeeCount | number | Distinct people who joined. Rejoins after a dropped connection count once. |
attendeeEmails | text | Comma-joined emails of everyone who joined. Empty string when nobody did, never null. |
hostEmail | text | Which Zoom user hosted it, for routing follow-up on a round-robin team. |
contactId | text | The contact the meeting was created for, or empty. |
joinUrl | text | The attendee link. |
Worth knowing
- Three views of the same events, so the strictness lives in your workflow condition rather than in our contract: branch on attended for 'did anyone show', on attendedMinutes for 'did they stay', on attendeeCount for 'was the group big enough'.
- actualMinutes is computed from the start and end times, never from Zoom's own duration field — that one reports the scheduled length and arrives as 0 for instant meetings, which would show every meeting as zero-length.
- attendedMinutes is exact only when the Zoom app subscribes to participant_left. Without that there is no leave time and the figure is computed to the end of the meeting, which reads as 'stayed to the end' for someone who dropped off early.
Participant Joined
Someone entered the call, while it is still running.
zwa_participant_joined
Variables
| Variable | Type | What it is |
|---|---|---|
meetingId | text | Zoom's numeric id. |
meetingUuid | text | The per-occurrence id. |
topic | text | The title. |
participantName | text | Whatever name they typed into Zoom. Often not their CRM name. |
participantEmail | text | Their Zoom email, or empty. Empty far more often than expected — Zoom reports it only for signed-in participants. |
participantUuid | text | Stable per person across the meeting. |
isHost | true/false | True when the person joining is the host. Use this in conditions. |
participantRole | text | host or guest. The same fact as a string, because trigger filters cannot express a boolean. |
joinedAt | text | When they joined. |
scheduledStart | text | When the meeting was booked to start. |
minutesLate | number | Minutes after the booked start that they joined. Negative when early. |
hostEmail | text | Which Zoom user hosts it. |
contactId | text | The contact, when known. |
joinUrl | text | The attendee link. |
Worth knowing
- Use participantRole in a trigger filter and isHost in a condition. The builder's filters offer String, Select, Multi-select and Dynamic — no boolean — so a filter on isHost compares the text "false" against a real false and matches nothing, which on a trigger looks exactly like the trigger not firing.
- Match on the contact the meeting was created for, not on participantEmail. A guest joining from a link is anonymous to Zoom.
- Fires once per join, and a reconnect after a dropped call is a second join. A workflow that must run only once should gate on the contact.
- This is what makes 'text the rep if the client has been waiting five minutes' possible — minutesLate is computed from our own record of the booked start, and nothing else in either platform has both halves.
Webinar Created
A webinar was scheduled on the account.
zwa_webinar_created A paid plan with the webinar add-on
Variables
| Variable | Type | What it is |
|---|---|---|
webinarId | text | Zoom's numeric id. |
webinarUuid | text | The per-occurrence id. |
topic | text | The title. |
startTime | text | When it starts. |
scheduledMinutes | number | Booked length. |
timezone | text | The webinar's timezone. |
joinUrl | text | The attendee link. |
registrationUrl | text | The public sign-up page. |
hostEmail | text | Which Zoom user hosts it. |
createdByThisApp | true/false | True when this app created it. |
contactId | text | The contact, when we created it. |
Worth knowing
- Carries the same loop hazard as Meeting Created. Gate on createdByThisApp being false if the workflow also runs Create Webinar.
Webinar Updated
A webinar was rescheduled or edited.
zwa_webinar_updated A paid plan with the webinar add-on
Variables
| Variable | Type | What it is |
|---|---|---|
webinarId | text | Zoom's numeric id. |
webinarUuid | text | The per-occurrence id. |
topic | text | The new title. |
startTime | text | The new start. |
scheduledMinutes | number | The new length. |
timezone | text | The new timezone. |
joinUrl | text | The attendee link. |
registrationUrl | text | The sign-up page. |
changedFields | text | Comma-joined names of what changed. |
timeChanged | true/false | True when the start time moved. |
previousStartTime | text | The old start, or empty. |
hostEmail | text | Which Zoom user hosts it. |
contactId | text | The contact, when known. |
Worth knowing
- The higher-stakes half of the pair. A moved webinar has to be communicated to everyone registered, and Zoom's own notification does not reach them through your CRM.
Recording Completed
A cloud recording is ready.
zwa_recording_completed
Variables
| Variable | Type | What it is |
|---|---|---|
meetingId | text | Zoom's numeric id. |
meetingUuid | text | The per-occurrence id. |
topic | text | The title. |
startTime | text | When the meeting started. |
recordingMinutes | number | Length of the recording, which is not the length of the meeting. |
shareUrl | text | Send this one. The viewer-facing page. |
downloadUrl | text | Requires an access token. Not a link to email. |
password | text | The recording's own passcode, separate from the meeting's. Empty when the account does not require one. |
fileCount | number | How many files Zoom produced — video, audio and chat count separately. |
fileTypes | text | Comma-joined, such as MP4,M4A,CHAT. |
hostEmail | text | Which Zoom user hosted it. |
contactId | text | The contact, when known. |
Worth knowing
- shareUrl and downloadUrl are the single easiest thing to get wrong here. downloadUrl is not a public link — fetching it needs an access token, so a recipient gets a login prompt at best. It exists for workflows piping recordings into their own storage.
- When password is set, a share link sent without it is useless.
Transcript Completed
The audio transcript is ready.
zwa_transcript_completed
Variables
| Variable | Type | What it is |
|---|---|---|
meetingId | text | Zoom's numeric id. |
meetingUuid | text | The per-occurrence id. |
topic | text | The title. |
startTime | text | When the meeting started. |
transcriptUrl | text | Token-authenticated. For piping into your own tooling, not for sending. |
fileType | text | VTT, usually. |
shareUrl | text | The viewer-facing page. |
hostEmail | text | Which Zoom user hosted it. |
contactId | text | The contact, when known. |
Worth knowing
- Separate from Recording Completed because Zoom finishes it separately, often minutes later. A workflow that waits for the recording and expects a transcript alongside it gets an empty field.