Registar mensagens WhatsApp no Google Sheets e enviar a partir de uma folha
Aponte o destino do webhook do número para um workflow n8n cujo nó Google Sheets acrescenta uma linha por mensagem: remetente, nome, texto, id da mensagem e hora. Para enviar a partir de uma folha, uma função Apps Script pode percorrer as linhas e chamar a Cloud API com UrlFetchApp, usando o phone number id e o token do número. A equipa continua a responder a partir da app WhatsApp Business.
Pedidos de escrita da API Google Sheets permitidos por minuto por utilizador por projeto; 300 por projeto.
Chamadas URL Fetch do Apps Script numa conta Google de consumidor; as contas Workspace têm 100 000.
Tempo máximo que uma única execução do Apps Script pode durar antes de ser interrompida.
Como se transforma cada mensagem WhatsApp numa linha?
A Meta envia cada mensagem do número para o destino do webhook que definir, aqui um nó Webhook do n8n que também responde ao pedido de verificação da Meta. O nó seguinte é o Google Sheets com a operação Append Row, que mapeia campos do payload para colunas: o número do remetente, o nome de perfil, o texto, o id da mensagem WhatsApp, a data e hora e o phone number id de receção.
Use Append or Update Row com chave no id da mensagem, em vez de um simples acrescento, se quiser que as repetições sejam inofensivas. A Meta volta a entregar uma mensagem quando considera que a entrega falhou, e a chave no id transforma a segunda entrega numa atualização da mesma linha.
Num número Coexistence, as respostas escritas na app WhatsApp Business chegam ao mesmo webhook como eventos smb_message_echoes. Registe-as com uma coluna de direção e a folha fica com os dois lados da conversa.
Onde é que a quota do Sheets se faz sentir?
Nas escritas por utilizador. A API Sheets permite 300 pedidos de escrita por minuto por projeto e 60 por minuto por utilizador por projeto, e uma credencial n8n corresponde a um utilizador. Um workflow que acrescenta uma linha por mensagem consegue assim cerca de uma mensagem por segundo, de forma sustentada.
Isso chega para a maioria dos números de lojas. Deixa de chegar depois de um template de difusão, quando algumas centenas de clientes respondem em poucos minutos. A API responde então 429 Too Many Requests e, sem repetições, perdem-se linhas.
Há duas soluções, e qualquer uma basta. Ative as repetições com espera no nó Google Sheets, o que corresponde ao conselho da própria Google de abrandar de forma exponencial. Ou agrupe: faça o n8n recolher mensagens durante trinta segundos e acrescente-as num só pedido, o que converte muitas escritas numa.
Como se enviam templates a partir de uma folha?
Com Apps Script, a partir do menu Extensões da folha. Uma função lê as linhas ainda não enviadas, chama o endpoint de mensagens da Cloud API com UrlFetchApp para cada uma e escreve na linha o id da mensagem devolvido e a hora. Um acionador temporal pode executá-la de poucos em poucos minutos, ou pode executá-la manualmente a partir de um menu personalizado.
Guarde o token de acesso nas propriedades do script e não no código, para que quem puder ver o script não o veja.
Tenha as quotas presentes. Uma conta Google de consumidor tem 20 000 chamadas URL Fetch por dia e uma conta Workspace 100 000, e cada execução pára ao fim de seis minutos. Processe as linhas por blocos e marque cada uma como enviada antes de avançar, para que uma execução interrompida retome onde ficou em vez de enviar duas vezes.
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());
}
}Erros comuns
- Acrescentar sem chave no id da mensagem. As repetições da Meta escrevem então a mesma mensagem em duas linhas.
- Escrever uma linha por mensagem através de uma única credencial durante um pico de respostas. O limite de 60 escritas por minuto por utilizador devolve 429 e perdem-se linhas.
- Enviar texto livre a partir da folha a pessoas que não escreveram nas últimas 24 horas. Fora dessa janela, só um template aprovado é entregue.
Ligue o número em easycoexistence.com, aponte o destino do webhook para o workflow n8n e copie o phone number id e o token para o script. A partir de US$ 9 por número ligado por mês, descendo até US$ 1 à medida que adiciona números, com os primeiros 3 dias grátis.
Perguntas frequentes
Posso usar o Make ou o Zapier em vez do n8n?
Sim. Um webhook personalizado do Make ou um catch hook do Zapier recebe a mensagem e o respetivo passo Google Sheets acrescenta a linha.
Com que conta Google escreve o n8n?
Com a que autorizou a credencial Google do n8n. Essa conta precisa de acesso de edição à folha, e a sua quota de escrita por utilizador é a que o workflow consome.
A coluna do telefone está formatada corretamente?
Guarde os números como texto simples, com os dígitos e o indicativo do país e sem o sinal de mais, que é a forma como a Meta os envia. Caso contrário, o Sheets trata-os como números, o que elimina o sinal de mais inicial e pode reformatar valores longos.
A EasyCoexistence guarda uma cópia das mensagens?
Não. A Meta entrega cada webhook ao seu URL do n8n, e a folha é a única cópia.
Continue a ler
Pronto para começar?
Configure a Coexistência do WhatsApp em minutos, não em meses. A aplicação continua a funcionar no telemóvel.
Começar período experimental gratuitoVerificado em