251
All workflows

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

  1. Z

    List attendees, by List webinar participants by 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. Z

    Fill 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.

  3. Z

    List 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.

  4. B

    Write three emails, by Generate an email by 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. H

    Tag contacts, by Create or update contacts by HubSpot

    Create or update every person, matched on email, with list_property set to their list.

  6. B

    Send, 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 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.

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

  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.