@denislav.dimitrov2
Denislav DimitrovDeveloper▲5
Co-Founder & .NET Developer, Plumbing Handyman Surrey
3h ago · edited · Introductions · London

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

  • @ksanyok
    Aleksandr Krykun
    Building PromoPilot, an AI SEO autopilot: tiered link building, SEO Radar and 100+ free SEO tools
    1h ago

    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

Log in to join the thread.