UK coding education business · Co-Founder & CEO

I have to answer for the number, so I built the thing that explains it.

I co-founded this business and run it at CEO level, which means the conversion rate is mine to explain. The explanation was sitting in thousands of recorded sales calls, which is exactly the data you cannot send to a third-party API.

  • 241,000+bookings taken by the platform
  • 277,000+student projects created
  • 10club locations

Live platform counts, August 2026.

Recognised2nd of 100, Club Hub UK Top 100 Children’s Activity Providers 2026 · Innovate UK funded · Xero Beautiful Business Fund global winner 2024 · STEAM Impact Awards 2026 winner · National Autistic Society Autism Inclusion Award 2025 · Code Awards accredited by STEM.org · 5.0/5 from 128 Reviews.io reviews

The situation

The business teaches coding to 6–16 year olds online and in person, across ten club locations and a virtual club.

The reporting could say how many leads didn’t convert. It could not say why, because the why was sitting in call recordings and onboarding notes that no dashboard had ever read. Those recordings involve children and families, so sending them to a hosted model was never on the table.

My role


Founder and CEO, and the engineer on the commercial systems.

I co-founded this business, co-built the platform it runs on with my fellow founder, and run the business at CEO level. I also manage the technical team. That combination is unusual and it’s the point: the person deciding what the business needs and the person building it are the same person, so nothing is lost in the handover.

The platform is shared work and I’m not going to claim it alone. The commercial brain on this page is mine: the pipeline, the funnel engine and the diagnosis layer were my design and my build.

This case study exists because I had to live with the results. Clever engineering wouldn’t have been reason enough.

How the pipeline runs

Where the sensitive data stops

Every stage inside the dashed boundary runs on hardware I own. Nothing inside it’s sent to a hosted API.

ON-PREMISE · GPU BOX · NOTHING LEAVES Recordingssales calls, raw audioTranscribeon owned hardwareInterpretlocal model, no vendorStructured causeswith quoted evidenceOne definitionevery number agreesBoard briefswhat to do, who owns it
Sensitive audio is transcribed and interpreted on hardware I own. Only structured causes and quoted evidence cross the boundary.

What the numbers did

More customers, and more from each one.

Both lines are up, and revenue is up faster. The two smaller figures multiply to the large one: 18% more customers, each worth 14% more, is 35% more revenue. Check it. Figures compare March to March, because this is a school-term business and measuring a term-time month against a summer one would tell you about the calendar and not the company.

  • +35%monthly recurring revenue, March 2025 to March 2026
  • +18%customers, like for like
  • +14%revenue per customer, like for like
25’0326’03
Recurring revenue Customers
One complete year, March to March, indexed so the shape is shown and the figures are not. Both lines rise; revenue rises faster. The dip in the middle is the summer holidays, left in because this is a children’s activity business and that dip returns every year. The window ends where it does because it’s the year the figures above compare, not because of what comes next.

Recurring revenue and customer count over the year to 1 March 2026, both indexed to the start. Both rise and revenue rises faster, ending the year 35% up against 18% more customers. Growth is gradual through the autumn and steepest over the winter. Both lines dip in the middle of the window, which is the summer holidays in a school-term business and happens every year.

What changed

The systems behind it

We can now say why a lead was lost, in the customer’s own words

The reason was always in the sales call and never in the reporting. Every lost lead now carries a cause and the sentence the customer said, so a conclusion can be checked against the recording instead of taken on trust.

The recordings never leave hardware we own

These are calls about children, so sending them to a hosted model was never available to us. The whole thing was designed around that constraint from the first day, and no recording or family detail goes anywhere near a third party.

Every number has exactly one definition

The conversion rate used to depend on who pulled it. It doesn’t any more. The board pack, the dashboards and the headline all read from the same place, so an argument about whether something worked stopped being an argument about whose figure was right.

Reporting stopped flattering the month it was in

An unfinished month always looks better than it is, for a reason that’s arithmetic and not optimism. The reporting now says when a period is too young to judge instead of printing a number that will fall away later.

The team asks the business, not the model

Everyone here works with an AI assistant, and given no context an assistant invents one confidently. Ours answer from the real systems with the permissions that come with them. Context is the whole problem in business AI use, and it’s plumbing rather than magic.

Decisions worth explaining

Why it was built this way

Local inference was a requirement, not a preference

The data is call recordings involving children. That ruled out hosted inference on the sensitive stages, so the pipeline was designed around a GPU box from the first day.

The local model was measured, not assumed

Directional briefs run through two backends over identical input, a local model and a cloud one, writing a side-by-side comparison for human judging. Local is used because it measured good enough here. The saving came second.

Safeguarding causes are deliberately hard to emit

The rubric requires explicit quoted evidence and instructs the model to under-emit instead of over-emitting. A false flag harms a real family and a real mentor, so the failure mode is chosen on purpose.

Production writes need a typed confirmation

The pipeline defaults to a local database. Targeting production requires an explicit flag and a typed acknowledgement before any write, because a mis-pointed run mutates live data immediately.

Stack. C# / .NET and MongoDB, local speech-to-text and open-weight models on owned hardware, a hosted model for comparison only, and MCP servers over the business systems.

Work with me

Got something like this to build?

Tell me the problem you’re trying to solve.