EmailFlow Pro | Elias Ricardo Skip to main content
UX Engineering Case Study

EmailFlow Pro

I was the designer producing campaign emails at Serasa Experian. Every change took too long — so I designed and built the tool that reduced campaign production from approximately 80 minutes to 10–20.

EmailFlow Pro interface — HTML editor, image log processor and AMPScript block

When

2025

Problem

Campaign emails at Serasa Experian were hand-coded in HTML for Salesforce Marketing Cloud. Each one took about 80 minutes.

My role

I was the designer producing those emails. I mapped the workflow, designed the tool and built it in React with AI-assisted development.

Result

Build time went from about 80 minutes to 10–20 per email.

01Context

Solve your own pain first

At Serasa Experian (the Brazilian arm of the global credit bureau), I was the designer responsible for producing campaign emails in Salesforce Marketing Cloud. The friction wasn't theoretical — I felt it every day: changes that should take minutes meant diving back into code, and every campaign repeated the same manual ritual.

My approach was pragmatic: if I can't use UX and AI to fix my own daily workflow, how can I design efficient solutions for millions of people? EmailFlow Pro wasn't born as a portfolio piece. It was a survival tool.

Fig. 01
EmailFlow Pro interface — HTML editor, image log processor, AMPScript block and output panel
The finished tool, live at sfmc-magic-builder.vercel.app: paste the email HTML, feed it the SFMC image log and AMPScript, get a production-ready email on the right.
02Users

Who I was actually designing for

The users weren't a market — they were my own team: the internal CRM and email-marketing staff at Serasa Experian who finish campaign emails in Salesforce Marketing Cloud. People fluent in HTML and design, but not interested in defending AMPScript edge cases on a deadline.

Designing for internal colleagues changed the priorities. There's no marketing funnel, no onboarding, no sign-up — just a tool that has to earn trust on the first paste. Because the stakes are millions of recipients, their deepest need wasn't speed, it was verifiable correctness. Speed was the headline; trust was the spec.

Re-link every image to its SFMC URL
After uploading assets to SFMC, the team had to manually swap each local image src for its final content-CDN URL. Dozens per campaign, all by hand.
Inject AMPScript without breaking the layout
Personalization blocks had to land in the right place and survive the build — one wrong escape and the send fails for millions.
Verify every link before it ships
A broken or untracked link reaches the entire base. They needed to scan all links at a glance, not hunt through raw HTML.

Jobs-to-be-done — framed as the outcomes my colleagues were "hiring" the tool to achieve, not features I wanted to build.

03My role

Design and implementation were one loop

This was not a handoff exercise. I defined the workflow around the job I needed to complete, designed the interface that made the steps visible, and built the processing logic that made the result repeatable.

My role
I was the designer producing campaign emails at Serasa Experian and the person experiencing the workflow bottleneck. I took the idea from functional prototype to a tested internal tool.
What I designed
A utility-focused one-screen workflow: HTML editor, image-log processing, AMPScript and link analysis, plus a visible processed-output panel. The interface was designed to make the transformation easy to verify.
What I engineered
A React client-side app with deterministic sanitization, image-log parsing, filename normalization, AMPScript injection, link analysis, and output checks against real campaigns.
Verified stackReactSalesforce Marketing CloudHTMLAMPScriptLovableCursor
04Problem

The cost of "manual labor"

Developing for Salesforce Marketing Cloud (SFMC) requires absolute precision — these emails went out to millions of Serasa Experian customers. My manual workflow was a massive bottleneck:

  • Time-consuming: 80 minutes per email.
  • Image re-linking: Hand-swapping every local image src for its SFMC content URL, one at a time, from an upload log.
  • High risk: Manually injecting AMPScript and checking 20+ links per campaign for millions of customers.

I was acting like a "human compiler." My creative energy was being drained by tasks that technology should have solved—but didn't.

05Constraint

Why generic AI (ChatGPT) failed

My first instinct was to use ChatGPT. I tried custom GPTs and complex prompts, but it revealed the limits of conversational AI:

  • Technical Hallucinations: GPT often invented AMPScript syntax, creating code that crashed inside Salesforce.
  • Inconsistency: Being a probabilistic model, the HTML structure changed every time. I spent more time reviewing the AI's work than doing it myself.
  • Lack of Workflow: A chat is a conversation, not a tool. Copying and pasting code back and forth is just another bottleneck. I needed a precision tool, not a chat window.
06Key decisions

Design for trust, engineer for repeatability

If the tool I needed didn't exist, I had to build it — without asking for budget, a dev team, or permission. I ran an AI-assisted development cycle in two stages:

  • Functional ideation (Lovable): I prototyped the interface around utility UX. The design had to "disappear" so the function could shine: raw code in, polished code out.
  • Precision engineering (Cursor): I moved the project to Cursor to code rigid business rules — deterministic sanitization that an LLM couldn't maintain consistently, ensuring the HTML met global email-rendering standards.
Key decisions & trade-offs

Deterministic rules over an LLM at runtime

Gain
Same input always produces the same output — auditable and testable.

Cost
I had to hand-write and maintain the sanitization logic instead of letting a model guess. More code to own.

100% client-side processing

Gain
Instant, and customer HTML never leaves the browser — a real concern at a credit bureau.

Cost
No server means no usage analytics or shared rule updates. Each user runs their own copy.

Opinionated one-click flow over a configurable editor

Gain
Zero learning curve; the tool disappears.

Cost
Power users can't tweak edge-case rules in the UI — they have to ask me to change the code.

07Validation

What I tested — and what broke

A tool my team would trust with millions of sends can't be validated by "it looks fine." The bar was strict: the assembled email had to match the version we already produced by hand — same images, same personalization, same links. So I tested it against real campaigns, not happy-path samples.

Real campaign replay

I ran emails I had already shipped by hand through the tool and diffed the output. The assembled HTML had to match the version that already went to production.

Image-swap accuracy

Every image src in the HTML had to resolve to the correct SFMC content URL from the log — no leftovers, no wrong matches, even with dozens of assets.

Link & AMPScript integrity

I seeded emails with bad links and edge-case AMPScript to confirm the analyzer caught them and the injection survived without breaking the build.

Testing against real data surfaced three failures that shaped the final product:

The image log came in inconsistent formats

Different exports gave me "Nome: x, URL: …", plain "filename → URL", and JSON. Rather than force one format on my colleagues, I made the parser accept all three.

Filenames in the HTML didn't always match the log

Casing and path prefixes broke naïve matching, so images silently stayed un-swapped. I normalized filenames before matching so a near-match still resolves.

"Did it actually work?" anxiety

A silent transform isn't trustworthy when millions of sends are on the line. Surfacing the link analysis and a clear processed-output panel turned that doubt into a visible check.

None of these showed up in the original prototype. They only appeared under real logs and real campaigns — which is exactly why shipping a working tool to my own team and stress-testing it beat polishing a mockup.

08Implementation

The tool, end to end

The result is a client-side single-page app with three inputs and one trustworthy output. You paste the raw email, hand it the data SFMC gives you, and it assembles a production-ready version — nothing leaves the browser.

Fig. 02
EmailFlow Pro on desktop: three input modules feeding one output panel
Three inputs, one output, all on one screen — no tabs, no wizard. Built for a desktop workflow, where the team produces campaigns.
  • HTML Editor: Paste, upload a .html file, preview the rendered email, and format the markup. The starting point for every campaign.
  • Image Log Processor: The core. SFMC spits out an upload log like Nome: banner.gif, URL: …sfmc-content.com/…. The tool parses it (that format, filename → URL, or JSON) and automatically rewrites every image src to its final SFMC content URL — the most error-prone manual step, gone.
  • AMPScript Block + Link Analysis: Paste your %%[ … ]%% block and it's injected in the right place; "Analisar Links" scans every link so you can verify protocols and tracking before the send reaches millions.

It's live — try it yourself.

Paste any email HTML and watch the three-step assembly run client-side.

Open the live tool
09Outcome

A shorter, more verifiable workflow

The measurable result was a reduction in campaign production time from approximately 80 minutes to 10–20 minutes per campaign. The tool also moved the risky steps into visible, repeatable checks.

80 → 10–20 min
Campaign production time
Client-side
Processing model
Deterministic
Transformation rules
  • Production time: Approximately 80 minutes to 10–20 minutes per campaign.
  • Verification: Image URLs, links, AMPScript placement, and processed output became visible checks in the workflow.
  • Processing: The app runs client-side, so customer HTML stays in the browser during processing.
10Reflection

The designer who builds

EmailFlow Pro changed how I work: when a tool limits the team, I treat that as a design problem and fix it. The same loop — understand, design, ship, measure — now runs through everything I build.

"Nobody asked me to build this. I was the user, I felt the pain, and I had the tools — so I built the infrastructure that gave me my time back."

The way I work, in one project

Find the friction, build the fix, measure the result — that's the loop behind everything in this case. If you're hiring someone who closes that loop on your team, let's talk. Thirty minutes, no slide deck.