- Before
- Click Register, then pick your race again
- Two sites that didn’t know about each other
- After
- From race card to bib pick-up in one journey
- Runners fix their own details
The race
If you organise a race, you know the week registration opens. People click “Register” on your website and land somewhere that looks nothing like it. They pick their race again, from a dropdown. The ticket arrives as a PDF. And somebody updates “places left” by hand. That was this festival.
It is a running festival with several races, from a short course to a long one, plus a kids’ race, organised by a running club. Two websites carry it: the event site, where people decide, and the ticket site, where they sign up and pay. Both work in two languages.
Two journeys
We walked both journeys from the first click to race morning. Here they are side by side.
Before
- 01The event site has six Register buttons. They all open the same ticket page, and the one in the menu still points at last year’s race.
- 02The ticket shop looks like a different website, with no way back to the event.
- 03Pick your race again, from a dropdown. The kids’ race lives on a separate page.
- 04A quantity box for more runners, as long as they all run the same race.
- 05A long generic checkout, partly in English only, then a PDF ticket.
- 06After paying, nothing can be changed by the runner.
After
- 01Every race card has its own Register button. The checkout opens with that race already picked, in the language you were reading.
- 02Same look, same header, same live numbers. Places left and who’s running match on both sites.
- 03Up to five runners in one registration, in any mix of races, kids included.
- 04Four steps: race, runner, give, review and pay. Made for a phone.
- 05A branded email in the runner’s language, with a QR code for bib pick-up.
- 06A private link to fix details, change a T-shirt size or hand the place to someone else.
Keeping two sites in sync
The event site and the ticket site stay separate WordPress installs. What changed is that they now behave like one.
- One theme and one core plugin on both. The logo, colours, rules and footer are edited once on the event site and copied to the ticket site.
- The ticket site publishes a small public feed: places left, runner and country counts, and the public runners list. The event site reads it, so every race card shows live places left and a “Who’s running” list that keeps itself up to date.
- Links carry the context across. A race card links to the checkout with that race picked; a page in the second language links to the checkout in the second language.
- One custom registration plugin replaced the events add-on, the PDF tickets, the attendee-field plugins, the translation plugin and the snippets. Fewer plugins, less to break, less to update.
Everything is editable in wp-admin with both languages side by side: every interface text, every email and the official rules. And the first screen of each site is complete on the first paint, with the hero image picked on the server and fonts and map styles that never block the page.
After the payment
Most registration systems go quiet once the money arrives. This is where the runner’s second journey starts.
- Branded emails in the runner’s language: the festival’s look, a card per runner with race and start time, and the QR code for bib pick-up. Runners with their own email address get their own confirmation, not just the person who paid.
- “My registration”: a private link in that email. No account, no password. Runners fix a typo, change their T-shirt size or update any detail except the consents they already gave. Lost the email? Type your address and the links arrive again.
- Can’t make it? Adults can hand their place to someone else until a cut-off the organisers set. The new runner gets their own link and accepts the rules themselves.
- Sold out? The race card turns into “Join the waitlist”, and organisers email everyone on it when places open.
The bib number stays hidden until pick-up, because numbers can change. A typo is no longer an email to the organisers.
Race morning
Check-in reads from the same registrations, live. The check-in team logs in with a role of its own that can do exactly one thing.
- Scan the QR in the runner’s email or search by name, bib or email. The screen shows the bib, the T-shirt and anything else in the order.
- One list of everyone, with filters for not picked up, picked up and not paid, and counters per race.
- Every handover records who gave out the bib and when. A wrong tap has an undo.
- A registration that isn’t paid says so in plain words: don’t hand over the bib, send the runner to the info desk.
- A printable list as an offline backup, in case the internet fails at the start area.
A runner who scans their own code only sees a short note. Organisers also get exports for the timing company and for T-shirt sizes, low-places alerts, an email preview screen and a go-live checklist inside wp-admin.
Security and privacy
- Cloudflare Turnstile on registration, the newsletter and, optionally, the login. Invisible for people, in the way for bots.
- No usernames exposed, XML-RPC off, and security headers (nosniff, frame protection, referrer and permissions policy, HSTS).
- Every admin action checks permissions and a one-time security token. Private links and pick-up codes are signed, so they cannot be guessed. Lookups and sign-ups are rate-limited.
- Children appear in public lists as a first name and an initial, and adults can hide their name. The public feed carries no emails, phone numbers or birth dates.
- A code review of all three codebases before launch.
None of this is visible to a runner. That is the point.
Results
It is early, and we don’t publish numbers we don’t have yet. What is true today:
- One journey from race card to bib pick-up, across two sites, in two languages.
- Runners change their own details without writing to the organisers.
- Places left and the runners list update on both sites by themselves.
- The events add-on, the PDF tickets, the attendee-field plugins, the translation plugin and the snippets are gone. One plugin does their work.
Registrations, phone sign-ups, time to register, speed scores and donations raised come after the first season, measured rather than guessed.
What’s next
First, the numbers above. Then the quiet part of the job: watching how runners and the check-in team use it on the day, and making next year’s registration a little more boring than this one.