Co-Founder & .NET Developer, Plumbing Handyman Surrey
Shipped: a booking and payments platform for a south-west London plumbing business
I'm Denislav, a .NET developer in Chessington, south-west London. This year I co-founded Plumbing Handyman Surrey, a plumbing and handyman business, and built the platform it runs on. It has been open to the public since October.
What it does
- A customer picks a service and a one-hour slot, adds photos and pays a £50 deposit by card. Bigger work goes through a quote request.
- The owner runs the business without a developer: every job and its money in one list, a calendar of slots, numbered PDF invoices with a link to pay the balance online, and a monthly export for the accountant.
The two problems that took the most thought
- A slot must never be sold twice. The booking runs in a database transaction with a concurrency token, so two people clicking the same slot in the same second cannot both get it.
- A payment counts only after Stripe's signed webhook confirms it. An unpaid booking frees its slot after 15 minutes, so a customer who closes the checkout page does not block the calendar.
How it is built and shipped
- ASP.NET Core MVC on .NET 10, Entity Framework Core, SQL Server
- Over 1,100 automated tests. GitHub Actions sends every push to staging and every merged pull request to production
- Docker on Linux servers, Cloudflare in front
Live: https://plumbing-handyman-surrey.co.uk
Code: https://github.com/denidim/HandyFix-Project
If you build booking or payment flows, I'd like to hear how you handle the customer who leaves halfway through checkout. And if you're building in London, say hello.
Introductions






Comments1
On the half-finished checkout, a common pattern is to hold the slot only for the life of the payment session and release it when the session expires, which sounds close to what you built. The extra step that pays off for a local service: if you capture the phone or email before the payment page, one message an hour later with a link back to the same slot brings some of those people back. On growth, a plumbing business in south-west London will get most booked jobs from Google Maps and local searches, so I would link the Google Business Profile straight to the booking page and add one page per service and town (boiler repair in Chessington, leak repair in Surbiton) with real job photos and starting prices. After a couple of months Search Console will show which towns and services already get impressions, and that tells you where to add pages next. If you want an outside look at the site, our free SEO Radar check runs without signup: promopilot.link/en/seo-radar
1 comment
On the half-finished checkout, a common pattern is to hold the slot only for the life of the payment session and release it when the session expires, which sounds close to what you built. The extra step that pays off for a local service: if you capture the phone or email before the payment page, one message an hour later with a link back to the same slot brings some of those people back. On growth, a plumbing business in south-west London will get most booked jobs from Google Maps and local searches, so I would link the Google Business Profile straight to the booking page and add one page per service and town (boiler repair in Chessington, leak repair in Surbiton) with real job photos and starting prices. After a couple of months Search Console will show which towns and services already get impressions, and that tells you where to add pages next. If you want an outside look at the site, our free SEO Radar check runs without signup: promopilot.link/en/seo-radar