Variable mail platform

Role

Product Designer

Timeline

6 months

Deliverable

MVP

Tags

B2B SaaS

No-code

If/Then rules

I designed a B2B platform for building and tracking variable, personalised mail: a no-code editor with six component types plus performance dashboards. The same product had to serve everyone from a non-technical small-business owner to a developer integrating by API. I anchored the editor on one idea, composing mail from conditions rather than code, so the least technical owner can personalise every mail piece without waiting on a developer.

Decisions

D1

A visual rule builder

Making mail vary by recipient is normally a scripting job most creative teams can't take on. The builder turns it into a sentence they fill in: If field, Then change content.

The whole rule, filled in like a sentence.

D2

One rule grammar, a reusable component library

Raw uploads (images and datasets) sit in Assets; the parts you compose with are Components, each saved with its own rules and reused across mailers. All six types answer to the same If/Then builder, so a creative learns one pattern and applies it to a headline, an image, a link or a QR.

Assets: raw uploads, images and datasets.

Assets: raw uploads, images and datasets.

Components: reusable, rule-bearing parts by type.

Components: rule-bearing parts, by type.

D3

Data-bound components start from a dataset

Map and chart work unlike the value-swap types. Each binds an uploaded dataset first, then rules layer on: a "Closest store" map reads the store-locator file, and a chart stays locked until a data source sets its default. The rule model holds; the content is a whole table, so you point the component at data before shaping it.

A data-bound type stays empty until a source is set.

Empty until a source is set.

The Closest-store map plots its dataset; rules layer on.

The Closest-store map plots its dataset.

D4

Default + stacked rules for safe fallthrough

When a recipient matches no rule, the component can render blank with nothing to flag it. A required Default sits under each component's ordered rules, so unmatched recipients always land on the Default.

A required Default sits beneath the ordered rules, so no recipient renders blank.

Rules run in order; the Default catches the rest.

D5

Mailers and Dashboards kept as separate homes

Both show performance, so they could have merged. I kept them apart: Mailers lists one row per mail piece and drills into that piece's metrics and API details, while Dashboards works across every mailer at once, with saveable views.

Mailers: one row per mail piece.

Mailers drills into one piece.

Dashboards: saveable views across every mailer.

Dashboards spans them all.

D6

Widgets begin with the metric

An earlier version of this panel led with chart type: you committed to a bar chart before knowing whether it fit the question. The final panel starts from the metric, breakdown, and comparison; the chart and its name fill in, with a live preview. It suits someone who knows the number they care about.

Before: a bar chart already chosen before the metric.

Before: the chart type chosen first.

After: pick the metric; the chart fills in.

D7

Developers and creatives share one mailer

The mailer exposes an API-ready view (ID, required variables, proof) for developers and an "Edit content" door into the editor for creatives, without forking into two products.

The same mailer: an API-ready view for developers, an Edit-content door for creatives.

The API view for developers, Edit content for creatives.

Results

The same mailer can run end to end: a creative builds it, the dashboards show how it performs, and a developer sends it through the API.

partridgecaro@gmail.com

©2026

partridgecaro@gmail.com

©2026