💬 Shared Inbox do WhatsApp na nova PlataformaMais
1msg official logo

WhatsApp Business API para lembrete de ação incompleta

O cenário envia ao cliente um modelo de WhatsApp personalizado quando ele começa, mas não termina uma ação importante.

Visão geral do caso de uso

O cenário envia ao cliente um template personalizado de WhatsApp quando ele começou, mas não concluiu uma ação importante. A mensagem inclui o nome do cliente, a ação incompleta e o que falta para ser concluído. Um botão de URL estático abre o portal, checkout ou formulário para retomar.

Exemplo de template

Olá,{{1}}! Para completar{{2}}, um passo resta.{{3}}Se você tiver perguntas — estamos aqui para ajudar.

Continuar
  • {{1}}
    nome do cliente
  • {{2}}
    ação incompleta (por exemplo, pagamento de pedido, solicitação de empréstimo, upload de KYC)
  • {{3}}
    passo ou prazo restante (por exemplo, concluir o pagamento dentro de 24 horas)
  • “Continuar”
    botão — fixo no modelo Meta
WhatsApp Business API for incomplete action reminder

Quando usar isso

Aproveite este cenário quando um cliente inicia o checkout, o onboarding ou a verificação, mas sai antes de terminar — e você precisa que ele retorne exatamente ao passo em que abandonou. Isso se encaixa em equipes de e-commerce que recuperam carrinhos não pagos, equipes de produtos que incentivam a conclusão de KYC ou de perfis, e agências que conectam gatilhos de carrinho abandonado ou rascunho salvo do CRM ou da pilha de análises de um cliente.

Menor taxa de desistência em fluxos inacabados
Três variáveis de corpo carregam o nome do cliente, o rótulo da ação incompleta e o passo restante, então o lembrete nomeia o que eles deixaram para trás em vez de um empurrão genérico.
Um toque para voltar ao checkout ou ao formulário
Um botão de URL estática rotulado Continuar abre o portal, checkout ou formulário onde eles pararam — o link é fixo no modelo aprovado da Meta enquanto apenas o texto do corpo é enviado pela API.
Lembretes sem uma janela de chat aberta
Como não há uma conversa ativa, o envio utiliza um modelo aprovado do WhatsApp através da API 1MSG — o único canal que pode alcançar o cliente fora da janela de sessão de 24 horas.
Sem perseguição manual após eventos abandonados.
Quando o sistema detecta um estado incompleto — tempo limite do carrinho, rascunho salvo ou verificação parada — ele resolve o número de telefone e dispara o template nesse gatilho, em vez de alguém copiar os detalhes manualmente.
Entrega registrada para acompanhamento no CRM
O resultado da entrega é registrado após o envio, para que o CRM ou o escritório administrativo possam ver quem foi lembrado e lidar com erros de acordo com as regras da plataforma.

Fluxo de trabalho

  1. Ações do cliente

    O cliente inicia uma ação, mas sai antes da conclusão.

    user action

  2. Registrar evento

    O sistema detecta o estado incompleto e resolve o número de telefone do destinatário.

    phone: "+…"

  3. Construir e enviar

    Uma mensagem de modelo personalizada é construída com três variáveis de corpo e um botão de URL estático.

    POST /sendTemplate

  4. Entregue

    O cliente recebe o lembrete do WhatsApp com o contexto da ação e a etapa restante.

    delivered

  5. Status rastreado

    Resultado da entrega é registrado; erros são tratados de acordo com as regras da plataforma.

    status: "read"

WhatsApp Business API for incomplete action reminder

Implementação técnica

Pré-requisitos

  1. 1MSG Chave da API · Como obter a chave da API
  2. Conta do WhatsApp Business · Como Conectar o WABA
  3. Modelo de WhatsApp · Como Aprovar o Modelo WABA
  4. Opt-in do consumidor · Como Gerenciar o Consentimento dos Clientes

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_INCOMPLETEACTION="___"         # {{2}} incomplete action
TEST_NEXTSTEP="___"         # {{3}} next step

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_INCOMPLETEACTION=$TEST_INCOMPLETEACTION" \
            "TEST_NEXTSTEP=$TEST_NEXTSTEP"; 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}} incomplete action → ${TEST_INCOMPLETEACTION}
# {{3}} next step → ${TEST_NEXTSTEP}
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_INCOMPLETEACTION}" },
        { "type": "text", "text": "${TEST_NEXTSTEP}" }
      ]
    }

  ]
}
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": truemean 1MSGaceitoA mensagem para enviar ainda não chegou ao telefone do cliente.idcampowamid.…) para correlacionar callbacks de entrega.

200 OKResposta
{
  "sent": true,
  "id": "wamid.HBgLMzgwNjM5...",
  "message": "Message accepted for delivery"
}
  • sent

    Aprovado para envionãoainda no telefone do cliente

  • id

    Armazenar; chamadas de retorno de entrega.hookInfoestão focados nisso

A entrega em si chega mais tarde, como um callback separado. Registre um webhookPOST …/webhook) e 1MSG POSTs atualizações de status para seu endpoint HTTPS em um nível superiorhooks[]carga útil.

200 OKWebhook de status de entrega — payload recebido
{
  "hooks": [
    {
      "id": "gBGGeSaGViBfAgnlzOSHEwK9O6F",
      "type": "message",
      "status": "sent",
      "timestamp": "1654864094",
      "recipient_id": "556123122026"
    }
  ]
}
  • status

    sent, delivered, read— ou um status de falha quando aplicável

  • id

    Correla o retorno com oidretornado pela chamada de envio

  • timestamp

    Segundos Unix, como uma string

Se você preferir não receber callbacks, faça uma consulta.GET {base}/{channel}/hookInfo?messageId=<id>em vez disso. Na prática, a entrega muitas vezes é concluída em segundos — mas o contrato da API não garante isso, então nunca bloqueie um fluxo aguardando por isso.

Erros comuns

StatusRespostaCausa
200Message was not sent: template is not definednamespace, template or language missing from the request body.
200template name (…) does not exist in <language>The template is approved in a different language than the one requested.
200Message was not sent: provide chatId, phone, bsuid, or usernameNo recipient the channel could resolve.
403access deniedThe token is wrong, or belongs to a different channel than the URL.
429too many requests. please try laterThe channel is over its send rate.

Perguntas Frequentes

Sim — mensagens de WhatsApp de início frio requerem um modelo aprovado pelo Meta.

Relacionado

Crie para o WhatsApp em horas
sem complicações de infraestrutura