---
ref: workflow:webinar-follow-up
title: Email webinar no-shows, attendees and engaged viewers
author: thedogwiththedataonit
tools: [tool:zoom/list-webinar-participants, tool:zoom/list-webinar-registrants, tool:zoom/list-webinar-absentees, tool:brew/generate-email, tool:hubspot/upsert-contacts, tool:brew/send-email]
tags: [capability:host-meetings, capability:manage-crm, capability:send-email, capability:write-copy, channel:email, has:api, motion:inbound]
updated: 2026-10-11
---

# 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 webinar
- `engaged_minutes`: the watch time that makes an attendee engaged, e.g. 40
- `recording_url`: the link to the recording, for no-shows
- `next_step`: what attendees should do next, with its link, e.g. start a trial at https://acme.example/trial
- `booking_url`: where engaged attendees book a call
- `list_property`: the HubSpot contact property, set up once, that records each person's list as `no_show`, `attended` or `engaged`, 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_email` is empty for people outside the host's account: pass `include_fields=registrant_id` to match registrants. Needs Pro or higher with the Webinar add-on.
- List webinar registrants: Match a past participant to their registration by `registrant_id` to 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.

```json
{ "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.

```sh
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.

```json
{ "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

1. **List attendees** with List webinar participants (Zoom). From `webinar_id`, list who attended with `include_fields=registrant_id`, leaving out hosts and panelists, and add up each person's seconds across rejoins. Keep two lists, engaged at `engaged_minutes` or more and attended under it, with each person's name, email and registrant ID.
2. **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.
3. **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.
4. **Write three emails** with Generate an email (Brew). Generate one email per list: `recording_url` for no-shows, `next_step` for attendees, `booking_url` for the engaged. Show the drafts to the user. Keep each approved email's `emailId`, `emailVersionId` and subject.
5. **Tag contacts** with Create or update contacts (HubSpot). Create or update every person, matched on email, with `list_property` set to their list.
6. **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.
