Sign-ups for a student club event: what we built and what broke
For CARNOT’s events we built our own sign-up flow: a form, a Google Sheet, a confirmation email with a ticket. One week the sheet quietly stopped receiving sign-ups, while every attendee still got a confirmation. Here is the setup, what broke, how we got everyone back, and what we changed so it cannot happen silently again.
The setup
The form sits on the event page. Each sign-up is sent to a small Google Apps Script web app, which adds a row to a Google Sheet, with one tab per event.
The attendee gets a confirmation email with a ticket they can add to Apple or Google Wallet. At the door, the ticket is scanned to check them in.
We chose a Sheet on purpose. Every organiser already knows how to filter, sort and share one, and there is no admin panel to build or maintain.
What broke
Apps Script gives every new deployment of a script its own URL. We had redeployed the script, and the site was still sending sign-ups to an older deployment. The rows never reached the spreadsheet we were looking at.
From the attendee’s side nothing was wrong: the form said thanks and the confirmation email arrived. From ours, the sheet just was not growing. That is what made it dangerous. Nothing failed loudly.
Testing made it more confusing. Signing up twice with the same email updates one row instead of adding a second, by design. So a quick test with your own address looks like the form is broken even when it works.
Getting everyone back
Every confirmation email had gone out through our email provider, and it keeps a log of what it sent. We rebuilt the full attendee list from that log, compared it with the sheet, and re-added everyone who was missing.
Afterwards we added the attendee’s year of study to the confirmation email, so the list can be rebuilt in full from sent emails alone, with nothing lost.
Three safeguards we added
A failure alert. If the sheet refuses a sign-up for any reason, the whole sign-up is emailed to the organisers. No registration can exist only in a log.
Ask the script where it writes. A check command asks the live script which spreadsheet and which tab it is writing to. We run it before an event, not after.
Test with different addresses. Since the same email updates one row, every test sign-up needs its own address, or you will think the form is broken.
If you run sign-ups for a club
After every change to the script, make one real sign-up and find its row. Keep a second copy of every registration somewhere other than the sheet. And a week before the event, confirm where the form actually writes. The failure we had is invisible from both sides until someone counts.