Asif Alam · Lead Engineer

Plate

Lead engineer, built it end to end

Plate is a restaurant booking platform for Lebanon: an iOS and Android guest app, a venue dashboard, a tablet app for restaurant staff and WhatsApp booking flows, all on one Supabase backend. Asif Alam is its lead engineer and built it end to end at Qwerty, from June 2025 to today.

Role
Lead engineer, built it end to end
When
Since June 2025
Platforms
iOS · Android · Web · Android tablet
Plate guest app, booking screen (sample data)
users
35k+
bookings
33k+
guests seated
115k+
restaurants
160+

(01)

The problem

Booking a table in Lebanon meant a phone call, or a WhatsApp thread that might get answered. Restaurants had the other half of the problem: bookings nobody saw in time, no-shows, and cancellations that cost the guest nothing. Plate's promise is in its store name, no call, no wait: a guest books in seconds, and the venue can't miss it.

(02)

What it does

  • Live table availability and instant booking, with a waitlist that suggests another time when nothing fits
  • A floor-plan editor for venues: rooms, table combinations, shifts and a "tonight" view
  • Accept, decline or accept with changes, every change re-checked against the tables
  • A tablet app for staff that stays listening and keeps an alarm ringing until someone acts on a booking
  • Card guarantees, deposits and no-show penalties through local payment providers
  • WhatsApp for staff (accept, decline, move a booking from the chat) and for guests (payment and card links)
  • Stays: bookings, calendar, add-ons and refunds for guest houses
  • Billing: invoices, credit notes, receipts, free trials and payment reminders
  • Loyalty: stamp cards, referrals and automatic guest tags
  • "Ask Plate", an AI concierge in the app, and a connector that lets ChatGPT and Claude find a table and hand over a pre-filled booking
  • A booking widget venues put on their own sites, no app needed

(03)

The hard parts

Double bookings stopped in the database, not the app

A booking and its tables are created in one Postgres function that enforces the gap between bookings (turn time included, timezone pinned), so no client can talk its way past it. When I fixed that check, I kept its error text byte-for-byte, because app versions already in people's pockets read it.

Moving a booking without breaking another

When a venue accepts a booking at a different time, the tables are checked again at the new time. Staff are refused a move that would collide; on the guest's side, conflicting tables are dropped and the booking is flagged, so nobody turns up to a table that's already taken.

Realtime that doesn't die quietly

A venue that stops receiving bookings loses money without knowing it. Subscriptions reconnect and recover on their own and report when they drop; the staff tablet sends a heartbeat every 30 seconds, and a new booking sounds an alarm that keeps going until someone answers it.

WhatsApp as a control panel

Staff can accept, decline or move a booking from WhatsApp buttons. The button payloads are parsed by small, tested functions; the time offsets are sized to WhatsApp's ten-row list, and the database enforces the same ±90-minute window again, so a stale message can't do what the dashboard wouldn't.

Money that adds up

Unpaid deposits expire every five minutes. Payment reminders send each stage once, and pick up where they left off if a scheduled run is missed. No spam, no gaps. Card guarantees become penalty charges for no-shows and late cancellations.

(04)

Stack

  • Expo
  • React Native
  • Next.js
  • React
  • TypeScript
  • Supabase
  • PostgreSQL
  • PostGIS
  • Edge Functions
  • pg_cron
  • WhatsApp Cloud API
  • OneSignal
  • Claude
  • MCP