Zoom to KlickTipp, tag webinar attendees automatically
You run a webinar, you get attendees… and then the messy part starts. Exporting Zoom lists, guessing who actually watched, tagging people in KlickTipp, and trying not to send “Sorry we missed you” to someone who stayed until the Q&A. It’s tedious. It’s also where follow-ups quietly fall apart.
This Zoom KlickTipp tagging automation hits marketers hardest, honestly, because segmentation is the whole game. But coaches running weekly webinars and agency owners managing client campaigns feel the same pain. The outcome is simple: full, partial, and no-show tags applied automatically, so the right emails go out fast.
Below, you’ll see how the workflow listens for a Zoom webinar ending, validates the webhook, pulls attendee data, and tags each contact in KlickTipp based on watch time (with topic-based routing for “Beginner” vs. “Expert” webinars).
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Zoom to KlickTipp, tag webinar attendees automatically
flowchart LR
subgraph sg0["Flow 1"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Zoom Webinar End Listener"]
n1@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Validate URL Handshake", pos: "b", h: 48 }
n2@{ icon: "mdi:cog", form: "rounded", label: "Hash Verification", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Assemble Validation Payload", pos: "b", h: 48 }
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Return Webhook Validation"]
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Compose Event Reply", pos: "b", h: 48 }
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Send Event Response"]
n7@{ icon: "mdi:cog", form: "rounded", label: "Delay One Second", pos: "b", h: 48 }
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch Zoom Participants"]
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch Zoom Absentees"]
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Iterate Participant List", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Exclude Internal Attendees", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Route by Webinar Title A", pos: "b", h: 48 }
n13@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Assess Full Attendance Primary", pos: "b", h: 48 }
n14@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Assess Full Attendance Secon..", pos: "b", h: 48 }
n15@{ icon: "mdi:cog", form: "rounded", label: "Tag Full Attendance Primary", pos: "b", h: 48 }
n16@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Assess General Attendance Pr..", pos: "b", h: 48 }
n17@{ icon: "mdi:cog", form: "rounded", label: "Tag Full Attendance Secondary", pos: "b", h: 48 }
n18@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Assess General Attendance Se..", pos: "b", h: 48 }
n19@{ icon: "mdi:cog", form: "rounded", label: "Tag General Attendance Primary", pos: "b", h: 48 }
n20@{ icon: "mdi:cog", form: "rounded", label: "Tag General Attendance Secon..", pos: "b", h: 48 }
n21@{ icon: "mdi:swap-vertical", form: "rounded", label: "Iterate Absentee List", pos: "b", h: 48 }
n22@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Route by Webinar Title B", pos: "b", h: 48 }
n23@{ icon: "mdi:cog", form: "rounded", label: "Tag Absence Primary", pos: "b", h: 48 }
n24@{ icon: "mdi:cog", form: "rounded", label: "Tag Absence Secondary", pos: "b", h: 48 }
n2 --> n3
n7 --> n9
n7 --> n8
n1 --> n2
n1 --> n5
n3 --> n4
n13 --> n15
n13 --> n16
n11 --> n12
n12 --> n13
n12 --> n14
n14 --> n17
n14 --> n18
n22 --> n23
n22 --> n24
n5 --> n6
n21 --> n22
n16 --> n19
n18 --> n20
n10 --> n11
n6 --> n7
n0 --> n1
n9 --> n21
n8 --> n10
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n1,n11,n12,n13,n14,n16,n18,n22 decision
class n0,n4,n6,n8,n9 api
classDef customIcon fill:none,stroke:none
class n0,n4,n6,n8,n9 customIcon
The Challenge: Clean webinar follow-ups without manual tagging
Webinar follow-up looks easy until you try to do it consistently. Zoom gives you data, but it doesn’t hand you “these people watched almost everything” vs. “these people dropped after 10 minutes” in a way your email system can use without work. So you export CSVs, filter in spreadsheets, then tag in KlickTipp by hand (or worse, you don’t tag at all and send one generic sequence). A week later you can’t remember who was in which session, and the next launch starts with the same scramble.
It adds up fast. Here’s where it breaks down.
- Exporting Zoom reports and cleaning them usually steals about an hour after every webinar.
- Manual tagging is easy to mess up, so the wrong people end up in the wrong follow-up emails.
- When you run multiple webinar topics, segmentation becomes a mini project instead of a quick task.
- No-show handling gets skipped because it’s one more list to prepare, which means money left on the table.
The Fix: Automatically tag Zoom attendance in KlickTipp
This workflow kicks in the moment a Zoom webinar ends. It listens for the webinar.ended event, verifies that the incoming webhook really came from Zoom (using HMAC validation), and then pulls the finished webinar’s participant data through the Zoom API. From that list, it filters out internal attendees (so your team doesn’t pollute your segments), routes each person based on the webinar title (for example, “Anfänger” vs. “Experten”), and calculates attendance bands using watch-time thresholds. Finally, it applies the right KlickTipp tags so your campaigns can send tailored follow-ups automatically, without spreadsheet gymnastics.
The workflow starts with a Zoom webhook and a quick handshake validation. Then it fetches two lists: participants and absentees, and it processes them separately. At the end, each contact gets a “not attended,” “attended,” or “attended fully” tag for the correct webinar topic.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you run two webinars a week (Beginner and Expert). Manually, you might spend about 30 minutes exporting data, another 20 minutes sorting “full vs. partial,” then 20 minutes tagging in KlickTipp, plus a quick check for no-shows. Call it roughly 90 minutes per webinar, so about 3 hours a week. With this workflow, you end the webinar and the tags appear automatically after the Zoom API fetch. Your “work” is basically zero, aside from checking the first run.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Zoom to receive webinar.ended webhooks and reports.
- KlickTipp to apply tags and trigger email sequences.
- Zoom API credentials (create in the Zoom App Marketplace).
Skill level: Intermediate. You will copy credentials, set webhook secrets, and map a few fields, but you won’t be writing “real code.”
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
A Zoom webinar ends and triggers the workflow. Zoom sends a webinar.ended event to your n8n webhook, and the workflow immediately replies as expected so Zoom doesn’t keep retrying.
The webhook is validated before anything else happens. A handshake check and HMAC verification confirm the request is legitimate, which matters because tagging contacts from an untrusted webhook is a nightmare scenario.
Zoom attendance data is fetched and split into people who attended vs. didn’t. The workflow calls the Zoom API for past webinar details by UUID, pulls participants, pulls absentees, and then iterates through each list so tagging happens per person.
KlickTipp tags are applied based on webinar title and watch-time thresholds. Switch and IF logic routes “Anfänger” vs. “Experten,” then checks attendance bands (for example, at or above 90% counts as “attended fully”). Contacts receive the matching tag through the KlickTipp community node.
You can easily modify the attendance thresholds to match your definition of “fully attended,” or add more routing rules for new webinar topics based on your naming conventions. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Webhook Trigger
This workflow starts when Zoom sends a webinar-end event to your webhook listener and validates Zoom’s endpoint handshake.
- Add and open Zoom Webinar End Listener, then set HTTP Method to
POSTand Path tozoom. - Set Response Mode to
responseNodeso the flow can reply using dedicated response nodes. - In Validate URL Handshake, confirm the condition uses
{{ $json.body.event }}equalsendpoint.url_validationto detect Zoom’s verification request. - In Hash Verification, set Type to
SHA256, Action tohmac, Value to{{ $json.body.payload.plainToken }}, and replace Secret with your Zoom verification key (currently[CONFIGURE_YOUR_API_KEY]). - In Assemble Validation Payload, keep only set fields and map plainToken to
{{ $json.body.payload.plainToken }}and encryptedToken to{{ $json.data }}. - Connect Assemble Validation Payload to Return Webhook Validation to complete the URL verification response.
⚠️ Common Pitfall: Forgetting to replace [CONFIGURE_YOUR_API_KEY] in Hash Verification will cause Zoom URL validation to fail.
Step 2: Send a Standard Event Response and Delay Processing
After webhook verification, the workflow returns an immediate “ok” response and then waits before querying Zoom data.
- In Compose Event Reply, set keepOnlySet to
trueand add status with valueok. - Connect Compose Event Reply to Send Event Response to return the immediate acknowledgment.
- In Delay One Second, set Amount to
1to allow Zoom to finalize attendance records before fetching lists.
Keeping the short delay helps avoid incomplete participant or absentee lists from Zoom’s API.
Step 3: Connect Zoom and Fetch Participant Data
After the delay, the workflow pulls attendance and absence lists from Zoom in parallel.
- Delay One Second outputs to both Fetch Zoom Absentees and Fetch Zoom Participants in parallel.
- Open Fetch Zoom Participants and set URL to
https://api.zoom.us/v2/past_webinars/{{ $('Zoom Webinar End Listener').item.json.body.payload.object.uuid }}/participants. - Open Fetch Zoom Absentees and set URL to
https://api.zoom.us/v2/past_webinars/{{ $('Zoom Webinar End Listener').item.json.body.payload.object.uuid }}/absentees. - Credential Required: Connect your zoomOAuth2Api credentials in both Fetch Zoom Participants and Fetch Zoom Absentees.
- In Iterate Participant List, set Field To Split Out to
participants. - In Iterate Absentee List, set Field To Split Out to
registrants.
Step 4: Configure Attendance Processing and Routing
Participants are filtered, routed by webinar title, and evaluated for attendance thresholds.
- In Exclude Internal Attendees, keep the boolean check on
{{ $('Iterate Participant List').item.json.internal_user }}to filter internal users. - In Route by Webinar Title A, ensure rules match on
{{ $('Zoom Webinar End Listener').item.json.body.payload.object.topic }}containingE-Mail Zustellung für AnfängerandE-Mail Zustellung für Experten. - In Assess Full Attendance Primary, confirm the threshold uses
{{ $json.duration }}greater than{{ $('Zoom Webinar End Listener').item.json.body.payload.object.duration * 60 * 0.9 }}. - In Assess General Attendance Primary, confirm the threshold uses
{{ $json.duration}}greater than{{ $('Zoom Webinar End Listener').item.json.body.payload.object.duration * 60 * 0.6 }}and excludes internal users. - In Assess Full Attendance Secondary and Assess General Attendance Secondary, keep the internal user exclusion and the same 90% / 60% duration thresholds.
- For absentees, keep Route by Webinar Title B rules matching the webinar topic in the same way as Route by Webinar Title A.
⚠️ Common Pitfall: If webinar titles change, update both Route by Webinar Title A and Route by Webinar Title B or contacts may miss tags.
Step 5: Configure KlickTipp Tagging Actions
Tag participants and absentees in KlickTipp based on attendance status and webinar title.
- In Tag Full Attendance Primary and Tag Full Attendance Secondary, set Email to
{{ $json.user_email }}and provide the correct tagId values (replace[YOUR_ID]). - In Tag General Attendance Primary and Tag General Attendance Secondary, set Email to
{{ $json.user_email }}and provide the correct tagId values. - In Tag Absence Primary and Tag Absence Secondary, set Email to
{{ $json.email }}and provide the correct tagId values. - Credential Required: Connect your klickTippApi credentials to all tagging nodes (6 nodes handle attendance and absence tags).
Group your tag IDs by webinar title so each branch in Route by Webinar Title A and Route by Webinar Title B maps to the correct KlickTipp tags.
Step 6: Test and Activate Your Workflow
Run a complete test to ensure the webhook handshake, Zoom data retrieval, and KlickTipp tags work end-to-end.
- Click Execute Workflow and trigger a Zoom webinar end event to the Zoom Webinar End Listener webhook URL.
- Verify a successful URL validation response from Return Webhook Validation and a standard response from Send Event Response.
- Confirm both Fetch Zoom Participants and Fetch Zoom Absentees run after Delay One Second and return data.
- Check that contacts receive tags in KlickTipp via the appropriate nodes (full attendance, general attendance, or absence).
- When verified, toggle the workflow to Active for production use.
Watch Out For
- Zoom webhook secrets and API credentials need the right scopes, and they can be rotated. If tagging suddenly stops, check the Zoom app credentials and webhook verification settings first.
- If you’re using the built-in delay/wait to let Zoom finish processing reports, processing times vary. Bump up the wait duration if the participant or absentee requests return empty data right after the webinar ends.
- KlickTipp community nodes depend on the exact tag names existing in KlickTipp. Create the tags up front (including the Beginner/Expert variants), or you will chase “tag not found” errors later.
Common Questions
About an hour if your Zoom and KlickTipp accounts are ready.
Yes, but you will need someone comfortable with API keys and webhook secrets. No coding, mostly careful setup.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Zoom and KlickTipp plan costs for API access (varies by account).
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
You can change the “full attendance” thresholds inside the IF checks (the ones evaluating 90% and the 60–89% band). If you run more than Beginner/Expert, duplicate the Switch routing blocks that match on webinar title and point them to a new set of KlickTipp tags. Many teams also adjust the internal attendee filter so staff emails and test accounts never get tagged.
Usually it’s expired or incorrect Zoom API credentials, or missing scopes in the Zoom app configuration. Double-check the Zoom App Marketplace settings, then confirm the webhook secret used for HMAC matches what you configured in n8n. If it fails only on busy days, you may be hitting Zoom rate limits while fetching participants and absentees back-to-back.
It’s typically limited more by Zoom API limits than n8n. On n8n Cloud Starter you can run plenty of webinars per month for a small list; if you self-host, executions aren’t capped (your server is the ceiling). If you expect hundreds of attendees per webinar and many webinars per day, plan for batching, retries, and slightly longer waits after the webinar ends.
Often, yes. This flow depends on webhook verification, multi-branch logic (Beginner vs. Expert), and iterating through attendee lists, which n8n handles cleanly without turning it into a fragile chain of zaps or scenarios. Self-hosting is also a big deal if you don’t want execution limits dictating how many webinars you can run. Zapier or Make can be fine for a simple “webinar ended → add tag” use case, but this is more nuanced. If you’re unsure, Talk to an automation expert and map the exact rules you need.
Once this is live, webinar follow-ups stop being a post-event chore and start working like a system. Your segmentation stays accurate, and you get your time back for the parts that actually grow revenue.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.