SK.
ABOUT
CASE STUDIES
EXPERIENCE
CONTACT
Back to Portfolio

Email Campaign Platform

Rebuilding an enterprise email marketing platform from the ground up

2023 — 2026
Email Campaign Platform - Rebuilding an enterprise email marketing platform from the ground up
Role & Ownership
Role

Product Designer — UX & UI

Ownership
  • •Information architecture across all 7 modules
  • •End-to-end flows for the full campaign lifecycle
  • •Interaction and visual design of every screen
  • •A component-based design system and patterns
  • •In-product AI features (assistive, generative)
  • •An AI agent that authors and maintains the docs
Collaboration
  • •Marketers — how a real campaign actually gets built
  • •Campaign operators — live sends and what breaks during them
  • •Data engineers — how audiences and data pipelines really work
  • •Approvers — what they need to see before signing off

Overview

A home-built marketing-automation platform used to design, target, and ship personalized email and messaging campaigns to millions of customers. I led the end-to-end redesign — every section, every flow, the design system, and the AI capabilities layered on top.

Context

The platform handles the entire campaign lifecycle in one place — building audiences, authoring messages, scheduling and approving campaigns, and measuring results. But the capabilities had accumulated faster than the interface could hold them. Power users were productive; everyone else faced a steep, unforgiving learning curve.

Problem

The platform could do almost anything — which was exactly the problem. Depth without structure meant every task felt like expert work. Features lived in inconsistent patterns, navigation didn't scale, and a single campaign could send someone across the product a dozen times with no clear sense of where they were in the journey.

Key issues included

  • •Six compounding problems, from a fragmented interface to documentation nobody could keep current
  • •Every one of them made the next feature more expensive to ship
  • •Detailed below

Solution

I organized the product around the campaign lifecycle. Each module maps to a real stage, so the platform reads as a sequence, not a pile of tools. Then I rebuilt each module's core task end to end, extracted a design system so every screen speaks one language, and introduced AI where it removes real friction — with human control over anything customer-facing.

Under NDANo production screens

I can talk about this work, but I can't show the real interface. Every visual on this page is a schematic reconstruction I drew for this portfolio — the structure, flows, and decisions are real; the pixels are not the production UI.

The product itself is a conventional email marketing platform, close in kind to HubSpot: build an audience, author a message, schedule and approve a campaign, measure the result.

The Challenge

Deep functionality, shallow usability.

The platform could do almost anything — which was exactly the problem. Depth without structure meant every task felt like expert work.

Fragmentation

No shared language

Each area had grown independently. The same action looked and behaved differently depending on where you were, so nothing you learned in one module transferred to the next.

Navigation

Didn't scale

The original navigation couldn't hold a growing feature set. Finding the right screen — and knowing where you were in a multi-step campaign — took insider knowledge.

Complexity

Expert-only workflows

Writing audience queries, segmenting, wiring approvals, reading analytics — each was powerful but exposed raw, with little guidance for anyone who wasn't already an expert.

Trust & safety

High cost of error

Campaigns reach real customers at scale. The UI had to make consequential actions feel deliberate and reversible, and surface approvals clearly — without slowing experts down.

Consistency

Design debt

Years of incremental additions left mismatched components, spacing, and states. There was no source of truth to build against or scale from.

Knowledge

Docs always stale

The product shipped faster than anyone could document it. New capabilities landed undocumented, so users couldn't discover what the platform could already do.

Redesign · The transformation

From code-heavy tool to intelligent platform.

The platform began as an engineering tool: messages written by hand, audiences queried by hand. Each move widened who could actually use it.

campaign.sql
template.html
styles.css
send.js
-- audience for the winback wave
SELECT id, email, country, segment
FROM customers
WHERE opted_in = true
AND last_active < now() - interval '90 days'
AND segment IN ('growth', 'winback')
ORDER BY last_active DESC;
Where it started

A code-heavy email generator

At first it was a bare tool for building and blasting emails. It was powerful — but every send meant hand-writing the message and hand-querying the audience. Using it required real engineering skills, so it stayed locked to a handful of specialists.

HTMLCSSJavaScriptSQL
1Make it usable

A guided interface. The engineering utility became a product people could use without writing code.

2Make it a platform

New modules and a canvas. Campaigns became a visual canvas of connected nodes instead of a long form.

3Make it intelligent

AI, built in. Assistive and generative help plus one alert centre, so the platform helps do the work.

Research · Who I designed for

Four people, one platform.

One campaign passes through very different hands. The redesign had to serve all four without collapsing into a lowest-common-denominator tool.

1
Persona

The campaign builder

Goal: Ship a personalized campaign fast. Pain: Lived in expert-only screens and raw queries. What changed: Guided creation, live previews, AI assistance.

2
Persona

The campaign operator

Goal: Watch sends go out cleanly, catch problems live. Pain: Run-time status buried inside strategic analytics. What changed: A dedicated dashboard focused on live health.

3
Persona

The approver

Goal: Sign off with confidence on something irreversible. Pain: Unclear what was actually about to send. What changed: Explicit approval flow with a simulation of who gets what.

4
Persona

The data analyst

Goal: Get data in, read results out. Pain: Data prep and analytics felt disconnected. What changed: Both designed as first-class stages of one lifecycle.

Redesign · Information Architecture

Structure that mirrors the work.

The redesigned structure: five sequential stages, with Settings and Survey as supporting modules that plug into every stage.

Information architecture
The campaign lifecycle
Data PrepLoad data
→
AudienceWho to reach
→
MessagesWhat to say
→
CampaignsSchedule & approve
→
InsightsMeasure
Supporting — plugs into every stage
Settings — reusable test data & configuration
Survey — dedicated survey campaigns
The end-to-end flow — what the user is trying to do
1
Data Prep

Get the data in

“I load and shape the data I need from our sources so it's ready to target.”

2
Audience

Choose who

“I define exactly which customers to reach — and preview the reach before I commit.”

3
Messages

Craft the message

“I author and personalize the message per channel, then send myself a test.”

4
Campaigns

Schedule & approve

“I schedule, split, simulate, and route it — then get a second pair of eyes to sign off.”

5
Insights

See what worked

“I measure engagement, conversion, and revenue — and learn for the next wave.”

Five sequential stages, each a module. The platform reads as a sequence of jobs, not a pile of tools.

Redesign · Before / After

The same task, rebuilt.

The platform's most-used and most intimidating task, before and after the redesign. Same capability, different experience.

Before
Audience Builder
Home
Audience
Query Tool
Segments
Messages
Reports
Admin
NewOpenSaveValidateRunExportClear
Query editor
SELECT id, country, language, segment FROM customers WHERE opted_in=true AND segment IN ('growth','winback') ORDER BY last_active DESC;
idcountrylanguagesegmentlast_active
10039821USengrowth2026-08-30
10077342DEdewinback2026-08-29
10011280JPjagrowth2026-08-29
Email HTML
<table role="presentation" width="600"> <tr><td style="padding:0"> <img src="{{hero_url}}" width="600" alt=""> </td></tr> <tr><td style="padding:24px 32px"> <h1 style="font:700 22px Arial">{{first_name}}, a little</h1> <p style="font:14px/1.5 Arial;color:#555">…</p> <a href="{{cta_url}}" style="background:#2f6fd0;color:#fff">Shop now</a> </td></tr> <tr><td style="padding:16px 32px;font:11px Arial"> <a href="{{unsub_url}}" style="color:#888">Unsubscribe</a> </td></tr> </table>
  • ✕Dense sidebar mixing every tool; no sense of a workflow
  • ✕Raw query only — no guidance, no plain-language path
  • ✕Exposed IDs, no reach estimate, no privacy masking
  • ✕Toolbar of ambiguous actions; validate & run disconnected
After
Platform.
AudienceMessagesCampaigns
Audiences
Create New
MarketingDirect Connect
Describe the audience
Active customers in growth or winback, opted in, not seen for 90 days
Build with AIRun✓ Validated
SELECT id, country, language FROM customers WHERE opted_in = true …Edit query
Preview
Est. reach 1,284,530
PersonCountryLang
••••3921USen
••••7742DEde
••••1180JPja
  • ✓Top-nav mirrors the campaign lifecycle, not the org chart
  • ✓Plain-language path via AI, with the query still inspectable
  • ✓Masked IDs + live reach estimate before committing
  • ✓Run, validate, and preview unified in one clear panel

Redesign · Section Highlights

Designing each module from scratch.

Seven modules, each rebuilt around the job it does: get the data in, choose who, craft the message, schedule and approve, then see what worked.

Audience — the detail screen
Platform.
AudienceMessagesCampaignsInsightsData Prep
Active customers — GrowthDraft
Created by you
SaveRequest Approval
Settings
Line of Business
Growth
Category
Winback
Audience Template
Standard
Flows
Approval · Default
Type
MarketingDirect Connect
Describe the audience
Active customers in growth or winback, opted in, not seen for 90 days
SQL Query
-- Active customers, opted-in
SELECT id, country, language
FROM customers
WHERE opted_in = true
AND last_active > :window
Build with AIRun✓ Validated
Preview · sample data
Est. reach 1,284,530
PersonCountryLangSegment
••••3921USengrowth
••••7742DEdewinback
••••1180JPjagrowth
••••5063GBenwinback
The query editor paired with settings, preview, and explain, so you validate both what you select and how it runs before committing.
Messages — one anatomy per channel
Platform.
AudienceMessagesCampaignsInsightsData Prep
EmailNotificationsPush
Product Launch — GrowthDraft
Created by you
1Draft
2Verify
3Request Approval
4Approved
Send testReview
Details
Line of Business
Growth
Broadcast Type
Marketing
Audience Region
Worldwide
Message Type
Email
Sender Name
Growth Team
Subject Line
Meet the all-new lineup ✨
Draft with AI
Design BlocksHTMLPlain TextLinksClicksVariables
Your Company
Meet the all-new lineup
Learn more
Every message shares the same header, details, and content anatomy, with the approval workflow visible up top. Shown here with a layout revision I would argue for: the shipped screen kept a separate right-hand column of tools, which spent a quarter of the width on five rarely-used actions and put Preview far from the canvas it previews. Content actions move onto the content, pre-flight actions attach to the step they complete, and the editor gets the width back.
Campaigns — a canvas of connected nodes
Platform.
AudienceMessagesCampaignsInsightsData Prep
Holiday growth — wave 2Draft
Created by you
SaveRequest approval
+−
Schedule
Dec 3 · 9:00
Recurring · weekly
+
Audience
Active customers
1,284,530 · approved
+
Marking Rules
Growth · global
Frequency cap applied
+
Split · A/B test
3 variants on the selected audience
Variant A · 50%
Message · Email
en_US +4 · Rec: dynamic
+
Variant B · 38%
Message · UI Notification
en_US +4 · LQR on
+
Holdout · 12%
No message
Control group
+
Split · A/B test
Selected step
Traffic split
Variant A · Email50%
Variant B · UI Notification38%
Holdout · no message12%
Audience
Active customers · 1,284,530
Success metric
Open → click-through
Test window
72h · winner auto-promoted
Guardrails
Frequency cap2 / week
Quiet hours09:00–21:00
Holdoutexcluded
Pre-flight
Variants renderedPass
Links checkedPass
Seed sendPending
Edited by you · 2h ago
Edit variants
A campaign is assembled from tiles: schedule, audience, and delivery rules are required; message, split, and A/B tests are added as needed. A complex, irreversible send stays legible at a glance.
Insights — the summary surface
Platform.
AudienceMessagesCampaignsInsightsData Prep
Campaigns summary
Explain
Date range
Last 7 days
Line of business
All
Region
Worldwide
ApplySave as
Campaigns
128
Sends
42.6M
Clicks
2.9M
Unsubs
18.2K
Bounces
204K
Delivered
98.1%
CampaignSendsClicksCTRDelivered
Holiday growth — wave 11.28M86K6.7%98.4%
Winback — September842K44K5.2%97.9%
New product launch2.10M168K8.0%98.6%
Headline metrics over a searchable table you drill into per campaign. Live run-time monitoring lives separately, in its own operational dashboard.
Insights — drilling into one campaign
Platform.
AudienceMessagesCampaignsInsightsData Prep
←
Holiday growth — wave 1
Single campaign view
Sends
1.28M
8.2% vs last wave
Clicks
86K
14% vs last wave
CTR
6.7%
1.2 pts vs last wave
Unsubs
510
3.1% fewer
Clicks over time — last 14 days
This wave Last wave
12K8K4K0Nov 20Nov 26Dec 1Dec 3Peak · 12.4K
Clicks by Geo country
Top 5
40K27K13K028K34K18K13K9KUSDEGBJPFR
Clicks by segment
86Kclicks
Growth40%
Winback30%
New18%
Loyal12%
Clickmap · where customers click
LowHigh
Email · Variant A
Learn more
Top clickmarkers
“Learn more” button52%
Hero image27%
Header logo11%
Footer links10%
Per-campaign detail: trend against the previous wave, breakdowns by region and segment, and the numbers that decide what to do next.
Data Prep — move and shape data on a schedule
Platform.
CampaignsInsightsData Prep
Jobs
New job
Welcome load
Warehouse → analytics store
Succeeded
Newsletter feed
Flat file → analytics store
Daily 06:00
Event attendee upload
CSV → customer table
Running · 62%
Subscriber export
Analytics store → CSV
Weekly · Mon 07:00
Welcome load · pipeline
Source
Warehouse · flat files
12 columns
Transform
Map, dedupe, normalise
3 rules
Destination
Analytics store
1.2M rows
Recent runs
Today · 04:001m 48s
Yesterday · 04:001m 39s
2 days ago · 04:00retried
Each job names its source, transform, and destination, and keeps its recent runs beside it — so a business user can build one without an engineering ticket.
Settings — reusable building blocks
Platform.
CampaignsInsightsSettings
Settings
Saved lists12
Saved IDs8
Mock data5
UDF data9
CLM3
Group text6
Saved listsCreate new
Search saved lists
Growth — regional seed
1,284 recipients · 2d ago
Shared
QA test recipients
26 recipients · 5d ago
Private
Holiday preview
340 recipients · 1w ago
Shared
Winback — lapsed 90d
8,902 recipients · 1w ago
Shared
VIP early access
512 recipients · 2w ago
Private
Newsletter — opt-in only
44,120 recipients · 3w ago
Shared
Beta programme
96 recipients · 1mo ago
Private
Trial expiring — 7 days
1,908 recipients · 1mo ago
Shared
Same create pattern:Name›Define›Preview›Save
Six kinds of saved data behind one rail, each with a count and the same create pattern, kept out of the main campaign flow.

Craft · States & Localization

The screens between the happy path.

Enterprise tools live in their empty, loading, and error states as much as their ideal one. Designing those deliberately is where trust is won or lost.

Empty, loading, error
Platform.Audience
+
No audiences yet

Create your first audience with a query, or let AI draft one from a plain-language description.

Create newStart with AI

Empty

Turns a dead end into a first step, with a low-effort AI on-ramp.

Platform.Audience

Loading

Skeletons that match the real layout, so nothing jumps when data lands.

Platform.Audience
Query failed — syntax error near line 4
Unknown column segement. Did you mean segment?
WHERE opted_in = true
AND segement IN (…)
Edit queryFix with AI

Error

Specific, located, recoverable — it points at the exact token and offers a fix.

One message, worldwide
EnglishEN
Your Company
Meet the all-new lineup
Learn more
GermanDE
Your Company
Entdecke die neue Produktreihe
Learn more
JapaneseJA
Your Company
新しいラインナップ
Learn more
Arabic · RTLAR
Your Company
تعرّف على التشكيلة الجديدة
Learn more
The same message across locales, including right-to-left — where the layout mirrors, not just the text.

AI · In the product

AI that removes friction — not a chatbot bolted on.

I introduced AI where the platform's complexity hit users hardest: turning intent into audiences and messages, and turning dense results into plain-language answers.

Three places AI earns its place
Assist

From intent to query

Describe the audience you want in plain language and get a starting query you can inspect and refine — lowering the query barrier without hiding what's actually running.

Generate

Drafting & variants

Assisted message drafting and variant generation to accelerate authoring and A/B testing — always previewed, always editable before a test send.

Explain

Results in plain language

Summaries that turn a dashboard full of metrics into a readable answer, so insight isn't gated behind knowing which chart to read.

AI inside the task
Platform.
AudienceMessagesCampaignsInsights
Audiences
Create new
Query
-- Inserted by AI · review before running
SELECT id, country, language
FROM customers
WHERE last_active BETWEEN :from AND :to
AND opted_in = true
✓ Inserted from AI
AI Assistant
Customers who lapsed in the last 90 days
Here's a query for customers with no activity in the last 90 days who are still opted in. Want me to also exclude anyone contacted this week?
Insert queryRefine
Ask about audiences, data, or metrics…↑
Describe the audience in plain language and get a starting query you can inspect and refine. The AI drafts; the query stays visible and editable.
Reviewing a message, with AI on the selection
Platform.
AudienceMessagesCampaignsInsightsData Prep
Product Launch — GrowthIn review
Sent for approval by you · 2h ago
Request changesApprove
✓Draft
✓Verify
3Request Approval
4Approved
Subject line
Meet the all-new lineup ✨
Email · Variant A
Meet the all-new lineup

Our biggest update yet, with longer range, faster charging, and a price that starts lower than last year.

Edit selection1 sentence
“a price that starts lower than last year.”
Make it shorter and warmer
“…and new pricing that starts lower than ever.”
ReplaceTry again
Learn more
Change log5 edits
Offer line rewritten
AI suggestion · you replaced
2h ago
Subject line shortened
AI suggestion · you accepted
3h ago
Variant B added
Teammate
yesterday
Audience set to Active customers
You
yesterday
Draft created
You
2 days ago
The approver reads the message that is about to go out. Selecting a sentence opens the assistant on the selection itself, and the panel beside it logs what changed and which edits came from a suggestion — but only a person can approve the send.
Design principles for AI in a high-stakes tool
1

Human in the loop

AI drafts, people approve. Nothing customer-facing ships without explicit human confirmation.

2

Transparent, not magic

The generated query and the draft stay visible, inspectable, and editable.

3

Right where the work is

AI lives inside the task, not in a separate mode you have to switch to.

4

Fail safe

Suggestions default to reversible, low-risk states. The destructive path is never the easy one.

AI · Beyond the product

An AI agent that keeps the platform documented.

The product shipped faster than anyone could document it, so I designed an agent that turns shipped work into review-ready documentation.

What the agent does
  • ✓Checks ticket status and picks up shipped work
  • ✓Drafts and updates the relevant doc pages
  • ✓Curates a human-readable release log (shipped-only)
  • ✓Enforces terminology, style, and structure rules
  • ✓Flags screens that need fresh screenshots for a human
  • ✓Opens changes for review before anything publishes
The documentation agent
Project tracker
Checkout redesignShipped
Audience filtersShipped
Split test limitsIn progress
The agent polls status, not commits.
→
Docs agent
Writes the release-log entry
Updates the pages the change touches
Enforces terminology and structure
Waiting on review
→
Human review
A person reads the diff and owns the screenshots.
ApproveRequest changes
→
Published by the agent
On approval the agent ships it to production and versions the set.
docs v2.14.0 · live
Request changes sends it back to the agent to redraft. Nothing reaches production without a person approving it first.
The agent watches ticket status in the tracker. When work ships it writes the release-log entry, updates the pages that change touches, and holds everything for review. A person reads the diff and owns the screenshots; on approval the agent publishes to production and versions the set, and a rejection sends it back to redraft. The hard part was the rules: what belongs in a release log, what a user needs to read, and when a human must step in.

Foundations

One system, seven modules.

To redesign this much surface area and keep it coherent, I built a component-based design system — shared patterns for tables, forms, creation flows, previews, approvals, and empty states.

New features now inherit good defaults instead of reinventing them, which is also what makes the interface ready to absorb AI and system feedback without fragmenting again.

1
Shared component library across the whole product
7
Modules on a single visual language
∞
Features that inherit patterns for free
Every screen
Built from shared, documented patterns
Depth kept.
Learning curve flattened.

The redesign kept everything power users relied on while making the platform legible to everyone else — and set it up to grow with AI instead of against it.

What I took from it

Structure beats polish

The biggest usability wins came from fixing the information architecture, not restyling screens. Get the map right and the rest follows.

Systems make breadth possible

Owning seven modules alone was only feasible because a design system turned one-off decisions into reusable patterns.

AI needs design most

The value of AI in a serious tool comes from restraint — clear affordances, transparency, and human control — far more than from raw capability.

Approach

  • •Understand the domain — sat with marketers, campaign operators, data engineers, and approvers to map how a real campaign gets built, and where it stalls
  • •Restructure the information architecture — reorganized the product around the campaign lifecycle rather than the org chart that built it
  • •Design the flows — rebuilt each module's core task end to end, reducing steps and making state visible at every point
  • •Build a design system — component library and interaction patterns, so new features inherit good defaults instead of reinventing them
  • •Introduce AI, deliberately — assistive and generative AI where it removes real friction, with clear affordances, previews, and human control
  • •Keep it documented — designed and shipped an AI agent that reads the ticket tracker and keeps documentation accurate release over release

Impact

  • •Campaign creation shifted from expert-only to a guided, repeatable flow
  • •New users onboard through guided flows and AI instead of tribal knowledge
  • •One consistent design language across 7 modules
  • •AI adopted inside real workflows, safely
  • •Documentation that finally keeps pace with releases

Reflection

"Three things stuck with me from owning this much surface area alone."

AREAS OF
Emphasis

Product Design
Enterprise SaaS
Design System
AI Product Design
GETTR - Scaling a social app past 5M users
Previous Case

GETTR

Scaling a social app past 5M users

Empower - One design system, every team
Next Case

Empower

One design system, every team

Project inquiry

READY TO
Collaborate?

SK.

Sergei Kovtun — Product Designer & UX/UI Designer

AboutCase StudiesExperienceContact
Download Resume
© 2026 SERGEI KOVTUN. All Rights Reserved.