RRiverbend District · Youth Speech Contest How it's built

2027 season · grades 9–12

Five minutes.
One stage. Your voice.

Register for the Youth Speech Contest and compete at one of 60 host clubs across the district. Club winners advance to the district final.

Register now
  1. 01

    Register

    Two minutes. Pick the club where you want to compete.

  2. 02

    Parent says yes

    We email your parent or guardian. They just reply YES.

  3. 03

    Take the stage

    Your club contacts you with your speaking time.

Register

You're entered once your parent or guardian gives consent.

All fields are required unless marked optional.

About you

Grade

Where you’ll compete

    Type a club or town name.

    Parent or guardian

    We’ll email them to ask for consent. You’re only entered once they say yes.

    Takes about a minute.

    You’re registered

    Last step: ask to check their email and reply YES.

    1. ✓
      Registration received
    2. 2
      Consent email to your parent or guardianSending within a minute…

    Latest registrations

    Live from the sheet
    StudentClubStatusUpdatedRef
    Loading…

    Names are shortened and emails are never shown publicly. Organisers see the full details in the Google Sheet.

    Behind the scenes · for the organisers

    A working demo, built on Google's free tools only

    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.

    Try the whole loop in two minutes
    1. Register a test student above, and put your own email as the parent's.
    2. Open the consent email and reply "yes". Or reply "can you call me?" to see how an unclear answer is handled.
    3. Watch the row in Latest registrations (and the confirmation screen) change to Consent received. This takes about a minute: the script checks the inbox every minute.

    Double-submit test

    Phones double-tap and bad connections retry. This sends the same registration three times at once. There should be exactly one registration; the other two get back the original.

    Ready.

    Last-seat race

    Eight students try to take a club's last three seats at the same moment. The sheet must end up with exactly three, not four or five.

    Ready.

    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)