Skip to main content
Petanque Life

Growth tools: Webinars

F21.21 6 features

At a glance

End-to-end webinar management for the growth track: list/create/detail with capability gates, automatic Google Calendar + Meet provisioning via Service Account and domain-wide delegation, lifecycle actions (publish, cancel, recording, delete), attendee management with reminder dispatch and CSV export, and an interest-lead preview built off `MarketingWebinarInterest`.

How it works

Webinars are a sys-operated growth tool — operators run them on behalf of the platform, the public pages from F19.16 are how prospects discover them, and the data lives in the same database as the rest of the platform. The list/create/detail/registrations/interest views all sit under `sys/webinars` and require `sys_support` for mutations. Creating a webinar via `POST /sys/webinars` auto-provisions a Google Calendar event and a Meet URL by impersonating `host_email` through a Service Account with domain-wide delegation; on provisioning failure the webinar persists as `DRAFT` and the response includes a `meet_provision_error` field so the operator can fix credentials and retry via PATCH.

Patching the webinar issues a Calendar update with `sendUpdates="all"` whenever timing, host, title, or description changes, so attendees always see the canonical version; the database update is intentionally not rolled back on Calendar failure so the operator can manually retry without losing edits. Lifecycle actions enforce state transitions: `publish` (DRAFT → SCHEDULED) refuses without a `meet_url`; `cancel` emails attendees, deletes the Calendar event with `sendUpdates="all"`, and flips `promote_on_homepage=false`; `recording` (ENDED → PUBLISHED) attaches the recording URL and flips homepage promotion off; `delete` is allowed only from DRAFT. Attendee management surfaces the full attendee list, a UTF-8-BOM CSV export, an idempotent send-reminder endpoint with 24h and 1h horizons (tracked by `reminder_*_sent_at` so a re-send never duplicates), and a bulk `mark-attendance` toggle.

Interest-lead preview reads `MarketingWebinarInterest` rows whose topics overlap the webinar's tags and whose subscribers are not unsubscribed — the audience the webinar-post-event-dispatch fan-out will hit.

Key capabilities

  • List, create, detail, registrations, interest views under `sys/webinars`
  • Auto-provisioned Google Calendar event + Meet URL via Service Account + domain-wide delegation
  • PATCH issues Calendar update with `sendUpdates="all"`; DB not rolled back on Calendar error
  • Lifecycle actions: publish (requires meet_url), cancel (emails + Calendar delete), recording, delete (DRAFT only)
  • Attendee CSV export (UTF-8 BOM); idempotent reminder dispatch at 24h and 1h
  • Bulk `mark-attendance` toggle
  • Interest-lead preview from `MarketingWebinarInterest` minus unsubscribes

In practice

A growth operator creates a webinar `Score-keeper v2 walkthrough` with `host_email = jamie@petanque.life` and three topic tags. The Service Account provisions the Calendar event and Meet URL on the first try; she clicks `Publish`, the state flips SCHEDULED, and registrations open via the F19.16 public page. The day before, she clicks `Send reminder (24h)`; 312 emails ship and `reminder_24h_sent_at` is stamped so a stray re-click does nothing.

Right before the session she clicks `Send reminder (1h)`. After the webinar she records attendance from the Meet log via the bulk-toggle, attaches the recording URL, and the post-event dispatch fans out to the interest-lead preview — 187 prospects whose topics overlap and who have not unsubscribed.

Features in this subsystem

6
ID Status Features
F21.21.01 Shipped Sys /webinars list + create + detail + registrations + interest views; all mutations require sys_support sys_engineer + fresh-auth and write to write_sys_audit (sys.webinar.* actions). | ✅ PL-T151
F21.21.02 Shipped POST /sys/webinars — auto-provisions Google Calendar event + Meet URL via Service Account + domain-wide delegation impersonating host_email; on failure persists DRAFT and returns meet_provision_error so the operator can retry via PATCH. Implemented (PL-T151)
F21.21.03 Shipped PATCH /sys/webinars/{id} — patches Calendar event with sendUpdates="all" when timing/host/title/description changes; DB update is not rolled back on Calendar failure (surfaced as meet_provision_error). Implemented (PL-T151)
F21.21.04 Shipped Lifecycle actions — publish (DRAFT → SCHEDULED, refuses without meet_url), cancel (emails attendees, deletes Calendar event with sendUpdates="all", flips promote_on_homepage=false), recording (ENDED → PUBLISHED + promote_on_homepage=false), delete (DRAFT only). Implemented (PL-T151)
F21.21.05 Shipped Attendee management — GET /registrations with full attendee doc, GET /registrations.csv UTF-8 BOM export, POST /send-reminder (idempotent 24h/1h horizons via reminder_*_sent_at), POST /mark-attendance bulk toggle. Implemented (PL-T151)
F21.21.06 Shipped Interest-lead preview — GET /sys/webinars/{id}/interest shows MarketingWebinarInterest rows whose topics overlap this webinar's tags and who are not unsubscribed (i.e. audience for webinar-post-event-dispatch fan-out). Implemented (PL-T151)