Agent immobilier dans whatsAPP <> Google Spreadsheet
Aperçu (architecture)
- WhatsApp → (Webhook Meta) → n8n→ (Parse + logique)
- → Google Sheets (lookup / append)
- → WhatsApp Graph API (réponse)
Prérequis
- WhatsApp Cloud API (compte Meta développeur, WABA, phone number ID, WABA ID, verification token, access token).
- n8n accessible publiquement (URL https) pour recevoir le webhook.
- Google Sheets : 1 feuille partagée avec le compte/SA utilisé par n8n (ex. CRM_WhatsApp).
-
Crédentiels n8n :
- HTTP Credentials (Bearer) pour Graph API.
- Google Sheets (OAuth2 ou Service Account).
Étapes dans n8n (MVP)
1) Réception WhatsApp
Webhook (Trigger)
- Method: POST
- Path: /whatsapp/in
- Response mode: Respond immediately (200 OK rapide pour éviter les retries de Meta).
If – Verification (GET) (optionnel si vous exposez aussi GET pour la vérification)
- Si query['hub.mode']=="subscribe" → Respond to Webhook avec query['hub.challenge'].
IF – Filtrer seulement les messages
- Condition: {{$json.entry[0].changes[0].value.messages}} is set.
2) Parsing & Normalisation
- Code (Function) – extraire texte, numéro, nom
const entry = $json.entry?.[0]; const value = entry?.changes?.[0]?.value; const msg = value?.messages?.[0] || {}; const contact = value?.contacts?.[0] || {}; const text = msg.text?.body || msg.button?.text || msg.interactive?.list_reply?.title || ""; return [{ json: { wa_from: msg.from, wa_name: contact.profile?.name, wa_id: contact.wa_id, wa_type: msg.type, wa_text: text.trim(), ts: new Date().toISOString() } }];
3) Journaliser dans Google Sheets
Google Sheets (Append)
- Spreadsheet: CRM_WhatsApp
- Worksheet: messages_log
-
Colonnes conseillées :
ts | wa_from | wa_name | wa_text | intent | reply | status
4) Logique “branchée” sur le tableur
(Deux cas simples pour démarrer, extensibles ensuite)
-
Lookup FAQ/Produits
6. Google Sheets (Lookup)- Spreadsheet: CRM_WhatsApp, sheet faq (colonnes : keyword | answer)
- Rechercher keyword ≈ wa_text (exact au début; pour “contient”, utilisez un Code de fuzzy-match).
-
IF
- Si trouvé → set reply = answer.
- Sinon → reply = "Je n’ai pas trouvé. Envoyez *menu* pour la liste ou posez une question précise."
-
Capture de lead (si le message commence par “#lead …”)
- IF (startsWith) → Google Sheets (Append) dans leads (colonnes : ts | wa_from | name | need | note), construire reply de confirmation.
(Vous pouvez router avec un Switch: menu, help, #lead, sinon faq.)
5) Répondre sur WhatsApp
- Set – construire le payload Graph API
{ "messaging_product": "whatsapp", "to": "={{$json.wa_from}}", "type": "text", "text": { "body": "={{$json.reply}}" } }
HTTP Request
Method: POST
URL: https://graph.facebook.com/v20.0/<PHONE_NUMBER_ID>/messages
Headers:
Authorization: Bearer {{ $cred.WHATSAPP_TOKEN }}
Content-Type: application/json
Body: JSON = l’objet du Set précédent.
Respond to Webhook (si vous n’avez pas activé “Respond immediately” au début)
Status 200, Body ok.
Modèle de feuilles (conseillé)
messages_log
ts | wa_from | wa_name | wa_text | intent | reply | status
faq
keyword | answer
leads
ts | wa_from | name | need | note
Messages interactifs (optionnel, très utile)
Pour proposer un menu (boutons rapides) :
HTTP Request → Body (JSON)
{ "messaging_product": "whatsapp", "to": "{{wa_from}}", "type": "interactive", "interactive": { "type": "button", "body": {"text": "Que voulez-vous faire ?"}, "action": { "buttons": [ {"type": "reply","reply": {"id": "FAQ","title": "FAQ"}}, {"type": "reply","reply": {"id": "LEAD","title": "Laisser mes coord."}} ] } } }
Dans le Code (parse), lisez msg.button?.payload ou msg.interactive?.button_reply?.id (selon le type) pour router.
Points importants (WhatsApp Cloud)
- Fenêtre 24 h : vous pouvez répondre en texte libre dans les 24 h après le dernier message de l’utilisateur ; hors fenêtre, utilisez un message template (HSM).
- Ack rapide : répondez en <3s au webhook (via “Respond immediately” ou un Respond to Webhook très tôt, puis envoyez la réponse utilisateur en asynchrone).
- Gestion d’erreurs : entourez HTTP Request et Google Sheets d’un Error Workflow ou d’un Try/Catch (IF → fallback), loggez dans messages_log.status.
Extensions possibles
Apprenez à utiliser des méthodes de jardinage biologique pour cultiver des fruits et légumes frais.
RAG/IA : si pas de correspondance dans faq, appeler un nœud OpenAI/Gemini → proposer une réponse puis apprendre en ajoutant la Q/R dans la feuille (avec validation humaine).
-------------------------------
Handoff humain : si urgent détecté → ping Slack/Email + consigner dans leads
-------------------------------
Multilingue : détection langue → onglet faq_fr, faq_mg, etc
Mini-checklist de mise en prod
- Webhook validé dans Meta (challenge OK).
- Token stocké dans Credentials n8n (pas en dur).
- Feuilles GS partagées au compte n8n.
- Tests : message “menu”, mot-clé connu, inconnu, hors 24 h avec template.