How I Built a WhatsApp-Integrated Booking System for a Retail Store
A deep dive into building an appointment booking system with WhatsApp OTP verification and automated reminders for a Singapore retail store.
The Problem
Running a brick-and-mortar retail store means managing a constant flow of customer visits. For Inlinex, Singapore's leading inline skate retailer, walk-ins for fittings, repairs, and pickups were creating bottlenecks. Customers would show up without appointments, leading to long wait times and frustrated staff.
The solution? A booking system that meets customers where they already are — WhatsApp.
Why WhatsApp?
In Singapore, WhatsApp is the dominant messaging platform. Rather than asking customers to download yet another app or check their email, we integrated directly with Meta's Cloud API for:
- OTP Verification — no fake bookings
- Automated Reminders — 24 hours before each visit
- Instant Confirmations — customers get immediate feedback
Technical Architecture
The system is built with Node.js and Express, backed by PostgreSQL for data persistence. Here's how the key pieces fit together:
Intelligent Slot Management
Not all visits are equal. A fitting session blocks a time slot (only one customer can be fitted at a time), but a pickup or wheel purchase doesn't. The system differentiates between blocking and non-blocking visit purposes, maximizing the store's capacity.
Shopify Integration
The booking widget is embedded as an iframe on the Shopify storefront. Getting this right required real-time height synchronisation between the iframe and the parent page — a classic cross-origin challenge solved with postMessage.
Rate Limiting
To prevent abuse, the system implements progressive rate limiting. First few requests are allowed freely, then delays increase exponentially. This stops both bot attacks and overly enthusiastic users from flooding the system.
Key Learnings
- WhatsApp template messages require approval — plan your message templates early and submit them for Meta's review process
- International phone numbers are tricky — we built a country flag selector to handle different formats
- Cron-based reminders need timezone awareness — Singapore is UTC+8, and getting reminder timing right across daylight saving changes elsewhere required careful handling
Results
Since launching, the booking system has:
- Reduced walk-in wait times significantly
- Given staff advance notice of what equipment to prepare
- Virtually eliminated no-shows thanks to WhatsApp reminders
Tech Stack
- Backend: Node.js, Express
- Database: PostgreSQL
- Messaging: WhatsApp Cloud API (Meta)
- Frontend: Vanilla JS (embedded iframe)
- Hosting: Railway
- Storefront: Shopify
Related Project
Inlinex Booking SystemA full-featured appointment booking system with WhatsApp OTP verification, intelligent slot management, and automated reminders for a premium inline skate retail store in Singapore.