The problem
The expo had already moved its vendors, raffles, and check-in into a custom platform — but communication was still manual. When a vendor applied, someone had to notice and reply. When a raffle winner was drawn, someone had to find their email and write the claim message. RSVP follow-ups and shipping-address chases were a person remembering to do them. There was no campaign tool for an event-wide announcement, no way to see what an email would actually look like before sending it to a few hundred people, and no log of what had gone out.
For a show with hundreds of vendors and attendees, "remember to send the email" is not a system — it's a liability that scales linearly with the guest list.
The approach
We built the communication layer directly into the existing platform, sharing its auth, data model, and Resend integration.
Campaign composer with a live preview. Admins write a campaign against the event's segmented audience and see exactly what recipients will get — the preview renders in a sandboxed iframe using the same merge-variable engine the dispatcher uses, so "what you see" is literally "what sends." No more guessing whether a template will render.
Transactional lifecycle, fully automated. Raffle-winner claim and decline notices, vendor-application confirmations, RSVP and contact-form notifications, and shipping-address reminders all fire from the events that trigger them — no human in the loop. A Vercel Cron job runs every 30 minutes to chase accepted winners who still owe a shipping address, sending exactly one reminder once the grace window passes.
Reporting that doesn't lie. Campaign stats (unique opens, clicks, sends) surface in an admin report with the rendered email content attached, so the coordinator can see both the numbers and the exact message they describe.
Stack: Next.js App Router with React Server Components for the admin surfaces, Neon Postgres for campaign and audience state, Resend for delivery, and Vercel Cron for the time-driven reminders — all inside the same codebase as the vendor and raffle platform.
The outcome
The coordinator stopped being the mail merge. Vendor and winner emails now send themselves the moment the underlying event happens, campaign blasts get previewed before they reach a single inbox, and every send is logged against the contact it went to. The communication layer that used to be a person's memory is now part of the platform.
This is the same discipline behind everything EMB ships: take the work a person does from memory, and turn it into a system that does it the same way every time.
An in-house CRM with a campaign composer, a live email preview, and an event-segmented send — plus a transactional layer that fires winner, reminder, and notification emails automatically across the attendee and vendor lifecycle. Nobody copy-pastes a vendor email anymore.