# Follow up after a missed demo

Check Zoom attendance for a Calendly invitee. Confirmed attendance is logged, incomplete evidence is sent to a review queue, and a supported no-show can produce a Gmail rescheduling draft.

**Category** Revenue Operations  
**Tools** n8n, Calendly, Zoom, Gmail, n8n Data Tables  
**Trigger** Authenticated POST after the booked meeting ends  
**Package** [Workflow JSON](missed-demo-follow-up.n8n.json) · [Test payloads](test-payloads.json) · [Validation report](validation-report.txt)

Import the JSON in n8n and run **Run with sample data**. The workflow imports inactive with **dryRun** enabled. The sample run uses fictional data and skips connected apps. Select credentials on the named nodes before testing live inputs.

## How it works

1. Receive a normalized booking event with the Zoom occurrence UUID, attendee and host emails, and the meeting end time. Skip bookings already recorded.
2. Look for the exact invitee email in the Zoom participant report. A possible no-show requires the host to be present, no unseen report pages, usable participant emails, and a configured Zoom identity policy.
3. Log attendance or the review reason. When draft creation is enabled, save a Gmail draft for a verified no-show and record its ID.

## How to use

1. Create an n8n Data Table with text columns **event_key**, **status**, **detail**, and **result_id**. Enter its ID in **Setup**.
2. Connect **Zoom OAuth2 API** on **Read Zoom attendance** with permission to read meeting participant reports for the meeting hosts. Select the rep's **Gmail OAuth2** account on **Create Gmail rescheduling draft**.
3. Set an optional Calendly rescheduling URL and the report delay. Leave **verifiedZoomIdentityRequired** false until your Zoom setup consistently requires attendees to join with the address used to book. Leave **createGmailDraft** false for the first connected test.
4. Set a private **Header Auth** credential on **Receive event**. From a trusted Calendly/Zoom relay, submit the **bookingId**, **meetingUuid**, **endedAt**, **inviteeEmail**, **inviteeName**, and **hostEmail** shown in the fixture. Use the occurrence UUID, including for recurring meeting links. Submit only once the report is ready. The webhook acknowledges receipt.
5. Test a verified host-only meeting, a meeting with the invitee, and a report with masked emails. Enable draft creation only once the results match how your meetings are authenticated.

## Test and operate

| Scenario | Expected result |
| --- | --- |
| Invitee email is present | **attended**, with no draft |
| Host absent, report paginated, or an email missing | **needs_review** if no exact invitee match exists |
| Complete report confirms absence under the configured identity policy | **no_show**, or a draft when enabled |
| Gmail response is lost after draft reservation | **draft_pending**. Inspect Gmail before releasing that booking for a retry. |

Review records marked **needs_review** in the Data Table. An unavailable Zoom report fails the execution so the trusted relay can retry later. Serialize submissions for the same booking ID.

[n8n source](https://n8n.io/workflows/9959-recover-missed-demos-with-calendly-zoom-and-ai-generated-follow-ups/) · [Zoom meeting UUID guidance](https://developers.zoom.us/blog/meeting-api-querying-tips-part1/)
