← Back to selected work

Case study

Webinar Migration Pipeline

Automating webinar follow-up email production for a global online education platform.

Context

Every webinar/masterclass run generates up to seven distinct follow-up email variants — no-shows, all-registrants, attendees who dropped off early, attendees who saw the offer, timed reminders before the event, timed sends from sign-up, and existing customers. When the platform's email system changed, all of this legacy content needed to move to the new system — one email at a time, by hand.

The problem

Rebuilding these emails manually meant three repetitive, error-prone steps for every single template: rewriting the HTML to match production standards, manually converting every legacy merge variable ({{ webinar_time }}, {{ webinar_replay_link }}, and a dozen others) into the new platform's templating syntax, and re-inserting the correct header, footer, and view-in-browser blocks by hand. Multiply that across every webinar and every email type, and it becomes a standing bottleneck — slow, inconsistent, and easy to get subtly wrong (a single missed variable breaks personalization for an entire send).

What I built

A Python migration pipeline that takes a raw data export and turns it into fully production-ready, live templates with a single command:

  1. Each email's raw HTML is passed to an LLM agent that handles content cleanup and rewriting, following a defined quality standard
  2. A mapping layer automatically converts every legacy variable to the new platform's correct syntax — no manual find-and-replace
  3. The processed content is wrapped in the platform's production scaffold: correct table structure, mobile-safe styling, and the required header/footer/view-in-browser blocks
  4. The finished template is created or updated directly via API

The pipeline is idempotent by design — re-running it never creates duplicates, it just safely updates what's already there. It also supports dry-run and single-record test modes, so changes can be verified before anything goes live, and every run produces a full audit trail (per-row status, flagged issues, template IDs) rather than relying on someone manually checking each email.

Outcome

Migrated roughly 400 templates across 20 webinar sequences. What used to take about two weeks of manual rebuilding now takes about 5 minutes per webinar (~23 templates) — with a full audit trail and zero duplicate or broken templates, even across repeated runs.

Stack

Python Braze (email platform + REST API) Gemini (LLM agent) BigQuery