name: comercialrs-meta-whatsapp-templates
description: Setup and send Meta WhatsApp templates for ComercialRS — template creation rules, API sending, and critical restrictions discovered via trial and error.
created: 2026-05-20
ComercialRS — Meta WhatsApp Templates Setup
Context
ComercialRS (Supabase Cloud dauftiqcvgaydddoxqhh) uses Meta WhatsApp Business API to send notifications to team members. Templates must be created manually in Meta Business Manager, then integrated into Edge Function dispatch-automation.
Meta Credentials (ComercialRS)
- - Phone ID:
812251211981254 - - WABA ID:
532448808878595 - - Token (WABA owner, send-capable):
EAASNGf6ucRcBRYZC7BtZAZBKnRjDTUwkTRpPgRw1jZALy7mQxiUTf6a7zJt7BvLj9iYsht7PtphRfDp9BjgyzjUNmJUru0yTVpzVc2EZCFxbRJID052my8IynikcjOeLAuuuXCFcE9SMKTWEdNUpnS4ltpJK4iD8d3ZAckIZBffhvrBmVFDIkmU3t1eg99klwZDZD - - Anon key:
eyJ_REDACTED - - Telefone de teste:
5511947236906 - - Choose "Number" type (Text type doesn't show dropdown for naming)
- - Name the variable in the name field
- - Meta auto-generates
{{1}},{{2}}, etc. - -
#132001→ template não existe nessa linguagem - -
"accepted"→ template existe e funciona nessa linguagem - - Status PENDING =
#132001"Template name does not exist in the translation" - - Aguardar aprovação (1h a 24h) antes de testar
- -
(#131008) Required parameter is missing→ Parâmetros enviados não correspondem ao template (contagem errada, tipo errado, ou params vazios) - -
(#132001) Template name does not exist in the translation→ O template NÃO EXISTE nesta conta WABA. Não é questão de parâmetros — o template precisa ser criado primeiro. - -
tasks:id, title, due_date, channel, link, status, priority, responsible_id, created_at, updated_at - -
team_members:id, name, phone, role - - Canal emoji:
video→📹,telefone→📞,mensagem→💬
CRITICAL: Meta Template Restrictions (Trial & Error Findings)
1. Variables CANNOT be at beginning or end of template body
Error: "Param text cannot be at the start/end of template body"
Fix: Add text AFTER the last variable:
`
🔗 {{1}} - ComercialRS
`
2. Parameters CANNOT have newlines, tabs, or 4+ consecutive spaces
Error: "Param text cannot have new-line/tab characters or more than 4 consecutive spaces"
Fix: Use | (pipe + space) as separator for lists. Never use \n inside parameter values.
WRONG:
`python
"1. Reuniao A - Video\n2. Reuniao B - Telefone"
`
RIGHT:
`python
"1. Reuniao A - Video | 2. Reuniao B - Telefone - ComercialRS"
`
3. Variables: use Number type in dropdown, not Text
In Meta Business Manager template editor:
4. Como descobrir o idioma correcto de um template (sem poder ler via API)
O token não tem scope whatsapp_business_management, por isso GET /{phone_id}/message_templates retorna #100. A solução é testar o envio directo para cada linguagem:
`bash
for lang in pt_BR pt_PT en es; do
curl -s -X POST "https://graph.facebook.com/v21.0/812251211981254/messages" \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d '{"messaging_product":"whatsapp","to":"5511914941608","type":"template","template":{"name":"TEMPLATE_NAME","language":{"code":"'"$lang"'"},"components":[{"type":"body","parameters":[{"type":"text","text":"a"},{"type":"text","text":"b"}]}]}}'
echo " → $lang"
done
`
Descoberta crítica (2026-05-22): Todos os 6 templates usam pt_BR, NÃO pt_PT. O código do dispatch-automation tinha pt_PT incorrectamente para 4 templates — todos corrigidos para pt_BR.
5. Template PRECISA estar APROVADO
Templates — Status 2026-05-22
| Nome | Lang | Params | Status | Notas |
| --- | --- | --- | --- | --- |
nova_reuniao_criada | pt_BR | 6 | ✅ Aprovado | Estava em review — aprovado hoje |
reuniao_atualizada_com_sucesso | pt_BR | 5 | ✅ Aprovado | |
lembrete_reuniao_em_30_minutos | pt_BR | 3 | ✅ Aprovado | |
1_reunioes_atrasadas_2 | pt_BR | 2 | ✅ Aprovado | Corrigido: código tinha pt_PT |
suas_reunioes_de_hoje | pt_BR | 2 | ✅ Aprovado | Corrigido: código tinha pt_PT |
reunioes_sem_atualizao_ha_3_dias | pt_BR | 2 | ✅ Aprovado | Corrigido: código tinha pt_PT |
CRITICAL: Como diagnosticar erro #132001 vs #131008
Como verificar se um template existe (mesmo sem permissão de leitura)
Se GET /{phone_id}/message_templates retorna #100 Tried accessing nonexisting field (message_templates):
1. O token não tem scope whatsapp_business_management
2. Única forma manual: entrar no Meta Business Suite → WhatsApp → Configurações → Modelos de mensagens
3. Ou: testar enviando para cada linguagem (pt_BR, pt_PT, en, es) — se TODAS retornam #132001, o template não existe nesta conta
Como descobrir o WABA ID a partir do Phone ID
`bash
curl -s 'https://graph.facebook.com/v21.0/{PHONE_ID}?fields=id,verified_name,business_profile&access_token={TOKEN}'
Retorna: {"id":"812251211981254","verified_name":"Rocha Sales Seguros","business_profile":{"id":"WABA_ID"}}
`
Formato das listas (para templates com many items)
`
1. 📹 Renata — Mensagem — 20/05/2026 às 14:30 🔗 https://link.com | 2. 📞 João — Telefone — 21/05/2026 às 10:00 🔗 https://link2.com - Comercial RS
`
Separador: | (espaço-pipe-espaço). NUNCA usar \n nos parâmetros.
Fix no dispatch-automation: params vazios
A Meta rejeita strings vazias como valor de parâmetro. O sendMetaTemplate em dispatch-automation/index.ts deve substituir "" por "-":
`typescript
const safeParams = params.map(p => p && p.trim() !== '' ? p.trim() : '-');
`
Templates a criar no Meta Business Suite
Os templates abaixo PRECISAM ser criados manualmente no Meta Business Suite antes do sistema funcionar:
Template 1: nova_reuniao_criada (6 params, pt_PT)
`
📅 Nova Reunião Criada!
📌 {{1}}
👤 Responsável: {{2}}
📹 Canal: {{3}}
📆 Data: {{4}}
🕐 Hora: {{5}}
🔗 {{6}} - Comercial RS
`
> ⚠️ Criar como "Portuguese (POR)" = código pt_PT
Template 2: reuniao_atualizada_com_sucesso (5 params, pt_PT)
`
✅ Reunião atualizada com sucesso!
📌 {{1}}
📹 Canal: {{2}}
📅 {{3}} às {{4}}
📊 Status: {{5}}
`
Template 3: lembrete_reuniao_em_30_minutos (3 params, pt_PT)
`
⏰ Lembrete — Reunião em 30 minutos!
📌 {{1}}
🕐 {{2}}
🔗 {{3}} - Comercial RS
`
daily_briefing (4 params, pt_PT)
`
📊 Seu Briefing Diário — {{1}}
📅 Reuniões hoje: {{2}}
✅ Concluídas: {{3}}
⏳ Pendentes: {{4}} - Comercial RS
`
weekly_closing (1 param, pt_PT)
`
🏁 Encerramento Semanal
✅ {{1}} reunião(ões) encerrada(s) esta semana!
`
API Sending (Python/requests)
`python
import requests
token = 'EAASNGf6ucRcBRYZC7BtZAZBKnRjDTUwkTRpPgRw1jZALy7mQxiUTf6a7zJt7BvLj9iYsht7PtphRfDp9BjgyzjUNmJUru0yTVpzVc2EZCFxbRJID052my8IynikcjOeLAuuuXCFcE9SMKTWEdNUpnS4ltpJK4iD8d3ZAckIZBffhvrBmVFDIkmU3t1eg99klwZDZD'
url = 'https://graph.facebook.com/v21.0/812251211981254/messages'
headers = {'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json'}
Exemplo: nova_reuniao_criada (6 params, pt_BR)
payload = {
'messaging_product': 'whatsapp',
'to': '5511947236906',
'type': 'template',
'template': {
'name': 'nova_reuniao_criada',
'language': {'code': 'pt_BR'},
'components': [{
'type': 'body',
'parameters': [
{'type': 'text', 'text': 'Reuniao com Cliente XYZ'},
{'type': 'text', 'text': 'Raissa'},
{'type': 'text', 'text': 'Video'},
{'type': 'text', 'text': '20/05/2026'},
{'type': 'text', 'text': '14:30'},
{'type': 'text', 'text': 'https://app2.paineldocorretor.com.br/crm/negocios/ID'}
]
}]
}
}
r = requests.post(url, json=payload, headers=headers, timeout=15)
print(r.status_code, r.text)
`
Fontes de dados (banco Supabase)
Armadilhas conhecidas
1. pt_PT vs pt_BR — criar template em "Portuguese (POR)" = pt_PT, não pt_BR
2. Nome com typo — reunioes_sem_atualizao_ha_3_dias (faltando "c" em atualização) — não mudar, é assim que foi criado
3. Variável no final — sempre adicionar texto fixo no fim (- Comercial RS)
4. \n nos params — nunca usar, usar | como separador
5. Template pendente — não tentar enviar, retorna #132001
6. Parâmetros vazios — Meta rejeita strings vazias "" como valor de parâmetro. No dispatch-automation, usar placeholder '-' para params sem valor
7. Token sem scope — GET /{phone_id}/message_templates retorna #100 se o token não tiver whatsapp_business_management. Única forma de verificar é manualmente no Meta Business Suite.
8. Conta WABA errada — se um template foi criado numa conta WhatsApp diferente, retorna #132001. Confirmar Phone ID + WABA ID correspondem à conta onde o template foi criado.