The page you just used talks to an Apps Script web app. Registrations land in a Google Sheet, and consent emails go out from a Gmail account. Replies are read back automatically. No servers, no subscriptions. The district and clubs are fictional.
Lab runs use throwaway "lab clubs", never send email, and are deleted after an hour.
Gmail limits
100 emails a day, and opening day needs more
A free Gmail account running Apps Script can email only 100 people a day. Every email goes through an Outbox tab, sent in priority order within the day's quota. Past the limit, emails wait and go out later, with nothing lost and no errors for students.
Reply tracking
Replies matched by Gmail thread, not by guesswork
Each consent email's Gmail thread ID is saved with the registration, so a reply is matched exactly. "Yes" and "No" are read automatically, including "No problem, she can go". Anything with a question or a condition goes to Needs review.
Link scanners
Robots open links. They can't consent.
School and work email systems open every link in a message to check it for threats. If opening the consent link recorded consent, a robot would consent for the parent. Here the link only shows a page. Consent needs a button press and a typed name.
Races & duplicates
One lock, one key per submission
Writes run under Apps Script's LockService, with SpreadsheetApp.flush() before the lock is released. Each submission carries a unique key, so retries return the original result. Club capacity is counted inside the lock.
Real-world mail
Bounces, out-of-office, the wrong sender
A bounced address is flagged so the club can follow up. Out-of-office replies are ignored. A "yes" sent from the student's address, or from an unknown address, never counts as consent. A person checks it. Reminders go out at 3 and 7 days, then the club coordinator is asked to follow up.
For volunteers
Everything is in the Sheet
A Dashboard tab with per-club counts, colour-coded statuses, a full history of every change, and a Contest menu: mark consent received by phone (with a note), resend after fixing an email, send rosters to clubs. Settings are a tab, not code.
club website (DACdb / ClubRunner / WordPress)
└─ one copy-paste snippet ──POST text/plain──▶ Apps Script web app
│ LockService · submission key · seat count
▼
Google Sheet: Registrations · Outbox · Replies · Events · Dashboard
│ ▲
every minute ─▶ send Outbox within Gmail's daily quota │
(thread ID saved) ──▶ parent's inbox │
every minute ─▶ read replies by thread ID ──── yes / no / unclear / bounce
consent page ─▶ GET shows · POST records (button + typed name)