WhatsApp Business API para recordatorio de seguimiento de propuesta
El escenario envía al prospecto una plantilla de WhatsApp personalizada recordándole revisar la propuesta comercial.
Descripción del caso de uso
El escenario envía al prospecto una plantilla de WhatsApp personalizada recordándole revisar la propuesta comercial. El mensaje contiene el nombre del prospecto, el producto o servicio discutido y un siguiente paso recomendado claro. Un botón URL estático les permite abrir el documento de propuesta directamente.
Ejemplo de plantilla
Hola {{1}}, queríamos hacer seguimiento de la propuesta que te enviamos para {{2}}. Nos encantaría conocer tu opinión - {{3}}. Si tienes preguntas o necesitas más detalles, responde a este mensaje.
[Ver propuesta]
El botón URL de la propuesta está fijado en la plantilla de Meta — solo las variables del cuerpo se envían vía API.
Variables y propósito
{{1}}— nombre del prospecto{{2}}— nombre del producto o servicio cubierto por la propuesta{{3}}— siguiente paso recomendado para el prospecto (p. ej. revisar, agendar llamada, confirmar)
Ejemplo completado
Hola Alex, queríamos hacer seguimiento de la propuesta que te enviamos para servicio de almacenamiento de datos en la nube. Nos encantaría conocer tu opinión - agenda una llamada breve para discutir los siguientes pasos. Si tienes preguntas o necesitas más detalles, responde a este mensaje.
[Ver propuesta]
Cuándo usarlo
- b2b y servicios
- e-commerce y saas
- agencias y equipos pequeños
Valor para el negocio
- Prospect receives a WhatsApp reminder 1–2 days after the proposal is delivered
- Message is personalised with the prospect's name and the specific offer
- Static URL button lets the prospect open and review the proposal directly
- Recommended next step is communicated clearly in the message body
- Sales team tracks delivery status and can follow up based on the outcome
Flujo de trabajo
- El CRM o sistema de ventas detecta que se envió una propuesta comercial y transcurrió el plazo de seguimiento (1–2 días).
- Se obtienen del CRM el teléfono del prospecto, contexto de producto o servicio y el siguiente paso recomendado.
- Se construye un mensaje de plantilla personalizado con tres variables en el cuerpo y un botón URL estático hacia la propuesta.
- El prospecto recibe el mensaje de WhatsApp y puede seguir el link para abrir y revisar la propuesta.
- Se registra el resultado de entrega para seguimiento adicional en CRM o pipeline de ventas.
- El progreso de entrega se reporta de forma asíncrona — típicamente
sent, luegodelivered(o failed/undelivered). - Tu sistema recibe el estado vía webhook (
hooks[]) o consultaGET …/hookInfo?messageId=<id>y maneja fallos si es necesario.
Implementación técnica
Requisitos previos
- Cuenta 1MSG con WhatsApp Business API conectada y plantilla de mensaje aprobada.
- Número de teléfono del prospecto en formato internacional (sin
+ni espacios). - Datos de personalización: nombre del prospecto, nombre de producto o servicio, siguiente paso recomendado.
Ejemplos de código
Node.js
#!/usr/bin/env node
// === Configuration (replace "___" placeholders) ===
const API_BASE_URL = "https://api.1msg.io"; // production 1MSG API base URL
const CHANNEL_ID = "___"; // channel ID from 1MSG dashboard
const API_TOKEN = "___"; // channel JWT token (Bearer)
const TEMPLATE_NAME = "___"; // approved template name
const TEMPLATE_NAMESPACE = "___"; // template namespace (422 without it)
const TEMPLATE_LANGUAGE = "___"; // template language code, e.g. "en"
// === Test data ===
const TEST_PHONE = "___"; // client phone in international format
const TEST_CUSTOMERNAME = "___"; // {{1}} customer name
const TEST_PRODUCTORSERVICENAME = "___"; // {{2}} product or service name
const TEST_NEXTSTEP = "___"; // {{3}} next step
function normalizePhone(phone) {
return String(phone).replace(/\D/g, "");
}
function assertConfigured(values) {
for (const [key, value] of Object.entries(values)) {
if (value === "___" || value === "" || value === undefined || value === null) {
throw new Error(`Missing configuration value: ${key}`);
}
}
}
async function sendTemplateMessage({ phone, customerName, productOrServiceName, nextStep }) {
assertConfigured({
CHANNEL_ID,
API_TOKEN,
TEMPLATE_NAME,
TEMPLATE_NAMESPACE,
TEMPLATE_LANGUAGE,
phone,
customerName,
productOrServiceName,
nextStep,
});
const url = `${API_BASE_URL}/${CHANNEL_ID}/sendTemplate`;
// params carries body ONLY. Button text is fixed in the Meta template — no button param.
const requestBody = {
phone: normalizePhone(phone),
template: TEMPLATE_NAME,
namespace: TEMPLATE_NAMESPACE,
language: {
policy: "deterministic",
code: TEMPLATE_LANGUAGE,
},
params: [
{
type: "body",
parameters: [
{ type: "text", text: String(customerName) }, // {{1}} customer name
{ type: "text", text: String(productOrServiceName) }, // {{2}} product or service name
{ type: "text", text: String(nextStep) }, // {{3}} next step
],
},
],
};
const res = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${API_TOKEN}`,
},
body: JSON.stringify(requestBody),
});
const raw = await res.text();
let data;
try {
data = JSON.parse(raw);
} catch {
data = null;
}
if (!res.ok || !data || data.sent !== true) {
console.error("Send failed. API response:");
console.error(raw);
process.exit(1);
}
console.log("Message sent to client.");
console.log("API response:", raw);
return data;
}
if (require.main === module) {
sendTemplateMessage({
phone: TEST_PHONE,
customerName: TEST_CUSTOMERNAME,
productOrServiceName: TEST_PRODUCTORSERVICENAME,
nextStep: TEST_NEXTSTEP,
}).catch((err) => {
console.error("Execution failed:", err.message);
process.exit(1);
});
}
module.exports = { sendTemplateMessage };
Respuesta inmediata de la API (síncrona)
- HTTP 2xx y JSON
"sent": truesignifican que 1MSG aceptó el mensaje para envío — no que ya llegó al teléfono del cliente. - Guarda el campo `id` de la respuesta (valor tipo
wamid.…). Úsalo para correlacionar callbacks de entrega o polling. - La respuesta también puede incluir
messageydescription— solo informativos.
Estado de entrega (asíncrono)
- Registra un webhook (
POST …/webhook) para que 1MSG envíe actualizaciones de entrega a tu endpoint HTTPS en un payload `hooks[]` separado (sent,delivered,read, o failed/undelivered cuando aplique). - Opcionalmente consulta:
GET {base}/{channel}/hookInfo?messageId=<id de sendTemplate>. - En la práctica, la entrega suele completarse en pocos segundos — pero eso no está garantizado por el contrato de la API.
Errores frecuentes
- Número de teléfono inválido o no normalizado
- Nombre de plantilla / namespace no aprobado o ausente
- Sin opt-in del cliente para mensajes comerciales de WhatsApp
- Cantidad de variables de plantilla incorrecta (422 de la API)
- Fallo de entrega — revisa el webhook de estado y la política de reintentos
Preguntas frecuentes
- ¿Necesito una plantilla aprobada? Sí — los mensajes cold-start de WhatsApp requieren una plantilla aprobada por Meta.
- ¿Puedo personalizar el texto? Las variables del cuerpo son dinámicas; el texto fijo y las etiquetas de botones se definen en la plantilla de Meta.
- ¿Cómo verifico la entrega?
sent: truesolo confirma aceptación. Rastrea la entrega vía webhookhooks[]oGET …/hookInfo?messageId=<id>. - ¿Qué pasa si no se entrega? Registra el hook failed/undelivered, verifica opt-in y estado de la plantilla, luego reintenta o usa otro canal.
- ¿Puedo conectarlo a mi CRM o backend? Sí — dispara la llamada a la API desde el webhook de tu plataforma o manejador de eventos.
CTA
¿Listo para usar recordatorio de seguimiento de propuesta? Conecta tu canal 1MSG y ejecuta los ejemplos de código de arriba.
Recursos relacionados
Build WhatsApp automation in minutes
Use 1MSG to automate this workflow and try it with our free demo.
