Operação

Boas-vindas ao comprador de infoproduto no WhatsApp: uma mensagem por checkout

A mensagem de boas-vindas é a mais segura e a mais útil de toda a operação de infoproduto: o comprador acabou de pagar, quer saber onde está o acesso e está receptivo. O risco é técnico, não de tom. Plataformas mandam um evento por compra, e um checkout com order bump são duas ou mais compras. Sem tratamento, o aluno recebe duas boas-vindas seguidas. Esta receita resolve isso.

Publicado em · 4 min de leitura

Este artigo também está disponível em: English · Español

O evento certo em cada plataforma

PlataformaEvento de compra aprovadaOnde está o telefone
---------
Hotmart (2.0.0)PURCHASE_APPROVEDdata.buyer.checkout_phone e checkout_phone_code (DDD separado para brasileiro)
Kiwifycompra_aprovada (webhook_event_type order_approved, order_status paid)bloco Customer do payload; confira em Testar Webhook
Eduzzmyeduzz.invoice_paiddata.buyer.cellphone, phone e phone2

Para assinatura, cada renovação aprovada é uma nova compra. A Kiwify manda compra_aprovada e subscription_renewed juntos; para a boas-vindas, use só a primeira compra (o subscription_id é o mesmo em todas as cobranças, então grave quem já foi recebido). Os detalhes por plataforma estão em Hotmart, Kiwify e Eduzz.

Caminho sem código e o que ele cobre

Em Fluxos, Recuperar vendas, escolha a plataforma e o objetivo 'Boas-vindas pós-compra'. O assistente cria um fluxo com uma única mensagem, que usa {nome} e {produto}, e gera a URL do webhook. Cole a URL na plataforma, marque o evento de compra aprovada e informe a chave da plataforma no assistente para validar a origem. Em poucos minutos o comprador passa a receber a mensagem.

O texto de partida é curto e genérico; troque pela sua voz. Um bom padrão: agradecimento, o que o comprador recebeu, onde está o acesso e como pedir ajuda. Não coloque senha nem link de acesso pessoal de uso único em texto aberto no WhatsApp se a sua plataforma já entrega isso por e-mail com segurança; use o WhatsApp para avisar que o e-mail saiu e para tirar dúvida.

O problema do order bump

Order bump é a oferta extra marcada no checkout. Para a plataforma, ele é outra compra, com outro evento. Se você manda boas-vindas por evento, o comprador recebe uma por produto. Na Hotmart, o payload diz quando a compra é um bump (purchase.order_bump.is_order_bump) e traz o id da compra principal (parent_purchase_transaction); quando esse id vem vazio para um bump, a própria compra é a principal. Na Eduzz, o campo data.orderBump.mainSaleId aponta para a fatura principal.

A regra é: uma boas-vindas por checkout. Calcule a chave do checkout (a transação principal), tente 'reivindicar' essa chave numa tabela com UNIQUE e só envie se conseguir. O assistente sem código não faz esse agrupamento por checkout: ele ignora o mesmo telefone no mesmo fluxo por 10 minutos, o que cobre muitos casos de bump, mas não é garantia se os eventos chegarem com mais de 10 minutos de diferença. Se isso importa para você, use o código abaixo.

Node.js (Express), Hotmart 2.0.0

// Hotmart 2.0.0: one welcome per checkout, even with order bumps
app.post("/hotmart", express.json(), async (req, res) => {
  if (req.get("X-HOTMART-HOTTOK") !== process.env.HOTMART_HOTTOK) return res.sendStatus(401);
  const { id, event, data } = req.body;
  res.sendStatus(200);
  if (event !== "PURCHASE_APPROVED") return;
  if (!(await saveEventOnce(id, req.body))) return; // duplicate delivery

  // An order bump is a separate purchase. The parent transaction id is the same for the whole checkout.
  const ob = data.purchase.order_bump;
  const parent = ob?.is_order_bump && ob.parent_purchase_transaction
    ? ob.parent_purchase_transaction
    : data.purchase.transaction;
  if (!(await claimWelcome(parent))) return;        // UNIQUE(parent): only the first purchase of the checkout welcomes

  const b = data.buyer;
  const phone = String((b.checkout_phone_code || "") + (b.checkout_phone || "")).replace(/\D/g, "");
  if (phone.length < 10) return;                     // no usable phone: log it, never guess
  await sendWhatsApp(phone.startsWith("55") ? phone : "55" + phone,
    "Oi, " + b.first_name + "! Sua compra de " + data.product.name + " foi confirmada. O acesso chega no e-mail " + b.email + ". Se não encontrar, olhe o spam ou responda aqui.");
});

// Shared helper: one send through the ZapZap API
async function sendWhatsApp(number, text) {
  const r = await fetch(`https://api.zapzapapi.com/api/v1/${process.env.ZAPZAP_INSTANCE}/send/text`, {
    method: "POST",
    headers: {
      "x-api-key": process.env.ZAPZAP_API_KEY,
      "x-api-secret": process.env.ZAPZAP_API_SECRET,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ number, text }),
  });
  if (!r.ok) throw new Error("ZapZap " + r.status + ": " + (await r.text()));
}

Telefone ausente: o que fazer e o que não fazer

Nem todo comprador deixa telefone, e em produto de afiliado o produtor precisa liberar o dado do comprador. Se o telefone não vier, o caminho certo é registrar e seguir: não tente adivinhar número, não use telefone de outro campo (como o do produtor) e não mande para um número que você 'achou'. Na Hotmart, o telefone de comprador brasileiro pode vir sem DDD, com o DDD em checkout_phone_code; o código acima junta os dois e descarta o que ficar com menos de 10 dígitos.

A ZapZap só dispara pelo assistente quando detecta um telefone de 10 a 13 dígitos. Quando o payload traz o número quebrado em dois campos, o assistente não junta; use o endpoint do exemplo.

Mensagem transacional não é campanha

A boas-vindas é transacional: acontece por causa de uma compra, para quem comprou. Isso a separa da campanha para a base, que pede consentimento específico e outro ritmo. Se você aproveitar a mensagem para empurrar outra oferta, ela deixa de ser só transacional e o risco muda. Se quiser ofertar depois, espere e peça licença: 'Quer receber dicas e novidades por aqui? Responda SIM'.

Inclua uma saída em toda mensagem e respeite. Veja o guia de LGPD no WhatsApp. A ZapZap conecta números por um canal não oficial e gerenciado; uma mensagem de boas-vindas por compra, sem repetição, é o uso de menor risco.

Resumo rápido

  • Os eventos são PURCHASE_APPROVED (Hotmart), compra_aprovada (Kiwify) e myeduzz.invoice_paid (Eduzz).
  • Order bump é outra compra: agrupe pela transação principal e envie uma boas-vindas por checkout.
  • O assistente cobre o caso simples; o endpoint próprio resolve bump com mais de 10 minutos de diferença e telefone sem DDD.
  • Boas-vindas é transacional: não misture oferta nova na mesma mensagem.

Perguntas frequentes

O comprador recebeu duas boas-vindas. Por quê?

Provavelmente por order bump. Para a plataforma, o bump é outra compra com outro evento. Agrupe pela transação principal (na Hotmart, parent_purchase_transaction; na Eduzz, orderBump.mainSaleId) e envie uma mensagem por checkout.

Posso mandar o link de acesso pelo WhatsApp?

Prefira avisar que o acesso saiu por e-mail e oferecer ajuda. Link pessoal ou senha em texto no WhatsApp expõe o aluno se o aparelho for compartilhado. Se o link é público do curso, tudo bem.

A boas-vindas precisa de consentimento?

É uma mensagem transacional para quem acabou de comprar, o que tem base diferente de campanha. Ainda assim, informe o canal no checkout, ofereça saída e respeite o pedido de parar. Para ofertas, peça consentimento específico.

Funciona para assinatura recorrente?

Para a primeira compra, sim. Para renovações, cada cobrança aprovada gera novo evento: grave quem já recebeu boas-vindas para não repetir. Na Kiwify, o subscription_id é o mesmo em todas as cobranças.

Meu comprador não recebeu nada. O que olhar?

Três pontos: se o evento chegou (histórico da plataforma), se a resposta da ZapZap foi triggered: 1 e se o telefone tem de 10 a 13 dígitos. Na Hotmart, o DDD pode vir separado do número.

Posso usar a mesma instância para tudo?

Pode, mas o número é um só e o ritmo conta. Mensagens transacionais por compra costumam ser baixo volume, o que ajuda. Em lançamento com picos, avalie o limite de 120 requisições por minuto por webhook e o ritmo de envio.

Dê boas-vindas no minuto da compra

Ligue sua plataforma em Fluxos, Recuperar vendas, ou use o código da receita. R$15 por número ativo ao mês, com crédito de boas-vindas sujeito à campanha vigente.