What's new
Club Stripe payments now stay in the club's account
- Allsorted subscription billing and club/member payments now have separate
Stripe configuration. Charges paid by parents or members are created directly in the club's connected Standard Stripe account; Allsorted takes no transaction fee and is not the merchant in the club-money flow.
- Clubs can link an existing Standard Stripe account or create their own
Standard account through Stripe-hosted onboarding. Existing legacy Express connections remain readable, but new onboarding no longer creates Express accounts.
- Browser confirmation, webhooks, refunds, reconciliation and expiry processing
all use the same connected-account identity. Connected webhook events are rejected unless the Stripe account and club metadata agree.
- In-flight and historical destination charges remain confirmable/refundable
through a strict compatibility path that verifies both the original transfer destination and club metadata. No new destination charges are created.
- Deployment needs the Connect secret/publishable key and connected-account
webhook configured before code goes live. No database migration is required.
Local six-area critical-journey assurance
- Added a complete provider-free lead journey for the local Vertical Test Club:
public trial booking, closure-aware dates, attended/no-show outcomes, staff follow-up, existing-family enrolment, one-time portal activation and a conversion that appears exactly once in the pipeline, reports and automation effect ledger.
- Trial-converted members can now be permanently erased without deleting the
immutable conversion operation. The nullable member identity is released by the database while the exactly-once status evidence remains intact.
- Added a provider-free member-lifecycle journey covering public enrolment,
family portal switching, membership and classes, default absence, promotion, insurance, leaver/reactivation and permanent erasure.
- Added one local-only
npm run smoke:critical-journeys command for the seeded
Vertical Test Club. It covers reversible critical writes, cross-feature data agreement, tenant/RBAC boundaries, desktop/mobile accessibility, warm-route readiness and mocked provider/background failure contracts without sending messages or collecting payments.
- The pack reuses one clearly labelled, idempotent assurance member/household
fixture and creates only temporary foreign-tenant/role fixtures for isolation checks. It refuses hosted targets and the wrong local ports.
- Shared dialogs now move focus inside after their portalled animation shell is
mounted and restore focus to the opener after Escape/close.
- Register and Settings navigation now matches the same base-role authority as
their routes, and live-register pulse decoration respects reduced-motion.
Email opt-outs can be inspected from Communications
- The recipient readiness summary already showed how many contacts were
unsubscribed from bulk email, but the nearby opt-out filter applied only to SMS. Communications now has separate, clearly labelled email and SMS reachability filters.
- Choosing Email → Unsubscribed returns the same contacts counted in the
email readiness summary. Older saved recipient audiences remain compatible and continue to behave as though no email-reachability filter was selected.
Event member search understands full names
- The staff Add booking picker now matches multi-word names such as
“Chris Wood”, as well as partial names, email addresses and reversed name order. Previously the whole query was compared separately with the first and last name, so a full name could return no results even when either name alone worked.
Event invitation feedback is less intrusive
- Sending invitations from the calendar event panel now reports created,
queued, sent and failed outcomes in the shared floating toast instead of leaving a result banner inside the event workspace. Partial and failed sends retain their warning or error styling.
Action feedback is clearer and more consistent
- Short-lived confirmations now use the same floating toast across
Communications, automations, scheduled reports, member and household tools, the register, portal actions, settings, billing and provider-return screens. Confirmed success is green, neutral updates are blue, partial outcomes are amber and failures are red.
- Messages that still need a decision or correction remain beside the affected
content. Validation errors, retry instructions, invitation delivery concerns, import results, booking conflicts and payment-provider recovery guidance are never hidden in a disappearing notification.
- Stripe, GoCardless and subscription callback results are consumed once, so
refreshing or revisiting a copied callback URL cannot repeat an old success message. Provider failures and expired-link guidance remain visible until the owner acts on them.
Event booking details and printable registers
- Requirement completion on the event roster now says Complete rather than
the ambiguous Pass, and has a visible View details action. The same panel shows the booking timeline and recorded requirement answers directly, without making staff navigate through invitation history.
- Date answers captured as ISO values are displayed in UK
DD/MM/YYYY format.
The immutable stored answer is not changed.
- The Bookings toolbar now includes an Event register PDF. It lists every
confirmed member with their payment state, attendance/result, key roster details and the answers captured when their booking was made. Large event rosters are paged completely rather than silently stopping at a database response limit.
Slow pages now recover instead of loading forever
- Scheduled status changes, arrears, the enrolment pipeline, calendar trials
and the course workspace now stop a stalled read and show a clear Retry action instead of leaving staff on an indefinite loading state.
- Moving away from one of these screens cancels its active request, and a newer
filter or retry cannot be overwritten by an older response.
- Calendar trials now receives invite status from the authenticated,
club-scoped server snapshot instead of a second browser database read.
External-event payment setup now fails safely
- Viewing an external event no longer initialises Stripe with a missing browser
key. Paid entry journeys now explain that payment is temporarily unavailable and stop before creating an entry or invoice; free entries remain available.
- Communications and event rich-text editors now register their hardened link
extension once, removing the duplicate-extension warning while retaining the existing safe-protocol and new-tab protections.
Browser-smoke usability repairs
- Event, task and grading-session editors now use the shared accessible modal,
including Escape dismissal, focus handling and a named close control.
- Member search, register warnings and date controls now expose clearer names
to assistive technology. Household filter rows show truthful overflow cues, and staff leave dates use the club's familiar UK date format.
- Automation builders now treat the loaded definition as the saved baseline,
so opening an untouched automation no longer produces a false unsaved warning.
System-wide smoke findings repaired
- Gymnastics and the assessment matrix now load member and assessment data from
guarded, club-scoped server snapshots. Apparatus result writes also validate the member's active programme enrolment before saving.
- Student Videos, Payment Options and Deliverability now distinguish a failed
read from an empty result, stop stalled requests and offer a visible retry.
- Bulk Voice Note rejection preserves failed selections and reports exact
success, partial and failed outcomes instead of silently clearing the queue.
- Team Sports now uses the same headings, cards, buttons, fields and guarded
confirmation dialogs as the rest of the staff app.
- The register Health sheet and Communications History now use accessible modal
behaviour. Health acknowledgements are recorded through a permission-checked server route rather than a browser database write.
- Add Member now keeps its current step and save context visible and warns before
abandoning entered details. Staff Leave saves use the shared toast feedback.
- Browser payment clients are created only when a publishable key is configured,
preventing unrelated read-only pages from throwing a provider error locally.