WhatsAppDirector
WhatsApp Automation & Messaging Platform
Built for Zeqah internal operations.
The Challenge
Zeqah needed WhatsApp-based communication workflows for reminders and operational messaging, with scheduling and session reliability.
The Approach
Used whatsapp-web.js to interface with the WhatsApp Web protocol, wrapping it in a Next.js dashboard for contact management and message composition. SQLite keeps things lightweight for single-instance deployments.
System Architecture
A headless WhatsApp automation layer: the system runs a persistent Puppeteer instance that controls WhatsApp Web inside a headless Chrome browser. A custom session serialization system saves and restores the WhatsApp Web session state across server restarts - solving the notoriously difficult problem of maintaining Puppeteer sessions. The Next.js backend provides REST APIs for the scheduling engine, which uses Bull queues for timed message delivery with configurable rate limiting. Contact management supports CSV import with deduplication. The system runs behind an Nginx reverse proxy on a VPS with PM2 for process management.
System architecture overview
Built For
Zeqah operations staff and support teams who run reminder broadcasts and student communication workflows through WhatsApp without manual one-by-one sending.
Design Decisions
Why whatsapp-web.js over the official API?
The official WhatsApp Business API requires approval and has strict messaging templates. whatsapp-web.js provides the flexibility to send any message type without template restrictions, perfect for small-business use cases.
Why SQLite instead of PostgreSQL?
This tool is designed for single-instance deployment (one business, one WhatsApp number). SQLite eliminates the need for a separate database server, making deployment as simple as copying a folder.
The Team
CTO (me)
WhatsApp protocol integration, session management, dashboard, scheduling engine
Operations Team
Template requirements, campaign operations, and validation
Tech Stack
Outcomes & Impact
- Session persistence across server restarts - solved a complex state serialization problem with Puppeteer sessions
- Bulk reminder scheduling with intelligent rate limiting to maintain delivery reliability
- Contact import from CSV and manual entry with duplicate detection