Worked productMarketing · a marketing automation desk

Sending is arithmetic, not a dashboard.

Twelve destinations over one fixture: journeys that run continuously, broadcasts that wait on an approver, the audiences both send to, and whether any of it arrives. Looking at it should settle whether generated figures can be made to reconcile across thirty-five screens.

Preview interactive design
The operatorLifecycle marketing leadadmin, not the owner
The clockThirty daysall the send history kept
StatusFour fields, sixteen valuesstored only, tones reasoned
The dataOne fixture, no second copyevery screen reads it
The only screen that adds the two sources together · 17,153 delivered over thirty days — 6,818 from journeys running continuously, 10,335 from five one-off sendsthe screen the day starts on
The screensTwelve destinations, three groups

Each screen owes the one before it an answer.

Thirty-seven registered routes: twelve destinations in the sidebar across three groups, nineteen off it, six for auth. Activity has no list screen — it is one feed reached from the inbox, the overview and every profile, and a thirteenth destination would push a nav group past what it can hold.

02The status set →
Screen 01

Where journey sending and broadcast sending are added up

The headline claims one delivered figure for the whole workspace, so it owes the reader both halves. The day chart is that same series plotted, and the four queues below are the predicates the sidebar badges count. It averages nothing across the two sources.

  • 3,176 over seven days — 1,731 journeys, 1,445 broadcasts, 54.5% of it continuous
  • Straight bars, because days are being compared against each other
  • The period offers 7, 14 and 30, because the log holds thirty days
/overview · chart-led
Screen 02

A journey’s ladder, and where people are standing on it

The arithmetic closes on every step — entered on one is what continued from the one above it, and each meter’s track is that step’s own entered, so the unfilled tail is whoever is still standing there. Enrolment is the sum of those tails and nothing else.

  • 962 entered the first step, 869 reached the end — 90.3% of them
  • Nobody is enrolled now, because the trigger stopped matching on 14 Aug
  • 22 delivery failures, 9 of them on one step, 0.8% of every attempt
/journeys/:idrecord · list-detail
Screen 03

Approvals, split by who is being waited on

Three queues out of one predicate: waiting on you, submitted by you, waiting on somebody else. The middle queue is where the operator is the one holding things up, and nothing is disabled to avoid deciding — a send you submitted yourself carries the reason instead.

  • Two broadcasts in review, one of them approvable by this viewer
  • “Yours cannot be approved by you” — the other carries who it waits on
  • One sends in 30 hours, to 1,284 people, and 1 of 1 counts as urgent
/approvalsqueue · gated
Screen 04

A send report drawn as the funnel it is

Attempted, delivered, opened, clicked — each bar measured against the top of the funnel, so the shape is the funnel, while each row also states its own rate against the row above it. A send still running reports what it has handed off, never a projection.

  • 1,276 attempted, 1,251 delivered, 514 opened, 148 clicked
  • Every bar against the 1,276; every rate against the line above it
  • 11.8% clicked of delivered, and 28.8% of opened — both stated, neither mixed
/broadcasts/:idrecord · reconciliation
Screen 05

Three checks, across three domains

A grid question gets a grid: SPF, DKIM and DMARC for each sending domain, and a domain counts as authenticated only when all three pass. Underneath, the failure figure decomposed by source — and the screen refuses to scope itself to a period, saying why in the lede.

  • 833 against 37,650 attempts — 2.2%, over the one 2.0% threshold
  • One domain of three passes all three checks; the root has failed DKIM for nine days
  • The broadcast that died mid-send went out from that domain — 268 attempted, 106 delivered
/deliverabilitymatrix · read-only
StatusA closed set with defined transitions

Six values, and the two everybody expects are missing.

Broadcast status is where a one-off send sits between written and delivered, grouped by who it is waiting on. Overdue review and partially delivered are not in it — both are computed at render from the record and the clock, and storing either would let a value disagree with the arithmetic.

03The awkward cases →
draftin_reviewscheduledsendingsentfailed
Six values, two of them terminal. Draft is deliberately neutral: nobody is waiting on it but its author, so it earns no tone that would put it in a queue. Across the product, four status fields and sixteen values, each carrying the reason for its tone and at least one fixture — except a stopped journey, reachable only by taking the transition, because nothing ships stopped.
The dataThree fixtures that break a screen

The cases a generated product gets wrong.

All three are real records in the fixture rather than hypotheticals.

04The audit →
Case 01A send that is still going out
Naively143 sent against 88 delivered, so 55 messages are booked as failures and the deliverability rate moves — on a send that has not finished.
HereA partial send has to be settled first. Messages in flight are pending, not failed, so the send never enters the failure table at an invented rate and the 2.2% does not move when it lands.
Case 02A review the operator cannot do herself
NaivelyThe badge counts both broadcasts in review, and the approve button renders live on the one she submitted — or greyed out with nothing said.
HereOne of them was submitted by the viewer, so the badge reads 1 and that row carries no button at all — “yours cannot be approved by you”, with the person it is waiting on shown beside it.
Case 03A draft journey that cannot be published
NaivelyPublish is live, and the journey goes out with an email step pointing at a template that has no subject line.
HereOne question, one answer: the publish gate and the step editor’s problem list read the same function, so the button is disabled and names the template that is not ready.
The auditWhat the pass found

Walked against the rows, and they close.

Every derived figure was checked against the array under it and none disagreed: 26,861 journey attempts and 10,789 broadcast sends make the 37,650 the failure rate is drawn from, every journey step sums to the number that entered it, and the approval rule resolves the same way in all four places that read it.

05Back to the top →
Two of the six can approve a send · never their own, which is why the queue badge reads 1 and not 2 — the rule is set here, and read in three other placescheckable

Reckon

The shell is reusable.
The arithmetic is not.

Twelve destinations, thirty-five routes and four status fields are the easy half. What takes the time is the figure that has to agree with the rows under it on every screen that quotes it.

Built for Claude Design · plain markdown · nothing to run