Automating Zoom Webinar Attendance Tracking with Gmail and Google Apps Script

TL;DR: Many professional societies run Zoom-based webinar series where you need to attend a minimum percentage of sessions to earn a certificate. I used Claude to audit my attendance history directly from Gmail, then automated the whole process with a Google Apps Script that detects new Zoom registration emails and adds calendar events — so you never miss a session again.

The Problem: Tracking Attendance for Certificate Programmes

Many professional associations now run structured online education programmes through Zoom, where attendance is tracked and a certificate is awarded to participants who reach a certain threshold — typically 70% of live sessions. The problem is that life gets in the way: you register for a session, forget about it, and only realise you missed it when the “sorry you couldn’t make it” email arrives. Over a multi-month programme, these misses add up quietly.

The good news is that Zoom’s post-event emails are remarkably consistent and machine-readable. This makes the whole problem automatable.

Step 1: Reconstructing Your Attendance History from Gmail

Zoom always sends one of two emails after a webinar ends:

  • “Thank you for attending…” — you were present
  • “We’re sorry you were not able to attend…” — you registered but missed it

This means your full attendance history is sitting in your Gmail inbox, waiting to be counted. To find it, search Gmail using a query like:

from:no-reply@zoom.us ("thank you for attending" OR "sorry that you were not able") [your-series-keyword]

Replace [your-series-keyword] with something specific to your programme — the organiser’s domain, the series name, or any unique phrase that appears in your webinar emails. The results give you a complete attended/missed breakdown to calculate your current attendance rate.

Step 2: Automating Calendar Events with Google Apps Script

Google Apps Script is a free JavaScript runtime that runs inside your Google account with direct access to Gmail and Google Calendar. No server, no third-party service, no cost.

The script does the following every hour:

  1. Searches Gmail for new Zoom registration confirmation emails matching your programme’s keywords
  2. Parses the webinar title and date/time from the email body
  3. Maps Zoom’s city-based timezone strings to proper IANA timezones
  4. Checks for duplicate calendar events before creating anything
  5. Creates a Google Calendar event with a 1-day email reminder and a 1-hour popup reminder
  6. Labels the processed email so it is never processed twice

Parsing the Zoom Email Format

The trickiest part was reliably extracting the date and time. Zoom confirmation emails always contain a line like:

Date & Time Oct 23, 2025 06:00 PM Amsterdam, Berlin, Rome, Stockholm, Vienna

The key insight is to anchor the regex on Date & Time rather than trying to detect a date anywhere in the body — robust across different webinar topics and templates:

const anchored = /Date\s*&\s*Time\s+(\w{3}\.?\s+\d{1,2},?\s+\d{4})\s+(\d{1,2}:\d{2}\s*[AP]M)(.*)/i;
const m = text.match(anchored);
// m[1] = "Oct 23 2025"  m[2] = "06:00 PM"  m[3] = "Amsterdam, Berlin, ..."

Zoom expresses timezones as a city list rather than an IANA string. A mapping function handles the conversion:

function mapTimezone(raw) {
  const s = (raw || "").toLowerCase();
  if (/amsterdam|berlin|rome|vienna|stockholm/.test(s)) return "Europe/Berlin";
  if (/london|dublin|bst|gmt/.test(s))               return "Europe/London";
  if (/eastern|new york|toronto/.test(s))             return "America/New_York";
  // ... other timezones ...
  return "Europe/Berlin"; // default
}

Deduplication

The script checks the calendar for an existing event with a matching title near the same date, and applies a Gmail label (Webinar-Added) to every processed thread — excluding it from future queries. Safe to re-run as many times as needed.

Setup: 2 Minutes

  1. Go to script.google.comNew project
  2. Paste the full script, replacing all default content
  3. Update the CONFIG block — specifically the keywords array
  4. Select createProcessedLabel → click ▶ Run
  5. Select installTrigger → click ▶ Run
  6. Optionally run backfillHistoricalWebinars once for past emails

Google will show a warning: “Google hasn’t verified this app.” This is normal for personal Apps Scripts — click Advanced → Go to [project name] (unsafe) and grant permissions. You are the developer and sole user.

Adapting for Your Own Programme

Everything lives in one CONFIG object at the top:

const CONFIG = {
  processedLabel:      "Webinar-Added",
  calendarId:          "primary",
  defaultDurationMins: 90,
  emailReminderMins:   24 * 60,  // 1 day before
  popupReminderMins:   60,        // 1 hour before

  // Change these to match your programme
  keywords: [
    "your-society-name", "your-series-name", "other-keyword",
  ],
};

Replace the keywords values with terms unique to your series — the rest works unchanged for any Zoom-hosted webinar programme.

What This Doesn’t Do

  • It doesn’t register you. The script only acts after you register — it creates the calendar reminder from the confirmation email.
  • It doesn’t track actual attendance. Events are created from registration confirmations, not post-event emails. Your official record is with the organiser.
  • It requires a consistent email address. Most programmes track attendance by email. Register with the same address every time.

Full Script

The complete script is available on my GitHub. MIT licensed — adapt freely.


Tags: Google Apps Script, Zoom, Webinar, Automation, Gmail, Google Calendar, CME, Medical Education, Professional Development


Leave a comment

Discover more from /root

Subscribe now to keep reading and get access to the full archive.

Continue reading