Felipe Gazolla.
← Projects
Aug 2025

Disparador.

Campaign and messaging automation — proof of concept, no real sending.

  • Automation
  • SaaS

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

Next.jsTypeScriptSCSS ModulesFictitious data

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.

Real product stack

Frontend
Next.js 15React 19TypeScriptTailwind CSSTanStack QueryReact Hook FormZodreact-qr-codeAxiosdate-fns
Backend
Fastify 4Node.jsTypeScriptPrismaPostgreSQLSwagger/OpenAPI
Messaging & real-time
Baileys (WhatsApp Web)BullMQRedisWebSocketqrcode
Auth & observability
JWTargon2PinoPrometheusVitest