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

 

  1. 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).
    1. 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

 

  1. 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).

Explication + utilité > 

Voir proposition de code

-------------------------------

Handoff humain : si urgent détecté → ping Slack/Email + consigner dans leads

En savoir plus

-------------------------------

Multilingue : détection langue → onglet faq_fr, faq_mg, etc

En savoir plus

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.