← All projects
Sports and leisure

Booking and payments platform for a sports coaching club

The club was paying a monthly subscription plus a percentage of every single booking to a platform that still did not quite fit how their camps ran. For anyone charging per child per day, a percentage of every booking is the part that scales against you. We built a replacement with no booking-platform commission on top of the card processing fees.

Sector
Youth sports coaching
Engagement
Custom build replacing a SaaS platform
Status
Live, taking real bookings
Our role
Design, build, testing, maintenance
0third-party bookings or e-commerce plugins in the build
Per daycapacity tracked at individual day level, not per week

What it does

A bespoke booking and payment system that replaced a subscription platform charging a monthly fee plus a percentage of every booking. Same capability, no booking-platform commission on top of card processing fees, and the club owns it.

Booking that matches how camps actually run

Parents book the days they need. The system prices and tracks capacity accordingly, rather than forcing whole-week blocks.

  • Per-day selection with capacity tracked for each individual day
  • Pro-rated pricing calculated server-side, so a tampered form cannot change the price
  • Prices held as whole pence rather than decimals, which removes an entire class of rounding bug
  • Sibling and multi-day handling built into the pricing rules

Payments the club owns

Card payments go straight to the club’s own payment processor account, with no booking platform fee on top of it.

  • Hosted checkout so card details never touch the club’s website
  • Payment confirmation verified through signed webhooks rather than trusting the browser
  • Confirmation handling is idempotent, so a repeated or replayed webhook cannot double-book or double-charge
  • Refunds and cancellations handled against the original booking record

Child data handled carefully

A booking system for children collects medical notes, emergency contacts and dietary requirements. Where that data goes matters as much as how it is stored.

  • Medical details and emergency contacts are deliberately kept out of emails and out of the payment provider’s records
  • Staff see what they need on the day, in the system, rather than in a forwarded inbox thread
  • Data collection limited to what the club has an actual operational reason to hold

Built to be maintained

A bespoke system is only cheaper than a subscription if it does not need constant attention.

  • Automated test suite covering pricing, capacity and payment handling, run on every push
  • A containerised local environment that mirrors the live site, so changes are proven before they go near production
  • Automated health checks that email the club if something stops working

What it connects to

Most of the value in a system like this comes from the systems it talks to, and most of the risk does too. Each connection is scoped to the access it needs for the job.

Payments

  • Hosted card checkoutClub-owned processor account, signed webhook confirmation

Platform

  • WordPressCustom plugin, no third-party bookings or e-commerce dependency
  • Automated monitoringScheduled health checks with email alerting

How it fits together

The path a piece of work takes through the system, start to finish.

A parent picks days, not packages

The booking form takes the specific days needed for each child. Availability is checked per day as the selection is made.

The server decides the price

Pricing, pro-rating and discounts are calculated entirely on the server in whole pence. The browser is never trusted with a figure that affects what gets charged.

Payment goes to the club’s own account

Checkout is handed to the payment processor. Card details never reach the club’s site, and the club receives the money into its own account rather than through a booking platform.

Confirmation is verified, not assumed

The booking is only confirmed when a signed webhook from the payment processor says the money moved. Repeated webhooks are handled safely, so a retry never creates a second booking.

Staff get what they need on the day

Registers, capacity and the medical details for each child are available in the system to the people running the session, rather than being emailed around or copied into the payment provider’s records.

The hard parts

The problems that decided how this was built. They are the reason it works the way it does rather than the obvious way.

Making a bespoke system genuinely cheaper than a subscription

The problem

Custom software is only a saving if it does not generate a stream of support work. Plenty of bespoke builds cost more over three years than the SaaS they replaced.

What we did

The build carries an automated test suite over the parts that hurt when they break (pricing, capacity, payment confirmation) running on every change, plus a local environment that mirrors production and automated health checks that report problems before the club notices them.

The result

A system with no booking-platform commission on top of card processing fees, built so the maintenance does not quietly replace the saving.

Payment confirmations that arrive twice

The problem

Payment providers retry webhooks. A naive booking system treats the retry as a second payment and double-books a place, or worse, tells a parent their child has two slots.

What we did

Confirmation handling was written to be idempotent from the start: the same event applied twice produces the same result as applying it once, and the booking state is derived from the verified payment rather than from the order of arriving messages.

The result

A retried or replayed webhook produces the same booking state as the first one, so a network failure changes nothing.

Built with

PHPJavaScriptWordPressHosted card checkoutDockerContinuous integration

We don’t publish screenshots, logos or client names for this work. Much of it runs inside a business and handles sensitive data, so we describe what was built rather than who it was built for. We’re happy to walk through the detail on a call.

Ask a question

Tell us what your version of this needs to do and we’ll come back within one business day with scope, approach and a price.

What is your question about? (required)

Need something like this?

Every build on this page started as a workflow that off-the-shelf software nearly handled. Tell us where the gap is and we’ll scope what it takes to close it.