WhatsApp Business API para esclarecer a necessidade.
O cenário envia ao lead um modelo personalizado de WhatsApp pedindo que esclareça seu propósito.
Visão geral do caso de uso
O cenário envia ao lead um modelo personalizado de WhatsApp pedindo para que ele esclareça seu propósito. A mensagem inclui o nome dele e o produto ou tópico de interesse. Três botões de resposta rápida permitem que ele escolha uso pessoal, uso comercial ou apenas navegação; os toques chegam via webhook para roteamento no CRM.
Exemplo de modelo
Olá, {{1}}! Para encontrar a melhor opção para "{{2}}", por favor, esclareça: qual é o objetivo que você está considerando para essa solução? Escolha uma opção adequada abaixo.
- {{1}}nome do lead ou cliente
- {{2}}produto, serviço ou tópico de interesse
- “Para mim”botão — fixo no modelo Meta

Quando usá-lo
Acesse este cenário quando um lead demonstrar interesse, mas seu propósito ainda estiver indefinido — uso pessoal, compra para negócio ou navegação inicial — e não houver uma conversa aberta no WhatsApp para perguntar em texto simples. Ele se encaixa em equipes de inbound que atribuem representantes por intenção, funis guiados por produtos que segmentam compradores cedo, e agências que mapeiam toques de resposta rápida às regras de roteamento do CRM.
Fluxo de Trabalho
- Captura de evento
O CRM sinaliza um lead cujo perfil de necessidade está incompleto após a captura.
phone:"+…" - Telefone e contexto do produto.
O telefone do lead e o contexto do produto são resolvidos a partir da carga útil.
phone:"+…" - Construir e enviar
Um template personalizado é enviado com duas variáveis de corpo e três botões de resposta rápida.
POST/sendTemplate - Status acompanhado
O lead seleciona «Para mim», «Para negócios» ou «Apenas navegando» — o evento chega via webhook.
status:"read" - Entregue
O CRM direciona o lead para a trilha de vendas correspondente ou caminho de nutrição.
delivered

Implementação técnica
Pré-requisitos
- Chave da API 1MSG · Como obter a Chave da API
- Conta do WhatsApp Business · Como Conectar WABA
- Modelo do WhatsApp · Como Aprovar o Modelo WABA
- Consentimento do Cliente · Como Gerenciar o Consentimento dos Clientes
- Ponto de extremidade do Webhook · Como Configurar Webhooks
Exemplos de código
#!/usr/bin/env bash
set -euo pipefail
# === Configuration (replace "___" placeholders) ===
API_BASE_URL="https://api.1msg.io" # production 1MSG API base URL
CHANNEL_ID="___" # channel ID from 1MSG dashboard
API_TOKEN="___" # channel JWT token (Bearer)
TEMPLATE_NAME="___" # approved template name
TEMPLATE_NAMESPACE="___" # template namespace (required — send fails without it)
TEMPLATE_LANGUAGE="___" # template language code, e.g. "en"
# === Test data ===
TEST_PHONE="___" # client phone in international format
TEST_CUSTOMERNAME="___" # {{1}} customer name
TEST_PRODUCTORSERVICENAME="___" # {{2}} product or service name
PHONE_NORM="$(printf '%s' "$TEST_PHONE" | tr -cd '0-9')"
for pair in "CHANNEL_ID=$CHANNEL_ID" "API_TOKEN=$API_TOKEN" \
"TEMPLATE_NAME=$TEMPLATE_NAME" "TEMPLATE_NAMESPACE=$TEMPLATE_NAMESPACE" \
"TEMPLATE_LANGUAGE=$TEMPLATE_LANGUAGE" "TEST_PHONE=$TEST_PHONE" \
"TEST_CUSTOMERNAME=$TEST_CUSTOMERNAME" \
"TEST_PRODUCTORSERVICENAME=$TEST_PRODUCTORSERVICENAME"; do
val="${pair#*=}"
if [ -z "$val" ] || [ "$val" = "___" ]; then
echo "Missing configuration value: ${pair%%=*}" >&2
exit 1
fi
done
if [ -z "$PHONE_NORM" ]; then
echo "Error: phone number has no digits after normalization" >&2
exit 1
fi
URL="${API_BASE_URL%/}/${CHANNEL_ID}/sendTemplate"
# params carries body ONLY. Button text is fixed in the Meta template — no button param.
# {{1}} customer name → ${TEST_CUSTOMERNAME}
# {{2}} product or service name → ${TEST_PRODUCTORSERVICENAME}
read -r -d '' PAYLOAD <<JSON || true
{
"phone": "${PHONE_NORM}",
"template": "${TEMPLATE_NAME}",
"namespace": "${TEMPLATE_NAMESPACE}",
"language": { "policy": "deterministic", "code": "${TEMPLATE_LANGUAGE}" },
"params": [
{
"type": "body",
"parameters": [
{ "type": "text", "text": "${TEST_CUSTOMERNAME}" },
{ "type": "text", "text": "${TEST_PRODUCTORSERVICENAME}" }
]
}
]
}
JSON
RESPONSE="$(curl -s -w '\n%{http_code}' -X POST "$URL" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${API_TOKEN}" \
-d "$PAYLOAD")"
HTTP_CODE="$(printf '%s' "$RESPONSE" | tail -n1)"
BODY="$(printf '%s' "$RESPONSE" | sed '$d')"
case "$BODY" in
*'"sent":true'*) ok=1 ;;
*) ok=0 ;;
esac
if [ "$HTTP_CODE" -ge 200 ] && [ "$HTTP_CODE" -lt 300 ] && [ "$ok" -eq 1 ]; then
echo "Message sent to client."
echo "API response: $BODY"
else
echo "Send failed. HTTP status: $HTTP_CODE" >&2
echo "$BODY" >&2
exit 1
fi
Status de resposta e entrega
HTTP 2xx e JSON "sent": true significam que 1MSG aceitou a mensagem para envio — não que ela já tenha chegado ao telefone do cliente. Salve o id campo (parece wamid.…) para correlacionar os callbacks de entrega.
{
"sent": true,
"id": "wamid.HBgLMzgwNjM5...",
"message": "Message accepted for delivery"
}sentAceito para envio — não está no telefone do cliente ainda
idArmazene-o; os retornos de chamada de entrega e
hookInfosão baseados nisso
A entrega em si chega mais tarde, como um retorno separado. Registre um webhook (POST …/webhook) e 1MSG envia atualizações de status para seu endpoint HTTPS em um payload de nível superior hooks[].
{
"hooks": [
{
"id": "gBGGeSaGViBfAgnlzOSHEwK9O6F",
"type": "message",
"status": "sent",
"timestamp": "1654864094",
"recipient_id": "556123122026"
}
]
}statusenviado,entregue,lido— ou um status de falha quando aplicávelidCorrelates the callback with the
idreturned by the send calltimestampSegundos Unix, como uma string
Se você preferir não receber chamadas de retorno, consulte GET {base}/{channel}/hookInfo?messageId=<id> em vez disso. Na prática, a entrega geralmente é concluída em segundos — mas o contrato da API não garante isso, então nunca bloqueie um fluxo esperando por isso.
Erros comuns
| Status | Resposta | Causa |
|---|---|---|
| 200 | Message was not sent: template is not defined | namespace, template or language missing from the request body. |
| 200 | template name (…) does not exist in <language> | The template is approved in a different language than the one requested. |
| 200 | Message was not sent: provide chatId, phone, bsuid, or username | No recipient the channel could resolve. |
| 403 | access denied | The token is wrong, or belongs to a different channel than the URL. |
| 429 | too many requests. please try later | The channel is over its send rate. |

