Chatbot RAG sur WhatsApp avec n8n : le tutoriel complet
Publié le 18 juillet 2026 · 6 min de lecture

Un chatbot qui répond sur WhatsApp depuis vos propres documents — catalogue, FAQ interne, conditions de garantie — c'est le croisement de deux mécaniques que nous avons déjà détaillées : le RAG avec Supabase pgvector pour la connaissance, et l'API WhatsApp Cloud de Meta pour le canal. n8n fait le pont entre les deux avec exactement six nodes. Ce tutoriel les assemble un par un.
Prérequis : une instance n8n (cloud ou self-hosted, ≥ 1.60), un projet Supabase avec la table documents et la fonction match_documents du guide pgvector, une clé API OpenAI, et un compte Meta for Developers.
Étape 1 — Créer l'app WhatsApp côté Meta
- Sur developers.facebook.com : Create App → Business, puis ajoutez le produit WhatsApp à l'app.
- Meta fournit un numéro de test et un Phone number ID (visible dans WhatsApp → API Setup) : notez-le, il servira pour l'envoi. Ajoutez votre propre numéro comme destinataire de test.
- Dans App settings → Basic, notez l'App ID et l'App Secret (pour le trigger), et générez un access token permanent via un utilisateur système Business Manager (pour l'envoi — le token temporaire de l'API Setup expire en 24 h).
Étape 2 — Le trigger : recevoir les messages
Ajoutez un node WhatsApp Trigger dans n8n, avec une credential WhatsApp OAuth (App ID + App Secret) et l'événement messages coché. n8n affiche alors une URL de webhook : collez-la dans WhatsApp → Configuration → Webhook de votre app Meta, avec le verify token proposé par n8n, et abonnez le champ messages.
Chaque message entrant arrive avec cette structure (extrait réel du payload Cloud API) :
{
"messaging_product": "whatsapp",
"contacts": [{ "profile": { "name": "Camille" }, "wa_id": "33612345678" }],
"messages": [{
"from": "33612345678",
"id": "wamid.HBgLMz...",
"timestamp": "1752825600",
"text": { "body": "Quelle est la durée de garantie du produit X ?" },
"type": "text"
}]
}
Trois expressions n8n suffisent pour tout le reste du workflow :
- la question :
{{ $json.messages[0].text.body }} - le numéro à qui répondre :
{{ $json.messages[0].from }} - le prénom (pour personnaliser) :
{{ $json.contacts[0].profile.name }}
Étape 3 — Le cerveau : AI Agent + vector store en outil
Ajoutez un node AI Agent, source du prompt Define below, avec le texte {{ $json.messages[0].text.body }}. Branchez-lui trois sous-nodes :
- OpenAI Chat Model (
gpt-4o-mini: rapide et peu cher, largement suffisant pour du support) ; - Simple Memory, clé de session Define below :
{{ $json.messages[0].from }}— un historique par client, indispensable pour les questions de suivi (« et pour le modèle Y ? ») ; - Supabase Vector Store en mode Retrieve Documents (As Tool for AI Agent), table
documents, query namematch_documents, limite 4, avec un node Embeddings OpenAI (text-embedding-3-small, le même modèle que celui utilisé à l'ingestion — sinon la recherche ne retrouve rien). Nommez l'outilbase_documentaireet décrivez-le : « Recherche dans la documentation produit officielle. À utiliser pour toute question factuelle. »
Le system message de l'agent fait le reste :
Tu es l'assistant WhatsApp de {{nom de l'entreprise}}.
Tu réponds en français, en 3 phrases maximum : WhatsApp n'est pas un blog.
Pour toute question factuelle, interroge l'outil base_documentaire et
appuie-toi uniquement sur ce qu'il renvoie. Si l'outil ne renvoie rien
de pertinent, dis-le honnêtement et propose d'écrire à {{email support}}.
Pas de Markdown : du texte brut, WhatsApp n'affiche pas les titres.
La dernière ligne évite le piège classique : l'agent qui répond avec des **gras** et des ## illisibles dans WhatsApp.
Étape 4 — Répondre au bon numéro
Terminez par un node WhatsApp Business Cloud : opération Send message, credential WhatsApp API (l'access token permanent), votre Phone number ID, destinataire {{ $('WhatsApp Trigger').item.json.messages[0].from }} et corps {{ $json.output }} (la réponse de l'agent).
Le workflow complet, prêt à importer
Le squelette complet (six nodes, connexions IA incluses) — collez-le directement dans n8n via Workflows → Import from File puis branchez vos quatre credentials :
{
"name": "Chatbot RAG WhatsApp",
"nodes": [
{ "id": "1", "name": "WhatsApp Trigger", "type": "n8n-nodes-base.whatsAppTrigger",
"typeVersion": 1, "position": [0, 0],
"parameters": { "updates": ["messages"] } },
{ "id": "2", "name": "AI Agent", "type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 1.7, "position": [220, 0],
"parameters": { "promptType": "define",
"text": "={{ $json.messages[0].text.body }}",
"options": { "systemMessage": "Tu es l'assistant WhatsApp de l'entreprise. Réponds en français, 3 phrases max, texte brut sans Markdown. Interroge l'outil base_documentaire pour toute question factuelle et appuie-toi uniquement sur ses résultats." } } },
{ "id": "3", "name": "OpenAI Chat Model", "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1, "position": [140, 220],
"parameters": { "model": "gpt-4o-mini" } },
{ "id": "4", "name": "Simple Memory", "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"typeVersion": 1.3, "position": [300, 220],
"parameters": { "sessionIdType": "customKey",
"sessionKey": "={{ $json.messages[0].from }}" } },
{ "id": "5", "name": "Base documentaire", "type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
"typeVersion": 1.1, "position": [460, 220],
"parameters": { "mode": "retrieve-as-tool", "toolName": "base_documentaire",
"toolDescription": "Recherche dans la documentation produit officielle. À utiliser pour toute question factuelle.",
"tableName": "documents", "topK": 4,
"options": { "queryName": "match_documents" } } },
{ "id": "6", "name": "Embeddings OpenAI", "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
"typeVersion": 1.2, "position": [460, 420],
"parameters": { "model": "text-embedding-3-small" } },
{ "id": "7", "name": "Envoyer la réponse", "type": "n8n-nodes-base.whatsApp",
"typeVersion": 1, "position": [460, 0],
"parameters": { "resource": "message", "operation": "send",
"phoneNumberId": "VOTRE_PHONE_NUMBER_ID",
"recipientPhoneNumber": "={{ $('WhatsApp Trigger').item.json.messages[0].from }}",
"textBody": "={{ $json.output }}" } }
],
"connections": {
"WhatsApp Trigger": { "main": [[{ "node": "AI Agent", "type": "main", "index": 0 }]] },
"AI Agent": { "main": [[{ "node": "Envoyer la réponse", "type": "main", "index": 0 }]] },
"OpenAI Chat Model": { "ai_languageModel": [[{ "node": "AI Agent", "type": "ai_languageModel", "index": 0 }]] },
"Simple Memory": { "ai_memory": [[{ "node": "AI Agent", "type": "ai_memory", "index": 0 }]] },
"Base documentaire": { "ai_tool": [[{ "node": "AI Agent", "type": "ai_tool", "index": 0 }]] },
"Embeddings OpenAI": { "ai_embedding": [[{ "node": "Base documentaire", "type": "ai_embedding", "index": 0 }]] }
}
}
Testez : envoyez un message WhatsApp au numéro de test depuis votre téléphone. La question part dans l'agent, l'agent interroge Supabase, et la réponse — sourcée — revient dans la conversation en quelques secondes.
Trois pièges à connaître avant la prod
- La fenêtre de 24 h : le bot ne peut répondre librement que dans les 24 h suivant le dernier message du client. Au-delà, seuls les templates approuvés par Meta passent. Pour un bot de support qui répond à chaud, aucun impact.
- Les messages non textuels : vocaux, images et documents arrivent avec
type≠textet sanstext.body. Ajoutez un node IF sur{{ $json.messages[0].type }}juste après le trigger pour leur répondre un message fixe (« Envoyez-moi votre question par écrit ») plutôt que de laisser l'agent planter. - L'ingestion, c'est l'autre moitié du travail : un RAG ne vaut que ce que valent ses chunks. Le pipeline d'ingestion complet (téléchargement, découpage, métadonnées, upsert) est détaillé dans le guide pgvector — et livré prêt à importer, avec le chatbot à citations et l'API
/ask, dans le Pack Assistant RAG.
Aller plus loin
Ce tutoriel vous donne le canal WhatsApp. Le Pack Assistant RAG (119 €) fournit la fondation industrialisée : ingestion PDF vers pgvector, chatbot avec citations des sources, synchronisation Notion et endpoint API — quatre workflows testés et documentés en français, que ce chatbot WhatsApp vient brancher tel quel. Pour comprendre chaque brique de l'agent, relisez aussi Débuter avec les nodes IA de n8n.
FAQ
Questions fréquentes
Faut-il un compte WhatsApp Business payant ?
Non pour commencer : l'API WhatsApp Cloud de Meta est gratuite jusqu'à 1 000 conversations de service par mois, et les réponses à un message client dans la fenêtre de 24 h sont des conversations de service. Il faut un compte Meta Business, une app Meta for Developers et un numéro de téléphone dédié (le numéro de test fourni par Meta suffit pour développer).
Le chatbot peut-il écrire le premier à un client ?
Pas librement : hors de la fenêtre de 24 h qui suit le dernier message du client, WhatsApp n'autorise que des messages templates pré-approuvés par Meta. Un chatbot RAG de support, qui répond aux questions entrantes, reste donc naturellement dans les règles : c'est toujours le client qui initie.
Comment le bot garde-t-il le fil de la conversation ?
Avec un node Simple Memory branché sur l'AI Agent, en utilisant le numéro de l'expéditeur (messages[0].from) comme clé de session : chaque client a ainsi son propre historique, et deux clients qui écrivent en même temps ne mélangent jamais leurs contextes.
Puis-je utiliser autre chose que Supabase pour les documents ?
Oui : l'AI Agent accepte n'importe quel vector store n8n comme outil (Pinecone, Qdrant, PGVector, en mémoire). Supabase reste notre choix : Postgres managé gratuit pour commencer, extension pgvector incluse et fonction match_documents standard, déjà utilisée par le Pack Assistant RAG.
Pack Assistant RAG
119 €