Sajjad Mahessar Good Merch Group Free audit
~/sajjad $ cat projects/table-bookings ← cd ../projects Systems

Table booking system

Live£100/mo removed

Full schema and booking engine built into the group website, replacing a paid reservations platform. 395 historic bookings migrated across.

Type
Booking system
Category
Systems
Built with
PostgreSQL/Supabase · Edge Functions · Database webhooks · RLS
Project
13 of 37
AVAILABILITY GRID MONTUEWEDTHUFRISATSUN PAST SLOTS FILTERED NOTICE PERIOD ENFORCED 395 HISTORIC BOOKINGS MIGRATED
Availability grid — notice and past-slot rules

What I built

  • Role-permissioned admin panel with a separate enquiries queue for large parties and private hire.
  • Transactional guest confirmation email fires from a database webhook, not from the page. The booking row is written first and the email is triggered by that write — so a confirmation cannot be missed because a browser closed or a request timed out. That was exactly the failure mode of the platform this replaced, which silently dropped 21 confirmations across six months.
  • Availability logic covering notice periods and past-slot filtering.
  • A full integration handover specification for surfacing bookings inside the iOS app.

What went wrong

  • Generated-column immutability blocking inserts.
  • CDN serving an ES module where UMD was expected, and a variable name collision with a CDN global.
  • RLS blocking anonymous inserts through a trigger, and select-after-insert failing under RLS.
  • A timezone bug shifting UK dates back a day, and past-time bookings passing validation because only the date was checked.

Schematics

The five-step guest booking flow on the group website
The admin booking diary showing a week of bookings across both sites
SLOT PICKEDVALIDATEDINSERTED DB WEBHOOK EDGE FN · EMAIL GUEST INBOX LARGE PARTIES AND PRIVATE HIRE DIVERT TO AN ENQUIRIES QUEUE 21 THREADS FOUND WITH NO CONFIRMATION — THE FAULT THIS REPLACED
FOUND AND FIXED IN ROLLOUT GENERATED-COLUMN IMMUTABILITY BLOCKING INSERTS CDN SERVING ES MODULE WHERE UMD EXPECTED VARIABLE COLLISION WITH A CDN GLOBAL RLS BLOCKING ANONYMOUS INSERT VIA TRIGGER SELECT-AFTER-INSERT FAILING UNDER RLS TIMEZONE SHIFT MOVING UK DATES BACK A DAY PAST-TIME BOOKINGS PASSING DATE-ONLY VALIDATION
Booking states from enquiry through to confirmation
Booking system

Function room booking & pricing

Date-priced bookings, confirmed by signed webhook

Supabase Edge FunctionsStripe CheckoutWebhooksNetlify
Telephony

Automated call routing

Keypad routing with voicemail to email

Twilio StudioFunctionsTwiMLSendGrid
No charge

I’ll find the money before you pay me anything.

Send me your software subscriptions and I’ll come back with what’s replaceable and what it’s worth — free, and yours to keep either way. How it works →

Contact

Want the same done to your cost base?

Open to operations, automation and technical operations roles — and to talking with anyone running a multi-site business who suspects they're paying for software they could own instead.