The brief was "we need better emails". The audit showed the real problem: the email platform couldn’t see many of the customers it was supposed to email, and four systems were competing to talk to the ones it could.
Shoppers who checked out as guests never became contacts, so recovery emails had no one to send to. And the recovery link rebuilt the cart without the subscription plan, sending people back to the wrong offer.
So: I built an event pipeline so every checkout reaches the email platform, deduplicated by checkout. The plumbing had to be right before any copy mattered.
Brevo, Shopify’s messaging, the subscription app, and automation workflows could all send. Nobody could say what a new subscriber received in week one.
So: One owner system per email type, written down, plus a 24-hour gap between marketing sends.
Marketing emails landing next to a charge or a failed-payment notice feel tone-deaf and drive cancellations.
So: Quiet periods around billing days and zero marketing during payment retries. Respect first, promotion second.
A renewal-triggered automation would have sent a "welcome"-style email on every single renewal.
So: Caught in the audit, before it ever fired.
UTM tags still contained template placeholders, and the account’s currency was set wrong.
So: One UTM convention across every template, so email finally shows up in attribution.
Business figures (revenue, spend, conversion and retention rates) stay private at my employer’s request. Happy to walk through the real work on a call.
Shopify + Seal Subscriptions webhooks → n8n (dedupe by checkout token, enrich, stage) → Brevo contact attributes and lifecycle stage → flows · Judge.me review requests · single-use referral codes.
I'd map every system that can send email before writing a single one. The most valuable deliverable was the ownership table, not the copy.