Latest Changes

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


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-09-07 12:48:31 UTC