ВойтиНачать бесплатный пробный период
Meta Tech Provider

Запись сообщений WhatsApp в Google Sheets и отправка из таблицы

Укажите адрес вебхука номера на рабочий процесс n8n, в котором узел Google Sheets добавляет строку на каждое сообщение: отправитель, имя, текст, идентификатор сообщения и время. Чтобы отправлять из таблицы, функция Apps Script может обойти строки и вызвать Cloud API через UrlFetchApp, используя идентификатор номера (phone number id) и токен. Команда по-прежнему отвечает клиентам из приложения WhatsApp Business.

60 / min

Допустимое число запросов на запись в Google Sheets API в минуту на пользователя в проекте; 300 на проект.

20,000 / day

Вызовы URL Fetch в Apps Script для личного аккаунта Google; аккаунты Workspace получают 100 000.

6 min

Максимальная длительность одного выполнения Apps Script, после которой оно принудительно останавливается.

Как каждое сообщение WhatsApp превращается в строку?

Meta отправляет каждое сообщение номера на заданный вами адрес вебхука. Здесь это узел Webhook в n8n, который заодно отвечает на проверочный запрос Meta. Следующий узел: Google Sheets с операцией Append Row. Он переносит поля из тела запроса в столбцы: номер отправителя, имя профиля, текст, идентификатор сообщения WhatsApp, время и идентификатор номера, принявшего сообщение (phone number id).

Чтобы повторные доставки не вредили, используйте Append or Update Row с ключом по идентификатору сообщения вместо простого добавления. Meta присылает сообщение повторно, если считает, что доставка не удалась, и при ключе по идентификатору вторая доставка просто обновит ту же строку.

На номере Coexistence ответы, набранные в приложении WhatsApp Business, приходят на тот же вебхук как события smb_message_echoes. Если записывать их со столбцом направления, в таблице окажутся обе стороны переписки.

Где срабатывает квота Sheets?

На записи в расчёте на пользователя. Sheets API допускает 300 запросов на запись в минуту на проект и 60 в минуту на пользователя в проекте, а учётные данные n8n соответствуют одному пользователю. Поэтому рабочий процесс, который добавляет по строке на сообщение, выдерживает примерно одно сообщение в секунду на постоянной основе.

Для большинства номеров магазинов этого с запасом хватает. Но запаса не остаётся после рассылки шаблона, когда несколько сотен клиентов отвечают за несколько минут. Тогда API отвечает 429 Too Many Requests, и без повторных попыток строки теряются.

Есть два решения, достаточно любого. Включите повторные попытки с ожиданием в узле Google Sheets: это совпадает с рекомендацией самого Google делать экспоненциальную паузу. Либо собирайте пакеты: пусть n8n накапливает сообщения тридцать секунд и добавляет их одним запросом, так много записей превращается в одну.

Как отправлять шаблоны из таблицы?

Через Apps Script, из меню «Расширения» таблицы. Функция читает строки, которые ещё не отправлены, для каждой вызывает эндпоинт сообщений Cloud API через UrlFetchApp и записывает в строку полученный идентификатор сообщения и время. Запускать её можно по таймеру раз в несколько минут или вручную из собственного меню.

Храните токен доступа в свойствах скрипта, а не в коде: тогда те, кто может просматривать скрипт, его не увидят.

Учитывайте квоты. Личный аккаунт Google получает 20 000 вызовов URL Fetch в сутки, аккаунт Workspace 100 000, а каждое выполнение останавливается через шесть минут. Обрабатывайте строки порциями и помечайте каждую как отправленную до перехода к следующей, чтобы прерванный запуск продолжился с нужного места, а не отправил сообщения дважды.

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());
  }
}

Распространённые ошибки

  • Добавлять строки без ключа по идентификатору сообщения. Тогда повторные доставки Meta запишут одно и то же сообщение в две строки.
  • Писать по строке на сообщение через одни учётные данные во время всплеска ответов. Лимит в 60 записей в минуту на пользователя вернёт 429, и строки будут потеряны.
  • Отправлять свободный текст из таблицы людям, которые не писали вам 24 часа. Вне этого окна доставляется только одобренный шаблон.
Настройка с EasyCoexistence

Подключите номер на easycoexistence.com, укажите адрес его вебхука на рабочий процесс n8n и скопируйте идентификатор номера (phone number id) и токен в скрипт. От US$ 9 за номер в месяц, до US$ 1 по мере добавления номеров, первые 3 дня бесплатно.

Часто задаваемые вопросы

Можно ли использовать Make или Zapier вместо n8n?

Да. Собственный вебхук Make или catch hook в Zapier принимает сообщение, а их шаг Google Sheets добавляет строку.

От имени какого аккаунта Google пишет n8n?

От имени того, который авторизовал учётные данные Google в n8n. У этого аккаунта должен быть доступ на редактирование таблицы, и расходуется именно его квота записи на пользователя.

Правильно ли отформатирован столбец с номерами?

Храните номера как обычный текст: цифры с кодом страны и без знака плюс, в том виде, в каком их присылает Meta. Иначе Sheets воспримет их как числа, отбросит ведущий плюс и может изменить формат длинных значений.

Хранит ли EasyCoexistence копию сообщений?

Нет. Meta доставляет каждый вебхук на ваш URL в n8n, и таблица остаётся единственной копией.

Читайте дальше

Готовы начать?

Настройте WhatsApp Coexistence за несколько минут, а не месяцев. Приложение продолжит работать на телефоне.

Начать бесплатный пробный период

Проверено по состоянию на

WhatsApp и Google Sheets через Cloud API