Email webinar no-shows, attendees and engaged viewers
Sorts a Zoom webinar's registrants into no-shows, attendees and engaged viewers, tags them in HubSpot, and emails each group.
Outcome
Every registrant in exactly one list, recorded on their HubSpot contact.
Three approved emails queued for eligible opted-in contacts: the recording to no-shows, your next step to attendees and a booking link to engaged viewers.
How it works
ZList attendees, by List webinar participants by Zoom
From
webinar_id, list who attended withinclude_fields=registrant_id, leaving out hosts and panelists, and add up each person's seconds across rejoins. Keep two lists, engaged atengaged_minutesor more and attended under it, with each person's name, email and registrant ID.
ZFill in missing emails, by List webinar registrants by Zoom
List the registrants of
webinar_id. For each attendee with no email, keep the email of the registrant with the same registrant ID.
ZList no-shows, by List webinar absentees by Zoom
From
webinar_id, list the registrants who did not attend. Keep them, with their names and emails, as the third list.
BWrite three emails, by Generate an email by Brew
Generate one email per list:
recording_urlfor no-shows,next_stepfor attendees,booking_urlfor the engaged. Show the drafts to the user. Keep each approved email'semailId,emailVersionIdand subject.
HTag contacts, by Create or update contacts by HubSpot
Create or update every person, matched on email, with
list_propertyset to their list.
BSend, by Send an email by Brew
Match the consent-qualified addresses to existing subscribed Brew contacts first; stop for the user to prepare any missing contacts. Once the user confirms the registrants agreed to hear from you, send each list its approved email, 50 inline recipients per send, each send with its own idempotency key.
You'll be asked for
The Zoom webinar's ID, or the instance UUID for one session of a recurring webinar
The watch time that makes an attendee engaged
e.g. 40
The link to the recording, for no-shows
What attendees should do next, with its link
e.g. start a trial at https://acme.example/trial
Where engaged attendees book a call
The HubSpot contact property, set up once, that records each person's list as `no_show`, `attended` or `engaged`
e.g. webinar_follow_up
webinar-follow-up.mdView markdown
Email webinar no-shows, attendees and engaged viewers
Sorts a Zoom webinar's registrants into no-shows, attendees and engaged viewers, tags them in HubSpot, and emails each group.
Set up the tools below, then run the steps in order for the user, carrying each step's results into the next. The run is done when the user has the outcome below.
Outcome
- Every registrant in exactly one list, recorded on their HubSpot contact.
- Three approved emails queued for eligible opted-in contacts: the recording to no-shows, your next step to attendees and a booking link to engaged viewers.
Inputs
Ask the user for these before you start.
webinar_id: the Zoom webinar's ID, or the instance UUID for one session of a recurring webinarengaged_minutes: the watch time that makes an attendee engaged, e.g. 40recording_url: the link to the recording, for no-showsnext_step: what attendees should do next, with its link, e.g. start a trial at https://acme.example/trialbooking_url: where engaged attendees book a calllist_property: the HubSpot contact property, set up once, that records each person's list asno_show,attendedorengaged, e.g. webinar_follow_up
Set up
Zoom (tool:zoom/list-webinar-participants, tool:zoom/list-webinar-registrants, tool:zoom/list-webinar-absentees)
Use the API.
- Base URL: https://api.zoom.us/v2
- List webinar participants:
GET /past_webinars/{webinarId}/participants - List webinar registrants:
GET /webinars/{webinarId}/registrants - List webinar absentees:
GET /past_webinars/{webinarId}/absentees - Auth: an OAuth access token, sent as
Authorization: Bearer <token>
Note: Get the access token from an OAuth app you create on the Zoom App Marketplace. Webinar calls need a Pro or higher plan with the Webinar add-on.
Notes:
- List webinar participants: Someone who rejoins gets a new entry, so add up their durations.
user_emailis empty for people outside the host's account: passinclude_fields=registrant_idto match registrants. Needs Pro or higher with the Webinar add-on. - List webinar registrants: Match a past participant to their registration by
registrant_idto get the email Zoom leaves empty for people outside your account. Needs a Pro or higher plan with the Webinar add-on. - List webinar absentees: Needs a Pro or higher plan with the Webinar add-on.
Brew (tool:brew/generate-email, tool:brew/send-email)
Use the first option your agent supports.
Notes:
- Generate an email: Costs credits and requires a ready brand. If generating, poll get_email. Keep emailId and emailVersionId; pass both to a send or automation to pin the design.
- Send an email: Supply subject and existing subscribed recipients. Use idempotency_key (MCP) or Idempotency-Key (HTTP), reusing it for retries. On confirmation_required, obtain approval and repeat with confirmed:true and the returned confirmation_id. Queued is not delivered.
MCP (official, remote)
Add this server to your agent's MCP settings, then sign in when asked.
{ "mcpServers": { "brew": { "url": "https://brew.new/api/mcp" } } }
- Generate an email: call the MCP tool
create_email - Send an email: call the MCP tool
send_email
CLI (official)
Install the command, then confirm it runs.
brew install getbrew/tap/brew-cli
brew-cli --version
- Generate an email: run
brew-cli emails generate - Send an email: run
brew-cli emails send
Set $BREW_API_KEY in your environment first (get a key: https://brew.new/settings/api).
Create or update contacts (HubSpot, tool:hubspot/upsert-contacts)
Use the first option your agent supports.
Note: Matches each contact on idProperty, email or a custom unique property. On MCP, manage_crm_objects waits for the user to confirm the proposed changes before it writes.
MCP (official, remote)
Add this server to your agent's MCP settings, then sign in when asked.
{ "mcpServers": { "hubspot": { "url": "https://mcp.hubspot.com" } } }
Call the MCP tool manage_crm_objects.
API (official)
- Base URL: https://api.hubapi.com
- Endpoint:
POST /crm/objects/2026-09/contacts/batch/upsert - Auth: send the header
Authorization: Bearer $HUBSPOT_API_KEY
Note: Use a service key or an app's static access token with the CRM scopes the calls need; paths carry a dated version such as 2026-09.
Before step 1, confirm access to each service with its cheapest read-only call, like a list or a search. Never send or change anything to test access.
Steps
- List attendees with List webinar participants (Zoom). From
webinar_id, list who attended withinclude_fields=registrant_id, leaving out hosts and panelists, and add up each person's seconds across rejoins. Keep two lists, engaged atengaged_minutesor more and attended under it, with each person's name, email and registrant ID. - Fill in missing emails with List webinar registrants (Zoom). List the registrants of
webinar_id. For each attendee with no email, keep the email of the registrant with the same registrant ID. - List no-shows with List webinar absentees (Zoom). From
webinar_id, list the registrants who did not attend. Keep them, with their names and emails, as the third list. - Write three emails with Generate an email (Brew). Generate one email per list:
recording_urlfor no-shows,next_stepfor attendees,booking_urlfor the engaged. Show the drafts to the user. Keep each approved email'semailId,emailVersionIdand subject. - Tag contacts with Create or update contacts (HubSpot). Create or update every person, matched on email, with
list_propertyset to their list. - Send with Send an email (Brew). Match the consent-qualified addresses to existing subscribed Brew contacts first; stop for the user to prepare any missing contacts. Once the user confirms the registrants agreed to hear from you, send each list its approved email, 50 inline recipients per send, each send with its own idempotency key.
Rules
- Use only the services set up above. The read-only calls they need, like listing ids or polling for results, are fine.
- Ask the user before anything that sends messages, costs money, or changes data, and say how many records it touches. One approval covers a batch the user has seen.
- Never print API keys.
