The situation
Their coordinator exported registrations from Eventbrite, cleaned them up, and pasted them into a colour coded spreadsheet, one tab per event. The exports corrupted data on the way through, so the cleanup was not optional. Hours per event, every event.
The constraint that shaped the build
That spreadsheet was not just a list. It carried her hand edits: cancellations, transfers, payments, the colours that told her where everyone stood. Overwriting those would have been worse than the manual job. So it is append only. Her edits are never touched.
What we built
Registrations sync themselves every four hours, plus a button for when she wants them now. Attendees are pulled, cleaned, deduplicated and filed to the right tab. A welcome email is drafted, never sent, so a human still decides. Misspelt tab names route people to an Unrouted list rather than failing the run.
What we found that they did not know
The welcome email had stalled twice, and the reason was where it lived. The HTML sat inside the spreadsheet, so changing a meeting point meant editing markup. We moved it into the workflow and gave her eleven plain English columns instead. Nobody touches HTML to change what the email says.
The asset nobody was using
Their list turned out to be 1,317 registrations. 921 unique people, 584 with marketing consent, 214 who had booked more than once. A real audience nobody was speaking to, sitting in the spreadsheet the whole time.