Latest Changes

This document tracks the latest changes and releases for the Horsify platform. New releases are automatically prepended to this file.


v2026.10.05.922 — Clearer media and notices

Released: October 05, 2026

Improvements

  • Feature Clips Reliability: Event feature clips are now served consistently from the assets CDN, improving playback reliability for riders and organisers. [PR #8722]
  • Club Notifications Clarity: The notifications bell now lists notices from all your clubs, with each link opening the correct club’s page so you can quickly see the right information. [PR #8708]

Bug Fixes

  • Video Thumbnails in Help Articles: Knowledge base articles with videos now show clickable thumbnails, making it easier to watch help content directly from each article. [PR #8724]

v2026.10.05.921 — Streamlined onboarding and shopping

Released: October 05, 2026

New Features

  • Simplified Rider Sign-Up: Riders who click "Start free" can now create an account without having to start an organisation, making it faster to get started. [PR #8718]
  • Size Chart-Based Store Products: Store product sizes can now be seeded directly from a size chart, helping organisers set up consistent, accurate size options for riders. [PR #8719]

Improvements

  • Clearer Member Account Status: Members without a Horsify login now consistently show "No Horsify account" in their profile, giving organisers a clearer view of who can access online features. [PR #8717]
  • Organiser Product Breadcrumb Fix: The organiser product breadcrumb now correctly takes you to the product edit page, reducing navigation confusion when managing store items. [PR #8720]
  • Smarter Riding School Paywall: The riding-school paywall now only appears once the API confirms it should, preventing premature or incorrect paywall displays. [PR #8716]

v2026.10.05.920 — Smoother club management

Released: October 05, 2026

New Features

  • Club site redirects from old URLs: Club websites can now set up 301 redirects from old addresses so visitors automatically land on the new Horsify-powered site. [PR #8709]
  • SMS allowance and rider message limits: Organisations now have a Horsify-managed monthly SMS allowance and are limited to one SMS per rider per channel, helping control costs and avoid over-messaging. [PR #8703]
  • Flexible signup without choosing a role: New users can sign up without immediately choosing Rider or Organiser, then create an organisation later when they’re ready. [PR #8700]

Improvements

  • Sponsor management restricted to club admins: Only a sponsor’s club admins can edit, delete or change its logo, keeping sponsor content under proper control. [PR #8712]
  • Sponsor logos use shared logo storage: Sponsor logos now use the shared logo path for more consistent display and easier management across the platform. [PR #8710]
  • Client list faster and more searchable: The Clients page now loads a page at a time and uses API-based filters and search, making large client lists quicker to browse and find the right rider. [PR #8702]
  • Manual registrations prefill from rider profiles: When adding a registration manually, Horsify now pre-fills the form using matched rider profile details to reduce typing and errors. [PR #8701]
  • Club venues kept managed with clearer approvals: A club’s own venue stays marked as managed, and organisers are clearly notified when Horsify decides on venue requests. [PR #8705]
  • Venue search listing toggle: Venue editors can now reliably turn “List this venue in search” on or off so venues appear correctly in public search. [PR #8699]
  • Landing navigation simplified for clubs: The duplicate “For clubs” link has been removed from the landing navigation, making the menu clearer for visitors. [PR #8697]
  • Home school remembered for riders: Horsify remembers each account’s home riding school and surfaces its “Book a lesson” link on the My Lessons page for quicker booking. [PR #8707]
  • SMS notifications open in correct organisation context: Notifications now open on the correct page within the organisation they belong to, ensuring context is preserved when reviewing messages. [PR #8708]
  • Notification history grouped under the bell icon: The bell icon now shows everything sent to a person, making it easier to review all recent notifications in one place. [PR #8708]
  • Roster views open in named organisation: Roster links from notifications now open in the organisation specified in the notification, reducing confusion when working with multiple clubs. [PR #8708]
  • Paid-plan organisations no longer offered free trials: Horsify stops recommending trial plans to organisations already on a paid plan, keeping plan suggestions relevant. [PR #8704]

Bug Fixes

  • Imported events save with clear explanations: Imported events now use the shared sponsor logo path and provide an explanation instead of failing silently when they can’t be saved. [PR #8709]
  • Web application firewall rate limits abusive traffic: The WAF now rate-limits page requests and blocks a crawler IP range behind bursts of server errors, improving reliability for legitimate users. [PR #8675]
  • Test auth tokens correctly mark confirmed emails: Test authentication tokens now accurately reflect whether an email is confirmed, reducing confusion in test environments. [PR #8713]

v2026.10.05.919 — Safer access & clearer roles

Released: October 05, 2026

New Features

  • Yard board link for non-account staff: Riding school staff without a Horsify login can now be given a secure yard board link, making it easier to share schedules with helpers and casual staff. [PR #8685]

Improvements

  • Account roles as per-organisation hats: Roles are now managed as “hats” per club or riding school instead of broad identity roles, giving organisers more precise control over who can do what in each organisation. [PR #8693]
  • Staff access tied to club membership: Staff permissions are now granted strictly via that person’s membership at a specific club, ensuring access is scoped correctly to each organisation. [PR #8690]
  • Club-site content links sign public blobs only: Club website content now signs links only to public containers, reducing accidental exposure of internal assets while keeping media sharing straightforward. [PR #8686]

Bug Fixes

  • Staff records require confirmed email: Staff accounts and /api/me/context now only treat an email as staff-linked once it’s confirmed, preventing mis-association of staff records. [PR #8694]
  • Confirmed email required to claim staff record: An unconfirmed email can no longer claim a staff record, tightening security around staff identity and access. [PR #8689]
  • Staff can’t take over existing client logins: Staff users can no longer rewrite the login details of clients who are already known elsewhere in Horsify, protecting riders’ accounts from unintended changes. [PR #8688]
  • Phone verification resets on number change: When a phone number is changed it is automatically marked as unverified, and imports avoid altering existing account holders, improving contact security and integrity. [PR #8687]
  • Yard board token hidden from analytics URLs: Yard board tokens are now redacted from analytics page URLs, preventing sensitive access links from appearing in logs or shared screenshots. [PR #8687]

v2026.10.04.918 — Riding school imports & safer exports

Released: October 04, 2026

New Features

  • Riding school site imports: Automatically set up riding school sites from HorseHand, including plans, venues, facilities, lessons, programs, horses and agistment, so new schools can get online faster. [PR #8680]
  • HorseHand photo import ledger: Record all imported HorseHand photos in an upload ledger to keep track of every riding school image. [PR #8681]

Improvements

  • Riding school booking rules: HorseHand imports now correctly treat lesson arenas as bookable while keeping school horses themselves off direct online booking, so lesson types can cleanly reference arenas without overbooking horses. [PR #8681]
  • Riding school site view in hub: The site management hub now focuses on riding school sites instead of the Club Site pitch, giving schools a more relevant management view. [PR #8680]
  • Stable HorseHand import messaging: Removed outdated “save the theme once” advice from the HorseHand importer for a clearer setup flow. [PR #8681]

Bug Fixes

  • Large photo upload protection: Prevented long runs of image uploads from pushing the API over 1 GiB of memory, improving stability during heavy photo sessions. [PR #8683]
  • Safer CSV exports and links: Hardened CSV exports against formula injection, tightened handling of Care Assistant vaccination records, and improved safety of event links. [PR #8680]
  • Reliable venue search while editing events: Fixed an issue where the venue search could drop out when draft backups or autosaves run during event editing. [PR #8682][PR #8677]

v2026.10.03.917 — Contact info dialog fixes

Released: October 03, 2026

Bug Fixes

  • Contact Info Dialog Now Updates Correctly: Fixed the client contact-info dialog so it correctly reflects the selected client’s details and behaves consistently when opened. [PR #8674]

v2026.10.03.916 — Stronger security, smoother sessions

Released: October 03, 2026

New Features

  • Coach intakes on session dates: Session dates can now show which intake coaches are teaching them, making it easier to see who is running each block of lessons. [PR #8666]

Improvements

  • Client list and emails: Organisers can see every client in the clients list, and keep an email address on file even for clients without a login, helping with broader communication. [PR #8672]
  • Sponsor reporting accuracy: Sponsor impression and click counts now run off stable view and request data, improving the accuracy of sponsor reporting. [PR #8650]
  • Local lesson times in calendars: Coach and rider calendar feeds now show each lesson at its actual local time instead of a UTC-based time, avoiding confusion around time zones. [PR #8670]
  • Family membership renewal emails: Membership renewals for children are now emailed to their guardian, one email per family, reducing duplicate messages and making renewals clearer. [PR #8661]

Bug Fixes

  • Secure entry form uploads: Files uploaded with an entry form are now strictly tied to that entry, preventing them being accessed or associated elsewhere. [PR #8667]
  • Membership application upload security: Membership application uploads are now bound to the specific application record to ensure they can’t be misused. [PR #8649]
  • Safer SMS one-time codes: SMS MFA codes are now HMAC-based, hashed and capped, with improved support for NZ mobile numbers and tighter limits on donation intents. [PR #8641]
  • Stronger sign-in route checks: Sign-in-only routes now enforce ownership and membership checks via the authorisation service, improving protection around login-related actions. [PR #8652]
  • Consistent API sign-in requirements: APIs now require sign-in by default via an authorisation fallback policy, reducing the risk of unintended public access. [PR #8644]
  • Broader endpoint authorisation: A–Z API endpoints and membership-related checks are now all routed through the organisation authorisation service, ensuring consistent access control. [PR #8651]
  • Abuse and spam limits: Various counts have been bounded, email amplification has been reduced, and support-ticket proxy usage is limited to curb abuse patterns. [PR #8643]
  • Campaign content safety: Campaign bodies are sanitised and test sends are confined, reducing the chance of unsafe or unintended campaign content being delivered. [PR #8648]
  • Public-only asset delivery: The assets CDN now serves only public blob containers, preventing accidental exposure of private files. [PR #8647]
  • Membership uploads protection: Membership-related uploads are now handled via private blob containers, strengthening protection for member documents. [PR #8649]
  • Account deletion safeguards: Deleting an account now requires re-authentication and stages the erasure process, helping prevent accidental or unauthorised deletions. [PR #8653]
  • Lesson waiver validity: A program place now requires a waiver that is valid on the day of the session, ensuring riders have up-to-date consent in place. [PR #8666]
  • Calendar feed accuracy: Coach and rider feeds now correctly report each lesson’s real time, fixing previous timing mismatches. [PR #8666]
  • Boot loader hang on sign-in: The web app no longer hangs due to a boot loader running during enhanced navigation on sign-in, improving reliability when logging in. [PR #8668]
  • Blazor crash fixes: Several Blazor error-boundary crashes observed in production have been fixed, and error pages now log their reference alongside the exception for easier troubleshooting. [PR #8660]
  • Identity schema stability: The Identity schema version is now pinned so it matches migrations, preventing login and authentication issues caused by schema drift. [PR #8664]
  • Client email retention without login: Fixes ensure that typing an email for a client without a login is preserved correctly, avoiding lost contact details. [PR #8672]
  • SMS MFA token handling: SMS MFA codes are now hashed and capped, and the system avoids issuing tokens for unattributed calls, tightening security around multi-factor sign-in. [PR #8641]

v2026.10.02.915 — Secure payments and bookings

Released: October 02, 2026

Improvements

  • Clearer riding school names on bookings: Lessons booked via /riding-school/{slug} now clearly display the correct riding school name, avoiding confusion for riders and organisers. [PR #8657]
  • Accurate registration settlement rules: Registrations are only marked as settled when their payments fully cover the amount owed, improving financial accuracy for clubs and event organisers. [PR #8646]
  • Refund flags no longer misused: Booking cancellations and store status changes no longer incorrectly claim refunds, reducing manual corrections and avoiding unintended payouts. [PR #8640]
  • Smoother login for multi-organisation admins: Admins with access to multiple organisations now land directly in the appropriate context instead of being sent to the organisation picker, speeding up access to admin tasks. [PR #8658]

Bug Fixes

  • Reliable two‑factor setup from Security Settings: The "Set up" button in Security Settings now correctly starts a working multi‑factor authentication flow, helping users secure their accounts without errors. [PR #8638]
  • Safer event registration and school horse modal: Direct event registration routes have been removed and the school‑horse modal is now safely encoded, protecting users from potential XSS issues during sign‑ups. [PR #8637]
  • Correct campaign premium unsubscribe behaviour: Campaign premium unsubscribe now respects the club’s plan rules, applies per‑club unsubscribes, and requires a proper POST request, ensuring compliant and predictable communication preferences. [PR #8642]

v2026.10.02.914 — Smoother lesson scheduling

Released: October 02, 2026

New Features

  • Back-to-back coach bookings: Riders can now book multiple lessons with the same coach consecutively from the coach’s first available time, making it easier to plan longer training sessions. [PR #8655]

Bug Fixes

  • Correct facility hire opening times: Hourly facility hire now correctly opens on the first bookable date with all available times loaded, ensuring organisers and riders see accurate hire slots. [PR #8639]

v2026.10.02.913 — Faster, clearer event pages

Released: October 02, 2026

New Features

  • Horse health declaration prefill: Health declaration forms now prefill your horses, PIC and property details so riders can submit faster with fewer mistakes. [PR #8632]
  • Clinic reminder timing update: Clinic reminder messages now clearly state the entrant’s own ride time instead of the overall event start. [PR #8618]
  • Riding school and equestrian SEO pages: Riding school and equestrian centre pages are now better ranked and easier to find in search engines, helping organisers attract more riders. [PR #8617]
  • HTML performance monitoring: Horsify now measures HTML load times from real browsers, helping us keep public pages responsive for organisers and riders. [PR #8623]

Improvements

  • Event flyer image quality: Event cards and hubs now use a dedicated 640px event image, improving flyer clarity without slowing down page loads. [PR #8634]
  • Organisation and venue logo thumbnails: Organisation and venue logos are now optimised to 640px with thumbnails, making directory cards and headers cleaner and faster to load. [PR #8630]
  • Venue page layout and nearby events: Venue pages now use straightforward sections instead of an accordion and show nearby events, giving riders a clearer path to book or enter. [PR #8628]
  • Rider and venue page prerendering: Rider landing, venue, venue hub, riding-lessons, organisation and hub pages are now prerendered through our performance circuit for faster initial loads and better SEO. [PR #8621]
  • Home page and hub SEO loading: Home page event sections, club hubs, event hubs and directories now load correctly in prerender, improving discoverability and indexation in search engines. [PR #8627]
  • Public pages without loading splash: Public-facing pages now start without a blocking boot splash or theme loader, making them feel snappier and more immediate. [PR #8624]
  • Root stylesheet optimisation: Core site stylesheets have been reorganised for better caching, improving load times for organisers and riders across Horsify. [PR #8622]

Bug Fixes

  • Event flyer cropping on desktop: Desktop lightboxes now show the full flyer image, ensuring riders see all event details. [PR #8616]
  • Event hub snapshot images: Event hub snapshots now correctly carry the 640px flyer image without exceeding performance budgets, keeping pages fast and visually consistent. [PR #8634]
  • Organisation logo snapshots: Organisation detail prerender snapshots now reliably include logo thumbnails, preventing missing or inconsistent branding on first load. [PR #8630]
  • Venue nearby events data: Venue pages now correctly display nearby events and state lists during prerender, avoiding empty or dead-end pages. [PR #8629]
  • Horse health declaration data: Rider horse, PIC and property details now prefill correctly in health declarations, fixing previous cases where fields were left blank or mismatched. [PR #8632]
  • Event reminder times: Event reminders now always show the entrant’s own scheduled time rather than the overall event start, fixing confusing reminder messages. [PR #8618]
  • Linked family member display: Linked family members no longer appear twice in member lists, giving clubs and organisers an accurate view of households. [PR #8615]
  • Event and venue search text accuracy: Search snippets for events and venues now update correctly, so riders see accurate descriptions that match current listings. [PR #8620]
  • SEO index cleanup for thin pages: Thin and duplicate pages are now excluded from search indexing, reducing clutter and improving visibility for important event and club pages. [PR #8620]
  • Club host canonical URLs: Club-hosted sites now correctly reference Horsify as the canonical source, preventing SEO issues where hosts appeared to own Horsify content. [PR #8619]
  • Club host page serving: Club hosts no longer serve Horsify pages as their own, ensuring riders see the correct origin and avoiding misleading branding. [PR #8619]
  • Events page region accuracy (NZ vs AU): The /events page for New Zealand no longer appears as Australian events, fixing region confusion for riders and organisers. [PR #8620]
  • Calendar sitemap handling: The /calendar page is now correctly handled by the sitemap loader, improving indexation and reducing SEO errors for scheduled events. [PR #8625]
  • Public page SEO blockers: Boot splash and blocking theme resources are removed from public pages, fixing SEO issues that prevented proper indexing. [PR #8624]

v2026.10.02.912 — Easier club and venue management

Released: October 02, 2026

New Features

  • Link family club members: Club admins can now link an existing club member into another member's family, simplifying family-based memberships and billing. [PR #8613]
  • Email template preview and test send: Organisation admins can preview and send test emails for template drafts before sending them to riders and members. [PR #8608]

Improvements

  • Retired venue redirects: Retired venue pages now redirect to their state’s venue hub, helping riders and organisers find current venues more easily. [PR #8609]
  • Thin events Stripe parity: “Thin” events now support the full set of Stripe payment actions available to their snapshot equivalents, ensuring consistent payment handling. [PR #8604]

Bug Fixes

  • Venue logos display correctly: Venue logos are now shown in full without unwanted cropping on venue cards and pages. [PR #8610]
  • Better venue SEO content: Venue pages now correctly prerender their about text, contact links and event listings, improving search visibility and sharing. [PR #8606]
  • Canonical pages per market: Venue, event and organisation pages now use the correct canonical URL for their market’s host, reducing duplicate content issues in search engines. [PR #8607]

v2026.10.01.911 — Safer bookings and clearer UI

Released: October 01, 2026

New Features

  • Child Ride Bookings In Child’s Name: Parents can now book horse rides directly in their child’s name, improving clarity for schools and event organisers. [PR #8589]
  • Instructor SMS Availability Messaging: Instructors can text their availability to Horsify’s number in their own words, making schedule updates faster and easier to manage. [PR #8595]

Improvements

  • Accurate Stripe Subscription Totals: The Stripe subscriptions page now loads every organisation so subscription counts show correct totals across your connected accounts. [PR #8597]
  • Stripe Thin-Event Payments From Connected Account: Thin events now fetch sessions and payment intents from the correct connected Stripe account, aligning payments with the right organisation. [PR #8596]
  • Market-Aware SEO Locale Tags: Event pages, club hubs and club sites now set their og:locale based on the market or organisation country, improving search and social sharing accuracy for different regions. [PR #8603]
  • More Visible Keyboard Focus On Dark Cards: The focus ring has been made clearly visible on dark cards, improving keyboard navigation for riders and organisers. [PR #8602]
  • Validation Errors Clearly Highlighted: Fields that fail validation now show a red border and read out their error with the field, making form issues easier to spot and fix. [PR #8602]
  • Reconnection Overlay Matches Current Palette: The reconnect overlay has been updated to match the current visual palette, keeping the interface consistent when connections drop. [PR #8602]
  • Consistent Club Navigation Overflow Links: Overflow-tier club navigation links stay in a flex row so the chevron remains correctly aligned with the label, improving menu readability. [PR #8599]
  • Lesson Rescheduling Only Where Allowed: The Reschedule option on “My Lessons” now only appears when the school allows rescheduling, reducing confusion for riders. [PR #8592]
  • WCAG 2.2 Accessibility Fixes Recorded: Recent accessibility improvements have been documented in the WCAG 2.2 guide, helping organisers understand and rely on Horsify’s accessibility compliance. [PR #8600]

Bug Fixes

  • Members Cannot See Instructor Contact Details And SMS History: Club members are no longer able to read instructors’ contact details or SMS history, protecting instructor privacy. [PR #8601]
  • Lesson Booking Without Phone Number: Signed-in riders who don’t have a phone number on their profile can now successfully book lessons instead of being blocked. [PR #8591]
  • Correct Retry Payment Links: Automatic payment retry links now send payers back to existing pages rather than dead links, reducing failed retries. [PR #8590]
  • Hide Book Hover Card During Quick-Info Popup: The book’s hover card is hidden while a lesson’s quick-info popup is open, preventing overlapping UI elements. [PR #8591]
  • Remove Anonymous School-Horse Booking Route: The anonymous school-horse booking route that bypassed guest checkout has been removed, ensuring bookings follow the proper flow. [PR #8589]

v2026.09.25.896 — Agistment & care upgrades

Released: September 25, 2026

New Features

  • Agistment organiser module: Manage paddocks, units, placements, jobs, agreements and signing directly in Horsify instead of the previous “Coming soon” placeholder. [PR #8466]
  • Agistment public signing page: Share a public link so agistment agreements can be reviewed and signed online by riders and owners. [PR #8466]
  • Agistment reminders: Automatically send nightly reminders for paddock tasks, jobs and lease events so important agistment work is not missed. [PR #8466]
  • Wound management for horses: Track wound cases, photos, treatments and dressing/dose logs in Horsify, with reminders when the next treatment is due. [PR #8465]
  • Horse health Wounds section: View wound information alongside the rest of a horse’s health details on a dedicated Wounds section. [PR #8465]
  • Horse care history editing: Riders can now correct or remove entries from a horse’s care history to keep records accurate. [PR #8464]
  • Day planning on the appointment book: Plan a day’s lessons from the appointment book with draft plans, a plan bar, issue panel, editor and apply flow, including history of previous plans. [PR #8458]

Improvements

  • Group lesson capacity handling: Group lessons now respect staff-set size limits while still allowing a full lesson to accept an additional rider when needed. [PR #8475]
  • Lesson booking edits preserve pricing: Editing a lesson booking no longer changes its original type or price, avoiding accidental re-pricing. [PR #8470]
  • Booking moves keep lesson length: When a lesson booking is moved, it keeps its original duration instead of inheriting the new slot’s length. [PR #8462, PR #8460]
  • Rider move time suggestions: When moving a rider between lessons, the system only offers times that will accept the move, reducing trial-and-error. [PR #8473]
  • Completed lessons visibility: Completed lessons are now faded on instructor-coloured views of the book, keeping focus on upcoming sessions. [PR #8473]
  • Facility hire duration consistency: Facility hires stay at the length they were originally priced on, even when details are changed. [PR #8469]
  • Lesson stretching accuracy: When a lesson is stretched on the book, Horsify sends the lesson details rather than just the time span, improving schedule reliability. [PR #8462]
  • Dressage para test support: Horsify now seeds the four EA Para Dressage national tests and scores the FEI Para Challenge II Grade III test using the correct para error-of-course scale. [PR #8469, PR #8471]
  • Registration email batching: Multiple registration changes now trigger a single consolidated email instead of two per change, reducing inbox noise. [PR #8468]
  • Health declarations for cancelled riders: Riders who cancel or scratch are no longer sent health declarations for that event. [PR #8467]
  • Agistment date formatting: Agistment dates use stable, month-name formatting rather than device-dependent locale settings, improving consistency. [PR #8466]
  • Agistment security and access: Agistment tools are restricted to admins (including read access), signing links are kept off WAF block lists, and signing tokens are redacted from analytics URLs. [PR #8463, PR #8466]
  • Agistment domain and rules: Under-the-hood agistment domain modelling and paddock rules improve reliability of agistment operations and reminders. [PR #8466]
  • Wound photo display: Wound photo URLs now clearly identify assets behind the CDN, and the photo viewer remains visible above the floating navigation while covering the full section. [PR #8465]
  • Wound treatment reminders: Wound reminder sweeps are pinned to run once per due time and are automatically re-armed for the next dose, preventing multiple or missed alerts. [PR #8465]
  • Horse care & feed mobile layout: “Done with details” inputs now render one per line on phones and the feeds checklist stacks correctly, improving small-screen usability. [PR #8464]
  • Feed counting options: The feed shed can now count feed automatically, only as logged, or not at all, giving organisers more control over recording methods. [PR #8464]
  • Riding school small-screen design: Riding school layouts have been reviewed and recorded for small screens, improving future consistency and design quality. [PR #8455]
  • Help centre landing page: The help centre landing page has been rebuilt to match the latest mockups and no longer shows an unnecessary breadcrumb, making navigation clearer. [PR #8453, PR #8457]
  • UI consistency audit fixes: Multiple small UI issues across admin lists, horse reminders, grids, tiles, labels, and CTAs have been corrected, plus improved dropdown contrast and more space for pickup addresses. [PR #8451, PR #8454, PR #8455, PR #8456, PR #8449, PR #8448]
  • Instructor privacy on public APIs: Public endpoints no longer expose internal staff instructor records to anonymous callers, protecting staff privacy. [PR #8459]
  • Club domain DNS auth stability: Nightly _dnsauth rotation has been hardened so clubs’ own domains continue to validate reliably. [PR #8448]

Bug Fixes

  • Lesson workload counting: Moved lessons are no longer counted twice against a horse’s workload, giving accurate workload reporting. [PR #8460]
  • Lesson move length rule: A rule that ensures moved lessons keep their own length is now applied correctly while preserving the new minimum floor. [PR #8462]
  • FEI Para Challenge scoring: The FEI Para Challenge II Grade III test now uses the correct para error-of-course scoring scale, fixing previous scoring errors. [PR #8471]
  • Horse care feeds checklist on phones: The feeds checklist layout has been fixed on mobile devices so items no longer overlap or mis-stack. [PR #8464]

v2026.09.24 — Smoother mobile and offline experience

Released: September 24, 2026

New Features

  • Judging stays on working page offline: Judges using the companion app are no longer pulled away from a working page when Horsify comes back online; instead they’re offered a clear way to return to the live site when ready. [PR #8429]

Improvements

  • Mobile rider management layout: The Add Rider flow and related screens now use a phone-friendly layout, making it easier to add riders from mobile devices. [PR #8442]
  • Roster views for smaller screens: Staff rosters now have a dedicated phone “day” view and a compact one-row header at medium screen widths, improving readability on smaller displays. [PR #8436]
  • Riding school clients and horses on phones: Clients and horses pages for riding schools now use a mobile layout, making it easier to manage records on handheld devices. [PR #8435]
  • Riding school booking pickers: Pickers in the staff booking form now visually match standard form fields, making booking details clearer and more consistent. [PR #8433]
  • Navigation-driven organisation selection: The main navigation is now the single place to pick your organisation, and pages respond to that choice, reducing confusion when switching between clubs or events. [PR #8441]
  • Admin screen usability: Admin pages now correctly handle date filters, keep analytics charts contained, and improve table layouts for easier data review. [PR #8440]
  • Account page polish: Rider and organiser account pages have been tidied up following a UI audit, resulting in a cleaner and more consistent experience. [PR #8439]
  • Riding school staff screen polish: Riding school staff and coach-facing screens have been refined per the UI audit, improving clarity and consistency. [PR #8432]
  • Dark mode consistency across embeds: Dark mode now persists seamlessly across embedded components and Syncfusion controls, avoiding jarring light/dark transitions. [PR #8431]
  • Reliable roster tab switching: Switching tabs from the roster’s “More” menu now waits correctly for the change, improving stability when moving between views. [PR #8436]
  • My Day calendar on tablets: The My Day calendar no longer overlays the activity feed on iPads, keeping both panels readable. [PR #8434]
  • Tailwind utility stability on mobile: Phone-specific stylesheets no longer override core Tailwind utilities, ensuring layouts behave consistently on mobile. [PR #8430]
  • Companion trip cancellation handling: When the iOS companion gives up on a trip, the shell is now asked to cancel it cleanly, reducing stale or stuck sessions. [PR #8438]
  • Android export support: Security settings now allow blob: connections so the Android app can reliably save and export data without failures. [PR #8429]

Bug Fixes

  • Add Rider button on phones: The Add Rider button now works correctly on mobile devices, resolving recent end-to-end test failures affecting rider creation on 24 September. [PR #8443]
  • Offline reconnect banner behaviour: The offline reconnect banner is now fixed to the bottom of the screen, doesn’t move the page, and no longer swallows taps on Save, making it predictable and unobtrusive. [PR #8429]
  • Clearer offline status messaging: The landing page no longer claims Horsify is offline while the banner reports it’s back, and the reconnect banner is announced via a short summary instead of the full banner text for better accessibility. [PR #8429]
  • Judging sync after reconnect: Once Horsify is back online, judging screens are now allowed to sync again so scores and changes are properly saved. [PR #8429]
  • Safe hand-back to live site: The companion only hands back to the live Horsify site after confirming it responds, and recovers cleanly when a trip back to live fails. [PR #8429]
  • Cancel stalled hand-backs: Hand-back flows are cancelled when the watchdog or iOS shell gives up, preventing users from being stuck in a non-responsive transition. [PR #8437]
  • Judge navigation cancels hand-back: If a judge opens another page during a hand-back, that transition is now called off to avoid unexpected navigation. [PR #8429]
  • Offline landing page hand-back safety: The landing page no longer hands back while scoring changes remain on the device, and only reports cancelled trips inside the shell, reducing risk of unsynced data. [PR #8429]
  • Reconnect watcher stability: The reconnect watcher now starts reliably on whichever page the companion loads, and the reconnect banner is steadied while counting unsynced changes. [PR #8429]
  • History-based companion recovery: The companion is brought back to life correctly when browser history returns to it, and Android sessions are remembered for the duration of the visit. [PR #8429]
  • Offline status on landing page: The landing page’s offline indicator now aligns with the reconnect banner, avoiding conflicting signals about connectivity. [PR #8429]

v2026.09.23 — Easier horse registration

Released: September 23, 2026

Bug Fixes

  • Restore “Add another horse” Button: Fixed the missing “Add another horse” button when registering additional horses in an already-entered class, making multi-horse entries quicker to manage. [PR #8400]

v2026.09.22 — Focused communications and smoother lessons

Released: September 22, 2026

Improvements

  • Redesigned organiser Communications page: See everything that needs your attention first, making it easier to follow up with riders and coaches. [PR #8377]

Bug Fixes

  • More flexible group lesson joining: Riders can now join a group lesson at its correct length and coaches’ notes are shown even when no curriculum is attached, improving clarity for riding-school sessions. [PR #8376]

v2026.09.21 — Compliance and clinic setup

Released: September 21, 2026

New Features

  • Quick clinic timetable setup: Build a dressage clinic timetable automatically from a few key answers, reducing manual scheduling work. [PR #8364]
  • Automatic Horsify rate for new organisations: New organisations now automatically receive Horsify’s standard fee rate when their plan is provisioned, avoiding manual configuration steps. [PR #8363]
  • Clear card surcharge handling: Card payment pricing now clearly separates fees that are and aren’t affected by the card surcharge ban, keeping charges compliant and transparent. [PR #8361]

Improvements

  • Accurate GST display on event forms: Event forms now only show GST messages where GST actually applies, giving riders and organisers clearer, more accurate pricing information. [PR #8363]

Bug Fixes

  • Correct GST handling for GST-free items: Lines that are sold GST-free no longer display misleading GST information, ensuring tax treatment is shown correctly. [PR #8363]
  • Card surcharge no longer passed to payers: Card surcharge fees are no longer passed on to riders or clubs ahead of the upcoming legal change, keeping payment processing compliant. [PR #8361]
  • More reliable event imports for Riverview: Fixed incorrect assumptions about Riverview’s organisation settings and ensured class disciplines import correctly, improving the accuracy of imported events. [PR #8362]

v2026.09.20 — Smarter scoring and coaching

Released: September 20, 2026

New Features

  • Invoice and Receipt Export: Export a period of invoices and receipts in a Xero-friendly layout to streamline your accounting. [PR #8351]
  • School Horse Work Hours: See each school horse’s hours worked today and how those hours are calculated, helping manage horse workload and welfare. [PR #8350]
  • Instructor Morning Summary & Alerts: Coaches receive a morning summary and real-time lesson-change notifications, reducing surprises and missed updates. [PR #8346]

Improvements

  • Mobile Lesson Cards Usability: Lesson type cards are now easier to read on mobile, and their edit dialog scrolls properly so all fields are accessible. [PR #8347]

Bug Fixes

  • Dressage Scoring Stability: Dressage rides no longer lose their scores if a class is re-ranked at the same time, ensuring results remain accurate. [PR #8352]
  • Dressage Placings Accuracy: Scratched rides are never placed, and three-ring championship scenarios are now handled correctly for fair, consistent results. [PR #8352]

v2026.09.19 — Riding school onboarding & polish

Released: September 19, 2026

New Features

  • Riding school rider hub: Gives riding schools that keep their own website a dedicated rider hub page on Horsify to share schedules, bookings and key info with their riders. [PR #8333]
  • Guided setup for new schools: Automatically takes new riding schools through a guided setup once, with the option to return to it from the onboarding checklist and settings, making it easier to get started. [PR #8333]
  • Six-step setup wizard: Introduces a shared six-step setup wizard for riding schools, streamlining the process of configuring programs, schedules and key details. [PR #8333]
  • Setup interview and planner: Adds preset interview questions, a planning flow and an apply endpoint to help schools capture rider details and plan term programs more consistently. [PR #8333]

Improvements

  • Organiser settings layout: Unifies page width across settings tabs and surfaces the onboarding checklist at the top, making organiser setup clearer and easier to follow. [PR #8329]
  • Venue URLs and events naming: Redirects old venue ID URLs to slug-based URLs for better SEO and labels the /events page as “horse shows” to improve clarity for riders browsing events. [PR #8331]

Bug Fixes

  • Term program lessons in appointment book: Ensures term-program lessons appear correctly as program lessons in the appointment book so organisers can manage bookings accurately. [PR #8332]

v2026.09.17 — Easier bookings and numbers

Released: September 17, 2026

New Features

  • Lesson Types Linked to Arenas: You can now define which arena each lesson type uses, making it easier to schedule and avoid clashes. [PR #8316]
  • Guest Facility Hire Bookings: Guests can book facility hire directly via a dedicated booking widget, with price and deposit clearly shown on the page. [PR #8315]
  • Printed Back Number & Judge Cards: Events can now print back-number cards and judge’s cards, and look up results by competitor number. [PR #8314]
  • Standardised Back Numbers: Riders now receive a single competitor number, labelled according to where it should be worn, simplifying rider identification across classes. [PR #8312]

Improvements

  • Clearer Ticket Naming on Bookings: Booking lines now lead with the ticket name so organisers and riders can more easily understand what each booking is for. [PR #8310]
  • Clearer Ticket Naming on Registrations: Registrations now show the ticket name first instead of the session name, improving clarity when reviewing entries. [PR #8310]
  • More Prominent Session Text: Event session text is displayed with higher prominence, making key session details easier for riders and organisers to notice. [PR #8311]

Bug Fixes

  • Accurate Facility Hire Slots: Facility-hire slot listings now stay in sync with the cart so arenas cannot be double-booked. [PR #8315]
  • Group Lesson Double-Booking Prevention: Fixed an issue where group lessons could be double-booked, and you can now cancel and complete them directly from the lesson card. [PR #8310]

v2026.09.16 — Flexible bookings and menus

Released: September 16, 2026

New Features

  • Per-Facility Hire Durations & Deposits: Set custom hire duration options per facility and take a configurable deposit at the time of booking to reduce no-shows and secure revenue. [PR #8296]
  • Membership Base Fees with Add-ons: Price membership types as a base fee plus optional add-on lines, giving clubs more flexibility in how they structure and sell memberships. [PR #8293]
  • Drag-and-Drop Club Site Menus: Drag menu items into dropdowns, see when changes go live, and get prompted to save before leaving, making it easier to manage your club’s online navigation. [PR #8295]

Bug Fixes

  • Stability Improvements from Log Review: Fixed four issues identified in the 13–16 Sep error logs to improve reliability across both the website and API. [PR #8294]

v2026.09.14 — Coach day view & roster fixes

Released: September 14, 2026

New Features

  • Coach “My Day” on mobile: Riding school coaches can now use a phone-first “My day” dashboard to check in riders, mark no-shows, complete sessions, manage horses and add notes more easily. [PR #8285]

Improvements

  • Appointment book refresh on organisation change: The riding school appointment book now reloads automatically when you switch organisations, ensuring you always see the correct schedule. [PR #8284]

Bug Fixes

  • Stable roster updates without errors: Adding a horse, person or segment to a saved task or shift in rosters no longer causes concurrency exceptions, making roster adjustments more reliable. [PR #8286]

v2026.09.13 — Smoother rider registration

Released: September 13, 2026

Improvements

  • Clearer venue calendar blocks: Club site editors now see clearly named venue calendar and helper blocks, making it easier to configure event pages. [PR #8272]
  • More informative payment errors: Checkout now explains why a payment could not be started, helping payers resolve issues more quickly. [PR #8270]

Bug Fixes

  • Reliable rider picker on registration: The rider picker on the registration page no longer locks up when the page makes automatic selections, ensuring smoother sign-ups. [PR #8273]

v2026.09.12 — Safer errors, richer rosters

Released: September 12, 2026

New Features

  • Riding-school fullscreen roster: Switch the riding-school book and roster to fullscreen with fitted rows and a cleaner corner gap for easier daily management. [PR #8221]
  • Roster tasks and segments (phases 0–3): Plan and track work with roster tasks, shift segments, horse care items, task bands on the diary, reminders, Publish day and offline “My day” views.
  • Task SMS notifications (phase 5): Send task lists by text message and apply lesson prep rules so staff know what to do before sessions.
  • Club merge helper (phase 4): Merge clubs while keeping staff and committee visible on event rosters, day boards, work parties, My jobs and roster-earned credit.
  • Standby read-only mode: Put a standby system into explicit read-only mode so it no longer pretends it can save changes. [PR #8198]
  • Club-site venue availability block: Add a venue availability calendar block to club sites so riders can see when venues are bookable. [PR #8196]
  • Auto theme from device: Horsify now follows your device’s light or dark mode by default, with a matching theme. [PR #8195]
  • Riding-school diary upgrades: Use a 15-minute diary grid, remembered day view, fitted book/roster layout, quieter staff bookings and carried-over packages to streamline school operations. [PR #8192]
  • Event schedule chip: Event cards now show a “Schedule” chip once a schedule is published, helping riders see which events are fully planned. [PR #8191]
  • API-auth refusal messages: When removing an authenticator app is refused, the MFA status now clearly says why.

Improvements

  • Accurate partial payments: Marking an invoice part-paid now correctly leaves the balance owing and shows it in the Mark Paid dialog.
  • Invoice refunds show Stripe reason: Event refund screens now show Stripe’s own refusal sentence (not raw errors) so organisers understand why a refund failed. [PR #8227] [PR #8229]
  • Safer payment error messages: Stripe failures on checkout, subscriptions, Connect and invoice refunds now use clear Horsify sentences instead of Stripe’s internal text. [PR #8234]
  • Health declaration error clarity: Health declaration email failures now report a short sentence, not the provider’s raw error.
  • Plan checkout refusal details: Plan checkout refusals now show a clear reason and name the plan consistently with the catalogue across more pages. [PR #8243] [PR #8249] [PR #8251]
  • Entry and campaign save feedback: Entry-form and campaign draft saves now return clear refusal reasons and the full campaign object so you know exactly what failed and why. [PR #8256] [PR #8257] [PR #8261] [PR #8264]
  • Calendar and availability edits: Instructor availability can be edited in a single call without losing data on refusal, and the calendar create/edit path stays fixed. [PR #8258]
  • Dialogs close more reliably: Shared dialogs’ close icon and Escape key now signal the page correctly, preventing stuck overlays. [PR #8248]
  • Locked vs unconfirmed sign-in: The sign-in flow now clearly distinguishes locked or disabled accounts from unconfirmed ones so users know what action to take.
  • Security settings feedback: Security Settings pages now explain when MFA status can’t load and when authenticator removal is refused, rather than silently failing. [PR #8232] [PR #8233]
  • Authenticator removal messaging: Organisation admins are no longer incorrectly told the authenticator was removed when it wasn’t.
  • Horse health save honesty: Horse health saves no longer report success when the API refused them, ensuring records stay accurate. [PR #8236]
  • Client contact email checks: Riding-school client emails that belong to another account are refused cleanly instead of causing server errors. [PR #8228]
  • Sponsor and member updates: When sponsor, logo, member or discipline changes are refused, web clients now show the API’s reason instead of a generic error.
  • Booking refusal clarity: Guest booking failures now display the API’s ProblemDetails reason and no longer leak exception text. [PR #8214] [PR #8217]
  • Riding-school roster layout: Single-day roster views drop the repeated date row and give more space back to the roster. [PR #8197]
  • Register “Review in Cart” flow: The “Review in Cart” option now takes riders to their cart when all items are already banked. [PR #8193]
  • Draft entries accept all horses: Draft entries now accept every eligible horse in a rider’s list, avoiding confusion when preparing entries. [PR #8187]
  • Discipline request status: Requested disciplines now correctly save as Pending instead of Approved, making approvals deliberate. [PR #8188]
  • Circuit-breaker boot escape hatch: A boot-time escape hatch helps systems start up even if the circuit breaker is slow to initialise. [PR #8185]
  • Membership approval alerts: Clubs are now alerted when a membership application is paid and awaiting approval, reducing delays. [PR #8181]
  • Instructor availability visibility: One-off availability slots no longer render white-on-white, making them visible on the schedule. [PR #8179]
  • Entries Mark Paid and balance: Marking an entry as paid after a part payment correctly leaves and shows any remaining balance owing.
  • Riding-school diary polish: Staff bookings are quieter in listings and carried-over packages behave more predictably. [PR #8192]

Bug Fixes

  • Mark Paid balance display: The Mark Paid dialog now correctly shows any remaining balance on a part-paid entry instead of implying it’s fully paid.
  • Biosecurity declaration link: The rider’s declaration link now correctly loads the rider’s own biosecurity declaration shape.
  • Entries draft refusal reasons: Refused draft entry saves now show their 404 reason in the rider UI and logs instead of failing silently. [PR #8259]
  • Invoice actions hide exception text: Invoice-management actions (including refunds) now hide internal exception text while still showing helpful messages. [PR #8247] [PR #8252]
  • Admin and organiser pages hide errors: Admin, organiser event and comms pages no longer display raw exception text, improving security and clarity. [PR #8240] [PR #8241] [PR #8244] [PR #8231]
  • Rider, public and school pages hide errors: Signed-in rider, public/booking, riding-school and money screens now show friendly error sentences instead of low-level exceptions. [PR #8238] [PR #8239] [PR #8242] [PR #8230] [PR #8224]
  • API endpoints hide exception text: API catch-alls and health endpoints no longer return raw exception messages, using standard failure sentences instead. [PR #8245] [PR #8250]
  • Health route safety and performance: Anonymous health routes stop publishing exception text and are now memoised for better performance on Web and Worker health checks. [PR #8250] [PR #8253]
  • API refusal reasons reach users: API refusals now consistently reach users as clear sentences instead of raw error bodies, across pages and clients. [PR #8222] [PR #8225] [PR #8220] [PR #8218]
  • Stripe key refusal handling: Stripe key-refusal sentences are no longer exposed on event refund routes; organisers instead see a safe explanation. [PR #8227]
  • Event refund messaging: Organisers now see Stripe’s refusal reason (not status text) when an event refund fails, and registrations hide the key-refusal wording. [PR #8227] [PR #8229]
  • Web pages handle refused writes: Web pages no longer treat refused writes as successes and now display the API’s reason instead of its raw body when writes or actions fail. [PR #8260] [PR #8265]
  • Common transport failures: Calls that receive no answer now fail with a fixed, user-friendly sentence instead of low-level technical noise. [PR #8237]
  • Login refusal states: Sign-in pages now hide exception text and show clear refusal states, including locked/disabled vs unconfirmed accounts. [PR #8226]
  • Booking email safety: Booking emails now read guest addresses only through IdentityContactLookup, avoiding mismatches and leakage. [PR #8210]
  • Guest identity handling: Guest pseudo IDs are minted and read consistently, and guest emails that can’t be matched are refused cleanly. [PR #8208] [PR #8213]
  • Guest and client search: Client search now finds guest clients via the email inside their pseudo ID and scopes email-prefix matches to the organisation’s own clients. [PR #8205] [PR #8203]
  • Club credit lookup: Club credit now finds non-members by exact verified email rather than a platform-wide name search, avoiding misapplied credit. [PR #8200]
  • Judges directory removal: The platform-wide judge directory endpoint has been removed, ensuring judges’ details aren’t exposed platform-wide. [PR #8202]
  • Bookings and payments linkage: Marking a lesson invoice as paid now correctly records the payment on the underlying booking. [PR #8201]
  • Riding-school roster date row: Single-day views no longer duplicate the date row, restoring space for roster content. [PR #8197]
  • Service worker caching: The PWA service worker no longer caches authenticated pages, preventing stale or sensitive content from persisting. [PR #8182]
  • Web circuit-breaker behaviour: A 429 (too many requests) from the API is no longer retried or counted by the circuit breaker, avoiding unnecessary lockouts. [PR #8186]
  • Public class list privacy: Public class lists no longer expose judges’ account IDs or riders’ IDs. [PR #8206]
  • Classes bulk edit consistency: Bulk edits and schedule moves now preserve a class’s phase and jumping settings. [PR #8207]

v2026.09.08 — Discipline access and lesson control

Released: September 08, 2026

New Features

  • Coach-Qualified Lesson Slots: Riding schools can now configure lesson slots that only coach-qualified staff can run, improving safety and quality control for riders. [PR #8168]
  • Programs on Book Now: Riding schools can list programs alongside lessons on the Book Now page, making it easier for riders to discover and book the right offerings. [PR #8168]
  • Admin-Gated Discipline Catalogue: Access to the discipline catalogue is now gated behind Horsify admin approval, ensuring only vetted disciplines are available for events. [PR #8167]

Bug Fixes

  • Correct GST Rate Display: Organisation markets now display and apply each organisation’s own GST rate instead of a hardcoded 10%, ensuring accurate pricing and tax handling. [PR #8163]

v2026.09.07 — Smoother facility booking safeguards

Released: September 07, 2026

Improvements

  • Stripe account visibility for admins: Organisation admins can once again see and manage their own Stripe accounts in the Stripe listing view. [PR #8152]

Bug Fixes

  • Accurate facility availability: Facilities without a valid rate card are no longer shown as bookable, preventing un-priceable bookings. [PR #8150]
  • Reliable SQL authentication outside Azure: SQL-authenticated connections no longer incorrectly use Azure token callbacks, improving stability for non-Azure deployments. [PR #8151]

v2026.09.06 — Safer bookings and events

Released: September 06, 2026

New Features

  • Separate Google API keys for web: Web integrations now use distinct browser and server Google API keys, improving security for maps and other Google-powered features. [PR #8143]

Improvements

  • Stronger password rules and lockout: Rider and organiser accounts now require at least eight-character passwords, with lockout after five failed attempts to better protect logins. [PR #8143]
  • Clearer event access controls: Only Active organisation admins can create, manage or delete events, and cancelled events are closed to new registrations and cart checkout. [PR #8143]
  • Safer sign-out and redirects: Sign-out now only redirects to local return URLs and no longer forwards trust headers, reducing the risk of malicious redirects. [PR #8143]
  • Improved web reliability around payments: Post-payment countdowns and notification polling now wait for circuit reconnection, and club-credit lookup failures correctly block “mark as paid”. [PR #8143]
  • More secure organisation and profile access: Anonymous and non-admin organisation views hide admin-only fields, and creating client profiles requires an active admin, an existing rider, and no duplicates. [PR #8143]
  • Stronger access control for instructors and dependants: Only an admin or the instructor can manage calendar-feed tokens, and admins may only manage dependants who are members of their organisation. [PR #8143]
  • Tighter control on school horses and venue equipment: Schools can only adopt horses they already have a relationship with and update photos for their own horses, and venue equipment routes now verify venue ownership. [PR #8143]
  • Stripe webhook and refund safety: Stripe subscription webhooks now re-fetch current data, and every Stripe refund uses a deterministic idempotency key to avoid duplicate refunds. [PR #8143]
  • Donations and store currency consistency: Donation payment intents and store currencies now always follow the organisation’s market settings for fewer currency mismatches. [PR #8143]
  • Better offline and bank-transfer fee handling: Organiser mark-as-paid retains platform fees on offline settlements, and store orders paid by bank transfer through the cart correctly carry the platform fee. [PR #8143]
  • Improved memberships and attachments: Anonymous membership application uploads are rate-limited and require a live organisation, and membership payment history is retained even if members or accounts are removed. [PR #8143]
  • Safer rider phone verification: Phone verification and phone-change confirmation have been hardened to reduce the chance of misuse. [PR #8143]
  • More secure password reset flows: Password reset codes are now checked in fixed time, with strict limits and rate limiting to protect reset links. [PR #8143]
  • Club site and venue content safety: Club-site navigation, footer and social links are validated, theme CSS colours/styles are allow-listed, and venue/product descriptions are sanitised before rendering. [PR #8143]
  • Email and SMS delivery robustness: Event cancellation emails are queued reliably through the outbox, and SMS opt-out checks and Infobip processing now include the recipient’s country for accurate routing. [PR #8143]
  • Campaign sending stability: Email campaign recipients are claimed atomically and saved per send, preventing duplicate or missed sends. [PR #8143]
  • Safer audit logging and privacy: Privacy audit trails are written at Information level with truncated IPs and hashed values to protect personal data while retaining useful logs. [PR #8143]
  • Improved booking fee and rate-card accuracy: Booking fees now correctly depend on the Stripe account type, and facility rate cards are matched using the venue’s local day/time for more accurate pricing. [PR #8143]
  • Safer Papersync handling: Inbound email webhooks fail closed and only accept attachments stored on Horsify’s storage, improving security for synced documents. [PR #8143]
  • Event results integrity: Result writes must reference entries from the same event, and unscored phases count as non-finishers until placed to keep combined standings accurate. [PR #8143]
  • Sponsor analytics and placements protection: Anonymous sponsor analytics events are de-duplicated and rate-limited, and featured sponsor placements require an active admin, the club’s own event, and platform-set status. [PR #8143]
  • Organisation admin safety and seed data controls: Seed admins are never created in production or with repository passwords, and only Active memberships can grant organisation access. [PR #8143]
  • Safer club-site links and Google key usage: Club-site links now use safe URLs, and Google API key separation reduces exposure of browser keys. [PR #8143]
  • Improved API rate limiting: API and web rate limits have been brought back toward code defaults and re-enabled, providing fairer, more predictable usage under load. [PR #8143]
  • Venue deletion safeguards: Deleting a venue no longer cascades to its events, preventing accidental loss of event data. [PR #8143]
  • Scratch withdrawals on split divisions: Organiser scratch actions now also withdraw later-day mirrors of split divisions for consistent competition management. [PR #8143]
  • Secure tax invoice access: Tax invoice endpoints require an active organisation admin rather than any member, ensuring only authorised users can view invoice details. [PR #8143]

Bug Fixes

  • Mobile floating controls no longer overlap: Help bubbles, sticky summaries, waiver submission, and rider labels now coexist cleanly on mobile screens without colliding. [PR #8141]
  • Anonymous bookings processed safely: All anonymous booking-create paths now run inside the main booking transaction, preventing inconsistent booking states. [PR #8143]
  • Account deletion fully cleans up data: Deleting an account now removes blocking records, purges sessions, and requires password confirmation for a safer, cleaner deletion. [PR #8143]
  • Cart repricing conflict resolution fixed: cartRepriced conflicts no longer re-commit rolled-back checkout work, reducing the chance of duplicate or corrupt orders. [PR #8143]
  • GST-exclusive invoice totals corrected: Tax invoices for GST-exclusive organisations now correctly sum from the amount received to match what was actually paid. [PR #8143]
  • Balanced overdue collection retries: Overdue balance collection now retries each balance in a bounded, idempotent way, avoiding repeated charges or missed attempts. [PR #8143]
  • Partial refunds update orders correctly: Partial store refunds no longer mark entire orders as refunded or restore all stock, keeping inventory and finances accurate. [PR #8143]
  • Event registration blocked for cancelled events: Registration endpoints now refuse cancelled events, avoiding unintended new entries. [PR #8143]
  • Event cancellation fully locks out sales: Cancelling an event now clears its detail cache and closes it to the cart, preventing further purchases or changes. [PR #8143]
  • Club credit lookup errors handled safely: Failed club-credit lookups now block “mark as paid” instead of being treated as “no credit”, ensuring correct balances. [PR #8143]
  • Safer output caching with credentials: The web output cache no longer stores responses to requests carrying credentials, preventing cross-user data leaks. [PR #8143]
  • Removed Facebook login and linking: Facebook OAuth login and account linking have been removed, eliminating a fragile authentication path. [PR #8143]
  • Sponsor analytics noise reduced: Anonymous sponsor analytics are de-duplicated and rate-limited to keep reporting accurate and stable. [PR #8143]
  • Stripe diagnostics access restricted: Stripe webhook diagnostic routes now require platform admin access, protecting sensitive payment debug data. [PR #8143]
  • Cart checkout ownership enforced: Checkout only accepts the caller’s own cart, preventing accidental or malicious use of another rider’s cart. [PR #8143]
  • Booking resource ownership validated: All resources referenced in a booking must belong to the organisation, ensuring bookings don’t mix assets across organisations. [PR #8143]
  • Anonymous facility slot privacy restored: Anonymous time-slot listings no longer show the booked client name, preserving rider privacy. [PR #8143]
  • School-horse photo and adoption rules fixed: Schools can only adopt horses they have a relationship with and can only replace photos for their own horses. [PR #8143]
  • Papersync attachments locked to Horsify storage: Inbound email attachments must reside on Horsify’s storage account, closing a security gap. [PR #8143]
  • Venue and product description sanitisation: Descriptions are now sanitised before being rendered as markup, reducing the risk of injected content. [PR #8143]
  • Club-site theme CSS validation: Functional colours and navigation/button styles are validated and allow-listed to avoid broken or unsafe themes. [PR #8143]
  • Phone verification hardened: Phone verification and change flows have been fixed to remove edge cases that could allow abuse. [PR #8143]
  • Course-designer venue ownership checks: Venue equipment routes now confirm the venue belongs to the organisation, preventing cross-organisation modification. [PR #8143]
  • Dressage/judges management checks tightened: Platform-role shortcuts were removed from organisation management checks, enforcing proper org-based permissions. [PR #8143]
  • Audit logging privacy fixes: IP addresses are truncated and values hashed in the audit trail, reducing exposure of personal data. [PR #8143]
  • Logo and banner upload validation: SVG uploads are refused, and file name/type must agree, stopping mismatched or unsafe branding files. [PR #8143]
  • SMS country handling corrected: Opt-out checks and Infobip integrations now correctly receive recipient country, fixing delivery and compliance issues. [PR #8143]

v2026.09.04 — Clearer fees and smoother signups

Released: September 04, 2026

New Features

  • Consistent Platform Fee Label: The passed-on fee is now always called “Platform fee” across all pages, making costs clearer for organisers and riders and only visible when the organisation setting is enabled. [PR #8124]

Bug Fixes

  • Reliable Organisation Details on Registration: The registration page now correctly reads organisation information via the typed client, ensuring accurate event and fee data during sign-up. [PR #8123]

v2026.09.03 — Mobile polish and security

Released: September 03, 2026

New Features

  • Stronger API Protection: All API traffic now routes through Front Door with improved origin checks and repaired WAF rules, adding an extra layer of security for organiser and rider data. [PR #8099]

Improvements

  • Better Mobile Event Editing & Registration: On phones, the register bar and Add Rider sheet now stay pinned to the navigation, and event edit pages are laid out for easier use on smaller screens. [PR #8101]

v2026.09.02 — Smoother, Safer Horsify Experience

Released: September 02, 2026

Improvements

  • Lower System Load During Use: Reduced idle database, Redis and CPU usage across worker, API and web services to keep Horsify running smoothly under load. [PR #8067]
  • Faster Web Container Performance: Cut steady-state and per-page CPU usage in the container app for snappier page loads and navigation. [PR #8064]
  • Cleaner Mobile Navigation: Standardised the BackLink component so it appears clearly centred and separate from the mobile hamburger menu, improving navigation consistency on phones. [PR #8066]
  • More Reliable Result Polling: Optimised the worker that polls event results so it no longer scans every result every two minutes, reducing background noise while keeping data fresh. [PR #8067]

Bug Fixes

  • More Secure Login Sessions: Fixed issues around session revocation, token issuing and MFA step-up to make logins more reliable and secure for organisers and riders. [PR #8063]
  • Stable Reconnect Overlay on .NET 10: Resolved reconnect overlay issues where it wouldn’t show or displayed a blank fatal dialog, ensuring clearer error messaging when the app loses connection. [PR #8068]
  • Accurate Server Error Logging: Eliminated several classes of false server errors discovered in end-to-end logs so genuine problems are easier to spot and fix. [PR #8061]
  • Better iOS Focus Behaviour: Stopped unwanted keyboard focus rings appearing on page titles after touch navigation on iOS, improving the visual experience on Apple devices. [PR #8068]

v2026.08.31 — Custom emails and smoother flows

Released: August 31, 2026

New Features

  • Custom Lesson Reminder Emails: Organisations can now customise their own lesson reminder email template to better match their branding and messaging. [PR #8039]
  • Improved Payout Defaults & Liability Checks: New payment settings help ensure connected-account payouts and liability responsibilities are configured correctly, reducing payout issues for organisers. [PR #8037]

Improvements

  • AI Event Creation Flow: The "Proceed to Event Form" step now works correctly in the AI-assisted event creation flow, making it easier to finalise new events. [PR #8037]

Bug Fixes

  • Stability From Log-Based Error Fixes: Server-side errors found via automated log analysis have been fixed, improving overall reliability of the platform. [PR #8035]

v2026.08.30 — Easier family registration

Released: August 30, 2026

New Features

  • Family Registration in One Order: Register a whole family for an event in a single order and pay once, simplifying checkout for multi-rider households. [PR #7976]
  • Improved Organiser Marketing Page: The /for-organisers page now showcases real product screenshots to better explain how Horsify works for events. [PR #7970]
  • Richer Clubs, Instructors & Schools Pages: Updated /for-clubs, /for-instructors and /for-riding-schools pages now use real content and screens to clearly show how Horsify supports different types of equestrian organisations. [PR #7975] [PR #7974] [PR #7973]
  • Clearer Custom Solution Page: The /custom-solution page has been rebuilt around practical examples instead of icon grids, making bespoke options easier to understand. [PR #7971]

Improvements

  • More Consistent UI and UX: Sixteen small visual and interaction issues plus one rendering defect have been fixed for a smoother, more consistent experience across the app. [PR #7969]

Bug Fixes

  • Visible Division Selection Errors: “Add to division” errors during registration now appear near the button instead of off-screen, so riders can immediately see what needs fixing. [PR #7979]
  • Reliable Club Site Loading: Club sites no longer appear empty when an upstream API call is refused, preventing confusing blank pages for organisers and riders. [PR #7972]

v2026.08.28 — Easier scheduling and billing

Released: August 28, 2026

New Features

  • Drag-and-drop class schedule board: Plan event classes more quickly with a visual board that lets you drag and drop sessions to build and adjust your timetable. [PR #7952]
  • Automated Stripe/CRM reconciliation: Keep your payments and rider records in sync with scheduled checks between Stripe, Horsify and your CRM, reducing manual reconciliation work. [PR #7950]

Improvements

  • Smoother session event creation: Event Sessions editor has been tidied and UX review changes applied, making it easier to set up and manage sessions within events. [PR #7952]

Bug Fixes

  • More reliable login after token expiry: Fixed an issue where stale cookies could lock users out after token expiry, so session refresh works as expected and reduces surprise logouts. [PR #7956]

v2026.08.27 — Smoother bookings and self-service

Released: August 27, 2026

New Features

  • Riding-school lesson finder: Riders can answer two quick questions to find suitable lessons in the booking flow. [PR #7915]
  • Riding-school pricing tiers: Riding schools can offer packages as clear pricing tiers in the booking wizard, making it easier for riders to pick the right option. [PR #7917]
  • Riding-school booking redesign (phase 1): The riding-school booking flow has a refreshed design to guide riders more smoothly from selection to confirmation. [PR #7913]
  • Event landing sections: Public event pages now highlight “On now”, “Upcoming”, and “Recent results” so riders and spectators can quickly see what’s happening. [PR #7912]
  • Event cards with stats: A shared EventCard layout shows key event details, chips, stats, and a consistent placeholder image across the site. [PR #7911]
  • Activity widgets for horses: A “Most Active Horses” strip and anonymised activity ticker showcase recent horse activity while protecting rider privacy. [PR #7914]
  • Rider class self-service: Riders can add or scratch classes from their registration details page, with matching API support for integrated tools. [PR #7910]
  • Watchdog status summary: A new watchdog summary endpoint lets organisers and integrators externally monitor Horsify’s status and performance. [PR #7916]

Improvements

  • More reliable organiser workflows: Fixes to organiser end-to-end scenarios and stale checks reduce false failures and improve overall reliability. [PR #7919]

Bug Fixes

  • Mobile-friendly registrations: Registration details pages now work smoothly on phones and ensure QR codes can be easily scanned at events. [PR #7909]
  • Waiver completion flow: After submitting a waiver, signers are returned to the top of the page so they can see confirmation and next steps. [PR #7909]
  • Profile name accuracy: Rider names entered on entry forms no longer overwrite the wrong rider profile, keeping participant records accurate. [PR #7909]

v2026.08.25 — Riding school booking updates

Released: August 25, 2026

Improvements

  • More Flexible Arena Scheduling: Staff can now see available times more clearly and book multiple lessons in the same arena when appropriate, improving riding school booking management. [PR #7905]

Bug Fixes

  • Release Doc Generation Compatibility: Web parameters were cleaned up to prevent CS1573 errors during release documentation generation, ensuring smoother deployments. [PR #7906]

v2026.08.24 — Scheduler and roster polish

Released: August 24, 2026

Bug Fixes

  • Roster lessons always visible: Fixed an issue where split staff records could hide the lessons tick in the roster view, ensuring all lesson indicators display correctly. [PR #7900]
  • Unassigned calendar lane grouped correctly: Ensured the unassigned lane in the calendar now has a proper ID so the scheduler groups and displays unassigned resources as expected. [PR #7899]

v2026.08.23 — Better entries and horse records

Released: August 23, 2026

New Features

  • Per-Horse Competition Records: Each horse now has its own competition record, making it easier to review results and history per horse. [PR #7882]
  • Judge Score Sheet Back Button: Dressage judges can now use a Back button in the score sheet header to return more quickly to the previous screen. [PR #7883]

Improvements

  • Scoped Horse Results: A horse’s record now only shows results belonging to the current account, helping organisers and riders see only their own competition data. [PR #7882]

Bug Fixes

  • Accurate Entries Per Nominated Horse: Checkout now creates one Entry per nominated horse, ensuring entry lists and fees match the horses actually nominated.
  • Dressage Entry Healing: Dressage registrations with incomplete Entry rows (including those with too few rows) are now properly healed so they can be processed correctly.
  • Stable Judge Activity Heartbeat: The dressage judge activity heartbeat no longer fails when the session is disposed, improving reliability during judging sessions.

v2026.08.22 — Sharper scoring and smoother payments

Released: August 22, 2026

New Features

  • Control Provisional Score Visibility: Organisers can now choose who can see a score before it is final, giving more control over when results become visible. [PR #7864]

Improvements

  • Judge Notes and Signing on iPad: Judges now have a clearer notes area and dedicated signing space on iPad, making dressage scoring more usable and reliable. [PR #7866]
  • Judge PDFs Load Reliably: Judge PDFs now open correctly without leaving visitors waiting on blank screens. [PR #7864]
  • Accessible Toggle Announcements: Toggle controls now clearly announce their “on” or “off” state for better accessibility. [PR #7864]
  • In‑App Links Stay In‑App: Links opened from the Horsify app now remain inside the app instead of unexpectedly switching to Safari. [PR #7861]
  • Improved Booking Bar Layout: The booking bar layout has been refined, with the day’s headline moved to its own line for clearer readability. [PR #7860]
  • More Accurate App Analytics: App analytics now respect iOS App Tracking Transparency, work on Android, and correctly track multiple pages, giving organisers better insights. [PR #7859]
  • Smoother Stylus Scoring: Stylus input in dressage scoring is now more reliable, preventing Safari interruptions from cutting off handwritten scores. [PR #7858]

Bug Fixes

  • Stop Chasing Old Event Payments: Riders will no longer receive payment reminders for events that have already finished. [PR #7867]
  • Remove Broken Scratch Path: An unused and non‑functional scratch action has been removed from the entry list to prevent confusion. [PR #7867]
  • Stripe Payments Script Restored: The Stripe Connect script has been restored to ensure payment processing continues to work smoothly. [PR #7859]

v2026.08.21 — Streamlined health and scoring

Released: August 21, 2026

New Features

  • Optional Facility Hire for Schools: Riding schools can now turn off facility hire while still booking lessons, giving more flexibility in how sessions are scheduled. [PR #7826]

Improvements

  • Health Declaration CSV Export: Health declaration CSV exports are now served through a same-origin proxy, improving reliability and security when downloading reports. [PR #7829]
  • Dressage Judge Sheet Layout: Dressage judge sheets now fit the viewport better and generate more reliable PDF downloads, making it easier to review and share scoring sheets. [PR #7828]
  • Consistent Payment Script Loading: Stripe Connect has been restored to its intended version to ensure payment flows load and run consistently for organisers and riders. [PR #7828]
  • Email and Deep Link Handling: System emails now come from the canonical www host, and app deep links open natively when possible, improving trust and the mobile experience. [PR #7825]

Bug Fixes

  • Health Declaration Dead Ends: Fixed issues where adding a horse or entering a rider address in health declarations could get stuck, so forms can now be completed without blocking. [PR #7825]
  • Dressage Autosave Stability: The dressage scoring autosave loop has been bounded to prevent runaway saves, resolving several related scoring failures. [PR #7827]

v2026.08.19 — Smoother mobile bookings

Released: August 19, 2026

New Features

  • Instructor availability from roster: Lesson times are now driven from the staff roster so riders only see sessions when instructors are actually scheduled to work. [PR #7769]
  • Hide unavailable instructors from bookings: Instructors who aren’t rostered on are automatically hidden from the appointment book, keeping the booking list clean and accurate. [PR #7770]
  • Offer only teachable lesson times: Riding school lesson searches now only show times when an instructor is free to teach, reducing double-bookings and confusion. [PR #7774]

Improvements

  • More logical booking form order: The manual booking form now lists the horse after the lesson type, making it quicker and more intuitive to create bookings. [PR #7768]
  • Faster search for bookable times: Booking searches have been optimised so organisers and riders see available times more quickly. [PR #7778]
  • Cleaner mobile organiser screens: Organiser pages on phones now keep all content within the viewport instead of hiding it off the right edge. [PR #7777]
  • Fix mobile page overflow: General mobile layouts have been adjusted so booking and other pages no longer extend off-screen on the right. [PR #7775]
  • Uncropped images on mobile: Logos, QR codes and thumbnails on mobile are no longer forced into 16:9 banners, so important details aren’t clipped. [PR #7776]

Bug Fixes

  • Accurate rider payments after cancellations: Riders are no longer asked to pay charges that organisers have already cancelled. [PR #7782]
  • Bill outstanding balance only: The payment page now correctly bills just the remaining balance instead of the full original total. [PR #7783]
  • Prevent duplicate staff records: Instructor sync no longer creates a second staff record for the same person, keeping staff lists tidy. [PR #7771]
  • Lesson availability respects roster: Instructor lesson availability now correctly follows rostered shifts, fixing mismatches between the roster and bookable times. [PR #7769]
  • Sitemap and logging errors resolved: The /sitemap.txt endpoint no longer returns errors, and related logging issues identified in reviews have been fixed. [PR #7773]

v2026.08.18 — Smoother help and booking

Released: August 18, 2026

Improvements

  • Cleaner knowledge base articles: Knowledge base articles no longer repeat their titles inside the body, making them easier to read. [PR #7749]
  • Direct links from help topics: Riding school help topics now link straight to their matching knowledge base articles, so organisers and riders can get detailed guidance with fewer clicks. [PR #7748]

Bug Fixes

  • Lesson booking button visibility: When you select a lesson time, the “Continue” button now automatically scrolls into view, reducing confusion during checkout. [PR #7746]

v2026.08.17 — Accurate EXCA Results

Released: August 17, 2026

Bug Fixes

  • Correct EXCA score import: EXCA cowboy race results now import the official published score instead of the Rider Sheet values, ensuring accurate standings for riders and organisers. [PR #7719]

v2026.08.16 — Smoother riding school setup

Released: August 16, 2026

New Features

  • Riding school site settings access: Riding schools can now access their site settings directly from a dedicated route, making it easier to manage their online presence. [PR #7700]
  • Public “Book Now” link for organisers: Organisers can now see and copy the public booking link for their riding school, simplifying how they share bookings with riders. [PR #7698]
  • Seeded instructor availability: Instructor availability can now be prefilled from club booking hours, reducing manual setup time for riding schools. [PR #7696]

Improvements

  • Clearer payment setup link: The “Set up payments” link in the riding-school checklist now correctly takes organisers to the organiser payments page. [PR #7701]
  • More helpful error messages: API conflicts now display clear error messages instead of a generic “Error: Conflict,” helping organisers understand and resolve issues faster. [PR #7699]

Bug Fixes

  • Public instructor list stability: Fixed instructor caching on public riding-school pages by using a shared key, improving reliability of displayed instructor information. [PR #7697]
  • Cleaner public organisation pages: Removed a broken members-only instructor call from public organisation pages to prevent errors and improve page loading. [PR #7697]
  • Reliable SMS delivery reporting: Infobip SMS delivery report webhooks are now properly authenticated, ensuring accurate and secure delivery status updates. [PR #7699]

v2026.08.14 — Sponsor access correctness

Released: August 14, 2026

Bug Fixes

  • Correct sponsor access control: Sponsor API endpoints are now authorised against the selected organisation, preventing cross-organisation access issues for sponsors and organisers. [PR #7689]

v2026.08.13 — Smoother bookings and registrations

Released: August 13, 2026

New Features

  • Editable Stabling and Camping: Organisers can now edit stabling and camping details directly on a rider’s registration, reducing back-and-forth corrections. [PR #7673]

Improvements

  • Dark Mode Booking Popups: The booking quick-info popup in riding school now respects dark mode for a more consistent experience in low-light settings. [PR #7676]
  • Clearer Web Wording and UI: Various web interface tweaks improve wording, consistency, and visual alignment so pages are easier to read and navigate. [PR #7672]
  • iOS Shell Cleanup: The “Book a demo” call-to-action is now hidden in the native iOS shell where it’s not relevant, keeping the app interface cleaner. [PR #7675]

Bug Fixes

  • Local-Time Staff Notes: Staff notes on bookings are now timestamped in the booking’s local time instead of UTC, avoiding confusion for organisers and riders. [PR #7676]
  • Pending Cancellation Explanation: The cart now clearly explains when an item has a pending cancellation instead of trying to load it as an active item. [PR #7674]

v2026.08.12 — Smoother bookings and displays

Released: August 12, 2026

New Features

  • Updated calendar and popup components: Upgraded to Syncfusion Blazor v34.2.3 for more reliable and modern calendars, dialogs and UI widgets across Horsify. [PR #7653]

Improvements

  • Clearer entry division options and waitlisting: Entry pages now show full divisions and allow riders to join waitlists when a division is full. [PR #7655]
  • Accurate lesson pricing display: Lesson slots now show the correct price and avoid double recalculations, so organisers and riders see consistent charges when booking. [PR #7658]
  • More precise booking and charge breakdowns: Quotes now reflect the real booking price and clearly itemise horse and facility charges for greater transparency. [PR #7658]
  • Stable club-site navigation: Club site shells properly render navigation sub-items and keep theme-coloured blocks displaying as intended. [PR #7654]
  • More robust club-site selection for riders: Improved handling of club-site selection and rider links to reduce failures when data is incomplete. [PR #7656]

Bug Fixes

  • Horse workload tracking from real bookings: Horse workload is now derived from actual bookings instead of outdated data, improving workload accuracy for riding schools. [PR #7657]
  • Event capacity controls always visible: Fixed an issue where event capacity controls could appear offscreen, ensuring organisers can reliably manage capacity settings. [PR #7655]
  • Correct handling of unspecified dates: Fixed a date-time conversion issue that could shift unspecified dates, improving accuracy of schedules and bookings. [PR #7658]
  • Reliable price breakdown gating: Resolved issues with breakdown gating and slot pricing so riders see the correct details only when appropriate. [PR #7658]
  • Consistent popup behaviour: Explicitly referencing Syncfusion Blazor Popups prevents missing or misbehaving dialogs in the web interface. [PR #7653]

v2026.08.11 — Smoother bookings and events

Released: August 11, 2026

New Features

  • Auto-Save Event Session Edits: Event session changes are now auto-saved so typed times and capacity updates aren’t lost if you navigate away or your browser refreshes. [PR #7633]

Improvements

  • Lesson Booking Notifications: Clubs and gate staff are now notified when a lesson booking is approved, helping everyone stay in sync on confirmed lessons. [PR #7637]
  • Focused Booking Calendar View: The booking calendar now automatically focuses on the first lesson of the day, reducing scrolling and making it easier to see what’s coming up. [PR #7635]
  • Clearer Dark Mode Contrast and Colours: Dark mode accent and status colours have been adjusted to meet WCAG AA contrast standards, improving readability for users viewing pages in dark mode. [PR #7634]

Bug Fixes

  • Reliable Invoice Number Allocation: Payment invoice numbers are now claimed outside the caller’s transaction to avoid clashes and ensure invoices are numbered correctly. [PR #7634]
  • Event Session Capacity Validation: Auto-save is blocked when an event session has zero or negative capacity, preventing invalid setups and hiding decorative icons that could be confusing. [PR #7633]
  • Shared Cart Race Condition Fix: A timing issue in the shared cart has been resolved so your cart state stays consistent during checkout. [PR #7632]

v2026.08.10 — Club sites get a fresh look

Released: August 10, 2026

New Features

  • Modern Club Site Themes: Choose from new modern style options to refresh the look and feel of your club site while keeping it easy for riders to navigate. [PR #7609]

Improvements

  • Accessible Theme Style Selector: Theme style chips now use proper toggle button behaviour, making it clearer and more accessible for all users when selecting a site style. [PR #7609]

v2026.08.09 — SEO and event visibility

Released: August 09, 2026

New Features

  • “This Weekend” Events Page: Added a dedicated /events/this-weekend page so riders and organisers can quickly see what’s coming up over the weekend. [PR #7605]

Improvements

  • Event Page SEO Enhancements: Implemented August 2026 technical audit recommendations on event templates to improve search engine visibility for events. [PR #7604]
  • Venue Page Search Visibility: Prerendered venue events and enriched structured data on venue pages to help them display more accurately and prominently in search results. [PR #7602]
  • Richer Event Metadata: Repaired event meta descriptions, encoded event titles correctly, sorted JSON-LD event data, and refined date handling and copy for clearer, more consistent event information in search. [PR #7603]

v2026.08.07 — Smoother memberships and mobile use

Released: August 07, 2026

Improvements

  • Safer Membership Application Links: Prevents anonymous users from resuming linked membership applications and refreshes membership periods using the club’s timezone for more accurate dates. [PR #7590]
  • Cleaner Rider Experience on Mobile: Refines the rider interface on small iOS screens so forms and pages are easier to read and use. [PR #7589]

Bug Fixes

  • Prevent Duplicate Membership Applications: Resubmitting a public membership form now resumes an existing pending application instead of creating duplicates. [PR #7590]

v2026.08.06 — Faster, Smoother Horsify Experience

Released: August 06, 2026

Improvements

  • Faster checkout and bookings: Optimised key API queries to make checkout, the booking widget, and public event pages load more quickly and reliably. [PR #7579]
  • More responsive web interface: Pruned and fingerprinted the Syncfusion theme and tuned garbage collection so pages feel snappier and use less memory, especially on smaller servers. [PR #7578]
  • Smarter performance and telemetry: Improved Redis caching, telemetry sampling, and metric handling so Horsify runs more efficiently while still capturing useful diagnostics. [PR #7578]

Bug Fixes

  • More accurate paging and search: Fixed issues with event paging, searching, and checkout batching to ensure results and cart items display correctly. [PR #7579]
  • Reliable telemetry sampling: Corrected telemetry settings so ApplicationInsights sampling percentages stay within valid limits and behave consistently. [PR #7578]

v2026.08.05 — Sharper club pages & SEO

Released: August 05, 2026

New Features

  • Hide Placeholder Venues from Search: You can now mark placeholder venues to be excluded from search engines, keeping public venue listings cleaner and more accurate. [PR #7564]

Improvements

  • Redesigned Clubs Landing Page: The /for-clubs page has been refreshed with an editorial layout and stock photography to better showcase how Horsify supports clubs. [PR #7564]
  • More Accurate Sitemaps for Search Engines: Our sitemap now only lists live marketing pages, helping search engines index the right Horsify content and avoid old 404 pages. [PR #7563]

Bug Fixes

  • Prevent Duplicate Tax Invoices: Membership payment finalisation is now serialised to avoid creating duplicate tax invoices during checkout. [PR #7567]
  • Consistent Accent Styles and Badges: Fixed missing accent-light styling and undefined badge classes so UI accents and badges display consistently. [PR #7566]
  • Clean Club Page Buttons: Removed unwanted underlines from pill-style call-to-action buttons on club pages for a cleaner appearance. [PR #7564]

v2026.08.04 — Smoother scoring and payments

Released: August 04, 2026

New Features

  • Horsify Care Assistant in Sign-In: Verification SMS and sign-in emails now highlight the Horsify Care Assistant, making it easier to discover help while logging in. [PR #7553]

Improvements

  • Mobile Layout Usability: Improved bottom-sheet dialogs and grid card layouts on mobile so headers/footers are clearly visible and cards fill the width with readable labels. [PR #7553]

Bug Fixes

  • EXCA Results Import Accuracy: EXCA scores imported from the Riders Sheet now correctly pin results to the right competition day and support bulk deletion of provisional results. [PR #7556]
  • Accurate Outstanding Payments: Resent payment links now bill only the true outstanding balance, and fully refunded, unstamped invoice rows are treated as retaining no charges. [PR #7555]

v2026.07.31 — Database performance foundations

Released: July 31, 2026

Improvements

  • Faster Database Migrations: Squashed many historical migrations into streamlined baselines to improve migration performance and stability. [PR #7536]

Bug Fixes

  • Migration Order Correction: Adjusted the date of the AddUniqueDeclarationPerRegistrationHorse migration so it runs in the correct order after the new baseline, preventing potential schema issues. [PR #7537]

v2026.07.30 — Reliable event coordination updates

Released: July 30, 2026

New Features

  • Expanded Copilot integrations: Copilot agents can now use a broader set of MCP-connected services (Infobip, Stripe, Azure, Syncfusion) to assist with event management workflows. [PR #7505]

Improvements

  • More coherent division scheduling: Each division is now kept in one continuous block in the schedule, making timetables easier to understand for organisers and riders. [PR #7514]
  • More accurate card surcharge tracking: Card surcharges are now explicitly recorded against bookings so event and club balances reconcile correctly. [PR #7510]
  • Faster, more reliable Copilot assistance: Copilot agent environments are pre-warmed and MCP configuration cleaned up to reduce delays and improve stability when using AI-powered tools. [PR #7505]

Bug Fixes

  • Registration deep link preserved after login: Riders following a registration link are now correctly returned to their registration flow after logging in, instead of being dropped on a generic page. [PR #7515]
  • Division blocks no longer split: Scheduling logic now prevents divisions from being fragmented into multiple time slots, reducing confusion and rescheduling errors. [PR #7514]
  • Stripe upgrade stability improvements: Upgrading to the latest Stripe API and SDK resolves payment-related edge cases and improves reliability for card transactions. [PR #7512]
  • Web session recovery instead of fatal error: Rare browser/JS teardown race conditions now recover gracefully instead of showing a fatal error page, reducing disruptions during event management. [PR #7513]
  • Push notifications reliably open the app: Tapping push notifications in the native app shell now consistently opens the correct screen instead of being ignored. [PR #7511]
  • Correct email template selection: Email template types now map to the correct content after an enum shift, preventing the wrong emails from being sent. [PR #7508]
  • Unpublished events kept private: Event sub-resource endpoints no longer expose unpublished events, ensuring draft events remain hidden from riders until organisers are ready. [PR #7509]

v2026.07.29 — Linked riders and smoother signups

Released: July 29, 2026

New Features

  • Linked Rider Type for Under-18s: Under-18 riders are now managed via a clearer “linked rider” setup, making it easier for guardians and organisers to handle dependant accounts. [PR #7478]
  • Family Members in Registrant Picker: The registration dropdown now shows account-level family members, simplifying the process of registering multiple related riders for an event. [PR #7477]

Improvements

  • More Accurate Dependant Age Handling: Age checks for dependants now use a single shared clock, providing more reliable “under-18” determinations on key dates. [PR #7478]

Bug Fixes

  • Case-Insensitive Matching for Dependants: Dependants are matched regardless of name casing, preventing duplicate or missing entries when merging rider information. [PR #7477]
  • Avoid Duplicate Riders on Club Signup: When a rider signs up and already exists via a club import, Horsify now links to that rider instead of creating a duplicate, keeping membership records cleaner. [PR #7476]
  • Display Name Persisted on Rider Signup: Rider display names are now correctly saved during signup, ensuring profiles appear consistently across Horsify. [PR #7476]

v2026.07.28 — Care assistant updates

Released: July 28, 2026

New Features

  • Unified horse care assistant page: Access all horse care guidance and tools from a single consolidated assistant page, with the deep link reliably opening the correct view. [PR #7455]

Improvements

  • Cleaner horse health layout on mobile: Decorative icons are hidden and layout clarified so care reminders are easier to read and interact with on smaller screens. [PR #7454]

Bug Fixes

  • Care reminders button no longer overflows on mobile: The “Add” button in Care reminders now stays within the screen on mobile devices, preventing layout breakage. [PR #7454]

v2026.07.27 — Smarter care & smoother entries

Released: July 27, 2026

New Features

  • Workload-Aware Feed Coach: Use the new workload-aware Feed Coach and structured feed card (including for school horses) to plan and track diets, then share a horse’s feed card via link without requiring the viewer to log in. [PR #7441, PR #7443]
  • Diet Tracking in Horse Care Assistant: Track a horse’s feed card and diet directly in the Horse Care Assistant so carers can see what’s being fed at a glance. [PR #7441]
  • Event & Booking Push Reminders: Send riders push notifications for upcoming events and bookings, reducing no‑shows and last‑minute confusion. [PR #7321]
  • Event Helpers & Task Allocation: Set up event helper roles, let people claim them during checkout, and manage rostering in one place from catalogue to final schedule. [PR #7265]
  • Results Block Grouped by Event/Day: Show club‑site results grouped by event, day and overall, with results scoping and editing limited to your organisation. [PR #7264]
  • Extreme Cowboy (EXCA) Results Import: Detect and import Extreme Cowboy score sheets, store doubled scores with a double‑points flag, and display EXCA scores in the correct time format. [PR #7305, PR #7275, PR #7274]
  • Group Lessons End to End: Run group lessons from scheduling through booking and payment so riding schools can manage groups alongside private lessons. [PR #7365]
  • Student Progress Tracking: Track riding‑school student skills and show a progress summary on My Bookings, helping instructors and riders see how they’re progressing. [PR #7272, PR #7382]
  • Riding-School Booking Calendar Upgrades: Use new riding‑school calendar controls including default calendar view, org‑wide diary blocks, recurring flags and client alerts for clearer scheduling. [PR #7397]
  • Riding-School Booking Hours & Global Booking Rules: Configure global booking hours and horse‑first booking rules so riders and staff see when lessons can be booked. [PR #7303, PR #7358]
  • Riding-School Waiver Workflow: Let clients sign waivers via emailed links, track waiver versions on the client profile, and send/resend waivers per client from the audit panel. [PR #7391, PR #7392, PR #7394]
  • Riding-School Dashboard Quick Toggle: Switch quickly between Events and Bookings on the organiser dashboard for riding schools. [PR #7371]
  • School Horse Feed Cards: Give riding‑school horses structured feed cards so staff can see standard rations per horse. [PR #7443]
  • Membership from Event Tickets: Automatically grant club membership when riders buy eligible event tickets and correctly charge and allocate the membership fee. [PR #7413, PR #7419]
  • Membership Waivers for Club Members: Attach membership waivers to club memberships so members can sign once and stay compliant across activities. [PR #7420]
  • Configurable Membership Reminders: Control when and how membership reminders are sent for your organisation. [PR #7409]
  • Club Membership from Tickets & Day Tracking: Track riders’ club membership status from ticket purchases so entry flows and pricing stay consistent. [PR #7413]
  • Club Credit as a Payment Method: Apply members’ club credit from the organiser “Mark as paid” screen and let general club credit pay for event entries, with “Club Credit” clearly shown on invoices and receipts. [PR #7292, PR #7295, PR #7298, PR #7300]
  • Club-Defined Member Profile Fields: Configure custom member profile fields for your club (including EAV fields) and capture this data on member profiles, with linked fields auto‑populating where appropriate. [PR #7299, PR #7304]
  • Spreadsheet Member Import & Add Member with Profile: Import members from a spreadsheet and create members with full Horsify profiles in one flow. [PR #7319]
  • Canonical Dependants (“My Riders”) Model & UI: Manage dependants consistently across the platform with a canonical dependant model and unified “My Riders” interface (multi‑guardian safe and org‑scoped). [PR #7297, PR #7308, PR #7314]
  • Event-Level Nomination Caps & Waitlists: Set whole‑event entry limits with an automatic waitlist fallback when events fill. [PR #7422]
  • Per-Horse-Per-Day Nomination Cap: Enforce a per‑horse‑per‑day entry limit at checkout to protect horses from over‑nomination. [PR #7426]
  • Multi-Day Session Split: Split a multi‑day session into day‑by‑day divisions so schedules, lists and results reflect how your event actually runs. [PR #7312]
  • Create From Existing Event Flow: Create new events from existing ones via a guided flow, replacing the older per‑event Clone button for more predictable setup. [PR #7307]
  • Store Checkout Pickup/Delivery Choice: Let buyers choose pickup or delivery at checkout and collect a shipping address where needed so fulfilment is clear. [PR #7309]
  • Organiser Store Order Notifications: Notify organisers of new store orders and highlight unfilled orders with a badge so nothing gets missed. [PR #7344]
  • Shipping Fees and Online Surcharge Improvements: Add processing fees correctly to email‑generated payment links and automatically drop the online surcharge when you settle invoices offline, including partial write‑offs. [PR #7343, PR #7375]
  • Stripe Charge Descriptions for Stores & Lessons: Use clearer, identifiable Stripe descriptions for store purchases and lesson‑link payments to simplify reconciliation. [PR #7410]
  • Admin Users Screen Enhancements: Use the new sortable, richer /admin/users view with signup dates to manage user access more easily. [PR #7398]
  • Organiser Admin Newsletter Audience: Target newsletters specifically to organisation admins for operational updates. [PR #7277]
  • Unified Help Hub: Use a single, unified getting‑help hub (web + in‑app) with a consistent support widget and safer Zammad integration. [PR #7272, PR #7274, PR #7268]
  • SEO Enhancements for Clubs & Events: Improve discoverability with club hubs on the core domain, resilient sitemaps, JSON‑LD for events/org pages, and better club‑site sitemap behaviour. [PR #7291, PR #7282, PR #7283]
  • Passkey-First Sign-Up & Cross-Domain Sign-In: Onboard new users with a passkey‑first journey and smoother cross‑domain passkey sign‑in for club sites, including iOS support. [PR #7408, PR #7416]
  • Self-Service Account Deletion: Let users delete their accounts themselves in line with App Store requirements. [PR #7405]
  • Organiser & Admin Default Table Views: Default organiser and admin list pages to table view for faster scanning and bulk actions. [PR #7402]
  • My Progress Mobile Dashboard Redesign: Use a mobile‑first My Progress dashboard with clearer level ordering and multi‑student support. [PR #7417]
  • My Bookings Progress Summary: Show riders a snapshot of their progress on the My Bookings page. [PR #7382]
  • Membership Reminders & Expiry Warnings Improvements: Direct membership expiry warnings to member‑facing pages and align the 45‑day warning window for clarity. [PR #7428, PR #7409]
  • Riding-School Built-But-Hidden Features Surfaced: Reveal previously hidden riding‑school capabilities (like blocks and hours) in the organiser UI so they’re easier to configure. [PR #7313]
  • Membership Payment Reminders: Configure when membership payment reminders are sent for your organisation to match your renewal strategy. [PR #7409]

Improvements

  • Better Feed & Diet Tools: Complete the Henneke body condition scoring, correctly draw the promised score band, allow editing saved feed cards, prevent zero‑forage errors for hay, and reconcile feed‑shed stock across matching units so care plans are accurate and editable. [PR #7445, PR #7443]
  • Rider Digest Audience Control: Automatically exclude pure riding‑school clients from rider digests so newsletters target active competitors and members. [PR #7438]
  • Member List Actions & Dependant Management: Improve the member list table so actions fit properly and dependant management tools are easier to access. [PR #7440]
  • Rider and Organiser Digest Content: Update rider and organiser monthly digests with public KB links and feature parity roundups for clearer communications. [PR #7437, PR #7429, PR #7435, PR #7301]
  • Registration Confirmation Mode Editing: Allow editing of an event’s registration confirmation mode after creation while staying compatible with manual confirmation setups and accessibility expectations. [PR #7427]
  • Nomination Caps & Limits Safeguards: Tighten event‑level and per‑horse‑per‑day nomination limits at checkout and ensure draft restorations, server‑side bounds and waitlist logic behave correctly. [PR #7426, PR #7425, PR #7422, PR #7424]
  • Ticket Purchase Resilience: Make ticket‑purchase registrations and session updates more resilient to transient failures so organisers and riders see consistent state. [PR #7431, PR #7425]
  • Event Pricing Display Accuracy: Correct event listings that previously showed paid classes as “Free” or “From $0.00”, and display mixed free/paid prices as a sensible range. [PR #7421, PR #7420]
  • Membership Fee Allocation for Tickets: Ensure membership fee components tied to tickets are charged correctly and membership/ticket reallocations are reflected accurately in analytics and memberships. [PR #7419]
  • Club Membership Renewal Flows: Send membership expiry warnings to member‑facing pages instead of admin‑only views and align the renewal window around 45 days. [PR #7428]
  • Lesson & Booking Email Routing: Route booking and registration confirmations to dedicated club email addresses to reduce clutter and ensure the right inbox receives them. [PR #7376]
  • Invoices & Online Surcharges: Automatically remove online surcharges when you settle invoices offline and support partial write‑offs to waive remaining balances cleanly. [PR #7375]
  • Registration Invoice Sync: Keep registrations and their invoices in sync by refreshing on late Stripe completions and aligning paid states. [PR #7373]
  • Store GST and Pricing Corrections: Stop charging GST to non‑GST‑registered clubs, align store order numbers to include the club acronym, and ensure live sale prices are used at checkout. [PR #7341, PR #7334]
  • Store Order Webhook Reliability: Harden store Stripe webhooks so order processing succeeds even if metadata is missing or races occur. [PR #7333]
  • Store Navigation & Filters: Use clearer copy on store payment links, correctly resolve store IDs on order detail pages, and align fulfilment filters with actual status values. [PR #7429, PR #7344, PR #7333, PR #7331]
  • Store Pickup/Delivery Messaging: Report the effective fulfilment method clearly when pickup isn’t allowed so buyers know their options. [PR #7309]
  • Stripe Refund Reconcilation: Correctly reconcile refunded payments on connected Stripe accounts, including thin events and PaymentIntent lookups. [PR #7386, PR #7387, PR #7378]
  • Club Credit Mark-Paid Reliability: Harden invoice mark‑paid flows when using club credit, including malformed/mixed tender scenarios, and surface “Club Credit” as a distinct tender. [PR #7292, PR #7298]
  • Invoice Date Filters Stability: Fix organiser invoice date filters so DateTimeOffset values no longer crash and end‑of‑day filters are inclusive. [PR #7271]
  • Waiver Capture Stability: Move to a self‑hosted signature pad with CSP updates and allow blob Web Workers so waiver signing works reliably across browsers. [PR #7402, PR #7396]
  • Event Waitlist Behaviour and Docs: Align the Event Waitlist behaviour and documentation with built functionality, clarifying that triggers are scoped to sessions/days, not just ticket classes. [PR #7287]
  • Results Display & Grouping: Improve result draw number keys, score formatting across disciplines, division grouping by name/discipline/scoring, and multi‑day dressage and overall calculations (including multiple horses per rider). [PR #7260, PR #7261, PR #7283, PR #7275, PR #7273, PR #7274, PR #7267]
  • Latest Results EXCA Formatting: Show EXCA scores as times, not percentages, in latest‑results blocks so riders see familiar formats. [PR #7274]
  • Club Hub & Sitemaps SEO: Refine Club Hub and sitemap behaviour to avoid indexing issues and improve discoverability. [PR #7282]
  • Club Hub Date & Timezone Handling: Fix club hub event date badges, timezones and mobile layout, including a safer default timezone when detection fails. [PR #7338]
  • Event & Club JSON-LD SEO: Prerender JSON‑LD for event and organisation pages, improving search engine understanding. [PR #7291]
  • Clubsite Performance & Rendering: Speed up tenant lookups and home page rendering, pass preloaded theme data to contact pages, and avoid rendering the whole site inside /contact. [PR #7318, PR #7323]
  • Clubsite Navigation & Assets: Keep essential Syncfusion assets on club pages, correctly format event date badges, and ensure club pages only link to published content. [PR #7349, PR #7340, PR #7351]
  • Clubsite Results & Caching: Refresh club‑site ResultsBoard caches when results are finalised so public results always show the latest standings. [PR #7290]
  • Store & Event Image Optimisation: Upgrade to ImageSharp 4, pin WebP encoding to lossy, and backfill/compress legacy event images to reduce file sizes and improve load times. [PR #7346, PR #7349, PR #7370]
  • Front-End Performance: Compress JavaScript at the edge and filter client profiles directly in the database to reduce load times and server work. [PR #7370, PR #7438]
  • Cart & Checkout Reliability: Ensure anonymous carts don’t leak between visitors, all registrations in a multi‑group cart are charged, and duplicate checkout errors clearly hint when a dependant is already registered. [PR #7369, PR #7377, PR #7389]
  • Booking Payment Links in Emails: Include payment links in “Booking Received” emails for pending bookings to make it easier for riders to pay later. [PR #7377]
  • Booking Links, Nav and Breadcrumbs: Restore key riding‑school navigation links, fix breadcrumb journeys back to My Bookings, and keep solo instructors labels consistent. [PR #7363, PR #7364, PR #7382]
  • Rider Site Navigation Improvements: Hide redundant Pricing links for signed‑in users, restore scroll to top on in‑app navigation, and fix mobile submenu alignment. [PR #7384, PR #7343, PR #7327]
  • Organiser Dashboard Usability: Improve Save button reachability and contrast on the organiser dashboard to meet accessibility standards. [PR #7357]
  • Clubsite Contact Page Clean-Up: Prevent /contact pages from embedding the whole site inside themselves, leading to clearer contact pages. [PR #7323]
  • Event Helpers Resilience: Harden server‑side validation and seeding for Event Helpers so rosters stay stable even under load. [PR #7265]
  • Event Session & Entry Handling: Prevent out‑of‑range sessions from blocking saves, adopt a consistent server session DTO, and use friendlier 410 pages when events are removed. [PR #7425, PR #7322, PR #7351]
  • Removed Event Handling: Show a friendly explanation when a registration link points to an event that’s been removed instead of a generic error. [PR #7351]
  • Entry Form Deletion & Cleanup: Let organisers delete entry forms previously blocked by abandoned drafts, with cleaner draft cleanup and a “deactivate” option. [PR #7306]
  • Member Profile Import & Display: Stop showing “No Horsify Profile” for members who do have one and route import/add member pages through a consistent landing layout. [PR #7329, PR #7324]
  • My Results Display for Riders: Fix timezone fallbacks, placing tallies and date formatting in My Results so riders see accurate placings. [PR #7267]
  • Riding-School Client Management: Restore editing of client contact details without blanking rows and keep quick‑info popups contained within the calendar. [PR #7362, PR #7400]
  • Club Booking Hours Visibility: Surface Booking Hours in the main site riding‑school menu so organisers and clients can find them quickly. [PR #7358]
  • Membership Checkout Errors: Surface clear reasons from the API when a membership checkout cannot be opened so organisers can help members resolve issues. [PR #7351]
  • Membership Warnings and 45-Day Window: Align membership warning windows to 45 days and route users to member‑facing pages to reduce confusion during renewals. [PR #7428]
  • Clubsite Store Navigation & Setup: Resolve store IDs correctly, provide a complete store setup guide, and seed a demo store for easier onboarding. [PR #7330, PR #7331, PR #7332]
  • Member Import & Club Membership KB Updates: Expand public help centre content for importing members, club membership configuration and club store setup with screenshots. [PR #7328, PR #7332, PR #7435, PR #7445]
  • Help Centre Host Consolidation: Use a single Zammad host for help links and make /help behave as a marketing/support page rather than an app area. [PR #7268, PR #7274]
  • Notifications to Unverified Phones: Allow transactional booking/event SMS to send even when the phone number isn’t verified, while normalising sender IDs to avoid “Unverified” labels. [PR #7280, PR #7359]
  • **
  • Workload-aware Feed Coach: Use the new Feed Coach to get workload-adjusted feeding guidance for each horse. [PR #7441]
  • Shareable Feed Cards: Share a horse’s feed card via a link so owners, coaches, and agistment centres can view it without logging in. [PR #7441]
  • Feed Card Diet Tracking in Care Assistant: Track a horse’s diet directly from its feed card inside the Horse Care Assistant to keep care notes and feeding in sync. [PR #7441]
  • Structured Feed Cards for School Horses: Give riding-school horses the same structured feed cards as privately owned horses for consistent feeding records. [PR #7441]
  • Exclude Riding-School-Only Clients from Rider Digest: Automatically skip pure riding-school clients from the rider digest so communications focus on active competitors and members. [PR #7438]

Improvements

  • More Complete Body Condition Scoring: Record the full Henneke body condition score range with clearer bands that match the on-screen caption. [PR #7441]
  • Accurate Feed-Shed Stock Matching Across Units: Have feed-shed stock correctly reconciled when feeds are tracked in different but equivalent units (e.g. kg vs g). [PR #7441]
  • Diet-Aware School Horse Management: School horse profiles now fully participate in structured diet and feed coaching workflows for easier barn management. [PR #7441]
  • Faster Rider Digest Generation: Rider digest processing now filters rider profiles directly in the database for faster, more reliable sends. [PR #7438]
  • Clearer Member Table Actions: Member table actions are now laid out to fit better on screen and expose dependant management directly from the list view. [PR #7440]

Bug Fixes

  • Forage Amounts No Longer Show as 0 kg: Fixed a Feed Coach issue where hay-fed horses could incorrectly show 0 kg of forage. [PR #7441]
  • Editable Saved Feed Cards: Resolved a problem that prevented previously saved feed cards from being edited. [PR #7441]
  • Stable Feed Coach Tabs and Limits: Fixed tab remount glitches, naming clashes, and server-side bounds in the Feed Coach so diet plans behave consistently. [PR #7441]
  • Secure Horse Nominations: Requiring sign-in to nominate a horse now closes a loophole that let anonymous users bypass per-horse entry caps. [PR #7434]

May 2026 — PaperSync, Offline Sync & Venue Enhancements

Released: May 2026

New Features

  • PaperSync — Paper Form OCR Ingestion: Organisers can now email paper-based entry forms to Horsify for automatic OCR processing. The system extracts participant data from scanned documents and creates registrations without manual re-entry. Includes a subscription gate and file-type validation to prevent abuse. [PR #5602, #5606]
  • Offline Sync (Phase 1 & 2): Event check-in and scratch management now work offline. Phase 1 delivers a background sync data worker that pre-fetches entries. Phase 2 adds conflict detection, entry caching, and a full scratch flow so stewards can continue working without connectivity and sync changes when back online. [PR #5602, #5606]
  • Facebook Incomplete Signup Tracking: Admins can now view a list of incomplete Facebook sign-ups — users who authenticated via Facebook but did not finish account creation — enabling targeted follow-up and account recovery. [PR #5630]
  • Venue PIC Field: Venues now include a Property Identification Code (PIC) field on the edit form, supporting biosecurity compliance and livestock tracking requirements for Australian equestrian venues. [PR #5610]
  • Venue Facility Description & Community Comments: Each facility on a venue page now supports a dedicated description field and a community comments section, giving visitors richer context about individual arenas, stables, and yards. [PR #5612, #5613]
  • PaperSync & Online Store Marketing Pages: New premium feature marketing pages for PaperSync and Online Store have been added so prospective subscribers can discover and learn about these capabilities. [PR #5607]
  • Organisation Picker Skip: Users who administer a single organisation are now taken directly to their dashboard, bypassing the organisation picker. A brief redirecting indicator is shown during the transition. [PR #5606]

Improvements

  • Tax Invoice ATO Compliance: Tax invoice PDFs have been redesigned with improved field layout and accurate GST presentation for full ATO compliance, replacing the previous basic format. [PR #5608]
  • Slug-Based Event URLs in Sitemap: The events sitemap now generates slug-based canonical URLs (e.g., /events/my-event-2026) rather than raw IDs, and the canonical URL guard condition has been simplified. [PR #5640]
  • Venue Image URL Caching: Venue API responses are now cached, stabilising image URLs across requests and enabling browser-level caching to reduce image flicker and redundant blob storage hits. [PR #5611]

Bug Fixes

  • Paid Invoices Showing Balance Owing: Fixed invoices correctly marked as paid still displaying a balance-owing amount in the UI grid and amount slider. [PR #5637]
  • Booking Query Performance: Added AsSplitQuery to booking queries that include multiple collection navigations, resolving EF Core cartesian explosion and slowdowns for large booking data sets. [PR #5636]
  • Invoice Not Updated on Mark-as-Paid: Fixed a bug where manually marking a registration as paid created a new payment record without updating the existing invoice. Payment details are now correctly written back to the invoice. [PR #5632]
  • Member Re-Invite Auto-Link: Auto-linking a member to their existing Horsify rider account now fires correctly when re-inviting members whose invitations are still pending. [PR #5631]
  • Org Stripe Checkout Robustness: Fixed several Stripe checkout edge cases for organisers — rider name is now persisted to the checkout session, registrations are set to PendingPayment status immediately, and confirmed-but-unpaid registrations can have their payment links resent. [PR #5629]
  • Instructor By-User Returns 404: Fixed a 404 error returned when no instructor record exists for a given user ID. The endpoint now returns 200 OK and guards the lookup with HasRidingSchoolAccess. [PR #5628]
  • PDF Paid-In-Full Badge Rendering: Removed an unsupported ✔ Unicode glyph from the PDF paid-in-full badge that caused generation failures in some PDF rendering environments. [PR #5627]
  • Duplicate Sitemap Controller: Removed a duplicate SitemapController that caused an AmbiguousMatchException on sitemap requests, and updated the sitemap to use www.horsify.com.au URLs. [PR #5625]
  • Club Site Robots.txt Conflict: Removed ClubSiteRobotsController that caused an AmbiguousMatchException on GET /robots.txt. Club site robots.txt now resolves the correct domain via effective host detection. [PR #5619, #5622]
  • Club Site Sitemap XML Encoding: Fixed malformed UTF-8 encoding in the club site sitemap XML and restored CMS page URLs that were missing from the output. [PR #5618]
  • Internal Email Hidden from Member Lists: The hello@horsify.com.au internal address is no longer visible in any organisation member list. [PR #5616]
  • JavaScript Interop TaskCanceledException: Replaced raw JS interop calls with safe TryInvoke wrappers to prevent unhandled TaskCanceledException exceptions during Blazor component disposal. [PR #5615]

April 2026 — Competition Classes, Member Dependants & SEO Overhaul

Released: April 2026

New Features

  • Save as Template for Entry Forms: Organisers can now save any entry form as a reusable template to quickly set up consistent forms across multiple events. Templates are managed in the Entry Form Builder. [PR #5309]
  • Auto-Link Member to Rider Profile: When saving a member record, Horsify now automatically links the member to their existing Horsify rider profile using email matching, reducing duplicate accounts. [PR #5312]
  • Dependent/Child Membership Support: Full support for adding child/dependent members linked to a parent or guardian account. Includes new API endpoints, MemberDependants domain model, EF Core migration, and management UI on the Organisation Members page. [PR #5313]
  • IndexNow SEO Integration: Club sites now automatically submit new and updated pages to Bing and other IndexNow-compatible search engines for significantly faster indexing. API key management and submission tracking included. [PR #5317]
  • Invoice Write-Off & Cancellation: Organisers can now write off or cancel outstanding invoices and failed payments. A mandatory notes field is required for audit trail compliance. [PR #5320]
  • Competition Class Horse Nominations: Organisers can configure whether individual competition classes require a horse nomination. Participants can then nominate a specific registered horse (or "Other") per class during event registration. [PR #5347, #5349]
  • Informational Text Form Field: New read-only InformationalText field type for entry forms and membership applications. Allows organisers to embed notices, instructions, or compliance disclaimers directly in dynamic forms. [PR #5351]
  • Extreme Cowboy Racing Discipline: Added admin bulk class template catalog for Extreme Cowboy Racing, with a full set of default competition class templates accessible from the Admin Discipline Management page. [PR #5352]
  • Discipline-Scoped Class Name Picker: The competition class editor now shows a filtered dropdown of standard class names for the selected discipline, with an "Other" option for custom names. Reduces data entry errors. [PR #5356]
  • "Other Horse" Nomination Support: Riders can now nominate an unregistered or borrowed horse by entering its name when their registered horses are not applicable for a division or class. New OtherHorseName field added to CartItem and CompetitionClassRegistration. [PR #5359]
  • WYSIWYG Email Template Editor: Organiser email template overrides now use a WYSIWYG rich-text editor (Syncfusion RichTextEditor) instead of raw HTML input, making template customisation accessible to non-technical users. [PR #5365]
  • Club Site SEO Isolation: Club-domain robots.txt and sitemap.xml are now independently generated per club site. Club sites no longer fall back to the main Horsify sitemap, preventing incorrect indexing and SEO bleed. [PR #5367, #5370]
  • Unified Session/Class Selection Summary: Competition class and session selections are now displayed consistently across confirmation emails, invoices, tax receipts, PDF exports, and the registration success page. A new RegistrationSelectionSummaryBuilder service centralises this logic. [PR #5371]
  • Multi-Society Horse Registrations: Riders can now record registration numbers across multiple equestrian societies per horse (e.g., EA, AQHA, NCAS). Custom entry form auto-fill now includes horse registration numbers. [PR #5372]
  • Auto-Save Event Sessions on Add: Event sessions are now automatically persisted to the API when added in the Event Edit page, eliminating the need for a separate save step. [PR #5375]

Improvements

  • Aspire 13.2.2 Upgrade: All .NET Aspire packages (Aspire.AppHost.Sdk, Aspire.Hosting.*, Aspire.StackExchange.Redis.DistributedCaching, Aspire.Microsoft.EntityFrameworkCore.SqlServer) upgraded to 13.2.2. [PR #5341]
  • Grouped Cart Checkout: Cart entries for the same event are now grouped together, presenting competition classes and sessions as a single cohesive checkout block rather than individual line items. [PR #5361]
  • Stabling/Yard Registration Layout: Improved stabling registration UX — day yards are now on the left, night stables on the right, with clearer field labels and consistent layout across event creation and registration. [PR #5369]
  • Membership Application CoE & Payment Evidence: Club-site membership application forms now correctly render Conditions of Entry waiver fields and evidence-of-payment document upload controls, with file upload API and client-side handling. [PR #5353]
  • What's New Prompt Templates: Added monthly prompt templates for generating "What's New" summaries for both Riders and Organisers, used to drive in-app release notes content. [PR #5315]

Bug Fixes

  • Email Campaign Branding: Fixed broken Horsify logo URL, unsubscribe link visibility, and missing brand styling in admin-sent campaign emails. [PR #5314]
  • Invoice Management Errors: Fixed invoice detail fetch errors, null reference exceptions on invoice view, unknown payer display on payment records, and invoice/payments page load failures. [PR #5318, #5322, #5323, #5325, #5332]
  • Cart Nomination Sync: Fixed cart nomination form not reflecting confirmed selections, duplicate horse+division prevention on add, and incorrect division display in cart. [PR #5360, #5362]
  • Invalid Horse ID Fallback: Cart add endpoint now gracefully falls back to "Other horse" mode when a HorseId is invalid or belongs to a different rider, preventing 500 errors. [PR #5363]
  • Cart Horse Validation: Fixed validation for mixed rider-profile and free-text horse nominations to correctly accept horses linked via OwnerUserId or rider profile. [PR #5374]
  • Event List Page Load: Fixed event list page failing to load due to a query error affecting organisations with large event sets. [PR #5348]
  • Club Site Visibility Issues: Fixed hero banner not rendering, element visibility errors on equestrian club pages, and "Create New Page" button visibility in the CMS page builder. [PR #5330, #5331, #5334, #5335]
  • Authorization Policy Registration: Added missing "Admin" authorization policy required by discipline class management endpoints. [PR #5355]
  • Security Vulnerability (CVE): Pinned System.Security.Cryptography.Xml to patched version across all test projects, resolving NU1901 CI restore failures and the underlying security advisory. [PR #5357, #5366]
  • Published Events Closure: Fixed incorrect handling of published event state during event closure operations. [PR #5319]
  • TBA Event Timezone: Fixed TBA event creation by aligning timezone fallback with the organisation's configured state, ensuring correct display for events without a confirmed venue. [PR #5350]
  • Unauthenticated User Redirect: Fixed redirect loop affecting unauthenticated users navigating to protected pages. [PR #5336]
  • Sitemap & SEO: Updated main site sitemap to www.horsify.com.au, fixed sitemap XML fetch errors, and corrected robots.txt generation logic. [PR #5326, #5340, #5344]
  • Error Handler 404: Fixed generic error handler incorrectly returning 404 for internal server errors. [PR #5337]
  • Validation Rule Truncation: Fixed form validation rules being silently truncated on save. [PR #5345]

April 2026 — Registration, Image & Payment Improvements

Released: April 2026

New Features

  • Custom Form Fields on Entry List & Exports: Organisers can now see custom form field responses directly in the entry list grid, Excel exports, and registration management views. Custom form data is also included in PDF receipts. [PR #5303, #5308]
  • Delete PendingPayment Registrations: Organisers and system admins can now delete registrations stuck in PendingPayment status, allowing cleanup of abandoned checkouts. [PR #5306]

Improvements

  • CDN URL Conversion: SasTokenRefreshWorker now proactively converts blob storage SAS URLs to CDN URLs when AssetsCdn__BaseUrl is configured, improving image load performance and reducing blob storage direct hits. [PR #5307]
  • Club Site Image Token Expiry Fix: Block renderers (Hero, ImageGallery) now always regenerate image URLs from blob paths at render time, eliminating 403 errors caused by expired SAS tokens in cached HTML. [PR #5307]
  • Entry Form Pre-Population: Fixed entry forms to properly guard against redundant reloads, preserve draft values during editing, and use org-specific membership numbers. Checkout forms now pre-populate from rider profile for all authenticated users. [PR #5294, #5299, #5302]
  • Email Delivery Reports: Restored email delivery report tracking with Delivered status and fixed fallback lookups in EmailDeliveryEventProcessor. [PR #5304]
  • Stripe SDK Compatibility: Updated Stripe UiMode from embedded to embedded_page and hosted to hosted_page to match the latest Stripe SDK v3 API changes. [PR #5292, #5298]

Bug Fixes

  • Unlinked Rider Profile: Fixed duplicate key constraint error on user deletion by making Rider.AuthUserId nullable with a filtered unique index. [PR #5289]
  • Venue Merge 500 Error: Fixed MergeVenues failing with 500 errors by wrapping in a transaction, using IgnoreQueryFilters on events, and properly transferring OrganisationVenue records. [PR #5288]
  • Image Gallery Render Error: Fixed crash when Albums JSON is malformed or non-array, and fixed unsafe reader pass-by-ref in LenientObjectListJsonConverter. [PR #5287]
  • Club Site Console Errors: Fixed Blazor.addEventListener is not a function JavaScript error on club site pages. [PR #5291]
  • Draft Entry API: Fixed empty body from GetDraftEntry API — now returns 204 instead of Ok(null) to prevent client-side deserialization errors. [PR #5296]
  • Auto-Populate Data Endpoint: Fixed authentication to allow all authenticated users (not just admins) to call the auto-populate-data endpoint. [PR #5299]
  • Subscription Check Noise: Eliminated repeated subscription API calls on every page load and reduced excessive log output. [PR #5284]
  • Admin Communication Endpoints: Fixed authorization using inline role requirement instead of a named 'Admin' policy that wasn't registered. [PR #5282]
  • ACA Internal Host Warning: Suppressed noisy Azure Container Apps internal hostname warning when FrontDoorId is not configured. [PR #5280]
  • Worker Key Vault Loading: Fixed Worker not loading Key Vault configuration in Azure dev deployments, causing missing email configuration. [PR #5279]
  • MFA Remember Device: Fixed MFA type=checkbox attribute ordering with @bind in Blazor, and preserved Remember this device checkbox state when switching MFA tabs. [PR #5261, #5262]
  • Member Management Bugs: Fixed 8 bugs in membership management including email case comparison, IsAdmin field display, member name display, and accessibility improvements. [PR #5252, #5256]
  • Membership Payment Flow: Fixed membership payment flow from CMS block and organisation view join button, including correct Stripe account selection (Standard vs Connect). [PR #5244, #5246, #5248]
  • SQL Infrastructure: Simplified SQL auto-provisioning to use deterministic logic, with safety checks to prevent dev connecting to prod SQL server. [PR #5265–#5272]

Late March 2026 — Membership, CMS & Infrastructure Update

Released: Late March 2026

New Features

  • Membership Application CMS Block: Added a self-service membership application form as a CMS block for club sites. Supports custom form templates, conditions of entry waivers, membership type selection with pricing, and embedded Stripe checkout for membership fee payment. Anonymous visitors can apply without authentication. [PR #5174, #5178, #5186, #5188, #5222]
  • Admin Communications Platform: Platform-wide admin communication system for sending newsletters to all riders and organisations. Includes audience segmentation, scheduled dispatch, Spam Act compliance (unsubscribe links), and double-send race condition prevention. [PR #5203, #5213]
  • Organisation Email Campaign Management: Refactored organisation email campaigns to use a shared CampaignEmailRenderer with background processing via OrgCampaignSendWorker. Added campaign duplicate functionality, builder fields UI, and fixed N+1 query in tracking endpoints. [PR #5218, #5219, #5226]
  • Email Delivery Monitoring: Added email delivery tracking endpoints with admin authentication and subscription tier checks. Organisers can monitor delivery status of sent campaigns. [PR #5154]
  • Committee Member Management: Full committee member management with profile modals, navigation links, search/filter dropdown, delete functionality (soft delete), and committee member listing on organisation pages. [PR #5148, #5169, #5179, #5181]
  • Bank Account Details for Organisations: Organisations can now securely store encrypted bank account details (BSB, account number, account name). Bank details are displayed in email confirmations and invoice PDFs for bank transfer checkouts. [PR #5064, #5065]
  • SMS MFA Backup Option: Added SMS/phone as a backup MFA method alongside authenticator app (TOTP). Organisers can set up SMS MFA during the mandatory MFA enrollment flow. [PR #5059]
  • MFA 28-Day Device Remember: Users can opt to remember their device for 28 days during MFA verification, skipping MFA on subsequent logins from the same device. Device tokens persist across logout via secure cookies. [PR #5061, #5062]
  • Camping & Accommodation Support: Events can now include camping/accommodation options with per-night fees, stable/yard fees, and bond amounts. Camping fields appear in event creation, registration, cart, and admin registration views with full unit test coverage. [PR #5068, #5070]
  • Payment Failure Tracking & Retry: Track payment failure counts and reasons on registrations. Organisers can resend payment links for failed payments, and delete orphaned registrations with repeated failures. [PR #5110, #5140]
  • CheckboxGroup Form Field Type: New multi-select checkbox group field type for entry forms, supporting volunteer preferences and similar multi-option selections. [PR #5056]
  • Competition Class Enrolment in Manual Registration: Organisers can now select competition classes when manually adding registrations on behalf of participants. [PR #5053]
  • Unverified Rider Login: Riders with unverified email addresses can now log in and use the app. An email verification nag banner prompts them to verify without blocking access. [PR #5099]
  • Confirm Email Field on Signup: Added a "Confirm Email" field to signup forms to prevent email typos during registration. [PR #5136]
  • Remove Pending Invitation Members: Organisers can now delete pending invitation (awaiting signup) members from the member management page. [PR #5129]
  • Membership Application Notifications: Organisers receive email notifications when a new membership application is submitted through the CMS block. [PR #5193]
  • CMS Block Types Expansion: Added missing CMS block types to the page builder UI including Upcoming Events, Event Calendar, Facebook Feed, PDF Viewer, Sponsors, Booking Widget, and Facility Booking Widget editors with styled renderers. [PR #5164, #5180]
  • Sponsors CMS Block Improvements: Enhanced sponsors block with tier grouping (Platinum/Gold/Silver/Bronze), gradient cards, hover animations, and auto-scrolling carousel for club site sponsor showcases. [PR #5202]

Improvements

  • Aspire 13.2.1 Upgrade: Upgraded .NET Aspire from 13.2.0 to 13.2.1 with all compatible NuGet packages updated. [PR #5251]
  • Syncfusion Grid Mobile Columns: Added mobile-hide CSS classes to Syncfusion grid columns across 22 pages, improving mobile responsiveness for all data grid views. [PR #5118]
  • Registration PDF Enhancements: Added competition class breakdown, accommodation details, end times, and class times to registration PDF receipts. [PR #5127, #5134]
  • Invoice Generation on Checkout: Invoices are now automatically generated when Stripe checkout completes for the organisation's Stripe account. [PR #5043]
  • Ticket Overbooking Prevention: Added validation to check and update sold counts across all payment methods (Stripe, bank transfer, cash) to prevent ticket overselling. [PR #5076]
  • Payment Type Restrictions: Checkout now restricts available payment types (card, bank transfer, cash) based on the organisation's configured payment fee settings for Standard Stripe accounts. [PR #5106, #5137]
  • Opt-In Organiser Communications: Organisers are now opted into Horsify platform communications by default, with Campaigns added to the admin menu. [PR #5260]
  • Mobile Layout Fixes: Extensive mobile viewport improvements for event registration forms, cart page alignment, checkout flow, and data grids. Fixed overflow issues and properly sized interactive elements. [PR #5078, #5096, #5097, #5103, #5107, #5109, #5114, #5130]
  • Quick Nav Sticky Fix: Replaced overflow-x-hidden with overflow-x-clip on layout main elements to fix sticky quick navigation without breaking scroll. [PR #5200]
  • Event About Header Icon: Added a decorative icon to the "About this event" header on the EventDetail page. [PR #5224]
  • www.horsify.club Redirect: Added 308 permanent redirect from www.horsify.club to www.horsify.com.au via Azure Front Door rule. [PR #5225]
  • NPM & Node.js Updates: Updated all NPM packages to latest versions and upgraded Node.js recommendation to v22 LTS for Playwright tests. Fixed compatibility issues with Node.js v24.11.0. [PR #5228–#5239]
  • E2E Test Suites: Added Playwright E2E tests for public pages, email campaign creation/sending, club site CMS features, and authenticated organiser flows. [PR #5151, #5227, #5290]

Bug Fixes

  • Membership Invitation Handling: Fixed invalid/expired membership invitation links showing a crash instead of a graceful error message. Fixed membership type not displayed or editable in invitations. [PR #5173, #5194]
  • Club Site Store Status: Fixed store showing as disabled in CMS and Store page even when enabled. [PR #5183]
  • PDF Viewer on Club Sites: Fixed PDF iframe sandbox attribute blocking browser PDF viewer, and fixed PDF viewer block file upload failing due to incorrect Content-Type. [PR #5177, #5189]
  • CSP Directives: Added Facebook and Azure Blob Storage to Content Security Policy frame-src directive for page plugin iframes and PDF viewing. [PR #5155, #5185]
  • Facebook CMS Block: Detect Facebook Group URLs in FacebookFeedBlock and show a helpful message (Groups cannot be embedded). [PR #5163]
  • Email Template Types: Added proper EmailTemplateType enum values, fixed Custom type usages, and fixed EventId and EventReminder bugs in email template management. [PR #5162]
  • Event Bank Transfer Checkout: Fixed case-insensitive JSON deserialization for Minimal API endpoints and fixed E2E tests. [PR #5125, #5160]
  • EventCalendar UTC Time: Fixed UTC time display in EventCalendarBlockRenderer and Upcoming Events CMS block. [PR #5155, #5161]
  • SAS Token Cache Invalidation: SasTokenRefreshWorker now invalidates Redis page/nav cache after token refresh to prevent stale URLs in cached pages. [PR #5159]
  • Logout Issues: Fixed multiple logout flow issues including token refresh re-authentication during logout, malformed JWT handling, expired JWT in auth cookie, and forceLoad navigation. [PR #5083, #5111, #5115, #5126, #5141, #5143, #5144]
  • MFA SMS Setup: Fixed MFA SMS setup token preservation on method change and SMS MFA recognition in login flow. [PR #5146]
  • Member Update Authorization: Fixed org admins unable to update IsAdmin field for members in their organisation. [PR #5147]
  • Email Campaign Member Count: Fixed organiser email campaign showing 0 members due to incorrect ID lookup. [PR #5226]
  • Riding School Paywall: Fixed riding school bookings paywall blocking multi-org admins, and fixed admin users seeing paywall despite admin=True. [PR #5072, #5198]
  • Cart Checkout Crash: Fixed null SessionTypeId/OccurrenceId causing cart checkout crash. Fixed payment methods total to exclude malformed cart items. [PR #5204, #5214]
  • Event Registration Button: Fixed Register for Event button visibility for Ticketed/FreeRsvp events. [PR #5201, #5205, #5212]
  • Stable/Yard Fee Display: Fixed stable/yard fee and bond not displayed on event registration page. Hide $0.00 competition class prices on cart and receipt. [PR #5042, #5050]
  • Foreign Key Constraint: Fixed SQL Server cascade path error for OrganisationInvitations.MembershipFeeId foreign key. [PR #5196]
  • Member Expiry Filter: Fixed Active member filter to require valid non-expired expiry date; moved no-expiry Active members to Expired tab. [PR #5191]
  • MFA Device Cookie: Fixed MFA device cookie preservation across logout and renewal on trusted login. [PR #5192]
  • AccessDenied Page Layout: Added LandingPageLayout to AccessDenied, OrganisationPaymentFees, and OrganisationSponsors pages. [PR #5105, #5255]
  • Submit Button Styling: Fixed white-on-white submit button and improved membership type card styling. [PR #5254]
  • Phone Input Sanitization: Sanitize phone number before validation in rider profile save. [PR #5250]
  • Data Seeding in Azure Dev: Fixed DatabaseInitializer.MigrateAndSeedAsync to seed test users in Azure dev deployments. [PR #5274]
  • PaymentType Enum Deserialization: Fixed PaymentType enum deserialization in payment processing fee API calls. [PR #5101]
  • Event Session Time Sync: Fixed session times not updating when event start/end time changes. [PR #5085]
  • Breadcrumb Navigation 404: Fixed Registrations breadcrumb link returning 404 on event registration detail page. [PR #5088]
  • Export to Excel/PDF: Fixed event entry list export to Excel and PDF not triggering browser download. [PR #5087]
  • Mobile Landing Nav: Replaced full mobile landing nav with floating hamburger bubble for better mobile UX. [PR #5086]
  • Cart Delete Button Mobile: Fixed cart delete button being oversized on mobile viewports. [PR #5114, #5130]
  • Disposed DbContext in Email Notifications: Fixed ObjectDisposedException in fire-and-forget email notification sending by using IServiceScopeFactory. [PR #5217, #5301]
  • EF Core Decimal Precision: Fixed decimal precision warnings for camping fee properties. [PR #5074]

March 2026 — Aspire 13.2.0 Upgrade

Released: March 2026

Improvements

  • Aspire 13.2.0 Upgrade: Upgraded .NET Aspire from 13.1.3 to 13.2.0. Updated Aspire.AppHost.Sdk, all Aspire.Hosting.* packages (Aspire.Hosting, Aspire.Hosting.AppHost, Aspire.Hosting.Azure.AppContainers, Aspire.Hosting.Azure.CognitiveServices, Aspire.Hosting.Azure.KeyVault, Aspire.Hosting.Azure.Redis, Aspire.Hosting.Redis, Aspire.Hosting.Azure.Storage, Aspire.Hosting.Azure.Sql, Aspire.Hosting.JavaScript), Aspire.StackExchange.Redis.DistributedCaching, and Aspire.Microsoft.EntityFrameworkCore.SqlServer to version 13.2.0.

March 2026 — Security & Event Management Update

Released: March 2026

New Features

  • MFA for Organisation Admins: Implemented mandatory authenticator-app (TOTP) multi-factor authentication for all organisation admin users. A new AdminMfaRequirementService acts as the single source of truth for MFA enforcement. Org admins must complete TOTP setup before accessing admin features. [PR #4853, #4855]
  • Refund Policy & Deposit Support: Added organisation-level refund policies with per-event override capability (UseOrganisation or Custom modes). Event tickets now support deposit vs. full-upfront payment modes via new DepositAmount and PaymentMode fields. [PR #4852]
  • Venue Map Image Upload: Venues can now upload a site map image (mirrors the existing logo upload pattern). The venue detail page displays the map with a click-to-enlarge lightbox. [PR #4869]
  • Organiser Manual Registration with Entry Form: Organisers can now create registrations on behalf of participants via admin-only endpoints (POST /api/organisations/{orgId}/admin-registrations), with full support for entry form fields. [PR #4880]
  • Extended Entry Form Auto-Populate Fields: Added five new DataSourceFieldType values for entry form templates: RiderDateOfBirth, RiderEmergencyContactName, RiderEmergencyContactPhone, RiderMedicalInfo, and RiderMembershipNumber. [PR #4851]
  • File Upload Field in Entry Forms: The FileUpload field type in DynamicFormRenderer is now fully functional end-to-end (previously a stub). Supports JPG, PNG, and WEBP with client-side validation. [PR #4903]

Improvements

  • Stripe Connect OAuth Fix: Fixed Stripe Connect organisation onboarding that was failing with a 400 Stripe OAuth is not configured error. Added the Stripe:ClientId configuration key and a Key Vault restoration guard. [PR #4838]
  • Club Site First-Load Performance: Eliminated an approximately 5-second loading spinner on club sites by parallelising SiteRenderer API calls and running block renderers concurrently. [PR #4882]
  • HTTP Client Resilience: Added retry and circuit-breaker resilience policies to the default and HorsifyApi HTTP clients to handle transient network failures gracefully. [PR #4893]
  • Riding School Subscription Guard in Club Site Nav: Riding school organiser menu items (Bookings, Clients, Instructors, School Horses, etc.) are now hidden in the club site shell when the organisation does not have an active riding school subscription. [PR #4850]
  • Aspire 13.1.3 & NuGet Package Upgrades: Upgraded Aspire from 13.1.2 to 13.1.3. All NuGet packages updated to the latest compatible versions for .NET 10 (OpenAPI packages remain pinned pending .NET 11). [PR #4885]
  • Complex Event Session Date/Time UX: Replaced datetime-local inputs with separate date and time fields for complex event sessions, eliminating visible flicker caused by JS UTC-to-local conversion on every Blazor re-render. [PR #4844]

Bug Fixes

  • Worker Failures: Fixed various worker failure issues. [PR #4836]
  • 401 Auth Errors and Broken Logout in Blazor Server: Fixed JWT token refreshes that succeeded in-memory but left stale HttpContext.User claims causing 401 errors. Logout click handlers were silently dropped on degraded circuits, and a global logout flag was blocking token refreshes for concurrent users. [PR #4841]
  • Venue Detail Layout: Fixed the venue detail page (/venues/{id}) incorrectly using MainLayout instead of LandingPageLayout. [PR #4846]
  • AuthTokenHandler Cross-Circuit Identity Leak: Fixed a token handler reconciliation issue that could substitute User A's token for User B's request in Blazor Server handler-pool scenarios. [PR #4848]
  • CTA Block Text Visibility: Fixed invisible text in CTA blocks on dark-themed club sites (white text was rendering on a light background). [PR #4849]
  • Stale JWT 401 on Return from Idle Session: Fixed expired JWTs causing API 401 errors after long idle periods by adding proactive token refresh during the Bootstrapping state and 401 retry logic. [PR #4854]
  • Missing RefundPolicy Database Migration: Fixed a production crash on /api/tenants/resolve caused by a missing RefundPolicy column. Added the AddRefundPolicyToOrganisations migration. [PR #4857]
  • Retain Club Subdomain on Rider Login: Fixed riders being redirected to their home club instead of the club site they were visiting when logging in. [PR #4861]
  • ForgotPassword / ResetPassword Missing Nav Layout: Fixed missing navigation on the forgot and reset password pages. [PR #4864]
  • MFA Flow Bug Fixes: Multiple fixes to the MFA authentication flow — fixed "invalid password" error after MFA setup, fixed verification code handling, fixed ValueTuple serialization breaking JWT responses, migrated QR code generation from the retired Google Charts API to server-side QRCoder, and fixed double-initialisation causing stale TOTP secrets. MFA can now be disabled in local/dev environments via Mfa:Enabled = false in appsettings.Development.json. [PR #4858, #4865–#4868, #4910, #4911]
  • Organisation Logo Clipping: Fixed square organisation logos being cropped top and bottom on the /organisations listing page. [PR #4870]
  • Club Site Images Expiring (403): Fixed hero and gallery images expiring after 24 hours due to a missing blob path in block JSON that prevented SAS token regeneration. Also fixed the short SAS token expiry for uploaded images in block content. [PR #4871, #4872, #4887]
  • Venue Map Migration: Fixed a missing Designer.cs for the AddVenueMapImage migration that prevented it from being applied. [PR #4876, #4877]
  • Complex Event Session Saving: Fixed new complex event sessions silently failing to persist due to a UTC/local-time mismatch. [PR #4878]
  • Entry Forms Not Shown at Cart Checkout: Fixed entry forms being bypassed during checkout. The cart now prompts for entry form completion before proceeding to payment. [PR #4879]
  • Club Site Store Product Links 404: Fixed product URLs using an org-name slug that matched no route. [PR #4881]
  • SAS URL JSON Encoding: Fixed & being HTML-escaped as \u0026 in serialised SAS URL JSON. [PR #4891]
  • /api/events 500 with Date Filters: Fixed a DateTimeOffset vs DateTime EF Core LINQ mismatch that caused 500 errors when date filters were passed to the events endpoint. [PR #4892]
  • Production Startup Crash — Azure SQL Auth: Fixed Microsoft.Data.SqlClient v6+ ActiveDirectoryDefault auth provider not being found on startup. Added the Microsoft.Data.SqlClient.Extensions.Azure package. [PR #4894]
  • Complex Event Checkbox Not Persisting: Fixed IsComplexEvent always returning false when loading an event for editing due to a missing field in the DTO mapping. [PR #4896]
  • Event Sessions Timezone: Fixed event sessions displaying and storing times as raw UTC instead of respecting the event's configured timezone. [PR #4900]
  • Session Field Overwrite on Multiple Edits: Fixed a race condition where a second field change reverted the first when editing multiple session fields simultaneously. [PR #4902]
  • Extreme Cowboy Racing Discipline Badge: Fixed the badge displaying "Extreme Cow Boy Racing" due to incorrect CamelCase splitting. Added ExtremeCowboyRacing = 35 with a lowercase b. [PR #4905]
  • Oversized Event Images: Fixed event images rendering at full container width with no height constraint. [PR #4906]
  • Discipline Dropdown and Classes Page Layout: Fixed an unbounded discipline dropdown on the competition classes page and corrected the page layout from MainLayout to LandingPageLayout. [PR #4907]

March 2026 Release

Released: March 2026

New Features

  • School Horse "In Training" Status: Added InTraining (enum value 4) horse status. Horses in training appear on the riding school landing page CMS block with an amber badge but are not bookable for lessons. [PR #4830]
  • School Horse Description Field: Added a public bio/description field (up to 1,800 characters) to school horse profiles, displayed on the CMS block horse detail modal. [PR #4830]
  • School Horse "N/A" Skill Level: Added an "N/A" option to SuitableForLevel, allowing horses not yet assigned a suitability level to be managed without being bookable. [PR #4830]
  • Horse Detail Modal on CMS Block: School horse cards on club/riding school landing pages are now clickable <button> elements that open a detail modal showing full horse information, description, and status. [PR #4830]
  • Delete School Horse: Organisers can now delete school horses from the management page. A soft-delete is performed (sets Status=Inactive, IsAvailable=false) when active bookings exist; a hard-delete is performed otherwise. A confirmation modal names the horse and warns about soft-delete. [PR #4831]
  • Photo Gallery CMS Block Improvements: Significant improvements to the Gallery Block editor including drag-and-drop upload zone with visual feedback, per-file upload status icons (spinner → ✓ / ✗), client-side validation (file extension + 5 MB limit), Select All / Deselect All in the image picker, per-image delete from library (trash icon), inline alt text editing per image, and an image count badge on the "Pick from Library" button. Album IDs are now auto-generated as URL slugs from the album name. [PR #4818]

Improvements

  • Rich Text Block Formatting: Replaced non-functional prose Tailwind classes with a dedicated rte-content CSS class, restoring correct heading, paragraph, list, blockquote, link, and table rendering in rich text blocks. Dark mode is fully supported. Editor toolbar expanded to include Formats, FontName, FontSize, FontColor, BackgroundColor, StrikeThrough, Indent, Outdent, and ClearFormat. [PR #4821]

Bug Fixes

  • Managed Identity / Event Hub: Fixed Managed Identity configuration for Event Hub checkpoint storage; silenced expected CORS warning on startup. [PR #4834]
  • BookingBalanceCollectionWorker Startup: Fixed DB authentication failure on startup by adding a 2-minute startup delay for the BookingBalanceCollectionWorker. [PR #4833]
  • School Horse Image URLs: Resolved multiple image URL issues for school horses. [PR #4832, #4829, #4828, #4827, #4824, #4823, #4819]
  • Cancellation Request Notification Link: Fixed 404 error on the "View Details" link in cancellation request notifications. [PR #4826]
  • Cart Page Timezone: Fixed event session times displaying in UTC instead of the local timezone on the cart page. [PR #4825]
  • LessonEnquiry EF Core Warning: Fixed EF Core query filter warning for LessonEnquiry entity by adding a matching query filter. [PR #4822]
  • Photo Album Fix: Fixed issues with the photo album block. [PR #4820]
  • Tenant Resolver: Fixed tenant resolver to filter non-.club domains early and return HTTP 200 for unknown tenants instead of an error. [PR #4817]
  • Email Template Seeding: Updated database seed for email templates; fixed horse school and mobile view regressions. [PR #4815]
  • Email Templates Not Persisting: Fixed email templates never persisting to the database in production. [PR #4814]

February 2026 Release

Released: February 27, 2026

Bug Fixes

  • LandingNav Layout Fix: Fixed page content hidden under the fixed LandingNav by adding 116px top offset to LandingPageLayout.razor. Affected all riding school, club, and agistment landing pages. [PR #4535]

New Features

  • Admin Store Management UI: Added three admin store management pages — product management (/admin/store/products), order management (/admin/store/orders), and store settings (/admin/store/settings) with Syncfusion Grid components, full CRUD operations, and status management.
  • Organiser Store: Added organiser-facing store management including product management, order tracking, and store settings at organiser level.

Improvements

  • Store Implementation: Completed public-facing store UI with shopping cart, Stripe checkout, order confirmation, and StoreId resolution. Seeded Horsify Store with sample products including variants.

Released: January 28, 2026


Released: January 28, 2026

New Features

  • Chat Widget Support: Added Microsoft Customer Connect chat widget for real-time customer support. The chat widget appears in the bottom-right corner of all pages, providing instant access to support for organisers, riders, and admins without leaving the application. Includes proper CSP security configuration and automated test coverage.

How This Works

When a new GitHub release is published, the automated workflow:

  1. Fetches release details from GitHub API
  2. Prepends a new section to this file
  3. Commits changes to the repository
  4. Syncs this page to Zammad knowledge base

Release Template

Each release follows this structure:

## Version X.Y.Z

**Released:** Month DD, YYYY

### New Features
- **Feature Name**: Description of the new feature [PR #XXX]

### Improvements
- **Area Name**: Description of the improvement [PR #XXX]

### Bug Fixes
- **Issue Description**: How the bug was fixed [PR #XXX]

### Breaking Changes
- **Change Description**: What changed and migration steps required [PR #XXX]

---

Version 1.0.0

Released: January 28, 2026

New Features

  • Documentation Agent: Added custom Copilot agent for automated documentation updates
    • Analyzes code changes and creates feature documentation
    • Manages Zammad sync configuration
    • Validates documentation structure
    • Handles release notes updates

Improvements

  • Documentation Process: Streamlined documentation workflow with automated validation and sync

For older releases, see the archive\n\n---\n\nSource: wiki/releases/LATEST_CHANGES.md \nLast synced: 2026-10-06 03:26:54 UTC

Dressage results: finding your score sheet after a competition