Version History

Release history and change log for the Ascot United FC Membership Platform.

v11.8.24 Current

Fix mobile photo upload + staff "Edit details" crash

17 Jun 2026
Registration photo uploads now work reliably on phones: when a parent picks a photo it is resized and re-encoded in the browser before upload, which fixes the "Your file couldn't be accessed / ERR_UPLOAD_FILE_CHANGED" error on Android and makes large photos upload much faster (documents/PDFs are left as-is). Also fixed a 500 error when a staff/volunteer account opened their own "Edit details" page (they are now treated as a normal user for their own family).
Released by Dan Birchmore
v11.8.23

Clearer failed-payment page + bulk add recipients

17 Jun 2026
When a card payment isn't completed (e.g. the bank's 3-D Secure check fails), the parent now sees a clear "payment not completed — try again" page with a retry button, instead of a blank confirmation. And when composing an email or SMS, staff can now paste a whole list of addresses (separated by commas, spaces or new lines) and add them all at once, rather than one at a time.
Released by Dan Birchmore
v11.8.22

Pay-by-instalment links, dropped-signup report, fixes

16 Jun 2026
The emailed/durable payment link now lets parents choose Pay in full or Pay monthly (it was full-only), so anyone who didn't complete an instalment sign-up can retry straight from the email. New Admin > Registrations > "Incomplete instalments" report lists parents who started a monthly plan but never completed the first payment (e.g. a failed 3-D Secure check), with one-click resend. Fixed: message threads could fail to save when the preview text was long (column widened); and payment summaries now show a readable description instead of raw JSON.
Released by Dan Birchmore
v11.8.21

Configurable registration alert recipients by age group

16 Jun 2026
New-registration alerts ("New Registration Requires Action") are now fully configurable per age group: in Set Up > Registration Alerts you choose exactly who is notified for each age group (any number of staff members and/or external email addresses). If an age group has no recipients configured, the alert falls back to the Registrations distribution-group mailbox, and finally to admins as a last resort, so a registration is never missed.
Released by Dan Birchmore
v11.8.19

Message camp parents (email & SMS)

15 Jun 2026
Staff can message the parents booked on a soccer camp directly from the Camps area — separate from the member mailbox. Choose the whole camp, a particular day, paid/owing only, or hand-pick parents, then send an email or SMS with {ParentName}/{ChildName}/{CampName} merge fields. Email replies come back to the sending staff member's mailbox. Every send is logged per camp.
Released by Dan Birchmore
v11.8.20

Camp messages: attachments & SMS replies

15 Jun 2026
Builds on the camp "Message parents" tool. Staff can now attach files to a camp email (PDF, images, Word, Excel or CSV — up to 10 MB), shown in the message history with download links. Camp text messages are now sent two-way by default so parents can reply — replies arrive in the existing SMS inbox (Communications > SMS); a toggle still allows a one-way branded send.
Released by Dan Birchmore
v11.8.18

Stability: permission fix, faster reads, alert fallback

15 Jun 2026
Three fixes from a log review. (1) Granting/removing a permission with no scope no longer errors. (2) Dashboard, Registrations and member pages no longer time out under load: the SQL command timeout was raised to 60s and indexes were added on Members and PaymentItems. (3) New-registration and allocation alert emails fall back to admins when no Age Group Coordinator / Secretary is assigned.
Released by Dan Birchmore
v11.8.17

Fix broadcast emails stuck on Pending

15 Jun 2026
NO SCHEMA CHANGES. Fixes a bug where sending a broadcast email from a mailbox (reply-tracking on) with a body longer than 200 characters failed to save: the conversation preview was 201 characters but the column holds 200, so the save threw and the message was left showing Pending even though the email had already gone out. The preview is now capped to fit, and a thread-tracking failure can no longer poison the broadcast's status save. (Existing stuck broadcasts did send - do not resend them; just set their status to Sent.)
Released by Dan Birchmore
v11.8.16

Never drop inbound email; forward sent mail

12 Jun 2026
Comms also gains a Forward button - on both sent broadcast emails and individual mailbox thread messages - so any email can be forwarded to another address (with an optional note); each forward is recorded in the audit log. Adds the UnroutedInboundEmails table. Any inbound email that cannot be routed to a mailbox or a group with active recipients is now (1) forwarded to the admin group where possible and (2) always stored, so nothing is ever silently dropped. Staff can read and mark these handled at Comms > Unrouted inbound (email HTML is shown in a sandboxed frame so untrusted content is safe). The admin group prefix defaults to "admin" (override with Mailgun:AdminGroupPrefix).
Released by Dan Birchmore
v11.8.15

Admins can edit all parent & child fields (audited)

12 Jun 2026
NO SCHEMA CHANGES. Designated users (the Edit-members permission) can now edit ALL fields for a player (name, DOB, playing day, FA number, medical, allergies, age group) and for a parent/guardian (name, email, phone, DOB, FA number, occupation, relationship, full address). Every change is written to the audit log field-by-field (old value to new value) with the reason given, so all edits are fully auditable. The parent editor is reached from the Full parent profile page.
Released by Dan Birchmore
v11.8.14

Camp payments moved to Stripe

11 Jun 2026
NO SCHEMA CHANGES. Soccer-camp online payments now go through Stripe (the same account used for registrations) instead of SumUp, after SumUp's Checkout API began rejecting our requests. Booking checkout, the day-change balance top-up, and the payment confirmation/webhook all use Stripe Checkout now. Refunds are provider-aware - new Stripe-paid bookings refund via Stripe, existing SumUp-paid bookings still refund via SumUp. Parents are redirected straight to the Stripe hosted payment page; the Stripe webhook (already used for registrations) confirms the booking, with a return-page check as a backstop.
Released by Dan Birchmore
v11.8.13

Fix camp/ticket payments (SumUp) + richer camp register

11 Jun 2026
NO SCHEMA CHANGES. URGENT FIX: SumUp tightened Checkout API validation and began rejecting our camp/ticket payment requests (HTTP 400 "pay_to_email or merchant_code", preceded by HTTP 500s during their rollout), so customers could not pay for soccer camps. We no longer send the deprecated pay_to_email field (merchant_code is the correct, required field), and we now retry transient SumUp 5xx errors so a brief blip no longer fails the customer. Also: the camp Attendance Register now gives staff more at a glance: the parent's phone number as a tap-to-call link (now also falls back to the parent account number, so it no longer shows blank for club-member bookings) plus the emergency contact; the child's photo/media consent (Photos OK / No photos / not set); the lunch ordered for that child on that day; and the child's headshot photo as an avatar where one is on file (served via a camp-staff-only endpoint).
Released by Dan Birchmore
v11.8.12

Payment links that never expire

11 Jun 2026
NO SCHEMA CHANGES. Fixes parents seeing "this checkout session has timed out" / "you're all done here" when clicking a resent payment link. The email previously contained a raw Stripe checkout URL, which Stripe kills after 24 hours - so any delay (common when chasing moved players over several days, whose original session was also cancelled) left a dead link. Resend Payment Link now emails a durable link to a new /Payment/Resume/{member} page that mints a FRESH Stripe session each time it is clicked, recalculating the current fee, so the link never goes stale. Already-paid or invalid links show a friendly message instead of a Stripe error.
Released by Dan Birchmore
v11.8.11

Quick camp account for non-members

11 Jun 2026
NO SCHEMA CHANGES. Fixes the confusing camp sign-in flow. Previously a new camp customer who clicked "Register now" was sent into the full team-registration wizard. Now, when signing in to book a camp, new customers are offered a lightweight "Create a quick account" page that creates a normal parent account plus a first camp-only child. Camp children capture medical/allergy details and an OPTIONAL headshot photo (encouraged, as it helps coaches recognise each child) but NOT proof of age, and no team registration. It signs them in and returns them to the camp to book. The camp "add another child" form also now takes an optional headshot. Parents are reminded to add a photo for any child that has not got one - on My Children, on the booking page, and on the child edit page - and can upload one at any time. Existing members are unaffected - they sign in and use their existing account and children.
Released by Dan Birchmore
v11.8.10

Full parent profile page

10 Jun 2026
NO SCHEMA CHANGES. Builds the admin "Full parent profile" page (Admin > UserDetail), which existed as an action but had no view, so the Full parent profile button and the parent-name link on a player's page errored. The page now shows all parent details, every linked child (with age group and status), and the second parent/guardian with login/invitation status and a resend-invitation button for staff.
Released by Dan Birchmore
v11.8.9

Parent FA Number & date of birth

10 Jun 2026
NO SCHEMA CHANGES. Helps capture the parent's FA Number (FAN) and date of birth needed to link a child to the parent on the FA Whole Game System. The registration form already captured these; this release adds: (1) the parent can now add/edit their FA Number AND date of birth on their own "Your Details" page; (2) a dashboard prompt nudges any parent missing their FA Number or DOB to add it; and (3) a new admin report, Reports > Missing FA Details, lists every parent without a FAN/DOB (with their children) and exports to CSV for chasing. The FA Number remains optional at registration. The admin Parent/Guardian panel on a player's page now also shows ALL stored parent info (FAN, DOB, relationship, occupation, full address) and the second parent/guardian (secondary contact) where one was given at registration. Parents can now also see and edit their second guardian on their own "Your Details" page, and the Contact Directory report lists second guardians alongside the primary parent.
Released by Dan Birchmore
v11.8.8

Allocate players for any season

10 Jun 2026
NO SCHEMA CHANGES. Team allocation now follows the PLAYER's season instead of the club's current season, so next-season registrations can be allocated to next-season teams while the current season is still running. The Allocate-to-Team and Add-to-Team lists on a player's page now show teams from that player's own season, and both actions guard against allocating a player into a team from a different season. (Create the relevant teams for the new season first via SetUp > Teams.)
Released by Dan Birchmore
v11.8.7

Move screen: payments-affected guidance

10 Jun 2026
NO SCHEMA CHANGES. When moving a player to another season, the Move screen now lists every payment on their current season and recommends what to do with each: refund & re-charge for paid full or instalment payments (refund also cancels the subscription); cancel the subscription and void the record for an instalment set up but never paid; and void £0 / unpaid records. Each carries a one-click action (Issue Refund, or Void). Payments shared with siblings are flagged and protected from one-click actions. The existing "carry payment across" option remains for same-fee moves, but refund & re-charge is the recommended route.
Released by Dan Birchmore
v11.8.6

Default season for new registrations

10 Jun 2026
SCHEMA CHANGE: adds Seasons.IsRegistrationDefault. New registrations no longer always default to the current season — in SetUp > Seasons you can mark which open season new sign-ups default to ("Set Sign-up Default"). Point it at next season when the bulk window opens, while the current season stays open (and Current for teams/fixtures/reports) for late joiners. The season-check splash now points at the chosen default. Falls back to the current season if none is set.
Released by Dan Birchmore
v11.8.5

Registration season-check splash

10 Jun 2026
Reduces wrong-season registrations at the source. When a parent opens a registration form for a season that is not the default while another season is also open, a "Check the season" splash prompts them to confirm — with a one-click switch to the recommended season. Advisory only, and applies to all registration entry points.
Released by Dan Birchmore
v11.8.4

Cancel instalment plan when moving season

10 Jun 2026
Closes the double-charge risk when a child paying by monthly instalments is moved to another season: the Move screen detects an active Stripe instalment subscription, shows how much has been paid, and offers to cancel the subscription as part of the move so no further instalments are taken. Money already paid is not auto-credited — refund separately if owed. Fully audited.
Released by Dan Birchmore
v11.8.3

Move siblings together on a shared payment

10 Jun 2026
Move to Another Season now handles families paid for in one transaction: when a child's paid registration payment also covers siblings, it can move them all to the new season together and re-stamp the shared payment, marking everyone Paid, in one audited action.
Released by Dan Birchmore
v11.8.2

Edit Player Details (designated staff)

10 Jun 2026
SCHEMA CHANGE: adds Users.CanEditMembers. Designated staff can now correct a player's date of birth, medical notes and allergies from the member's page (Admin > Registrations > the player > Edit Details). Editing the date of birth recalculates the age group and clears any override, so the corrected fee follows automatically on Resend Payment Link. Junk values such as "N/A" or "None" in medical/allergies are cleared so they no longer pull through to reports. Access is limited to System Admins plus any user a System Admin ticks as "Can edit player details" on the Staff edit page. Every edit is written to the audit log.
Released by Dan Birchmore
v11.8.1

Camp Booking Admin: Refunds, Day-Moves & Early-Bird Discounts

05 Jun 2026
SCHEMA CHANGE. Admins (Admin/System Admin) can now manage individual camp bookings from a new Booking Detail page: issue a partial or full refund straight back to the parent's card via SumUp, and change a child's booked days (a straight swap, or add/drop days). Reducing days auto-refunds the difference; adding days creates a SumUp payment link the parent settles to clear the balance. Every refund and day-move REQUIRES a reason, and all changes are written to a per-booking audit history (with amount, before/after days, reason and the admin who did it). Camp discount codes also gain "valid from" and "expiry" dates so you can run early-bird offers that open and close automatically.
Released by Dan Birchmore
v11.7.13

Camp Per-Day Capacity + "Spaces Filling Fast"

05 Jun 2026
SCHEMA CHANGE: adds Camps.FillingFastThresholdPercent. The camp "Max Participants" figure is now enforced as a per-day place limit. On the booking page a day that has reached the limit shows "Fully booked" and cannot be selected; a day in its last quarter of capacity shows a "Spaces filling fast" nudge to encourage booking. Exact remaining numbers are deliberately not shown. The limit is also enforced server-side: a booking is rejected if a chosen day cannot fit all the children being booked (guards against a day filling up while the parent was on the page). Counts are based on confirmed (paid) bookings. The public Camps list also shows a "Spaces filling fast" (or "Fully booked") teaser on each camp card so it stands out before a parent even opens it. The "filling fast" trigger is now configurable per camp (default 75% of a day's places).
Released by Dan Birchmore
v11.7.12

Fix: Allocating a Fixture to a Pitch

04 Jun 2026
NO SCHEMA CHANGES. Fixes an unhandled error ("Something went wrong") when a secretary allocated a fixture to a pitch. The pitch-clash capacity check built its overlap window inside a database query using TimeSpan.FromMinutes(<team duration column>), which EF Core cannot translate to SQL, so the request failed. This only triggered once a pitch had a format capacity configured for the team's format. The check now filters candidate fixtures in the database and evaluates the time overlap in memory, so allocation works. Pre-existing issue (logic dates to v11.0.1); unrelated to the camp features in v11.7.11.
Released by Dan Birchmore
v11.7.11

Camp Extended Care & Lunch Upsell

04 Jun 2026
SCHEMA CHANGE (adds columns to Camps and CampBookings - applied by this script). Adds optional paid early drop-off and late collection (wraparound care) to soccer camps. When creating or editing a camp, an admin can switch on Early Drop-off and/or Late Collection, set the display times, and set a single fee per day that applies to each. Parents then choose early drop-off and/or late collection per day on the booking page; each adds the fee, per child, per day, to their total. If an option is not switched on for a camp (with a fee set), parents cannot book it. The per-day selections and the amount are stored on the booking and shown on the booking confirmation. LUNCH UPSELL: a camp can also optionally offer paid daily lunches. An admin switches on Meals, sets a per-day meal fee, and types a flexible list of menu options for each camp day (managed on the camp page). During booking, the parent picks one option per day or "bring my own lunch" (free); each chosen lunch adds the fee, per child, per day. The chosen meal per day is stored so catering has the numbers. PHOTO CONSENT: camp bookings now require the parent to answer a photo / media consent question (Yes / No, with an optional note) before paying. The answer is stored per booking and shown to staff on the bookings list and on the parent's confirmation.
Released by Dan Birchmore
v11.7.10

Fix: SMS MFA Code Rejected at Sign-In

04 Jun 2026
NO SCHEMA CHANGES. Fixes a sign-in problem introduced with the multi-method MFA challenge. SMS verification codes are 6 alphanumeric characters (e.g. 9J3UVQ), but the code box on the Two-Factor Authentication screen was set to accept digits only, so the browser blocked the code with "Please match the requested format" before it could be submitted. The field now accepts letters and digits when the SMS method is active (and stays numeric for email / authenticator codes). The server-side check for SMS / email codes is now case-insensitive too, with a guard so an empty code can never validate. Email and authenticator sign-in were unaffected.
Released by Dan Birchmore
v11.7.9

MFA: Sign-In Fallback + SMS Logging

03 Jun 2026
NO SCHEMA CHANGES (reuses the existing Messages tables). Two MFA improvements. (1) TRY ANOTHER WAY AT SIGN-IN: the two-factor sign-in screen now lets a staff member switch method - email me a code, text me a code (if a mobile is on file), use my authenticator app, or resend - instead of being locked to the single method chosen at setup. Removes the lock-out where a staff member's SMS never arrives. (2) SMS NOW LOGGED + REAL ERRORS: every MFA / sign-in SMS is recorded in the message history (number, time, and Sent/Failed with the provider's reason; the one-time code itself is not stored), and the setup screen now shows the actual send failure instead of a generic "could not send" - previously a provider-level SMS failure was reported as success with no text arriving.
Released by Dan Birchmore
v11.7.8

Refunds Count per Age Group

03 Jun 2026
NO SCHEMA CHANGES. Follow-up to v11.7.7. Each age-group card on the Reports dashboard now shows a "Refunded" count alongside Paid in full / Instalment / Unpaid, so the per-group figures reconcile with the total (e.g. U11: 10 paid + 5 instalment + 1 refunded = 16). A complete refund sets the member's payment status to Refunded, so the card counts members in that age group whose payment was fully refunded.
Released by Dan Birchmore
v11.7.7

Refunds Count on Reports Dashboard

03 Jun 2026
NO SCHEMA CHANGES. Adds a "Refunds" tile to the Reports dashboard top summary, showing the number of refunded payments for the selected season (payments marked Refunded / Partially Refunded, or with a refunded amount). The tile is season-aware like the rest of the dashboard and links through to the Payments report filtered to refunds. It is shown only to full-access users, because refunds are a club-wide figure whereas a scoped user's other tiles are limited to their age groups.
Released by Dan Birchmore
v11.7.6

Reports Instalments + Registration Email Season Fix

03 Jun 2026
NO SCHEMA CHANGES. Reporting accuracy fix. The Reports dashboard previously counted only fully-settled players under "Paid" (PaymentStatus = Paid), so families paying by monthly instalments (PaymentStatus = Instalment) were not shown anywhere - the per-age-group and top-line totals did not reconcile with Total Players. The dashboard now shows an "On Instalments" figure in the top summary and an "Instalment" count on each age-group card, and the full-payment figure is relabelled "Paid in Full" for clarity. Both link through to the Player Register filtered by payment status. REGISTRATION EMAIL SEASON: the registration confirmation (welcome) and "registration complete" emails showed the current operational season name (e.g. 2025/26) instead of the season the family actually registered for. They now use each member's own season, so a family registering for 2026/27 sees 2026/27. (Season tickets and the combined ticket email already used the correct season.) Also includes the v11.7.5 changes: explicitly-selected team / age-group Comms audiences reach all their families (no team-news opt-in gate), and the two-factor setup screen sends the anti-forgery token under the correct header so SMS / email MFA codes can be sent.
Released by Dan Birchmore
v11.7.5

Targeted Team Audiences Reach All Families

03 Jun 2026
NO SCHEMA CHANGES. Follow-up to the v11.7.4 academy recipient fix. When staff explicitly select a team or age-group audience in Comms (New Message), the message now reaches ALL of that group's families, rather than only those flagged for "Team & Age Group News". Academy families were never offered that opt-in on the academy registration form, so the flag was off and the audience still resolved to 0 recipients even though the directory counted them. The recipient resolver no longer applies the team-news subscription filter to explicitly-selected team / age-group audiences (this now matches how the All Parents audience already behaves and what the recipient count shows). The opt-in subscription flags still govern the bulk mailing lists (e.g. Club News Subscribers). Note: parents who deliberately opted out of team news will now receive explicitly-targeted team / age-group messages.
Released by Dan Birchmore
v11.7.4

Season-Aware Reports & Comms + Staff MFA Options

03 Jun 2026
NO SCHEMA CHANGES. The Reports area can now report on any season, not just the current one. Every report (Reports dashboard, Player Register, Team Roster, Team Register, Contact Directory and Finance) gains a Season selector. Previously all reports were hard-pinned to the current operational season, so once 2026/27 became current you could no longer report on 2025/26. The Reports dashboard shows registration completion by age group (Pending / Allocated / Registered, plus Paid / Unpaid counts per age group) for the chosen season, and every drill-down link (status cards, age-group cards, team cards and the report tiles) carries the selected season through, so clicking into the Player Register keeps you in the same season. Reports default to the current season when no season is chosen. STAFF MFA OPTIONS: the mandatory staff two-factor setup now lets each staff member choose their method on first sign-in - Authenticator app (recommended), SMS text message (when a mobile number is on file), or Email - rather than being forced onto an authenticator app. Sign-in verification already supported all three methods; this opens the same choice at first-time setup. TOTP remains the recommended, most secure option, and admins can still set or reset a staff member's method from Staff Admin. COMMS FIX: sending SMS or email to an academy audience (e.g. Foundation Academy U5/U6 or Girls Development Academy) previously resolved to 0 recipients, because academy players are grouped by age group rather than allocated to those team records. The recipient resolver now falls back to the team's age group (the same logic the recipient directory already used to count the group), so these audiences resolve their members again for both SMS and email. SEASON-AWARE COMMS: New Message now has a Season selector (shown when more than one season is active) so staff can message a future season's audiences at rollover - e.g. next season's academy / teams before flipping the current-season flag, or the outgoing season's members afterwards. It scopes the team / age-group / staff audiences and the recipient counts to the chosen season; All Parents and Club News stay club-wide. Defaults to the current season.
Released by Dan Birchmore
v11.7.3

Season-Aware Set Up + Instalments on Resume Payment

29 May 2026
NO SCHEMA CHANGES. Bundles the concurrent-season admin quality-of-life work with a parent-facing payment fix. SEASON-AWARE SET UP PAGES: Set Up > Fees, Terms, Academy Term Fees and Discount Codes now each have a season switcher dropdown. While running 2025/26 and 2026/27 concurrently, admins can configure each season's rates / terms / codes directly without temporarily flipping the current-season flag. The grid and fields are unchanged — the dropdown just controls which season's values you are editing, and Save writes against the selected season. ADD TEAM honours the season filter (from v11.7.1) and these Set Up pages follow the same pattern. INSTALMENTS ON RESUME PAYMENT: the parent Dashboard Resume Payment page now offers Pay in Full or Monthly Instalments — matching what the original registration form offers — whenever the age group fee allows instalments and the member's season has a future instalment deadline. Previously a parent who started but did not finish payment was forced into a single full payment on resume, losing the instalment option they had at registration. The instalment route creates a Stripe subscription (the existing webhook handles collection), applies any instalment surcharge, and spreads the cost across the months remaining to the season deadline. Discount codes still apply and recalculate the per-instalment figure at checkout. MOVE MEMBER BETWEEN SEASONS (from v11.7.1) is also included for fixing wrong-season registrations.
Released by Dan Birchmore
v11.7.2

Set Up Pages Honour Season Filter

29 May 2026
Follow-up to v11.7.1 — closes out the remaining admin pages that were hardcoded to IsCurrent and so could not be edited for a non-current season. NO SCHEMA CHANGES. SET UP > FEES now accepts ?seasonId and shows a season switcher dropdown at the top. Admins can edit the AgeGroupFees table for 2026/27 while 2025/26 is still current. SET UP > TERMS now accepts ?seasonId and shows a season switcher. The Add Term form pins new terms to the season the admin was viewing (was: always IsCurrent). SET UP > ACADEMY FEES now accepts ?seasonId and shows a season switcher. The fee grid lists terms from the selected season. SET UP > DISCOUNT CODES now accepts ?seasonId and shows a season switcher. New codes are created against the season being viewed, not always IsCurrent. The header on the Create New Code panel makes the target season explicit ("Create New Code for 2026/27"). No more "flip 2026/27 to current, configure, flip back" dance — admins can now edit any active season's setup directly.
Released by Dan Birchmore
v11.7.1

Season-Management Quality of Life

28 May 2026
Small follow-up to v11.7.0 covering the two remaining concurrent-season pain points. NO SCHEMA CHANGES. ADD TEAM RESPECTS THE SEASON FILTER: Set Up > Teams now passes the currently filtered seasonId into the + Add Team form. The form shows a clear "Adding to the 2026/27 season" badge at the top and posts a hidden SeasonId so the new team lands in the season the admin was viewing, not always IsCurrent. Previously admins had to temporarily flip the current-season flag to add teams to a non-current season. MOVE MEMBER BETWEEN SEASONS: new Admin > Member Detail > Move to Another Season action (Admin / System Admin only). Used when a parent accidentally registers a child into the wrong season on ChooseSeason. The action updates Members.SeasonId, clears TeamId, removes all MemberTeams rows (teams are per-season), optionally recalculates AgeGroupId from DOB against the new season's start year (recommended for standard age groups, ignored for academies), and resets registration to Pending / Unpaid in the new season. The original Payment row stays attached to the old season so the finance trail is preserved — admins separately handle refund/reissue if the parent already paid. Audit-logged as MoveMemberToSeason with full before/after detail.
Released by Dan Birchmore
v11.7.0

Concurrent Season Registration

27 May 2026
Two (or more) seasons can now accept registrations at the same time, so late joiners can sign up for the current season while new families register for the next season. The IsCurrent season flag remains singular (it still drives fixtures, comms, availability and gate) — what is new is that any season with IsActive && IsOpen is now eligible to accept registrations. NEW SEASON-PICKER LANDING (/Registration/ChooseSeason): shown automatically when more than one season is open. Parents see a card per season with the four registration paths (Foundation Academy, Girls Development Academy, Saturday/Sunday football, Isthmian Youth) and pick the one that applies to their child. If only one season is open the landing page transparently redirects to the existing form, so behaviour is identical to v11.6.x until a second season is opened. SEASON-AWARE REGISTRATION: all five registration entry points (Index, FoundationAcademy, GirlsDevelopmentAcademy, IsthmianYouth, SelfRegister) accept an optional ?seasonId= parameter that pins the form to the chosen season. The form POST honours a new hidden TargetSeasonId field, so Member, Payment, Term and AgeGroupFee lookups all resolve against the parent's chosen season instead of falling back to IsCurrent at POST time. AJAX fee, discount-code and age-group suggestions also honour the chosen season so the live form total matches the Stripe checkout amount. ADD-CHILD GAP FIX (folded in from the planned v11.6.2): a logged-in parent with any active child anywhere now auto-skips the parent-details steps when adding a sibling — fixes the Rosie/Indie scenario where adding a sister to Girls Development Academy was sending the parent through the standard registration flow rather than the academy-specific one. ADMIN: Admin > Registrations has a new Season dropdown when more than one season exists, so admins can switch between seasons without leaving the page. Dashboard "Add Player" and the home page "Register" buttons now go to /Registration/ChooseSeason. NO SCHEMA CHANGES — version history only.
Released by Dan Birchmore
v11.6.1

Lift Headshot / ID Document Upload Cap to 25MB

11 May 2026
Bug fix: the registration and Edit Child / Add Child forms displayed "max 25MB" for player headshot photos and ID documents but the underlying JavaScript and server-side validators were still enforcing the legacy 5MB / 10MB limits — so parents with modern phone cameras (HEIC, large JPEGs) were getting "File is too large. Maximum size is 5MB" alerts even though the label said 25MB. This release aligns every layer (site.js client-side guard, RegistrationController.RegisterPost validator, DashboardController.AddChild and EditChild validators) on the 25MB ceiling, and extends the accepted formats list to include HEIC / HEIF / WebP / TIFF / TIF alongside the existing JPG / PNG (and PDF for ID documents) to match the page labels. No schema changes; no data migration required.
Released by Dan Birchmore
v11.6.0

Photo Consent & Coach Team Register Export

10 May 2026
PHOTO / MEDIA CONSENT: New PhotoConsent (Yes / No) plus optional restrictions note captured on every registration form (Index, Foundation Academy, Girls Development Academy, Isthmian Youth, Self-register). Existing members can update consent at any time via the parent dashboard EditChild page. Admins can see consent status on the MemberDetail page. Stored on Members.PhotoConsent (BIT NULL — null means legacy registration, not yet captured) and Members.PhotoConsentRestrictions (NVARCHAR(500) NULL). TEAM REGISTER EXPORT: New coach-friendly attendance register at Reports > Team Register. Pick a team and the number of upcoming sessions (4-12), then open the print view for an A4 layout listing each paid-up player (PaymentStatus = Paid or Instalment) with name, DOB, photo consent status (highlighted), allergies and medical notes, plus tickbox columns for the next N sessions. Session dates auto-computed from the team's PlayingDay (Saturday / Sunday / Both / Midweek). Print via the browser (Ctrl+P or save as PDF). Accessible to anyone with Players.CanRead at any team scope (managers, coaches, AGCs, secretary, admin).
Released by Dan Birchmore
v11.5.0

Resume / Resend Payment, Discount Codes & Zero-Fee Registration Fix

10 May 2026
ADMIN — RESEND PAYMENT LINK: Admins, Secretary, Finance and Director roles can now resend a Stripe payment link to a parent for any unpaid registration. A new Resend Pay Link button appears on the Registrations list and Member Detail pages for members in Pending or AwaitingPayment status with PaymentStatus = Unpaid. The button calculates the outstanding fee from the member's age group, playing day and current term, creates a Stripe Checkout session, sets the member to AwaitingPayment, and emails the parent a fresh pay-now link. Audit-logged as PaymentLinkResent. New AwaitingPayment option in the Registrations status filter. New email template payment-link.html. PARENT — RESUME PAYMENT: Parents now have a prominent Resume Payment button on the Dashboard for any of their children at Pending or AwaitingPayment status with PaymentStatus = Unpaid (replaces the small Complete payment link). The Resume Payment page shows the outstanding fee, lets the parent enter a discount code with live validation, and redirects to Stripe — no admin involvement required. If a discount code reduces the total to zero, the member is marked Paid (and Registered with team auto-assignment for academy members) without going to Stripe. The legacy RetryPayment route now redirects to ResumePayment for backwards compatibility. BUG FIX — academy zero-fee escape: academy registrations submitted without a SelectedTermId or with no matching AcademyTermFees row no longer slip silently through the £0 path — the form now blocks submission with a clear error so the parent re-selects a term instead of producing a stuck Pending/Unpaid member. BUG FIX — free registration status: genuinely-free registrations (totalFee = 0) now create a £0 Payment record and mark members Registered/Paid (academy) or Paid (standard), mirroring the discount-free path so admins can distinguish free registrations from broken zero-fee ones in the admin view.
Released by Dan Birchmore
v11.4.0

Dashboard Fix + Duplicate Registration Prevention

18 Mar 2026
Dashboard referee alerts only count future fixtures. Membership number generator rewritten to prevent duplicates (MAX + UPDLOCK). Unique index added on MembershipNumber. Duplicate AwaitingPayment registration check added to all registration forms.
Released by Dan Birchmore
v11.3.0

Late Registration Fee

16 Mar 2026
Per-age-group late registration fee with configurable cutoff date. Automatically applied to non-academy registrations after the cutoff date. Shown as a separate line item in fee breakdown and payment history. Also includes Stripe sync refund detection fix for instalment payments.
Released by Dan Birchmore
v11.2.0

Academy Registration

12 Mar 2026
Foundation Academy and Girls Development Academy registration with term-based weekly rate fees, excluded dates, auto team assignment, skip season tickets, and dashboard term renewal.
Released by Dan Birchmore
v11.0.1

Referee & Fixtures Enhancements

12 Mar 2026
1. Referee Module: Added Date of Birth, League Registration Number, and Parent/Guardian contact details (dynamic — only visible for under-18 referees). Age auto-calculated from DOB. 2. Player Registration: Added Parent's Occupation field with community benefit explanation. 3. Pitch Allocation Engine: Configurable per-pitch capacity for different match formats (e.g. 11v11=1, 9v9=2, 5v5=3 simultaneous fixtures). Server-side overbooking prevention. 4. Referee Allocation: Confirmation messages now show referee registration number (18+) or parent/guardian contact (under 18), plus cancellation responsibility reminder. Consistent across portal, SMS, and token-link confirmation paths. 5. Fixtures: Extended request window from 14 days to end of current season. Managers can now edit fixtures (date, time, opposition, notes). Full cancel/edit notification system with 14-day pitch allocator notification window. Referee and team staff notified on edits and cancellations.
Released by Dan Birchmore
v10.1.7

Enhanced Reports with Drill-Down

03 Mar 2026
Enhanced the Reports dashboard with clickable stat cards that drill down to the Player Register with pre-applied filters. Added Payment Status filter and Midweek playing day option to the Player Register filter bar. Expanded the Age Group breakdown to show per-group registration and payment status. Added a new Players by Team section showing player counts per team grouped by age group. Fixed confirmation page showing wrong payment for parents with multiple registrations. Fixed instalment surcharge accumulating for children with zero-fee playing days.
Released by Dan Birchmore
v10.1.6

Isthmian Youth Team Registration

03 Mar 2026
Added dedicated registration flow for the Isthmian Youth Team at /Registration/IsthmianYouth. This team plays midweek only, so the playing day is fixed to "Midweek" instead of Saturday/Sunday/Both. Added MidweekFee column to AgeGroupFees so admins can configure midweek registration fees per age group via the Fees admin page. The registration workflow (parent details, address, player details, payment, terms) is otherwise identical to the standard registration process.
Released by Dan Birchmore
v10.1.5

Email Branding & Template Manager

02 Mar 2026
• Club badge added to all 17 email template headers • Standardised email footer with tagline, address and website link • Event ticket emails fixed from purple to navy/gold brand palette • Payment & refund emails converted to consistent table layout • Soccer Camps page updated from green to navy/gold brand colours • New Email Template Manager in Set Up (Admin only) • View, edit, and send test emails for all 17 notification templates • Live preview with sample data alongside HTML source editor
Released by Dan Birchmore
v10.1.4

Referee Queue Fix & Table Redesign

02 Mar 2026
Fixed referee allocation queue not showing confirmed fixtures — the Queue query filtered only for FixtureRequest.Status = "Allocated", but when a referee accepts the fixture status changes to "Confirmed", excluding it from the query. Confirmed counter always showed zero. Also fixed inconsistent decline status in legacy token handler. Redesigned the Queue view: status counters are now clickable filters (All, Needs Action, Awaiting Reply, Confirmed, Declined) and fixtures display in a sortable table layout instead of cards, with client-side filtering. Default view shows all fixtures.
Released by Dan Birchmore
v9.1.0

New User Role Management Conoslidation

28 Feb 2026
Staff management consolidation: role-based permissions (roles define access automatically), staff welcome email with password-set link, consolidated single-page staff management, permission summary and optional overrides on Edit page, removed redundant ManageStaff/TeamPermissions/Permissions pages, TeamStaff data migrated to StaffTeamAccess.
v9.0.1

New Roles and Responsibilities

28 Feb 2026
Team-level permission management: New IPermissionService with cascading scope resolution (Club > AgeGroup > Team). Team Permissions management UI in SetUp with interactive matrix and role presets. Read-only Team Roster page for staff with Players.CanRead permission. Controller enforcement for fixture requests, communications, and player data using module permissions. Payment failure notifications now target users with Finance.CanRead permission at team scope. Season rollover copies team-scoped permissions when copying teams. Fixed stored procedures and view to reference unified Users table (v8.0.1 UserId column).
v8.0.9

Camp Registration Added

27 Feb 2026
Camp registration: MemberType (Player/CampOnly), require login for booking, child selector, My Children, My Bookings, admin filtering
v8.0.8

Added Soccer Camp Payments

27 Feb 2026
Pending order cleanup (48h), resume payment, camp staff dropdown, public camp booking with SumUp payments.
v8.0.7

Added Event Handling

27 Feb 2026
Event ticket online payments (SumUp), public event purchase flow, event sales reporting.
vv8.0.6

Club Announcements, Events Module, Soccer Camps & Ticket Descriptions

27 Feb 2026
Club-wide announcement banners on the Dashboard with severity levels and scheduling. Ticket type descriptions for match fixtures. New Events module for selling tickets to fundraisers, raffles, social events and awards nights. New Soccer Camps module replacing Class4Kids — supports multi-day bookings, age-group classes, member/non-member pricing, sibling discounts, discount codes, staff assignment with class-level scoping, and real-time attendance sign-in/sign-out register.
Released by Dan Birchmore
vv8.0.4

Contact Lists, Senior Matches & Reporting

27 Feb 2026
Secondary contacts now appear in the Compose directory picker with child names displayed. New "Club News Subscribers" mailing list based on opt-in preference. "All Parents" group now sends to everyone regardless of subscription status. Edit My Details page includes a Club News opt-in/out toggle. SMS cost display corrected to show sub-penny precision (e.g. £0.028 not £0.03). Senior Matches tab added to the Match Day navigation for fixture creation, ticket setup, season tickets, and templates. Ticket Sales Report added to the Reports page. Fixture templates can now be marked as default — auto-selected when creating new fixtures. Add Mailbox form fixed (type mismatch and field name bug). Compose button now visible for users without a personal mailbox.
Released by Dan Birchmore
vv8.0.3

Email Attachments & Compose Fix

27 Feb 2026
Email attachments are now supported across all sending paths. Staff can attach PDF, image, Word, Excel and CSV files (up to 10 MB total) when composing broadcast emails, replying to inbox threads, or sending direct emails. Inbound emails with attachments from parents are automatically saved and displayed in the thread view with download links. Attachments are stored securely in Azure Blob Storage. Fixed: Compose button and Sent tab were missing for users without a personal mailbox. Fixed: Add Mailbox dropdown on the Mailboxes setup page was always empty due to a type mismatch between the controller and view, plus a form field name mismatch.
Released by Dan Birchmore
vv8.0.2

Audit Log Attribution, Security Alert Tuning & Match Day Navigation

26 Feb 2026
Payment audit log entries now show the parent's name instead of "—". All payment-related audit calls (Payment, PaymentFailed, PaymentOverdue, PaymentRefunded) resolve the parent name from the Users table. Admin-initiated actions (StripeSync, SubscriptionCancelled, RefundIssued, RefundFailed) now pass the logged-in admin name. Security alert emails no longer fire on successful sign-in or MFA code dispatch — alerts now only trigger on failed MFA attempts (someone has the password but not the second factor). New Match Day sub-navigation bar added to Fixtures, Availability and Gate Operations pages so users can move between them without returning to the Dashboard.
Released by Dan Birchmore
v8.0.1

Unified Users Table

26 Feb 2026
Merged Parents and Staff into Users. All passwords use ENCRYPTBYPASSPHRASE. ParentId renamed to UserId on Members, UserRoles, UserAgeGroups. StaffId renamed to UserId on StaffTeamAccess, StaffAgeGroupAccess, StaffModulePermissions.
Released by Migration Script
vv7.0.7

Security & Authentication Overhaul

26 Feb 2026
Second guardian now receives an email invitation to set their own password independently (7-day expiry, resendable by Parent 1 or staff). All staff forced to configure MFA on first login. Parents nudged on every login until MFA configured. TOTP preferred (Microsoft Authenticator), SMS and email fallback — SMS codes now alphanumeric. Fallback MFA attempts trigger an alert email. Self-service password reset for all account types: parents 1hr expiry, staff 30min. Tokens are single-use, invalidated on login, rate-limited to 3 requests/hour.
Released by Dan Birchmore
vv7.0.8

Registration Form, Payment Copy & Crash Fix

26 Feb 2026
CRASH FIX: SuggestAgeGroup AJAX endpoint threw ArgumentOutOfRangeException when the browser sent a partial or malformed date of birth during registration — now validates parsed date is between 1900 and today before performing any age calculations, and guards DateOnly construction against out-of-range year values. Payment copy corrected: "Direct Debit" replaced with card / monthly card payments throughout registration (Stripe card only). All parent details and address fields enforced as mandatory client-side.
Released by Dan Birchmore
vv7.0.6

Dynamic Instalment Scheduling

26 Feb 2026
Replaced fixed InstalmentMonths (per age group) with a dynamic payment schedule. Added InstalmentPaymentDeadline to the Season — monthly instalments are now calculated automatically from the parent registration date to the deadline. Replaced InstalmentMonths (int) with AllowInstalments (bit) on AgeGroupFees.
Released by Dan Birchmore
v7.0.5

Full Live Dashboard & Thread Fixes

26 Feb 2026
All Needs Attention panel items now poll every 60 seconds and update without page disruption: unread messages, pending fixture requests, pending registrations, referee allocations (pending and declined), availability gaps, governance overdue actions, expiring qualifications, and unpaid fees. Each count is role-gated server-side using the same scope checks as the main dashboard load. Cards are injected dynamically if not present at page load. Bell pulses on any new arrival. Email thread messages ordered most-recent-first. Fixed Staff account ownership checks on Thread and Reply actions.
Released by Dan Birchmore
v7.0.3

Dashboard UX & Referee Status Tracking

26 Feb 2026
Improved post-login dashboard with role-aware Needs Attention panel, simplified grouped super-tiles (Match Day, Players & Squads, Referees, Communications, Finance & Reports, Club Admin), and full referee allocation status tracking showing Pending / Accepted / Declined / Unavailable with urgent replacement alerts.
Released by Dan Birchmore
v7.0.2

Registration Required Fields & Secondary Contact Login

25 Feb 2026
Registration: Mandatory Fields (changes) - County is now a required field on registration (was optional) - Secondary parent / guardian: Phone Number now required (was optional) - Secondary parent / guardian: Relationship to Player now required (was unlabelled) - Secondary parent / guardian: Password and Confirm Password fields added (required when secondary contact is checked) Secondary Contact Login (new) - Second parent / guardian can now log in independently using their own email and password - Login checks: Staff table first, then Primary Parent, then Secondary Contact - Secondary contact signs in under the linked primary parent account (shared access to children and dashboard) - Display name shows the secondary contact name when logged in as secondary - AccountType claim set to SecondaryContact to distinguish session type Database - SecondaryContacts table: PasswordEncrypted (varbinary 256, nullable) column added - SecondaryContacts table: PasswordIV (varbinary 16, nullable) column added - Existing secondary contact rows unaffected (columns nullable, no password required for legacy records)
Released by Dan Birchmore
v7.0.1

Board Governance Module

25 Feb 2026
Board Governance Module (new) • Full board governance workflow built directly into the platform • Board member register with position, term dates, and staff account linking • Meeting management: create and manage Board, AGM, EGM, Finance, and Disciplinary meetings • Hybrid meeting support — in-person, remote, apologies and absent attendance recorded per member • Structured agenda builder with per-item minutes recording • Formal resolution register with auto-generated reference numbers (RES-YYYY-NNN) • Full voting record per resolution — For / Against / Abstained / Absent per board member • Action item tracker with assignee, due date, status and completion notes • Minutes approval workflow — formal sign-off with timestamp and approver recorded • PDF/print export for: meeting minutes, resolution register, open action log • Dashboard integration — Governance module card added to Administration section • Dashboard alert strip shows overdue action count when non-zero • All governance actions logged to the audit trail • No new dependencies — print-to-PDF via the browser (Ctrl+P / Save as PDF)
Released by Dan Birchmore
v6.0.7

Extended File Upload Support

25 Feb 2026
File Upload Improvements • Maximum file size increased from 10MB to 25MB • Web server request body limit increased from 20MB to 30MB • Supported file types extended to include modern formats: - .heic / .heif (iPhone and modern Android photos) - .webp (modern web image format) - .tiff / .tif (high quality scans) • Content type mappings added for all new formats • All upload hints and accept attributes updated across: - Registration (Index + SelfRegister) - Dashboard (AddChild, EditChild, ReplaceDocument) - Compliance (AddQualification, EditQualification)
Released by Dan Birchmore
v6.0.5

Azure Security – Blob Storage Proxy

25 Feb 2026
Security Hardening • ViewHeadshot and ViewDocument controller actions now stream files through the application instead of redirecting the browser to a direct Azure Blob Storage SAS URL • Browser no longer contacts blob storage directly — all requests are proxied server-side • Enables Azure Storage firewall to be restricted to the VM subnet only (selected networks), closing off public blob access at the network level • New DownloadFileAsync method added to IFileStorageService and BlobStorageService • LocalFileStorageService updated with equivalent DownloadFileAsync implementation • GetDownloadUrl remains available for any future internal server-side use
Released by Dan Birchmore
v6.0.4

Pitch Schedule Redesign & Build Fixes

21 Feb 2026
Pitch Schedule • Fixture blocks redesigned — team name + time only inside the block (no more stacked text) • Referee status shown as coloured left-border stripe: green=confirmed, amber=pending, red=unassigned • Full fixture details (opposition, age group, referee name/status) shown in hover tooltip only • Tooltip styled with navy background, gold labels, readable at all block sizes • Timeline row height increased from 54px to 70px for better readability • Block shadow and hover lift improved Build Fixes (v6.0.3 backfill) • IEmailService.SendAsync returns (bool, string?) tuple — all bare awaits fixed across RefereesController, RefereePortalController, NotificationService, AccountController, TicketService • ISmsService.SendAsync same fix applied across AccountController, RefereesController, NotificationService, TicketService • RefereePortalController missing [AllowAnonymous] — referee magic links were redirecting to staff login • RefereePortalSessions EF model and DbSet added
Released by Dan Birchmore
v6.0.3

Referee Portal & Allocation Flow Overhaul

21 Feb 2026
Referee Portal • New self-service portal at /RefereePortal — standalone layout, separate from staff app • Magic link login: one-click link sent by email, no password required • Password login also supported for referees with PortalEnabled=true and PasswordHash set • Dashboard: pending assignments with Accept/Decline CTAs, upcoming confirmed fixtures, availability management • Confirm fixture page: single-click acceptance with fixture detail card • Decline fixture page: optional reason field, staff notified immediately by email • Availability self-management: add/remove unavailability date blocks with reason • RefereePortalSessions table added (EF model + DbSet + SQL migration) Allocation Flow • Email now sends portal magic link (Accept/Decline CTAs open portal pre-authenticated) • SMS now sends portal link instead of YES/NO reply instruction • Magic link token auto-creates a session and redirects to confirm or decline page • Staff receive email on confirm (green) and decline (red with Assign New Referee CTA) • Fixture status reverts to Allocated on decline so it reappears in the allocation queue SMS Inbox Fix • Referee YES/NO reply handler now runs BEFORE parent matching in the polling loop • Parent-referees replying to fixture notifications no longer appear in the staff SMS inbox • Handled replies are deleted from EveryMessage but never stored as staff inbox messages Pitch Schedule • Fixture blocks now show truncated referee name (confirmed=green, pending=amber hourglass) • Hover tooltip on each block shows: fixture, time, age group, referee status — full details without truncation • .sched-tooltip CSS class added with dark navy popup style
Released by Dan Birchmore
v6.0.2

Build Fixes, Referee Controller & Permissions Matrix

21 Feb 2026
Build Fixes • Resolved CS0103: _email and _sms not found in SmsInboxPollingService.RefereeHandler — services now resolved from IServiceScope • Resolved RZ1031: Razor option tag selected attribute — converted inline ternaries to @if/else blocks • Resolved CS1525: Trailing comma in StaffAdminController audit calls • Renamed Module model to ClubModule to prevent ambiguity with System.Reflection.Module • Fixed DashboardHubViewModel missing properties: CanSeeRegistrations, CanAllocateFixtures, CanRequestFixtures, CanAllocateReferees, CanSeeComms, CanSeeReports, PendingRefereeAllocations Referee Module • RefereesController added: Index, Create, Edit, AddUnavailability, RemoveUnavailability, Deactivate, Confirm, Decline (token) • Views/Referees: Index, Create, Edit, TokenResult, TokenInvalid, TokenExpired • Referee index: card grid with stats strip, filter bar (search, age group, qual, availability, preferred), unavailability modal • Edit page: inline unavailability management panel with add/remove date blocks • Token-based confirm/decline pages render without main layout for unauthenticated referee access via email links Module Permissions Matrix • StaffAdminController: Permissions, SetPermission, RevokePermission, ApplyPreset actions added • Views/StaffAdmin/Permissions.cshtml: click-to-cycle matrix (None ? Read ? Write), club/age group/team scope columns • Preset templates: Manager, AGC, Secretary, Finance, CWO — clears existing permissions and applies standard set • Save batches all pending changes in a single pass; toast confirmation on save • "Manage Permissions" button added to Staff Edit page header • PermissionModels.cs: ClubModule and StaffModulePermission EF model classes • ApplicationDbContext: DbSet<ClubModule> Modules, DbSet<StaffModulePermission> StaffModulePermissions added Dashboard • Fixed module card routing: Teams ? SetUp/Teams, Players ? Admin/Index • Gate Operations card added to Operations section for GateStaff/TicketAdmin/Admin/Secretary roles • Referee card icon changed from bi-whistle to bi-person-badge-fill for reliable CDN rendering • PendingRefereeAllocations counter now counts fixtures with Status=Allocated and no active referee allocation (previously always zero) Referee Allocation Alerting • On pitch allocation, Admin and Secretary staff now receive email alert: fixture details + Allocate Referee CTA • NotifyRefereeAllocatorsAsync added to NotificationService Staff Admin • Team dropdown no longer filtered by active season (staff assignments are not season-specific) • StaffAdminController.PopulateDropdowns: loads all active teams regardless of season CSS / Styling • aufc-btn-navy and aufc-btn-gold classes added to site.css with explicit color declarations • Fixed dark text on navy buttons across: Gate/Dashboard, Gate/PairReader, Account/MfaChallenge, Account/MfaSetup, StaffAdmin/Create, StaffAdmin/Index, Home/VersionHistory, StaffAdmin/Edit
Released by Dan Birchmore
v6.0.1

Referee Module, Granular Permissions & Dashboard Relaunch

21 Feb 2026
Dashboard • New icon-based module launcher grid replacing list-based navigation • Alert strip with live counts for registrations, messages, fixture requests, referee pending, expiring DBS • Module grid split into Operations / Club Management / Administration sections • Module cards animate in on load with staggered reveals; permission-aware (only show accessible modules) • Parent view updated with cleaner player cards and availability response prompts at the top Staff Permission Matrix • StaffModulePermissions table replacing implicit role-based access • Modules master table seeding 13 addressable platform modules with display metadata • Club / AgeGroup / Team scope levels per grant — CanRead / CanWrite flags per cell • vw_StaffEffectivePermissions view for clean permission querying across all controllers • sp_GrantModulePermission and sp_RevokeModulePermission stored procedures • Preset templates (Manager, AGC, Secretary, Finance, CWO) for one-click baseline setup • Dedicated Manage Permissions page per staff member with change-tracking save bar • Club-wide grants visually override age group and team scope cells in the matrix UI Referee Module • Referees table: name, email, phone, FA registration number, qualification level • PreferenceFlag 1-4 controlling suggestion engine sort priority • NotificationPreference (Email / SMS / Both) per referee • Optional ParentId link for referees who are also registered club parents • RefereeAgeGroupApprovals: junction table recording which age groups each referee is cleared for • RefereeUnavailability: date-range blocks with Reason (Holiday / Illness / Personal / Other) • RefereeAllocations: full lifecycle — Pending, Confirmed, Declined, Cancelled with full audit trail • Tokenised accept/decline links (72-hour expiry, no portal login required) • FixtureRequests status flow extended: Pending > PitchAllocated > RefereeAllocated > Confirmed > Complete • Allocator suggestion engine excludes unavailable referees and those already committed same date • Suggestions ordered PreferenceFlag DESC, randomised within each tier Referee Portal • Separate portal login independent of Staff and Parent accounts • Dashboard: pending confirmations, confirmed upcoming fixtures, unavailability management, age group approvals • RefereePortalTokens table: Activation, PasswordReset, FixtureConfirm, FixtureDecline token types • RefereePortalSessions table for revocable session management • Referee index with live search, age group filter, qualification filter, and Available / Unavailable / Preferred chips Two-way SMS • Referees reply YES or NO to allocation SMS — no link click required • SmsInboxPollingService extended with TryHandleRefereeReplyAsync partial class • Broad YES keywords: yes, y, accept, confirm, ok, okay, yep, sure, 1 • Broad NO keywords: no, n, decline, reject, cancel, nope, 0 • Text after NO captured as decline reason; replies archived from general SMS inbox • Staff notified by email on both confirm and decline; referee receives acknowledgement SMS Email • referee-allocated.html template: Accept + Decline CTA buttons, SMS shortcut reminder, portal link • Template tokens: RefereeName, TeamName, Opposition, FixtureDate, KickOffTime, DurationMinutes, PitchName, MatchFormat, AgeGroup, AllocatedBy, ConfirmUrl, DeclineUrl, PortalUrl, ClubName Migration run order 1. AddModulePermissions_v6.0.1.sql 2. AddReferees_v6.0.1.sql 3. AddRefereePortalAuth_v6.0.1.sql 4. AddVersionHistory_v6.0.1.sql
Released by Dan Birchmore
v5.1.2

Refund Status Fix & SMS Sender Attribution

21 Feb 2026
Fixed refunded payments showing as Paid. Added Payment.EffectiveStatus computed property. SMS messages from availability requests/reminders now show the staff member who initiated them instead of System. Added Messages.SenderName column.
Released by Dan Birchmore
v5.1.1

UI Changes

21 Feb 2026
Report Drill-Through — Player names in Team Roster, Player Register, Contact Directory, and Finance Report now link directly to Member Detail. Breadcrumbs added to all four report sub-pages. Report tiles on Reports dashboard converted to component classes.
Released by Dan Birchmore
v5.1.0

UI Changes

21 Feb 2026
UI Component Library & Design System — CSS component library with semantic colours, stat cards, tile grid, alert banners, attention badges, status badges, breadcrumbs, data tables, empty states, action panels, and toast notifications. Shared partials (_StatusMessages, _Breadcrumb) replace copy-pasted TempData blocks across all views. Breadcrumb navigation added to 17 key pages. Enhanced mobile responsive rules for tiles, stats, tables and toasts. Bulk section class standardisation.
Released by Dan Birchmore
v5.0.0

Dashboard Hub & Simplified Navigation

20 Feb 2026
**Major UX overhaul — role-aware Dashboard hub replaces dropdown navigation.** ### Dashboard Hub - Dashboard is now a **role-aware hub** that shows different tiles, stats, and alerts depending on your role - **Parents** see their children, availability requests, payment alerts, and quick links - **Managers/Coaches** see team-focused tiles: Fixtures, Availability, Comms, and Reports - **Admins** see the full operational command centre: pending registrations, compliance alerts, all management tiles, and Setup access - **GateStaff** see a focused view with Gate Dashboard and reader pairing - **TicketAdmin** sees ticketing management tiles and reports - **Finance/Directors** see financial stats, unpaid fees, and payment reports - Attention-needed alerts appear at the top with clickable badges linking directly to the relevant pages - Notification badges on tiles show pending counts (registrations, messages, fixtures, qualifications) ### Simplified Navigation - Removed the three dropdown menus (Match Day, Ticketing, Club) from the top navigation bar - Navigation is now: **Home | Tickets | Register | Dashboard | User menu** - All operational links previously in dropdowns are now accessible from the Dashboard hub tiles - Much cleaner experience on mobile devices - User dropdown simplified to just Edit Details and Sign Out ### What's Unchanged - All existing sub-pages (Members, Fixtures, Availability, Comms, Compliance, Reports, SetUp, etc.) remain exactly the same - Registration flow unchanged - Backend logic, data access, and API endpoints unchanged - SetUp page unchanged (it was already the gold standard)
Released by Dan Birchmore
v4.0.6

Ticket Reports & Gate Ticket Status Fix

20 Feb 2026
New TicketReports page with per-fixture reporting: revenue, online vs gate split, ticket type breakdown, attendance ring chart, and gate operator sales table. Fixed critical bug: gate sale tickets now created as Pending until payment confirmed, preventing failed/cancelled sales inflating attendance. Webhook and poll handlers now activate/cancel tickets on payment result. LiveStats and reports only count Valid/Used tickets.
Released by Dan Birchmore
v4.0.5

App Cancel Clears Solo Reader

20 Feb 2026
Cancel button in gate dashboard now sends DELETE to SumUp reader endpoint, clearing the pending transaction on the Solo immediately. Added CancelReaderCheckoutAsync to SumUpService. ReaderId tracked through sale lifecycle for cancel support.
Released by Dan Birchmore
v4.0.4

Gate Sale: Single-Call Reader Checkout & Cancel Detection

20 Feb 2026
Replaced two-step checkout flow with single CreateReaderCheckoutAsync call. Polling now checks reader status to detect terminal cancellations. Added 2-minute poll timeout. UI shows specific messages for cancelled, failed, and timed-out payments.
Released by Dan Birchmore
v4.0.3

SumUp Reader Endpoint Fix

20 Feb 2026
Fixed SumUp SendToReader to use merchant-scoped endpoint (POST /v0.1/merchants/{mc}/readers/{id}/checkout) instead of deprecated checkout-scoped endpoint that returned 404. Added ListReadersAsync and ReaderDiagnostic endpoint for troubleshooting. Reader diagnostic available at /Gate/ReaderDiagnostic.
Released by Dan Birchmore
v4.0.2

Staff Management Consolidation

20 Feb 2026
Consolidated staff management into single StaffAdmin controller. Removed legacy Users & Roles and Roles pages from SetUp — replaced with single Staff Management card linking to StaffAdmin. Old SetUp/Users, SetUp/Roles, SetUp/ManageRoles actions now redirect to StaffAdmin. Removed old Staff views (Create, Edit, Index, _StaffForm) that referenced retired inline view models. Old StaffController replaced with redirect wrapper to StaffAdmin. Fixed duplicate service registrations in Program.cs. Updated navigation: Club menu Staff link now points to StaffAdmin.
Released by Dan Birchmore
v4.0.1

Staff Module, MFA & SQL Passphrase Encryption

20 Feb 2026
Major architectural change. New Staff table replaces the overloaded Parents table for all platform users (managers, coaches, AGCs, admin assistants, finance, directors, gate staff). Staff members are managed in a single table with optional ParentId link for staff who are also parents. Access is scoped via StaffTeamAccess (grants a role on a specific team — strict, no cross-team visibility) and StaffAgeGroupAccess (grants a role across an entire age group). Global admin access is via Staff.IsAdmin flag. Legacy UserRoles/TeamStaff/UserAgeGroups tables retained for backward compatibility during migration. Added two-factor authentication (MFA) with three methods: TOTP via Microsoft Authenticator or Google Authenticator (preferred — QR code enrolment, 6-digit code validation with ±1 time-step drift tolerance), email code, and SMS code. MFA can be required per user at admin discretion via Staff.MfaRequired flag. MFA setup and challenge screens added to login flow. Replaced AES-256 C# encryption with SQL Server ENCRYPTBYPASSPHRASE/DECRYPTBYPASSPHRASE for staff passwords. Passwords can now be decrypted directly in SSMS using the passphrase from appsettings.json. Legacy AES encryption retained for existing parent accounts. New Staff management UI: create, edit, deactivate staff; assign team and age group access with roles; set MFA requirements; link to parent accounts; reset MFA. DataAccessService updated to read from Staff tables first with legacy fallback. AccountController updated to authenticate against Staff table first (with MFA flow) then Parents as fallback.
Released by Dan Birchmore
v3.0.5

Gate Payment Confirmation Fix (Two-Step Checkout)

20 Feb 2026
Fixed gate sale screen freezing on "Waiting for payment..." after the customer had already tapped and paid on the Solo reader. Root cause: the previous code used CreateReaderCheckoutAsync which hit POST /v0.1/merchants/{merchant}/readers/{reader}/checkout — this creates a checkout directly on the reader and returns a reader-specific transaction ID, not a standard SumUp checkout ID. When the browser polled for payment status via GET /v0.1/checkouts/{id}, the ID did not exist as a checkout, so the status always returned empty and the UI stayed on PENDING indefinitely. Card payments were processing correctly throughout — the money was taken — but the app could not confirm it. Fix: replaced with a two-step flow. Step 1: create a standard checkout via POST /v0.1/checkouts (returns a proper pollable checkout ID). Step 2: send that checkout to the Solo reader via POST /v0.1/checkouts/{id}/readers/{reader_id} (reader displays the payment). The poll endpoint GET /v0.1/checkouts/{id} now works because both steps share the same checkout ID. Also corrected the SendToReaderAsync endpoint from PUT /v0.1/checkouts/{id} to POST /v0.1/checkouts/{id}/readers/{reader_id} per the SumUp Cloud API specification.
Released by Dan Birchmore
v3.0.4

Gate Sale Fix, Operator Tracking & Multi-Reader Support

20 Feb 2026
Fixed gate sale error "The string did not match the expected pattern" — caused by System.Text.Json failing to serialise the full TicketOrder EF entity (circular navigation properties) in the AJAX response. Gate sale responses now return flat DTOs (OrderRef, TotalAmount, TicketCount, SoldBy) instead of EF entities. Payments were processing correctly on SumUp throughout — only the browser response was failing. Added operator tracking: the logged-in user's name is displayed in the gate header, shown in sale success messages, and listed against every gate sale in the Stats tab's Recent Gate Sales feed (amount, order ref, operator name, time). SoldByParentId was already being recorded on every gate order — now resolved to display name via Parent lookup. Added multi-reader support: appsettings.json now supports a SumUp:Readers array with Id and Name per reader. When multiple readers are configured, a dropdown appears on the Sell tab so gate staff can choose which Solo to send payment to. Legacy SoloReaderId/SoloReaderId2 fields still work as fallback. Added [IgnoreAntiforgeryToken] to all Gate AJAX endpoints (CheckIn, GateSale, CancelGateSale) to prevent token validation issues on mobile browsers.
Released by Dan Birchmore
v3.0.3

Gate Module & SumUp Solo Integration

20 Feb 2026
New Gate Dashboard for match-day operations — three-tab interface (Scan / Sell / Stats) accessible to GateStaff, TicketAdmin, and Admin roles. Scan tab: QR code scanning via device camera using the BarcodeDetector API with fallback manual ticket code entry. Validates both standard match tickets and season tickets, prevents double check-in, and records who checked in each person. Sell tab: gate staff select ticket quantities, system creates order with auto-check-in, and sends payment directly to the paired SumUp Solo card reader via the Cloud API. Payment status polling every 2 seconds with pending overlay and cancel option. Free entries (e.g. Child tickets) recorded instantly without card reader. Optional customer details capture for SMS/email ticket delivery. Stats tab: live attendance figures auto-refreshing every 15 seconds — total attendance, checked in, season ticket holders, gate sales, advance sales, and comp tickets with breakdown by ticket type and sale channel. SumUp Solo reader pairing page for admins with step-by-step instructions. SumUp Cloud API integration updated — CreateReaderCheckoutAsync sends payments directly to the Solo reader via POST /v0.1/merchants/{merchant}/readers/{reader}/checkout endpoint. Reader status polling and webhook support for payment confirmation. appsettings.json populated with SumUp API credentials, merchant code, affiliate key, and paired reader ID. Gate sales auto-check-in customers at point of sale. Pending payments can be cancelled, which voids the order and marks tickets as cancelled. New GateController with AJAX endpoints: CheckIn, GateSale, PollPayment, CancelGateSale, LiveStats, PairReader. New Gate Dashboard and PairReader views.
Released by Dan Birchmore
v3.0.2

Ticketing Bug Fixes & Stripe Webhook

19 Feb 2026
Fixed Stripe webhook failure: API version mismatch between Stripe account (2020-08-27) and Stripe.net library (47.4.0) caused all webhook events to return 400. Added throwOnApiVersionMismatch: false to ConstructEvent and upgraded Stripe account API version. Fixed webhook endpoint URL (was pointing to old membership subdomain). Fixed orphan order cleanup: when SumUp checkout creation fails, the order and ticket records are now immediately deleted instead of being left as phantom Pending records. Fixed all dashboard, gate, and report queries to only count tickets from paid orders. Fixed season ticket check-in FK error (CheckedInByParentId was not being set). Fixed gate scanner CSRF token issues on JSON endpoints.
Released by Dan Birchmore
v3.0.1

Matchday Ticketing Module

17 Feb 2026
Complete ticketing system for first-team matchday operations. Online ticket sales via SumUp Checkout API with payment widget. Gate operations with QR code scanning (html5-qrcode library on iPad Safari), real-time attendance counters, and walk-up ticket sales via SumUp Solo card readers (Cloud API integration). Season ticket management with QR codes and mobile wallet pass placeholders (Apple/Google Wallet). Fixture management with ticket type configuration, fixture templates for quick setup, and complimentary ticket issuance with automatic email/SMS delivery. Comprehensive reporting: fixture summary (attendance, revenue by channel, ticket type breakdown, no-shows), season overview (running totals, average attendance), and revenue report with date/channel filters and CSV export for SumUp reconciliation. New roles: TicketAdmin and GateStaff. New database tables: MatchFixtures, TicketTypes, TicketOrders, Tickets, SeasonTickets, SeasonTicketCheckins, FixtureTemplates, FixtureTemplateTicketTypes. Public ticket page at /Ticketing with mobile-optimised QR ticket display. Short URL /t/{ref} for SMS ticket links. SumUp webhook endpoint at /api/sumup/webhook with HMAC-SHA256 validation. QR codes generated via QRCoder NuGet package. Navigation updated with Ticketing dropdown and public Tickets link. DATABASE: Run AddTicketing.sql then AddVersionHistory_v3.0.1.sql.
Released by Dan Birchmore
v2.7.10

SMS Cost Display Fix

16 Feb 2026
Fixed SMS compose screen rounding costs to the nearest penny — a rate of 2.8p was displaying as 3p. Costs under £1 now show in pence (e.g. 2.8p/recipient, 5.6p/recipient) and switch to pounds for larger amounts (e.g. £2.80). SMS Settings rate input now accepts 4 decimal places to match the stored precision.
Released by Dan Birchmore
v2.7.9

SMS Cost Tracking & Compose Enhancements

16 Feb 2026
SMS compose screen now shows a live character counter with segment breakdown (160 chars = 1 segment, then 153 per concatenated segment, up to 6 max). Messages exceeding the maximum are blocked before sending. Estimated cost per recipient and total cost shown in real time based on number of recipients selected. Every SMS sent — whether by staff from Comms, or by the system for availability requests, reminders, and change notifications — is tracked with segment count, cost per segment, and total cost. New SMS Settings page under Set Up allows admins to configure the rate per segment and maximum segments. New SMS Usage report shows monthly cost breakdown by sender with detailed message-level view for bill reconciliation. ViewMessage page now shows segment count and cost for SMS messages. New AppSettings table stores configurable system settings. Changed EveryMessage DeliveryReceipt parameter from 1 to 0 — delivery receipts are still polled from the API but this stops the service sending summary delivery notifications as inbound SMS messages. DATABASE: Run AddSmsCostTracking.sql before deploying.
Released by Dan Birchmore
v2.7.8

Refund Email Fix & Parent Refund Notification

16 Feb 2026
Fixed refund staff alert emails showing raw HTML tags instead of rendered content in the Comms inbox — the ViewMessage page now correctly detects HTML in email bodies that start with div/table/p tags (previously only detected full HTML documents). Parents now receive a branded refund confirmation email when a refund is processed, with refund amount, player names, refund type (full/partial), reason, and a note that the refund may take 5–10 business days to appear. Parent notification is sent for both in-app refunds and Stripe webhook refunds.
Released by Dan Birchmore
v2.7.7

Refund Form Fix & Age Group Corrections

16 Feb 2026
Fixed refund form freezing after clicking Process Refund (disabled button was preventing form submission). Fixed deactivation form same issue. Corrected age group MinAge/MaxAge values to match FA grassroots school year system — age is calculated on 31 Aug of the season start year. U12 now correctly spans two school years (Year 8 + 9, ages 12–13). Age group suggestion now shows birth date range and calculated school year age for transparency. Run SQL/FixAgeGroupRanges.sql to update age group definitions.
Released by Dan Birchmore
v2.7.6

Deactivation Workflow with Optional Refund

16 Feb 2026
Deactivating a member now opens a dedicated confirmation page showing their details, team memberships, and any payments eligible for refund. Admins can enter a reason for deactivation, choose whether to issue a refund (full, single instalment, or custom amount), and provide a justification. The system deactivates the member, removes them from all teams, and optionally redirects to the refund page with pre-filled details. Reactivation remains a single click. Refunds can also still be issued after deactivation from the member payment history. Every action (deactivation, team removal, refund decision, reactivation) is recorded in the audit log with who performed it and why.
Released by Dan Birchmore
v2.7.5

In-App Refunds & Enhanced Payment History

16 Feb 2026
Admins, Finance, and Secretary can now issue refunds directly from the member detail page — choose full or partial amount, enter a mandatory justification, and the system processes the refund through Stripe, cancels any active subscription, updates all payment and member statuses, sends staff notifications, and records every action in the audit log. Payment history now clearly shows refunded status with purple badge, refund amount, date, who processed it, and the justification. Refunded payments show crossed-out totals with zero outstanding. Issue Refund button appears on eligible payments for authorised users only.
Released by Dan Birchmore
v2.7.4

Stripe Sync Fix — Subscription Refunds

16 Feb 2026
Fixed Stripe Sync not detecting refunds or cancellations on instalment (subscription) payments. Two bugs: (1) the sync skipped payments already marked Paid, even if incorrectly — Jack Birchmore was showing as Paid despite only 1 of 10 instalments collected; (2) refund detection only checked PaymentIntentId, which subscription payments do not have — the refund was on an invoice charge. Sync now queries all Stripe invoices for a subscription to calculate actual amount paid, then checks each invoice charge for refunds. Also corrects payments with wrong status (e.g. Paid when subscription is still active).
Released by Dan Birchmore
v2.7.3

Stripe Refund Handling & Manual Sync

16 Feb 2026
Webhook now handles charge.refunded events — refunds issued in Stripe automatically update payment and member status to Refunded. Staff receive email notifications for all refunds. New Stripe Sync tool (Set Up > Stripe Sync) lets admins manually reconcile all payment records with Stripe to recover from missed webhooks — checks for completed checkouts, subscription cancellations, and refunds. Payments report now shows Refunded status with filter and summary card.
Released by Dan Birchmore
v2.7.2

Contextual Navigation Badges

15 Feb 2026
Notification badges now show on individual menu items so users can see exactly what needs attention. Match Day dropdown shows separate counts for pending Fixtures and Availability with no-responses. Club dropdown shows counts for unread Comms, pending Members registrations, and Compliance expirations within 30 days. All powered by a single unified polling endpoint for efficiency.
Released by Dan Birchmore
v2.7.1

Bug Fixes — SMS Inbox, Auth & Build

15 Feb 2026
Fixed SMS inbox polling: delete API was calling non-existent method (DeleteInboxMessage ? DeleteInboundMessages). Now batches deletes in a single API call using MessageCSV parameter. Fixed crash on Availability Respond page when user is not logged in (missing Authorize attribute). Also added Authorize to Compliance controller. Added missing ILogger to AvailabilityController. Fixed Razor build error in Detail view.
Released by Dan Birchmore
v2.7.0

Availability Improvements & Home/Away Fixtures

15 Feb 2026
Availability: managers can now select or exclude specific players when sending availability requests (all selected by default). Members can be added to an existing request after it has been sent. Team staff (managers, coaches) receive email and SMS notifications when a player changes their availability after initially accepting. Upcoming fixtures pull through to the availability form — select a fixture and all details pre-fill automatically. Fixtures: managers now choose Home or Away when creating a fixture. Only home fixtures queue for pitch allocation by the secretary. Away fixtures are logged directly with Confirmed status.
Released by Dan Birchmore
v2.6.0

Multi-Team Support, Stripe Reconciliation & Error Logging

15 Feb 2026
Players can now belong to multiple teams (e.g. Saturday Blues and Sunday Reds) via a new MemberTeams table. Admin member detail shows all assigned teams with add/remove controls and primary team badge. Team Roster, Availability, and Comms all use correct team membership instead of age group matching. Stripe payment metadata now includes parent name and per-child fee breakdown for easy reconciliation. Application errors now log to Logs/errors.log for simple troubleshooting. Fixed Comms recipient count and send logic which was incorrectly targeting all parents in an age group rather than the specific team.
Released by Dan Birchmore
v2.5.1

Multi-Team Support, Stripe Reconciliation & Error Logging

15 Feb 2026
Players can now belong to multiple teams (e.g. Saturday Blues and Sunday Reds). Admin member detail shows all teams with add/remove controls. Team Roster and Availability use the new MemberTeams junction table. Stripe metadata now includes parent name and per-child breakdown for easy reconciliation. Application errors now log to Logs/errors.log. Bug fixes: session auth fix for Availability and Compliance pages, Fixture Secretary role name correction, Team Roster filtering by team instead of age group.
Released by Dan Birchmore
v2.5.0

Staff Compliance Tracking & Availability System

15 Feb 2026
STAFF COMPLIANCE: Track FA qualifications (DBS, Safeguarding, First Aid, Coaching badges) with traffic-light dashboard, auto-expiry reminders, proof document uploads. AVAILABILITY SYSTEM: Teamer-style availability requests via email + SMS, parent responds in-app, manager sees live summary with reminder nudges.
Released by Dan Birchmore
v2.4.0

Payment Monitoring & Alerts

15 Feb 2026
PAYMENT FAILURE MONITORING: • Webhook now tracks instalment payment failures — failure count, reason, next retry date • Payment status 'FailedRetrying' added for payments being retried by Stripe • Members marked 'Overdue' when subscription cancelled with outstanding balance • Audit trail entries for PaymentFailed and PaymentOverdue events PARENT NOTIFICATIONS: • Parents automatically emailed when an instalment payment fails • Email includes failure reason, amount due, next retry date, and dashboard link • Recommend also enabling Stripe's built-in customer emails for card update links STAFF ALERT SYSTEM: • New PaymentAlertSubscribers table — select which staff receive payment alerts • Three alert types: Failures (payment declined), Overdue (subscription cancelled), Completed (fully paid) • Staff alerts include full parent contact details (name, email, phone) for follow-up • Urgent alerts for overdue payments with outstanding balance breakdown SET UP — PAYMENT ALERTS PAGE: • New page under Set Up for Admin/Finance users • Checkbox grid to subscribe staff and configure which alert types they receive • Shows current payment health status (failed count, retrying count, outstanding balance) • How-it-works guide explaining Stripe retry behaviour • System Admin and Finance users auto-subscribed on first run FINANCE REPORT ENHANCED: • Failed payments section now shows failure count, reason, last failure date, parent phone • New 'Retrying' status filter for payments being retried • Failed filter now includes both Failed and FailedRetrying statuses DATABASE: Run AddPaymentMonitoring.sql before deploying
Released by Dan Birchmore
v2.3.3

Failed Seed Recovery + Seed Controller Fix

15 Feb 2026
SEED CONTROLLER FIX: • All DELETE statements now wrapped in a database transaction with try/catch and rollback • Previously, deletes ran without a transaction — if any failed mid-way, earlier tables were already wiped • Added missing table deletes before Parents: SecondaryContacts, FixtureRequests • Added conditional deletes for optional tables (EmailMessages, EmailThreads, MailboxGroups, etc.) • Uses IF OBJECT_ID pattern to safely skip non-existent tables without breaking the transaction RECOVERY: • RecoverFromFailedSeed.sql script restores all data lost during partial seed execution • Restores Members, UserRoles, UserAgeGroups wiped by the incomplete seed • Regenerates membership numbers via sp_GenerateMembershipNumber • Runs in a single transaction — all or nothing DATABASE: Run RecoverFromFailedSeed.sql if affected by the partial seed issue
Released by Dan Birchmore
v2.3.2

Restore Registration Type Selector

15 Feb 2026
REGISTRATION TYPE SELECTOR RESTORED: • The "My Child / Children" vs "Myself (18+)" card selector is back on the registration page • Selecting "Myself (18+)" now redirects to the dedicated adult form at /Registration/SelfRegister • Selecting "My Child / Children" stays on the child registration form as before IMPORTANT — DATABASE MIGRATION: • AddSecondaryContacts.sql MUST be run before deploying v2.2.0+ code • This script adds Relationship, SubscribeClubNews, SubscribeTeamNews columns to Parents • Without these columns, ALL queries touching the Parents table will fail • This affects: Admin Registrations, Dashboard, Reports, Comms — all pages break • The script is idempotent and safe to re-run
Released by Dan Birchmore
v2.3.1

Fix — Self-Registration Player Data

15 Feb 2026
BUG FIX — SELF-REGISTRATION PLAYER DATA: • Player name and DOB hidden fields were posting empty on self-registration form • The [Required] validation on ChildRegistrationViewModel blocked the submission before the server-side override could apply • Fix: Controller now clears ModelState for Children[0].FullName and Children[0].DateOfBirth in self-reg mode (server populates them from parent details) • Additional fix: Form submit interceptor added to guarantee hidden fields are synced from step 1 before POST • MutationObserver now syncs on every step transition, not just step 3 • No database changes required
Released by Dan Birchmore
v2.3.0

Separate Adult Self-Registration Form

15 Feb 2026
ADULT SELF-REGISTRATION (18+): • New dedicated registration form at /Registration/SelfRegister for adult players • All labels written in first person — "Your Details", "Your Playing Preferences" etc. • No parent/guardian references, no relationship dropdown, no secondary contact section • No "Add Another Player" button — single player entry only • Player name and DOB automatically synced from the personal details step (hidden fields) • Proof of identity label updated (passport, driving licence, or photo ID) • Client-side 18+ date of birth validation with clear error message and redirect link • Server-side 18+ validation — rejects registration if under 18 • Communication preferences (club news, team news) still available • Same fees, payment, and terms steps as child registration • Before You Begin step includes link back to child registration form CHILD REGISTRATION UPDATED: • Self-registration radio toggle removed from Step 0 • Replaced with info banner linking to the adult form for 18+ players • All self-registration JS removed (toggle, label updater, auto-fill) • Form is now exclusively for parent/guardian registering children CONTROLLER CHANGES: • New SelfRegister GET action serves the adult registration view • Register POST returns correct view (SelfRegister or Index) on validation failure • No database changes required
Released by Dan Birchmore
v2.2.1

Relationship Field for Parent / Guardian

15 Feb 2026
RELATIONSHIP TO PLAYER: • Both the primary and secondary parent/guardian now have a Relationship to Player dropdown • Dropdown options: Parent, Guardian, Step-Parent, Grandparent, Foster Carer, Other • Selecting "Other" reveals a free-text input — the typed value is stored as the relationship • Stored on Parents.Relationship (NVARCHAR 100) and SecondaryContacts.Relationship (NVARCHAR 100) • Defaults to "Parent" for existing records DATABASE CHANGES: • Parents table: added Relationship (NVARCHAR 100, default 'Parent') • SecondaryContacts.Relationship widened from 50 to 100 chars • Re-run AddSecondaryContacts.sql (idempotent — safe to re-run)
Released by Dan Birchmore
v2.2.0

Communication Preferences & Secondary Contacts

15 Feb 2026
PARENT / GUARDIAN LABELLING: • "Parent" renamed to "Parent / Guardian" throughout registration • "Before You Begin" step updated to reflect parent/guardian terminology COMMUNICATION PREFERENCES: • Parents/guardians can now opt in or out of two communication channels during registration: – General Club News: events, announcements, and updates from the club – Team & Age Group News: fixtures, match updates, and team-specific information • Both are opted-in by default • Preferences stored on Parent record (SubscribeClubNews, SubscribeTeamNews) • Comms module now respects preferences: – "All Parents" broadcasts only reach parents subscribed to Club News – Age Group and Team sends only reach parents subscribed to Team News – Individual and staff-targeted sends are unaffected SECOND PARENT / GUARDIAN: • Optional second parent/guardian can be added during registration • Collapsible section with name, email, phone, and relationship fields • Relationship options: Parent/Guardian, Step-Parent, Grandparent, Other Family Member • Independent communication preferences — each contact can opt in/out separately • Secondary contacts automatically included in broadcasts where they are subscribed • New SecondaryContacts table with cascade delete from parent • Client-side validation: name and email required only when toggle is checked DATABASE CHANGES: • Parents table: added SubscribeClubNews (BIT, default 1), SubscribeTeamNews (BIT, default 1) • New SecondaryContacts table with FK to Parents • Run AddSecondaryContacts.sql before deployment
Released by Dan Birchmore
v2.1.2

Build Fix — Comms Sent Folder

15 Feb 2026
BUILD FIX: • Fixed Razor compilation error in Comms/Index.cshtml (RZ1010: nested @{} block inside @if) • No functional changes from v2.1.1 — same Sent folder fix now compiles correctly
Released by Dan Birchmore
v2.1.1

Comms — Sent Folder Fix

15 Feb 2026
BUG FIX — SENT FOLDER: • Sent folder was only showing SMS and bulk compose messages • Email replies sent from inbox threads (stored as outbound EmailThreadMessages) were missing • Sent view now loads both message types and merges them into a single chronological list • Email replies display with a reply icon, recipient address, and link back to the original thread • No database changes required
Released by Dan Birchmore
v2.1.0

Fixture Notifications, Reschedule & Workflow

15 Feb 2026
FIXTURE ALLOCATION NOTIFICATIONS: • Team management staff (managers, coaches) automatically notified by email when a fixture is allocated • Email includes full match details: date, kick-off, end time, pitch, duration, and secretary notes • Links directly to fixture details and pitch schedule • New email template: fixture-allocated.html RESCHEDULE FIXTURES: • New Reschedule action allows changes to allocated fixtures (date, time, pitch, notes) • Restricted to System Admin and Secretary roles only • Full audit trail: every change logged with before/after values (e.g. "Date: 22 Feb ? 01 Mar; Pitch: Goaters Road ? South Pitch") • Reschedule button appears on fixture details page for authorised users • Overlap detection and pitch availability checking on reschedule form • Confirmation prompt before saving changes HOME FIXTURES ONLY: • Removed Home/Away toggle from fixture request form • All fixture requests are now automatically set as Home games • Simplifies the request form — managers only ever request home fixtures AUDIT TRAIL IMPROVEMENTS: • Fixture allocation now logs kick-off time alongside pitch name • Reschedule changes captured with detailed before/after comparison • All fixture actions (Request, Allocate, Reschedule, Reject, Cancel) fully audited with user and timestamp PERMISSIONS: • New CanRescheduleFixtures permission: System Admin + Secretary only • CanAllocateFixtures unchanged: Admin + System Admin + Secretary
Released by Dan Birchmore
v2.0.2

Weekend Pitch Schedule View

15 Feb 2026
NEW: PITCH SCHEDULE VIEW - Weekend-focused view showing Saturday and Sunday side by side - Pitches as rows with a visual timeline from 8am to 5pm - Fixture blocks colour-coded: green (allocated) and amber dashed (pending) - Blocks show kick-off, end time, team name, and opposition - Navigate between weekends with prev/next buttons - Shows fixture counts per day and "This weekend" indicator - Unallocated fixtures below the grid with direct allocate links VIEW TABS: - Fixtures page now has two tabs: Pitch Schedule and Calendar - Pitch Schedule is the default view (linked from main nav) - Calendar view preserved for monthly overview
Released by Dan Birchmore
v2.0.1

Fixture Management — UX Improvements

15 Feb 2026
FIXTURE TIME RANGES: • Calendar and list views now show full time ranges (e.g. 10:00–11:00) instead of just kick-off time • Duration calculated from team fixture settings • Pending fixtures display "TBC" until secretary sets the time ALLOCATION IMPROVEMENTS: • Kick-off time defaults to 9:00 AM instead of team default • Quick-select time buttons (9am through 3pm) for fast allocation • Manual time input still available alongside quick buttons • Live "finishes at" display updates as time is changed • Team default time shown as a hint DETAILS PAGE REDESIGN: • Match-day style hero banner with date tile, VS separator, and team details • Dedicated kick-off card showing start time, end time, and duration • Improved card layout with colour-coded borders • Better visual hierarchy for pitch, requester, and allocator info BUG FIX: • Fixed KickOffTime column NULL constraint that prevented fixture requests from saving
Released by Dan Birchmore
v2.0.0

Fixture Management

15 Feb 2026
Major release: Full fixture request and pitch allocation system. FOR MANAGERS: • Request home fixtures via a simple form — select team, date, kick-off time, and opposition • Booking window limited to 14 days ahead to prevent premature scheduling • Track all your requests from the My Fixtures page with live status updates • Cancel pending requests if plans change • Team defaults auto-fill kick-off time based on age group settings FOR SECRETARY: • Pending fixture queue with urgency indicators showing days until fixture • Allocate pitches with real-time availability — busy pitches are flagged and disabled • Format compatibility checking — pitches show whether they support the required game format • Time overlap detection prevents double-booking pitches at the same time • Reject requests with a reason that is visible to the requesting manager • Notes field to communicate pitch instructions back to the manager CALENDAR: • Monthly calendar view showing all allocated and pending fixtures • Colour-coded entries — green for allocated, amber for pending • List view below calendar with full fixture details • Click any fixture for full details including pitch, requester, and notes • Navigation between months with previous/next controls SETUP (Pitches & Teams): • New Pitches management screen in Set Up — add, edit, and deactivate pitches • Each pitch configured with supported game formats (3v3, 5v5, 7v7, 9v9, 11v11) • Team edit screen now includes fixture settings: typical format, duration, default kick-off time • Duration settings used for overlap detection during allocation NAVIGATION & PERMISSIONS: • Fixtures link added to main navigation bar for all staff • Pending count badge on nav and Pending button for secretary • Managers and coaches can request fixtures for their assigned teams • Secretary, Admin, and System Admin can allocate, reject, and manage all fixtures • All staff can view the fixture calendar for their accessible teams
Released by Dan Birchmore
v1.1.5

SMS Reply from Conversation

15 Feb 2026
• Reply to inbound SMS directly from the conversation thread view • Chat-style reply input with auto-growing textarea at the bottom of the conversation • Live character counter showing SMS part calculation (160 per single / 153 per multi-part) • Replies sent via two-way mode so responses route back through the same pool number • Ctrl+Enter keyboard shortcut to send quickly • Each reply creates a full Message and MessageRecipient record for audit and delivery tracking • Delivery receipts for replies are automatically matched by the existing polling service • Conversation view refreshes after sending to show the new outbound message in the timeline • Back to Inbox and Archive controls moved to secondary position below the reply bar
Released by Dan Birchmore
v1.1.4

Unified Inbox & SMS Cleanup

15 Feb 2026
• SMS conversations now appear in the unified Communications inbox alongside emails and notifications • Inbound SMS messages are sorted chronologically with email threads and system notifications • SMS conversations display with a green accent and phone icon for easy identification • Removed separate SMS Inbox page in favour of the unified view • Inbound SMS messages are automatically deleted from the EveryMessage remote inbox after download • Prevents duplicate message fetching on subsequent polling cycles • SMS unread count now included in the main inbox badge and navbar notification count
Released by Dan Birchmore
v1.1.3

SMS Inbound & Version History

15 Feb 2026
• Inbound SMS message polling from EveryMessage InboxTotals and InboxService APIs • Automatic collection and storage of incoming SMS replies • Phone number matching to link inbound SMS to registered parents • SMS inbox view in the Communications area with read/archive controls • SMS conversation thread view linking outbound and inbound messages • Version history page — track all releases with summaries, accessible from the footer • Version history stored in database for easy updates with each release
Released by Dan Birchmore
v1.1.2

Reporting & Data Scope

10 Feb 2025
• Player register report with filtering and export • Team roster reports with contact details • Contact directory for staff and parents • Payment reports with status tracking • User data scope control — restrict visibility by age group • Age Group Coordinator (AGC) role with scoped access • External staff management for non-registered volunteers
Released by Dan Birchmore
v1.1.1

SMS Delivery Tracking

08 Feb 2025
• SMS delivery receipt polling from EveryMessage API • Automatic matching of delivery receipts to sent messages • Real-time delivery status updates (Delivered, Failed, Expired) • Processing log entries for delivery receipt tracking • Message-level status rollup when all recipients confirmed
Released by Dan Birchmore
v1.1.0

Communications & Payments

01 Feb 2025
• Broadcast email and SMS messaging to groups, teams, and individuals • Two-way email via staff mailboxes with threaded conversation view • Staff mailbox configuration with aliases and group distribution lists • Stripe payment integration for registration fees • Registration fee management per age group and playing day • Discount code support for hardship and special pricing • Inbound email processing via Mailgun webhooks • Personal sender mode with reply-to mailbox routing • Notification system for internal staff alerts
Released by Dan Birchmore
v1.0.0

Initial Release

15 Jan 2025
• Parent registration and login with encrypted password storage • Child/player registration with date of birth, medical info, and photo consent • Document upload for ID verification (passport, birth certificate) • Season management with open/close registration control • Admin dashboard for reviewing and approving registrations • Age group and team configuration • Audit logging for all system actions • Role-based access control (Admin, Secretary, Finance, etc.) • Club-branded responsive UI with Ascot United FC theming
Released by Dan Birchmore
Back to Home