Le besoin
Un canal WhatsApp interne, léger, réutilisable — pour envoyer OTP et notifications sans payer les API officielles ni gérer leur validation. Une brique unique que tous les produits (Mon Bara, TransitSoft) consomment via un SDK.
Baileys, sans Chromium
Pas de WhatsApp Web dans un Chromium headless (lourd, fragile, gourmand en RAM). Baileys parle le protocole WhatsApp directement en WebSocket. Résultat : ça tourne sur un petit VPS.
- Serveur — Express + Socket.IO + Baileys + BullMQ
- Dashboard — Next.js : créer une session, scanner le QR, générer les clés
packages/shared— types + schémas Zod + events socket (source de vérité)packages/sdk— le client npm@wa/sdk
Multi-sessions & clés
Chaque session = un numéro WhatsApp, créée par QR depuis le dashboard, avec une clé API affichée une seule fois. Le projet consommateur ne voit jamais Baileys : juste une baseUrl et une clé.
Rate limiting = survie
WhatsApp bannit vite un numéro qui spamme. Toute émission passe par une file BullMQ rate-limitée (15 msg/min, configurable), avec retry backoff et concurrence contrôlée. Statuts en temps réel via Socket.IO :
queued → sending → sent → delivered → read | failed
Stack
Baileys · Express · BullMQ · Socket.IO · Drizzle ORM · Redis · SDK npm
Retour d'expérience détaillé : Une API WhatsApp interne avec Baileys (sans Chromium).