Se connecterCommencer l’essai gratuit
Meta Tech Provider

Enregistrer les messages WhatsApp dans Google Sheets et envoyer depuis une feuille

Dirigez la destination du webhook du numéro vers un workflow n8n dont le nœud Google Sheets ajoute une ligne par message : expéditeur, nom, texte, identifiant du message et heure. Pour envoyer depuis une feuille, une fonction Apps Script peut parcourir les lignes et appeler la Cloud API avec UrlFetchApp, en utilisant le phone number id et le token du numéro. L'équipe continue de répondre depuis l'app WhatsApp Business.

60 / min

Requêtes d'écriture de l'API Google Sheets autorisées par minute et par utilisateur et par projet ; 300 par projet.

20,000 / day

Appels URL Fetch d'Apps Script pour un compte Google grand public ; les comptes Workspace en obtiennent 100 000.

6 min

Durée maximale d'une exécution Apps Script avant son arrêt.

Comment chaque message WhatsApp devient-il une ligne ?

Meta envoie chaque message du numéro à la destination de webhook que vous avez définie, ici un nœud Webhook n8n qui répond aussi à la requête de vérification de Meta. Le nœud suivant est Google Sheets avec l'opération Append Row, qui associe les champs du payload à des colonnes : le numéro de l'expéditeur, le nom de profil, le texte, l'identifiant du message WhatsApp, l'horodatage et le phone number id qui reçoit.

Utilisez Append or Update Row avec l'identifiant du message comme clé plutôt qu'un simple ajout si vous voulez que les nouvelles tentatives soient sans effet. Meta renvoie un message quand elle pense qu'une livraison a échoué, et la clé sur l'identifiant transforme la seconde livraison en mise à jour de la même ligne.

Sur un numéro Coexistence, les réponses saisies dans l'app WhatsApp Business arrivent sur le même webhook sous forme d'événements smb_message_echoes. Enregistrez-les avec une colonne de direction et la feuille contient les deux côtés de l'échange.

Où le quota de Sheets pose-t-il problème ?

Sur les écritures par utilisateur. L'API Sheets autorise 300 requêtes d'écriture par minute et par projet, et 60 par minute et par utilisateur et par projet, or un identifiant n8n correspond à un seul utilisateur. Un workflow qui ajoute une ligne par message peut donc tenir environ un message par seconde, en continu.

C'est largement suffisant pour la plupart des numéros de boutique. Ça ne l'est plus après l'envoi d'un template en masse, quand quelques centaines de clients répondent en quelques minutes. L'API répond alors 429 Too Many Requests et, sans nouvelles tentatives, des lignes disparaissent.

Deux solutions, chacune suffit. Activez les nouvelles tentatives avec une attente sur le nœud Google Sheets, ce qui correspond au conseil de Google lui-même de ralentir de façon exponentielle. Ou regroupez : faites collecter les messages par n8n pendant trente secondes et ajoutez-les en une seule requête, ce qui remplace de nombreuses écritures par une seule.

Comment envoyer des templates depuis une feuille ?

Avec Apps Script, depuis le menu Extensions de la feuille. Une fonction lit les lignes pas encore envoyées, appelle l'endpoint messages de la Cloud API avec UrlFetchApp pour chacune, puis écrit dans la ligne l'identifiant du message renvoyé et l'heure. Un déclencheur horaire peut l'exécuter toutes les quelques minutes, ou vous pouvez la lancer à la main depuis un menu personnalisé.

Stockez le token d'accès dans les propriétés du script plutôt que dans le code, pour que toute personne pouvant consulter le script ne le voie pas.

Gardez les quotas en tête. Un compte Google grand public dispose de 20 000 appels URL Fetch par jour et un compte Workspace de 100 000, et chaque exécution s'arrête au bout de six minutes. Traitez les lignes par lots et marquez chacune comme envoyée avant de passer à la suivante, afin qu'une exécution interrompue reprenne là où elle s'est arrêtée au lieu d'envoyer deux fois.

Apps Script: send one approved template per unsent row
function sendPending() {
  const token = PropertiesService.getScriptProperties().getProperty("WHATSAPP_TOKEN");
  const sheet = SpreadsheetApp.getActive().getSheetByName("Send");
  const rows = sheet.getDataRange().getValues();
  for (let i = 1; i < rows.length; i++) {
    const [phone, name, sentAt] = rows[i];
    if (sentAt) continue;
    const res = UrlFetchApp.fetch("https://graph.facebook.com/v23.0/<PHONE_NUMBER_ID>/messages", {
      method: "post",
      contentType: "application/json",
      headers: { Authorization: "Bearer " + token },
      payload: JSON.stringify({
        messaging_product: "whatsapp", to: String(phone), type: "template",
        template: { name: "order_ready", language: { code: "en" },
          components: [{ type: "body", parameters: [{ type: "text", text: name }] }] },
      }),
    });
    sheet.getRange(i + 1, 3).setValue(new Date());
  }
}

Erreurs courantes

  • Ajouter sans clé sur l'identifiant du message. Les nouvelles tentatives de Meta écrivent alors le même message sur deux lignes.
  • Écrire une ligne par message avec un seul identifiant pendant une rafale de réponses. La limite de 60 écritures par minute et par utilisateur renvoie 429 et des lignes sont perdues.
  • Envoyer du texte libre depuis la feuille à des personnes qui n'ont pas écrit depuis 24 heures. Seul un template approuvé est livré en dehors de cette fenêtre.
Faire cela avec EasyCoexistence

Connectez le numéro sur easycoexistence.com, dirigez sa destination de webhook vers le workflow n8n, puis copiez le phone number id et le token dans le script. À partir de US$ 9 par numéro et par mois, jusqu'à US$ 1 à mesure que vous ajoutez des numéros, avec les 3 premiers jours gratuits.

Questions fréquemment posées

Puis-je utiliser Make ou Zapier à la place de n8n ?

Oui. Un webhook personnalisé Make ou un catch hook Zapier reçoit le message, et leur étape Google Sheets ajoute la ligne.

Avec quel compte Google n8n écrit-il ?

Celui qui a autorisé l'identifiant Google de n8n. Ce compte doit avoir un accès en modification à la feuille, et c'est son quota d'écriture par utilisateur que le workflow consomme.

La colonne des numéros de téléphone est-elle bien formatée ?

Stockez les numéros en texte brut, sous forme de chiffres avec l'indicatif du pays et sans signe plus, c'est le format qu'envoie Meta. Sinon Sheets les traite comme des nombres, ce qui supprime le plus initial et peut reformater les valeurs longues.

EasyCoexistence conserve-t-il une copie des messages ?

Non. Meta livre chaque webhook à votre URL n8n, et la feuille est la seule copie.

Poursuivre la lecture

Prêt à commencer ?

Configurez WhatsApp Coexistence en quelques minutes, pas en quelques mois. L’application continue de fonctionner sur le téléphone.

Commencer l'essai gratuit

Vérifié le

WhatsApp et Google Sheets sur la Cloud API