The problem
The show ran on a stack of disconnected artifacts: a Google Sheet that was the canonical booth roster, a Dropbox folder of floor-plan PDFs, a Google Form for vendor intake, and a charity raffle administered by hand — winners drawn from a list, contacted one at a time, prizes tracked in someone's head. On event day, attendance and badge check-in were a clipboard.
Every booth was a manual placement; every tier rule (corner premiums, traffic-zone tiers, exhibitor-class restrictions) was applied by judgment. When the show grew past 200 vendors, the coordinator was working 60-hour weeks for two months ahead of each show, and a single missed booth swap or an un-closed raffle could cascade into a dozen phone calls.
The approach
We replaced the artifacts with one authoritative system, built in deliberate layers over several months.
Self-serve vendor portal. Email-only magic-link auth — vendors don't want passwords and the coordinator doesn't want to manage accounts. Vendors handle their own packet uploads, contact details, and documents.
Interactive SVG venue map. The floor plan renders from the same booth records that drive the database. Hovering a booth shows its tier, status, and assigned vendor; tier-match rules are enforced in code at assignment time and flag conflicts immediately instead of three weeks later.
Raffle engine. Winners are drawn against eligibility predicates (no prior win, decline-aware re-pooling, ship-vs-pickup fulfillment rules) instead of by hand. A Vercel Cron job closes each raffle at its deadline — zeroing the Shopify ticket inventory, drafting the product so sales actually stop, and alerting the coordinator if anything is misconfigured. A public proceeds endpoint feeds a live "dollars raised" section straight onto the storefront.
Event-day check-in. QR scanning ties attendance back to the same data model, so the operator dashboard reflects who's actually on the floor.
Stack: Next.js App Router for the operator and vendor surfaces, Neon Postgres + Drizzle for canonical state, magic-link auth via signed tokens, the Shopify Admin API for ticket inventory, Vercel Cron for the time-driven automations, and Resend for delivery.
The outcome
The first show after launch was the coordinator's first under-40-hour week in years. Vendors handle 100% of their own onboarding; raffles draw and close themselves on schedule, with Shopify ticket sales stopping the moment a raffle ends instead of an hour later; and the week-of-show changelog that used to live in the coordinator's head now lives in an audit trail.
The coordinator's paraphrased quote was "I forgot what it felt like to not be the system."
A single operations platform: self-serve vendor portal with an interactive venue map, a raffle engine that draws winners and closes ticket sales on Shopify automatically, and QR check-in. The coordinator stops being the system the show runs on.