Disparador.
Campaign and messaging automation — proof of concept, no real sending.
Demos are interactive on desktop — on mobile, see the preview just below.
Navigable demo with fictitious data
Problem
Businesses need to organize campaigns, contacts, lists and communication templates in a centralized way.
Solution
Campaign dashboard, contacts, lists/segments, campaign builder, templates, fake inbox, fake QR Code for connection, reports and a phone simulator.
My role
Conception and development of the proof of concept.
Outcome
Presented as a functional proof of concept with mocked data; makes it clear that it does not send real messages.
Demo stack
How it works.
Description of the real product (frontend + backend). The demo embedded above is its demonstration version, with fictitious data.
A multi-tenant platform for campaign and messaging automation in the style of a WhatsApp bulk sender. It covers connecting numbers via QR Code (WhatsApp Web session), contacts and lists/segments, templates with variables, a campaign builder with pacing control, pause windows and quiet hours, scheduling, a bidirectional inbox, delivery tracking (sent/delivered/read/failed) and reports. The Next.js frontend consumes a Fastify/Prisma API with BullMQ/Redis queues and WhatsApp integration via Baileys. The demo is a proof of concept — it does not connect or send real messages.
Architecture
- Frontend in Next.js (App Router) consuming a REST API in Fastify 4 with Prisma over PostgreSQL.
- Integration with WhatsApp Web via Baileys: each instance is a session paired by QR Code (generated with qrcode), with real-time status over WebSocket, heartbeat and automatic reconnection.
- Bulk sending controlled by BullMQ queues over Redis: configurable throttling, pause windows (break windows) and quiet hours (DND) to reduce the risk of being blocked.
- Multi-tenant domain in ~12 entities (Tenant, User, Instance, Contact, ContactList, Template, Campaign, Recipient, Message, Webhook, AuditLog, SettingsCredential), with access roles and delivery status per message.
- JWT authentication (@fastify/jwt) with passwords in argon2; observability with Pino, Prometheus metrics (prom-client) and OpenAPI/Swagger documentation; transactional email via Nodemailer.
Modules
- Connections: WhatsApp instances paired by QR Code, with status and reconnection
- Contacts and lists/segments (with opt-out)
- Message templates with variables (e.g., {{name}})
- Campaign builder: instance, message/template, pacing, windows and scheduling
- Campaigns: draft, running, paused and finished — with send progress
- Bidirectional inbox: conversations and messages (sent/delivered/read/failed)
- Reports: delivery funnel and message volume
- Phone simulator: preview of the rendered message
- Settings, profile, webhooks and audit
Engineering highlights
- Real integration with WhatsApp Web (Baileys), with QR Code pairing and one session per instance.
- Resilient sending via queues (BullMQ/Redis) with throttling, pause windows and quiet hours — an anti-blocking strategy.
- Real time via WebSocket for connection status and campaign progress.
- Templates with variables and per-contact mapping, for mass personalization.
- End-to-end delivery tracking (sent → delivered → read / failed).
- Multi-tenant with roles, audit log and webhooks; metrics exposed in Prometheus.