Case study: custom software
A national charity's membership and events, rebuilt on one source of truth
Intricate event tickets, twelve membership levels, and a members-only website, where the reports finally match the sales.
A well-known UK charity ran its members, its events, and its members-only content on a patchwork of plugins that no longer agreed with each other. Ticket sales and reports drifted apart, exports quietly dropped custom fields, and staff dreaded every event. We designed and built a single custom platform to replace it, with one set of records behind every number, built into the charity's existing website so the rest of their site stays exactly as it was. We built it for the charity that owns it.
The brief
When the numbers stop agreeing
A working charity had outgrown its tools. The job wasn't to add features; it was to make everything agree with everything else again.
The problem
A patchwork that drifted
Members lived in one plugin, ticketing in another, content in a third. The ticketing kept its own tally of seats sold, separate from the actual attendee records, and over time the two drifted. Reports didn't match the money.
- Separate plugins for membership, ticketing, and content that didn't share data
- A sold-seats counter that drifted from the real attendee and order records
- Exports that quietly dropped the custom fields staff most needed
- Event setup so fiddly the team dreaded it
The platform
One set of records behind everything
We built a custom platform, native to the charity's existing website, where sales, attendance, revenue, reports, and exports all derive from one set of records. Nothing is tallied twice, so nothing can drift.
- Membership, ticketing, payments, and a members-only area in one system
- Every figure derived live from a single source of truth, never a stored counter
- Intricate, per-ticket registration with conditional logic and fees
- Reports and exports that carry every field, filterable and reconcilable
The engine
The life of a booking
Six things happen between a stranger joining and a full event running at the door. The team touches only the parts they choose to.
Someone joins
A new member chooses one of twelve levels across two groups, annual and auto-renewing, or three-year and lifetime, and pays by card through the charity's own Stripe account. A member number is issued and a personal dashboard goes live, showing their events, their billing, and what their membership unlocks.
The website opens up
Membership unlocks the members-only areas of the site: the newsletter, member articles, the message board, instrument loans, discounts, and directory listings. Access follows the membership level, and it lifts automatically when a membership lapses. No manual gate-keeping.
An event goes on sale
Staff build an event and its ticket types in a plain-language admin, setting pence-accurate prices and capacities, and it appears on the public What's On listing. Logged-in members see their member price and early-access window applied automatically, with no discount codes and no separate lists.
The complex part: registration
Each ticket type carries its own form. A senior place asks seventeen questions: grade, guardian contact, allergies and medical needs, a timed performance-class choice with eligibility rules, the piece and composer, an accompanist that adds its fee automatically, and ensemble participation. A junior place asks eleven, different ones. Fields appear only when they apply.
One cart, one payment
A parent books several different ticket types in a single transaction, say one senior place and one beginner, each attendee getting the right form and the total adding up correctly, through one checkout and one confirmation. A free accompanying place is added automatically for young children, and membership fees and tickets run through the same account.
The team runs it, and the numbers match
Admins filter attendees by event, ticket type, age, or check-in status, see allergies and class choices as columns, switch to check-in mode at the door, and export every field to a spreadsheet. Because each report derives from the same records as the sales, they reconcile, which is the one thing the old setup could never do.
Under the hood
The parts we're proud of
One source of truth, by design
The platform's first job was to end the drift. Seats sold, revenue, attendance, and every report all derive from a single set of records, with no separate counter to fall out of sync. The charity's worst recurring problem, reports that didn't match sales, was designed out rather than patched over.
Tickets with real-world complexity
Registration isn't a name and an email. It's grades, allergies and medical needs, timed class selections with eligibility rules, per-option fees, an auto-added free place for young children, and a different form for every ticket type. A form builder models all of it as configuration, so a new event doesn't need new code.
Membership that gates the right things
Twelve levels across two groups, annual and lifetime, auto-renewing or by invitation. Each level sets what a member pays, when they get early access, and which parts of the website unlock. Access is granted and revoked automatically as memberships change.
Built into what they already run
The platform sits natively inside the charity's existing website and connects to the Stripe and Mailchimp accounts they already use. The rest of their site is left untouched. This just adds a focused, reliable events and membership engine where the old plugins used to fight.
How it was delivered
A rebuild, planned before it was built
This wasn't a greenfield novelty. A working charity had outgrown its plugins, and the fix had to preserve everything: 321 members, twelve levels, years of event history, and their existing site. So the plan came before the code.
This was a build engagement: fixed price, billed by milestone, with the plan agreed before the first line of code. No growth campaign attached, and that's how most clients hire us: one service at a time.
Built to be operated
The unglamorous parts that keep it honest
- Migrated, not just rebuilt. Years of members and event history had to move without loss, so the work opened with a data audit and a migration plan. The platform was shaped around the real data before a line of it was built.
- Sits alongside, doesn't rip out. The charity's wider website and its existing admin stay exactly as they were. The platform adds a focused events and membership engine in one place, rather than forcing a rebuild of everything around it.
- Accepted before it's invoiced. Each milestone ships to a staging site, gets signed off in writing, and only then is billed. Nothing is charged for work the charity hasn't seen working first.
- Reconciles on real data. The single-source-of-truth design isn't a slogan, it's provable. Run the sales and attendance reports against the charity's own records and they match, which the old system could never do.
Stack
Built into what they already run
Outgrown a patchwork of plugins?
Tell us what you want built or rebuilt. Within 48 business hours you'll get a written plan and a fixed quote, no sales call. Migrations, memberships, and money that has to reconcile are exactly the kind of complexity we like most.
Get a build quoteDetails anonymized at the client's request. Stripe and Mailchimp are integrations, not clients.