Bienvenida al comprador de infoproducto en WhatsApp: un mensaje por checkout
El mensaje de bienvenida es el más seguro y el más útil de toda la operación de infoproductos: el comprador acaba de pagar, quiere saber dónde está el acceso y está receptivo. El riesgo es técnico, no de tono. Las plataformas envían un evento por compra, y un checkout con order bump son dos o más compras. Sin tratamiento, el alumno recibe dos bienvenidas seguidas. Esta receta lo resuelve.
Publicado el · 5 min de lectura
Este artículo también está disponible en: Português · English
El evento correcto en cada plataforma
| Plataforma | Evento de compra aprobada | Dónde está el teléfono |
|---|---|---|
| --- | --- | --- |
| Hotmart (2.0.0) | PURCHASE_APPROVED | data.buyer.checkout_phone y checkout_phone_code (DDD separado para brasileños) |
| Kiwify | compra_aprovada (webhook_event_type order_approved, order_status paid) | bloque Customer del payload; revísalo en Testar Webhook |
| Eduzz | myeduzz.invoice_paid | data.buyer.cellphone, phone y phone2 |
En una suscripción, cada renovación aprobada es una nueva compra. Kiwify envía compra_aprovada y subscription_renewed juntos; para la bienvenida usa solo la primera compra (el subscription_id es el mismo en todos los cobros, así que guarda a quién ya se le dio la bienvenida). Los detalles por plataforma están en Hotmart, Kiwify y Eduzz.
Camino sin código y qué cubre
En Fluxos, Recuperar vendas, elige la plataforma y el objetivo 'Bienvenida poscompra'. El asistente crea un flujo con un único mensaje, que usa {nome} y {produto}, y genera la URL del webhook. Pega la URL en la plataforma, marca el evento de compra aprobada e ingresa la clave de la plataforma en el asistente para validar el origen. En pocos minutos el comprador empieza a recibir el mensaje.
El texto de partida es corto y genérico; cámbialo por tu voz. Un buen patrón: agradecimiento, qué recibió el comprador, dónde está el acceso y cómo pedir ayuda. No pongas contraseñas ni enlaces de acceso personales de un solo uso en texto abierto por WhatsApp si tu plataforma ya los entrega por correo de forma segura; usa WhatsApp para avisar que el correo salió y para resolver dudas.
El problema del order bump
El order bump es la oferta extra marcada en el checkout. Para la plataforma, es otra compra, con otro evento. Si envías la bienvenida por evento, el comprador recibe una por producto. En Hotmart, el payload dice cuándo la compra es un bump (purchase.order_bump.is_order_bump) y trae el id de la compra principal (parent_purchase_transaction); cuando ese id viene vacío para un bump, la propia compra es la principal. En Eduzz, el campo data.orderBump.mainSaleId apunta a la factura principal.
La regla es: una bienvenida por checkout. Calcula la clave del checkout (la transacción principal), intenta 'reclamar' esa clave en una tabla con UNIQUE y solo envía si lo logras. El asistente sin código no hace esta agrupación por checkout: ignora el mismo teléfono en el mismo flujo durante 10 minutos, lo que cubre muchos casos de bump, pero no es garantía si los eventos llegan con más de 10 minutos de diferencia. Si eso te importa, usa el código de abajo.
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()));
}Teléfono ausente: qué hacer y qué no hacer
No todo comprador deja teléfono, y en un producto de afiliado el productor debe liberar el dato del comprador. Si el teléfono no llega, lo correcto es registrar y seguir: no intentes adivinar un número, no uses el teléfono de otro campo (como el del productor) y no escribas a un número que 'encontraste'. En Hotmart, el teléfono de un comprador brasileño puede llegar sin DDD, con el DDD en checkout_phone_code; el código de arriba junta los dos y descarta lo que quede con menos de 10 dígitos.
ZapZap solo dispara por el asistente cuando detecta un teléfono de 10 a 13 dígitos. Cuando el payload trae el número partido en dos campos, el asistente no los une; usa el endpoint del ejemplo.
Un mensaje transaccional no es una campaña
La bienvenida es transaccional: ocurre por una compra, para quien compró. Eso la separa de la campaña para la base, que pide consentimiento específico y otro ritmo. Si aprovechas el mensaje para empujar otra oferta, deja de ser solo transaccional y el riesgo cambia. Si quieres ofrecer algo después, espera y pide permiso: '¿Quieres recibir consejos y novedades por aquí? Responde SÍ'.
Incluye una salida en cada mensaje y respétala. Mira la guía de LGPD en WhatsApp (LGPD es la ley de protección de datos de Brasil). ZapZap conecta números por un canal no oficial y gestionado; un mensaje de bienvenida por compra, sin repetición, es el uso de menor riesgo.
Resumen rápido
- Los eventos son PURCHASE_APPROVED (Hotmart), compra_aprovada (Kiwify) y myeduzz.invoice_paid (Eduzz).
- El order bump es otra compra: agrupa por la transacción principal y envía una bienvenida por checkout.
- El asistente cubre el caso simple; el endpoint propio resuelve bumps con más de 10 minutos de diferencia y teléfonos sin DDD.
- La bienvenida es transaccional: no mezcles una oferta nueva en el mismo mensaje.
Sigue leyendo
Lee también
Preguntas frecuentes
El comprador recibió dos bienvenidas. ¿Por qué?
Probablemente por un order bump. Para la plataforma, el bump es otra compra con otro evento. Agrupa por la transacción principal (en Hotmart, parent_purchase_transaction; en Eduzz, orderBump.mainSaleId) y envía un mensaje por checkout.
¿Puedo enviar el enlace de acceso por WhatsApp?
Prefiere avisar que el acceso salió por correo y ofrecer ayuda. Un enlace personal o una contraseña en texto por WhatsApp expone al alumno si el dispositivo es compartido. Si el enlace es público del curso, no hay problema.
¿La bienvenida necesita consentimiento?
Es un mensaje transaccional para quien acaba de comprar, lo que tiene una base distinta a la de una campaña. Aun así, informa el canal en el checkout, ofrece una salida y respeta el pedido de parar. Para ofertas, pide consentimiento específico.
¿Funciona para suscripción recurrente?
Para la primera compra, sí. Para las renovaciones, cada cobro aprobado genera un nuevo evento: guarda a quién ya recibió la bienvenida para no repetir. En Kiwify, el subscription_id es el mismo en todos los cobros.
Mi comprador no recibió nada. ¿Qué reviso?
Tres puntos: si el evento llegó (historial de la plataforma), si la respuesta de ZapZap fue triggered: 1 y si el teléfono tiene de 10 a 13 dígitos. En Hotmart, el DDD puede venir separado del número.
¿Puedo usar la misma instancia para todo?
Puedes, pero el número es uno solo y el ritmo cuenta. Los mensajes transaccionales por compra suelen ser de bajo volumen, lo que ayuda. En un lanzamiento con picos, evalúa el límite de 120 solicitudes por minuto por webhook y el ritmo de envío.
Da la bienvenida en el minuto de la compra
Conecta tu plataforma en Fluxos, Recuperar vendas, o usa el código de la receta. R$15 por número activo al mes, con crédito de bienvenida sujeto a la campaña vigente.
