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

- 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