Update — 2026-07-20
20 July 202620 July 2026
Fixed — Resending an event invite now works
- Resending an event invite was failing every time. From the event's invitee list,
"Resend" (and "Resend selected" for a batch) returned a server error and no email went out. This affected every club, on every event, for every invite — there was no combination where it worked, and no error the club could act on.
- The cause was internal: when preparing the reminder, the app looked up whether your club
had set up its own custom "event invited" email, and it asked for that setting using names that no longer matched the database. The lookup failed, and because sending an invite is treated as something that must never half-happen, the whole resend correctly stopped rather than sending a wrong or half-built email. That safety behaviour was right; the lookup underneath it was wrong.
- Both resend and bulk resend now work, and a club that has built its own custom invite
email will now actually get that template used.
- The same faulty lookup was also present when invites are first sent. There it failed
quietly rather than loudly: the invite still went out, but always using the standard wording, so a club that had designed its own invite email never saw it used. That is now corrected too.
- No data was affected and no invite links were changed by this fix. Invites that were sent
successfully before are unaffected, and existing booking links keep working.
Note for the owner
The subject line still comes from the app's standard wording ("Reminder: You're invited to …") even when a custom template is used, because the sender has always taken the subject from the app rather than from the template. Changing that would alter the wording members receive, so it has been left exactly as-is and flagged for your decision rather than bundled into a fix.
Improved — Event invitations now use the template you chose for that event
- When you create or edit an event you can pick an invitation template for it. Until
now the invitation and resend emails ignored that choice and only ever looked for a club-wide "event invited" automation rule — so the template set on the event itself was quietly never used.
- Invitations now follow a clear order: the event's own invitation template first, then
your club-wide "event invited" rule, and finally the standard built-in invitation. The same order is used for first invitations, single resends and bulk resends, so all three now send the same thing.
- If the template chosen on an event has since been archived or deleted, the invitation
quietly falls back to your club-wide rule (or the standard email) instead of failing.
Fixed — Invitations can no longer be sent using an SMS or Telegram template
- An event invitation is an email. If your club had an "event invited" automation set up
for SMS, Telegram or Push only, that template could previously be picked up and sent as an email — producing an email built from message content never written for email.
- Only email-capable templates are now eligible. Templates set to Email, to the legacy
"Email + Telegram" option, or to any combination that includes email, all still work exactly as before. Older rules saved before the channel setting existed are still treated as email, so nothing that worked stops working.
- If more than one club-wide invitation rule is eligible, the most recently updated one is
now chosen consistently, rather than whichever the database happened to return first. Previously the same event could use a different template from one send to the next.
Fixed — "Invites sent" now tells you what actually happened
- Sending invitations always reported "N invites sent successfully", where N was simply
the number of invitations created. It said the same thing whether every email went out, every email failed, or no email was ever attempted.
- Creating an invitation and delivering it are now reported separately, and the message
reflects the real outcome — for example "12 invites created — 10 sent, 2 failed", or "5 invites created" when you chose not to email anyone.
- Emails that are queued for retry are reported as queued rather than sent, and emails
deliberately not delivered (currently a demo club — see the note below on why invitations aren't affected by unsubscribes) are shown as not delivered instead of being counted as successes.
- Members with no email address, and invitations that have already been used, are now
listed as skipped with the reason, rather than silently disappearing from the count.
- Invitation links are never thrown away because an email failed. The booking link is
still valid and you can simply resend it.
Fixed — Resending to a blocked address no longer breaks the member's existing link
- When you resend an invitation and the system deliberately declines to send —
currently a demo club — it was treating that as a successful send.
- For an invitation that had already been used, that had a real consequence: the member's
existing, working booking link was replaced with a new one, and the email carrying the new link never went anywhere. The member was left holding a link that no longer worked, with no way to be told.
- The old link is now left completely untouched unless a replacement email was genuinely
sent or durably queued for delivery. The resend reports honestly that nothing was delivered, and bulk resend counts that member as skipped rather than resent.
Fixed — Results are no longer shown in green when the emails failed
- Invitation results were always presented as a success, whatever happened. Even after the
wording was made accurate, "12 invites created — 12 failed" was still shown in a green success banner and a success notification.
- Results are now styled to match the outcome: green only when every email was sent or
durably queued, amber when some were skipped, blocked or failed, and red when nothing was delivered at all. Anything that isn't a clean success now also stays on screen longer so it can be read.
Fixed — Two more places now report what actually happened
- Re-inviting a member whose booking was cancelled previously said "Re-invited <name>"
purely because the invitation had been created — it said the same thing when no email went out. It now reports the real outcome, and only says "Re-invited" when an email was genuinely sent or queued.
- Inviting members from the assessment screen ignored the delivery result entirely.
It now reports the same honest outcome as everywhere else.
Improved — You're now told when an invitation template needs attention
- If the template chosen for an event (or your club-wide invitation automation) can't be
used — it's been archived, deleted, or isn't set up for email — the invitation still goes out using the standard wording, but you're now told, so a silent fallback doesn't go unnoticed for months.
- You're also told when more than one club-wide invitation automation is switched on, since
only one can be used.
- These notices explain what to check and never expose template contents or anything
belonging to another club.
Under the hood
- A database error while loading members could previously be reported as "no email
address" for everyone in the batch — an outage disguised as a data problem. Read failures while loading the event, the club or the members now stop the request cleanly instead of producing a misleading result.
- A missing event and an event belonging to another club remain indistinguishable, so
nothing can be learned by probing.
Fixed — "Request a new booking link" no longer breaks a member's existing link
- The booking page lets a member request a fresh link if theirs has already been used.
Where the system deliberately doesn't send — currently a demo club — it correctly declined, but still replaced their existing link. The member was left holding a link that no longer worked, on the one screen where there's no staff member to ask.
- The existing link is now left completely untouched unless the replacement email was
genuinely sent or durably queued. The member is told simply that we couldn't send a new link and to contact their club.
- That message is deliberately identical for every reason a new link couldn't be sent, so
the page can't be used to work out anything about a member's email address or about what another request happened to be doing at the same moment.
Fixed — "Resent 0 invites" is no longer shown as a success
- Bulk resend and bulk revoke reported through a green success notification whatever
happened, so "Resent 0 invites · 12 skipped" — where nothing at all was resent — still looked like a success.
- Bulk results are now coloured by what actually happened: green only when every row
completed, amber when some were skipped, and red when none completed. The compact summary of skip reasons is unchanged.
Improved — Template problems now show wherever you resend
- The invitation, resend and bulk-resend screens all report when a configured template
couldn't be used, so the notice reaches you wherever you happen to be working — the event page, the calendar panel, and the grading booking screen.
- On the grading screen the notice now persists while the list refreshes, instead of
disappearing before it could be read, and repeated resends no longer stack the same notice over and over.
- These notices sit apart from the delivery result: a template notice never turns a
failed send green, and a successful send is never reported as a problem.
Fixed — Two people regenerating the same invite can no longer break the link
- If the same invitation was regenerated twice at nearly the same moment — a member
clicking "request a new link" while a staff member resends, or two quick clicks — both emails went out and only one of the two links could work. The member could easily be looking at the dead one, and nothing in the system knew.
- Replacing an invitation link and creating its replacement email now happen as a single
all-or-nothing step. The first request wins and its link is the live one; the second is told the invitation was just regenerated elsewhere, and sends nothing.
- If the system loses power at exactly the wrong moment, the replacement email is already
recorded and still goes out — the link that was promised is the link that works.
- A request that is refused — because another one won, or the club is in demo mode
— leaves the existing link completely untouched, rather than quietly reporting success while changing nothing.
- If a connection drops at the exact moment the change is being made, we can no longer be
certain either way. Staff are now told plainly that the result couldn't be confirmed and to check the member's invitation, instead of being reassured that nothing changed — which might not be true.
- When two people regenerate at once, the one who loses is now told that **another
regeneration completed first** and not to rely on the previous link. It no longer says the member's existing link is unchanged, because when someone else has just replaced it, that was the opposite of the truth.
What "sent" does and doesn't mean
- Invitation emails are transactional, not marketing. They are deliberately not governed
by the unsubscribe and bounce suppression list that applies to bulk club-wide messages — a member who has unsubscribed from newsletters still receives the invitation they need in order to book.
- The one case where the system deliberately doesn't send is a demo club, and that is
decided before anything is changed, so nothing is altered and nothing is claimed.
- "Sent" means the email was accepted by our provider, or safely queued to be delivered.
Neither is a guarantee it reaches an inbox — a mailbox can still bounce it or file it as spam. Where we can't confirm delivery, we now say so rather than implying success.
Fixed — Demo clubs no longer claim an email was sent
- On a demo club, "request a new booking link" replied as though a new link had been
emailed. Demo clubs deliberately don't send email, so nothing had been.
- Demo stays exactly as read-only as before, but now says honestly that a new link
couldn't be sent.
Improved — Warnings and partial results now have their own amber
- Notifications previously had only green, blue and red. A result that was neither a clean
success nor an outright failure — "8 resent, 2 skipped" — had to borrow one of those, and both misrepresent it.
- There's now a proper amber warning style, so a partial result looks like a partial
result.
Correction to an earlier note
- Earlier notes said a template problem meant "the standard invitation was used". That was
inaccurate in two ways: when an event's template can't be used the system falls back to your club-wide template rather than the standard one, and a template being chosen says nothing about whether the email then arrived.
- Template notices now describe only which template was selected, and never claim an
email was sent. Whether it was delivered is reported separately, by the delivery counts.
Fixed — A booking and a link-regeneration can no longer race each other
- Until now, "does this member already have a booking?" was checked just *before* an
invitation link was regenerated or revoked — so a booking created in that same instant could slip through, leaving an invitation re-opened for a member who had just booked.
- Regenerating and revoking now make that decision *while holding the same per-event lock
the booking system itself uses*, so the two can genuinely no longer interleave: whichever starts first finishes first, and the other sees the result.
- Staff "add booking" and the register's walk-in bookings now take that same lock too. Staff
can still deliberately book over capacity — that behaviour is unchanged — it simply happens under the lock now.
- Re-adding a member whose booking was cancelled is refused exactly as before; a cancelled
booking is never silently brought back by re-adding.
For the owner — new database steps
Three new proposed migrations accompany this (regeneration v2, atomic revoke, locked booking creation), plus one closing cancelled-booking resurrection in grading. Apply them before deploying the app build that uses them — the app fails safe (a clear error, no fallback to the old behaviour) if they are missing. Details in the release checklist.
Fixed — The attendance monitor no longer cries wolf
- Since the 16 July attendance system upgrade, the behind-the-scenes monitor that
checks attendance bookkeeping reported failure on every run — not because anything was failing, but because it counted the club's pre-upgrade historical records (which are simply awaiting a one-off review) as if they were live errors. A permanently-red monitor is worse than none: a real problem would have been invisible inside the noise.
- The monitor now tells those two stories apart. Historical records show as an
amber "historical review outstanding" note with the exact counts, while the red alert is reserved for things that are genuinely wrong right now — and it also now confirms on every run that the old writing path is still switched off.
- Nothing about attendance itself changed: registers, entitlements and the pending
review of historical records are exactly as they were. This is the monitor telling the truth, plus a prepared, read-only review pack so the historical tidy-up can be done deliberately rather than under a false alarm.
Improved — Invoice & VAT settings now have their own home
- The club's invoice details (supplier name and address, VAT registration, VAT
rate, and whether prices include or exclude VAT) used to live inside Settings → "Your Plan" — the page about your Allsorted subscription, where nobody thought to look. They now have their own tab: Settings → Payments → Invoices & VAT.
- The page now says plainly whether the club is ready to issue invoices, and if
not, exactly which details are missing — in plain words, not database names.
- Turning VAT on now asks for everything invoices legally need (VAT number and an
explicit inclusive/exclusive choice, with a worked £10 example showing the difference). Turning VAT off requires none of it. These checks are also enforced server-side, so no route into the settings can save a half-configured VAT state.
- VAT invoicing currently supports GBP only, and the settings now say so rather
than finding out at enrolment time: a club billing in another currency sees a clear note, can't switch VAT on, and the readiness summary lists the currency requirement alongside everything else. Previously the page could say "Ready to issue invoices" for a setup that every enrolment payment would then refuse.
Fixed — Enrolment no longer hangs at the payment step
- When a club's invoice details were incomplete, a parent completing an enrolment
invite reached the payment step and the page sat on "Preparing payment..." forever, with no message and no way forward. No payment was being taken, but the page never said so.
- The page now stops, explains calmly that the club's payment setup isn't finished,
confirms no payment has been taken, and offers a Try Again button. Every kind of failure at that step now exits the spinner — including network drops.
- Staff now find out before a parent does: the Trials & Enrolments page shows
a warning when the club isn't ready to issue invoices, linking straight to the new Invoices & VAT tab to finish setup.