insight · human_confirmed
Webinar data model (GHL custom objects)
Model - Parent: Webinar (`custom_objects.webinar`) — one Zoom webinar instance/date. - Child: Webinar Registration (`custom_objects.webinar_registration`) — one contact × webinar enrollment; mutable status Registered → Attended / No-show / Replay. - Associations: Registration → Contact (`webinar_registration_contact`); Registration → Webinar (`webinar_registration_webinar`). Canonical keys - Zoom numeric webinar `id` is the cohort key (same topic across dates ≠ same webinar). - Parent holds: webinar_id, webinar_uuid, topic, start_at, duration_minutes, timezone, registration_url, join_url, host_email, status. - Child keeps person fields + thin denormalized webinar_id / webinar_start_at for GHL filters. Sync path - Registration source: Zoom registrants (GHL funnels point at Zoom register URLs). Typeform is sales application, not webinar opt-in. - Pre-event: ZOOM_LIST_WEBINAR_REGISTRANTS → create/update Registration + ensure parent Webinar. - Post-event: ZOOM_LIST_WEBINAR_PARTICIPANTS → status + attendance_seconds; attendance_pct = duration_seconds / (duration_minutes × 60) × 100. - Historical: past Zoom registrant lists often empty — backfill from participants + GHL webby tags. GHL IDs (location rqDSpdr1Z3u98eMKUclS) - Webinar object: 6a9376eab601c7209a156b28 - Webinar Registration object: 6a9374a0eeae1dbb7ed0dba1 - Assoc webinar↔registration: 6a9377002f7b4a3d1e87d19b - Assoc registration↔contact: 6a9374ad2f7b4a3d1e86f8d5 DATE fields (for smart lists) - Webinar.`start_date` (DATE) — prefer over text `start_at` for filters. - Registration.`webinar_start_date`, `registered_date`, `attended_date` (DATE). - TEXT ISO fields (`start_at`, `webinar_start_at`, `registered_at`, `attended_at`) kept for raw timestamps; use DATE fields in Smart Lists (In the Last / In the Next). - Example view: Status = Attended AND Attended Date is in the last 7 days. - Example view: Status = Registered AND Webinar Start Date is in the next 7 days.