O que é um template
Templates são modelos de mensagem aprovados pela Meta. Eles são usados para iniciar ou retomar conversas fora da janela de atendimento, além de casos de autenticação, utilidade e marketing. O template pertence à WABA, tem nome, idioma, categoria, componentes e status próprios.
Utility
Atualizações transacionais esperadas, como pedido, entrega, agendamento ou conta.
Marketing
Promoções, campanhas, novidades e mensagens que estimulam compra ou engajamento.
Authentication
Códigos de autenticação e verificação conforme o formato definido pela Meta.
O que a HookCloud já administra — e o que fica com você
| Responsabilidade | HookCloud | Assinante/agência |
|---|---|---|
| App da Meta | Configura App ID, App Secret, Embedded Signup e campos de eventos. | Não precisa acessar o App Dashboard da HookCloud. |
| Permissões do token | Solicita as permissões necessárias durante o Embedded Signup. | Se aparecer “permissão ausente”, refaça a conexão pelo Flow; não tente solicitar escopos manualmente. |
| Credenciais de uso | Exibe o Meta Access Token, WABA ID e demais IDs para owner/admin autorizado. | Usa essas credenciais somente no backend do próprio sistema. |
| Status de templates | O campo message_template_status_update já é administrado no App da HookCloud. | Não precisa assinar esse campo. Para o seu banco local, combine os status refletidos pelo Flow com uma sincronização GET moderada. |
| Catálogo local | Fornece a integração e as credenciais do ativo conectado. | Cria o banco/cache dos templates no próprio sistema e controla quando sincronizar. |
Para consultar templates, você usa o WABA ID e o Meta Access Token correspondentes ao número conectado. O token deve ficar no servidor. O navegador, o chat da comunidade e o código público do site não são locais seguros para armazená-lo.
GET oficial para listar templates
A listagem é feita na Graph API com o WABA ID. Use uma versão configurável da API; o exemplo abaixo usa a versão adotada atualmente pelo projeto.
curl -G \
"https://graph.facebook.com/v25.0/WABA_ID/message_templates" \
-H "Authorization: Bearer META_ACCESS_TOKEN" \
--data-urlencode "fields=id,name,language,status,category,components,quality_score,rejected_reason,last_updated_time" \
--data-urlencode "limit=100"Resposta e paginação
A resposta contém data e, quando houver mais resultados, um objeto paging com cursores e uma URL next. Continue apenas enquanto paging.next existir.
{
"data": [
{
"id": "1234567890",
"name": "confirmacao_agendamento",
"language": "pt_BR",
"status": "APPROVED",
"category": "UTILITY",
"components": []
}
],
"paging": {
"cursors": { "before": "...", "after": "..." },
"next": "https://graph.facebook.com/..."
}
}Uma página adicional é uma nova chamada. Por isso, uma tela que repete a sincronização completa a cada abertura multiplica rapidamente o consumo da WABA.
Como armazenar os templates no seu sistema
Use uma tabela local por workspace/WABA. Um modelo mínimo:
create table whatsapp_message_templates (
id uuid primary key default gen_random_uuid(),
workspace_id uuid not null,
waba_id text not null,
meta_template_id text,
name text not null,
language text not null,
category text,
status text not null,
quality_score text,
rejected_reason text,
components jsonb not null default '[]'::jsonb,
meta_last_updated_at timestamptz,
last_synced_at timestamptz not null default now(),
deleted_at timestamptz,
unique (waba_id, name, language)
);- Use meta_template_id como referência externa quando disponível.
- Mantenha unicidade por WABA + nome + idioma.
- Guarde components como JSON para reconstruir parâmetros de header, body e botões.
- Nunca salve o access token na mesma tabela de uso comum dos templates.
- Marque como ausente/deletado somente depois de uma sincronização completa e bem-sucedida; uma página incompleta não prova exclusão.
Fluxo recomendado de sincronização
Exemplo de sincronização no backend
Exemplo simplificado em TypeScript. O método upsertTemplate representa a gravação no seu banco.
type MetaTemplatePage = {
data: Array<{
id: string;
name: string;
language: string;
status: string;
category?: string;
components?: unknown[];
quality_score?: unknown;
rejected_reason?: string;
last_updated_time?: string;
}>;
paging?: { next?: string };
};
async function syncTemplates(wabaId: string, accessToken: string) {
const fields = [
'id','name','language','status','category','components',
'quality_score','rejected_reason','last_updated_time'
].join(',');
let next: string | undefined =
`https://graph.facebook.com/v25.0/${wabaId}/message_templates` +
`?fields=${encodeURIComponent(fields)}&limit=100`;
while (next) {
const response = await fetch(next, {
headers: { Authorization: `Bearer ${accessToken}` }
});
const body = await response.json();
if (!response.ok) {
const code = body?.error?.code;
// 4 e 80007: reagende com backoff; não faça retry imediato em loop.
throw new Error(`Meta template sync failed: ${code ?? response.status}`);
}
const page = body as MetaTemplatePage;
for (const template of page.data ?? []) {
await upsertTemplate({
wabaId,
metaTemplateId: template.id,
name: template.name,
language: template.language,
status: template.status,
category: template.category,
components: template.components ?? [],
qualityScore: template.quality_score ?? null,
rejectedReason: template.rejected_reason ?? null,
metaLastUpdatedAt: template.last_updated_time ?? null,
lastSyncedAt: new Date().toISOString()
});
}
next = page.paging?.next;
}
}Atualizações de status já administradas pela HookCloud
O campo técnico message_template_status_update já está habilitado no App da HookCloud. Isso significa que o assinante não precisa configurar o campo, informar App Secret ou manter uma assinatura de App por conta própria.
| Status da Meta | O que significa | Ação no seu sistema |
|---|---|---|
| PENDING | Template enviado para análise. | Não liberar campanhas até a aprovação. |
| APPROVED | Template aprovado para o idioma e categoria informados. | Liberar o uso e atualizar a data de sincronização. |
| REJECTED | A Meta rejeitou o conteúdo ou a classificação. | Salvar o motivo, revisar o modelo e reenviar uma versão corrigida. |
| PAUSED | Template temporariamente pausado, geralmente por qualidade. | Parar automações que dependem dele e revisar público/conteúdo. |
| DISABLED | Template desabilitado. | Não tentar enviar; criar estratégia e modelo substitutos. |
Para manter sua própria base atualizada, trate o GET de templates como reconciliação da fonte de verdade. Uma estratégia segura é sincronizar quando o usuário solicitar, após uma alteração conhecida ou em uma agenda moderada. O objetivo é evitar polling agressivo sem perder a capacidade de confirmar o estado atual.
message_template_status_update, message_template_quality_update, message_template_components_update e template_category_update podem gerar alertas administrativos. O Flow registra somente informações necessárias para status e diagnóstico, sem transformar a plataforma em um editor completo de templates.GET excessivo, rate limit e erros de requisição
Chamadas à Graph API consomem limites do app e do caso de uso da WABA. Paginação, retries e chamadas duplicadas também aumentam o volume. Quando o limite é atingido, você pode receber códigos como 4 ou 80007, além de falhas temporárias.
| Evite | Faça |
|---|---|
| GET completo ao abrir cada tela | Leia o banco local e ofereça botão de sincronização. |
| GET antes de cada envio | Valide o status local; atualize somente quando estiver antigo ou incerto. |
| Vários workers sincronizando a mesma WABA | Use lock/dedupe por WABA. |
| Retry imediato e infinito | Backoff exponencial com jitter e limite de tentativas. |
| Pedir todos os campos sem necessidade | Solicite apenas os campos usados pelo sistema. |
| Ignorar cabeçalhos de uso | Monitore X-App-Usage e X-Business-Use-Case-Usage quando presentes. |
Backoff sugerido
Para erros transitórios, use uma fila com atrasos crescentes, por exemplo 30 segundos, 2 minutos, 5 minutos e 15 minutos, com pequena variação aleatória. Pare o retry quando o erro exigir correção humana, como token inválido, permissão ausente, template desabilitado ou problema de pagamento.
Antes de enviar um template
- Confirme que o template local está APPROVED e não está pausado ou desabilitado.
- Use exatamente o nome e o idioma cadastrados na Meta.
- Monte os componentes na mesma ordem e tipo do modelo aprovado.
- Preencha todas as variáveis obrigatórias e não envie valores vazios.
- Em header de mídia, use tipo e formato compatíveis.
- Confirme opt-in e finalidade correta da categoria.
- Guarde o wamid retornado e acompanhe os status de entrega no webhook configurado para a operação.
Uma resposta HTTP de sucesso significa que a Meta aceitou a solicitação; a entrega final ainda pode falhar depois. A configuração do App da HookCloud já está pronta. O assinante precisa apenas tratar os eventos que chegam ao webhook da própria operação e manter o catálogo local coerente.
Erros ao listar ou sincronizar templates
| Código | O que significa | Como corrigir | Referência Meta |
|---|---|---|---|
| 0 / 3 / 10 / 200 | Token ou app sem autorização suficiente para o objeto/ação. | Refaça o Embedded Signup ou gere uma credencial com acesso à WABA e whatsapp_business_management. Não repita com o mesmo token em loop. | Access Tokens |
| 100 | Parâmetro, campo, ID ou versão da chamada é inválido. | Confira WABA ID, nomes dos campos, URL e versão da Graph API. | Endpoint message_templates |
| 190 | Token inválido, expirado ou revogado. | Interrompa a sincronização, marque a conexão para reautorização e não exponha o token no log. | Access Tokens |
| 4 | Limite de chamadas do app atingido. | Reduza frequência, una chamadas, use cache e reagende com backoff. | Graph API Rate Limiting |
| 80007 | Limite do caso de uso/WABA atingido. | Pare o polling, monitore os cabeçalhos de uso e espere a recuperação da janela. | Graph API Rate Limiting |
Erros comuns de envio ou entrega de templates
A Meta pode devolver o erro imediatamente na API ou depois, no status failed do webhook. Sempre registre código, detalhes, horário, WABA ID, Phone Number ID, nome/idioma do template e wamid.
| Código | Explicação simples | Ação recomendada | Retry? | Meta |
|---|---|---|---|---|
| 130429 | O número/app atingiu limite de capacidade ou throughput. | Enfileire envios e reduza concorrência; use backoff. | Sim, depois | Rate limits |
| 130472 | O destinatário está em um experimento da Meta e a mensagem não foi entregue. | Não insista em loop. Aguarde e acompanhe a documentação/resultado do experimento. | Não imediato | Error codes |
| 130497 | Envio restrito para o país/região do destinatário ou do negócio. | Confira elegibilidade geográfica e políticas aplicáveis. | Não, sem mudança | Error codes |
| 131000 | Falha genérica ou interna da plataforma. | Registre o fbtrace_id, tente com backoff e confira o status da plataforma. | Sim, limitado | Error codes |
| 131005 | Acesso negado para enviar em nome do número/WABA. | Verifique token, escopos, tarefas no ativo e reautorize. | Não | Access Tokens |
| 131008 | Parâmetro obrigatório ausente. | Compare o payload com o template aprovado; preencha nome, idioma, componentes e variáveis. | Após corrigir | Template messages |
| 131009 | Valor de parâmetro inválido. | Revise número E.164, idioma, tipos, valores de botões e mídia. | Após corrigir | Template messages |
| 131016 | Serviço temporariamente indisponível. | Aguarde e tente novamente com backoff; não altere o template sem evidência. | Sim | Error codes |
| 131021 | Remetente e destinatário são o mesmo número. | Use outro destinatário. | Não | Error codes |
| 131026 | A mensagem não pôde ser entregue ao destinatário. | Confirme se o número usa WhatsApp, está correto, atualizado e aceitou os termos. Não trate como falha do template automaticamente. | Somente após validar | Error codes |
| 131031 | Conta/WABA bloqueada ou restrita. | Abra WhatsApp Manager, consulte Qualidade/Visão geral da conta e siga o processo de revisão da Meta. | Não | Error codes |
| 131037 | Nome de exibição ainda não aprovado ou não pronto para uso. | Confira o status do nome e do número no WhatsApp Manager. | Após aprovação | Phone numbers |
| 131042 | Problema de pagamento ou elegibilidade comercial da WABA. | Corrija a cobrança na Meta; a assinatura HookCloud via Stripe/Lastlink não paga as tarifas da Meta. | Após corrigir | Error codes |
| 131043 | A mensagem expirou dentro do TTL antes de ser entregue. | Revise o TTL — comum em autenticação — e não reenvie código expirado. | Novo código | Message Templates |
| 131047 | Janela de atendimento de 24 horas encerrada para mensagem livre. | Envie um template aprovado ou espere nova mensagem do usuário. | Use template | Template messages |
| 131048 | Restrição por spam/qualidade baixa ou excesso de bloqueios. | Pare campanhas, revise opt-in, conteúdo, frequência e qualidade do número/template. | Não imediato | Error codes |
| 131049 | A Meta decidiu não entregar para manter o engajamento saudável do ecossistema, frequentemente por limite de marketing por usuário. | Não reenvie repetidamente. Aguarde, reduza frequência e use Utility somente se a mensagem for realmente transacional. | Não imediato | Per-user marketing limits |
| 131050 | O destinatário parou de receber marketing da empresa. | Suprima marketing para esse contato e respeite a preferência até novo opt-in/retomada permitida. | Não | Error codes |
| 131051 | Tipo de mensagem/componente não suportado. | Use estrutura compatível com a Cloud API e com o template aprovado. | Após corrigir | Template messages |
| 131053 | A Meta não conseguiu carregar a mídia usada na mensagem. | Confira URL/arquivo, MIME type, tamanho e disponibilidade pública; reenvie mídia válida. | Após corrigir | Error codes |
| 131056 | Muitas mensagens do mesmo número para o mesmo destinatário em pouco tempo. | Crie fila por destinatário e aguarde antes de tentar novamente. | Sim, depois | Error codes |
| 131057 | Conta temporariamente em manutenção/migração. | Aguarde a conclusão da operação da Meta e tente novamente mais tarde. | Sim, depois | Error codes |
| 131061 / 131063 | Configuração específica de Marketing Messages incompatível com o endpoint Cloud API usado. | Revise a configuração de marketing e use a API correta para o recurso habilitado. | Após configurar | Marketing templates |
| 133010 | O número remetente não está registrado para uso na Cloud API. | Conclua o registro do número e confira o Phone Number ID. | Após registrar | Phone numbers |
Erros específicos do template
| Código | Causa mais comum | Como contornar corretamente | Meta |
|---|---|---|---|
| 132000 | A quantidade de parâmetros enviados não corresponde às variáveis do template. | Conte variáveis por componente e envie exatamente a mesma quantidade e ordem. | Template messages |
| 132001 | Template inexistente, idioma errado, ainda não aprovado ou indisponível. | Use nome e locale exatos; sincronize o status e confirme APPROVED. | Message Templates API |
| 132005 | Texto final/tradução excede o limite permitido. | Reduza texto fixo e valores das variáveis; teste todos os idiomas. | Template guidelines |
| 132007 | Formato ou conteúdo viola regras de template. | Leia o motivo, remova formatação/caracteres problemáticos e submeta novamente. | Template guidelines |
| 132012 | Tipo do parâmetro não combina com o componente aprovado, como imagem em header de vídeo. | Espelhe exatamente os tipos de header, body e buttons do template. | Template messages |
| 132015 | Template pausado por baixa qualidade. | Pare automações que dependem dele, corrija a estratégia e aguarde/revise conforme a Meta. | Template pausing |
| 132016 | Template desabilitado após problemas repetidos de qualidade. | Não continue tentando. Crie outro template com conteúdo e público revisados. | Template pausing |
| 132018 | Parâmetros de template inválidos; detalhes costumam indicar variável vazia, extra ou malformada. | Inspecione error_data.details e valide cada parâmetro antes do envio. | Error codes |
| 132068 | Template com WhatsApp Flow bloqueado por política/configuração. | Revise o Flow, a associação ao template e as políticas aplicáveis. | Error codes |
| 132069 | Envio de template com Flow foi limitado por frequência. | Reduza a velocidade e implemente fila/backoff. | Rate limiting |
| 135000 | Erro genérico ligado aos dados da mensagem/template. | Leia os detalhes retornados, compare com o template aprovado e corrija o payload. | Error codes |
Passo a passo para o erro 131042: pagamento/elegibilidade
Passo a passo para o erro 131049
A mensagem “This message was not delivered to maintain healthy ecosystem engagement” geralmente não é um defeito de token, webhook ou template inexistente. É uma decisão de entrega da Meta, especialmente em mensagens de marketing.
- Não repita a mesma mensagem em sequência.
- Registre o contato em uma lista temporária de supressão.
- Aguarde antes de uma nova tentativa; a Meta não publica um único prazo garantido para todos os casos.
- Reduza frequência e melhore segmentação/engajamento.
- Confirme opt-in e pedidos de parada.
- Use Utility apenas quando a finalidade for realmente transacional; não troque a categoria para burlar a decisão.
- Acompanhe qualidade do template e do número no WhatsApp Manager.
Consulte os limites de marketing por usuário na documentação da Meta.
O que salvar para diagnosticar sem expor segredos
- código, título e error_data.details;
- fbtrace_id e horário UTC;
- WABA ID, Phone Number ID, template ID, nome e idioma;
- wamid quando a API aceitou o envio;
- status local do template e data da última sincronização;
- tentativa, backoff aplicado e resposta HTTP;
- nunca o token completo; e nunca solicite o App Secret da HookCloud.
Envie o e-mail do owner, Workspace ID, Connection ID, horário aproximado e o código de suporte exibido no painel para suporte@hookcloud.app. Nunca envie o token completo.
