Actualizado el 25/10/2026
En la API oficial de WhatsApp, los mensajes de bienvenida, de ausencia y de horario de atención no son configuraciones listas como en la app WhatsApp Business: los envía tu sistema, a partir del webhook de mensaje recibido. La lógica es simple: cuando el cliente escribe, verificas si es su primer contacto y si estás dentro del horario, y respondes con texto libre, porque la ventana de 24 horas acaba de abrirse. La Cloud API ofrece un solo complemento nativo, los ice breakers y comandos, que aparecen antes del primer mensaje.
Qué cambia respecto de la app WhatsApp Business
En la app, estos mensajes se activan con pocos toques. El Servicio de ayuda de WhatsApp describe dos funciones:
- Mensaje de bienvenida: se envía cuando el cliente escribe por primera vez o vuelve a escribir después de 14 días sin conversación.
- Mensaje de ausencia: se envía siempre, en un horario personalizado o fuera del horario comercial definido en el perfil de la empresa.
En la API no existe ese panel. El número lo opera un software, y el software decide qué responder. Da más trabajo al inicio y mucho más control después: puedes considerar feriados, horarios distintos por equipo, idioma del cliente, cola de atención y estado del pedido.
| Función | App WhatsApp Business | API (Cloud API) |
|---|---|---|
| Bienvenida en el primer contacto | Configuración nativa | Tu webhook detecta el primer contacto y responde |
| Mensaje de ausencia | Configuración nativa, con el horario del perfil | Tu webhook compara la hora y responde |
| Feriados y excepciones | Limitado | Libre: tú defines la regla |
| Botones, listas, enlaces | Limitado | Mensajes interactivos completos |
| Opciones antes del primer mensaje | No | Ice breakers y comandos (nativo) |
Ice breakers y comandos: la única función nativa
La Cloud API tiene los llamados componentes conversacionales, que se configuran por número con POST /<PHONE_NUMBER_ID>/conversational_automation. Según la documentación de componentes conversacionales:
- Ice breakers (
prompts): hasta 4 por número, de hasta 80 caracteres cada uno, sin emojis. Aparecen como opciones tocables cuando el cliente abre una conversación nueva con la empresa. - Comandos (
commands): hasta 30, con nombre de hasta 32 caracteres y descripción de hasta 256. El cliente escribe/y ve la lista.
Cuando el cliente toca un ice breaker o envía un comando, llega un webhook normal de mensaje recibido, con el texto en messages[].text.body. Es decir, el ice breaker no responde nada por sí solo: solo facilita el primer mensaje, y tu sistema responde.
Dos cuidados. Los ice breakers solo aparecen si todavía no existe una conversación entre el cliente y el número; para probar, borra antes el chat en tu teléfono. Y un enlace wa.me con texto prellenado oculta los ice breakers, porque el cliente ya llega con un mensaje listo.
Meta llegó a ofrecer, en la misma función, una opción de mensaje de bienvenida que disparaba un evento request_welcome cuando el cliente abría la conversación por primera vez. La página actual de la documentación describe solo ice breakers y comandos. No construyas el flujo dependiendo de ese evento: detecta el primer contacto en tu propia base de datos, como se muestra a continuación.
Cómo armar bienvenida, ausencia y horario en el webhook
El flujo completo cabe en cuatro pasos:
- Recibe el webhook de mensaje (
field: "messages", convalue.messages[]). - Determina si es el primer contacto del cliente (o el primero después de X días).
- Verifica si la hora actual, en la zona horaria de la empresa, está dentro del horario laboral y no es feriado.
- Elige la respuesta: bienvenida, ausencia o nada (deja que responda el agente o el bot).
El timestamp del mensaje recibido viene en segundos Unix, en UTC. Conviértelo a la zona horaria de la operación (en Brasil, normalmente America/Sao_Paulo) antes de compararlo con el horario comercial.
Ejemplo en Node.js
const HORARIO = {
zona: 'America/Sao_Paulo',
// 0 = domingo ... 6 = sábado; horas en HH:MM
dias: { 1: ['08:00', '18:00'], 2: ['08:00', '18:00'], 3: ['08:00', '18:00'],
4: ['08:00', '18:00'], 5: ['08:00', '17:00'], 6: ['09:00', '12:00'] },
feriados: ['2026-11-02', '2026-11-15', '2026-11-20', '2026-12-25'],
};
function ahoraEnZona(tsSegundos, zona) {
const d = new Date(Number(tsSegundos) * 1000);
const p = Object.fromEntries(
new Intl.DateTimeFormat('en-CA', {
timeZone: zona, year: 'numeric', month: '2-digit', day: '2-digit',
hour: '2-digit', minute: '2-digit', weekday: 'short', hour12: false,
}).formatToParts(d).map((x) => [x.type, x.value])
);
const dias = { Sun: 0, Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6 };
return { fecha: `${p.year}-${p.month}-${p.day}`, hora: `${p.hour}:${p.minute}`, dia: dias[p.weekday] };
}
function dentroDelHorario(ts) {
const { fecha, hora, dia } = ahoraEnZona(ts, HORARIO.zona);
if (HORARIO.feriados.includes(fecha)) return false;
const rango = HORARIO.dias[dia];
return Boolean(rango) && hora >= rango[0] && hora < rango[1];
}
export async function alRecibirMensaje(msg, db, enviarTexto) {
const contacto = await db.buscarContacto(msg.from);
const primerContacto = !contacto || Date.now() - contacto.ultimoMensajeEn > 14 * 864e5;
const abierto = dentroDelHorario(msg.timestamp);
await db.registrarMensaje(msg.from, Number(msg.timestamp) * 1000);
if (!abierto) {
// evita repetir la ausencia en cada mensaje del cliente
if (contacto?.ausenciaEnviadaEn && Date.now() - contacto.ausenciaEnviadaEn < 12 * 36e5) return;
await db.marcarAusencia(msg.from, Date.now());
return enviarTexto(msg.from,
'¡Hola! Atendemos de lunes a viernes de 8 a 18 h y los sábados de 9 a 12 h. ' +
'Tu mensaje quedó registrado y respondemos en cuanto abramos.');
}
if (primerContacto) {
return enviarTexto(msg.from,
'¡Hola! Te escribe Tienda Ejemplo. ¿En qué te ayudamos: un pedido, un cambio o una consulta sobre un producto?');
}
// dentro del horario y cliente recurrente: pasa al bot o a la cola de agentes
}
Los feriados del ejemplo son feriados nacionales de Brasil en 2026; agrega los de tu país o región y guarda la lista en un lugar fácil de editar.
El envío de la respuesta
La respuesta es un mensaje de texto común, permitido porque el cliente acaba de abrir la ventana de atención. Con Vectalk, el payload es el mismo de la Cloud API:
curl -X POST https://apis.vectalk.com.br/api/messages \
-H "Authorization: Bearer $VECTALK_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"messaging_product": "whatsapp",
"to": "5511999999999",
"type": "text",
"text": { "body": "¡Hola! Atendemos de lunes a viernes de 8 a 18 h." }
}'
Para la bienvenida, conviene cambiar el texto por botones de respuesta («Hacer un pedido», «Hablar con un agente», «Copia de factura»). El cliente toca en lugar de escribir y tu sistema recibe una respuesta estructurada.
Cuánto cuesta responder automáticamente
Los mensajes de texto libre enviados dentro de la ventana de atención pertenecen a la categoría de servicio. Según la página de precios de Meta, desde el 1 de octubre de 2026 los mensajes de servicio se cobran a partir del mensaje entregado número 1.001 del mes, por número; los primeros 1.000 siguen siendo gratuitos. Los mensajes del cliente a la empresa nunca se cobran.
En la práctica, eso cambia el diseño:
- No respondas cada mensaje fuera del horario. Una ausencia cada 12 horas por contacto, como en el ejemplo, es suficiente.
- Evita dos mensajes cuando uno alcanza. Una bienvenida con botones reemplaza «¡Hola!» seguido de un menú.
- Controla el volumen. El webhook de estado incluye el tipo de cobro de cada mensaje.
¿Y fuera de la ventana de 24 horas?
La bienvenida y la ausencia son respuestas: siempre llegan justo después de un mensaje del cliente, con la ventana abierta. El problema aparece al día siguiente. Si el cliente escribió a las 22 h, recibió la ausencia y nadie respondió hasta las 22 h del otro día, la ventana se cerró y solo puedes retomar con una plantilla aprobada.
Dos defensas simples: una cola que priorice, al abrir, las conversaciones recibidas fuera del horario, y una alerta para las conversaciones que están por cumplir 24 horas sin respuesta. Las métricas de atención muestran cómo medirlo.
Buenas prácticas para mensajes automáticos
- Indica el horario real y el siguiente paso. «Respondemos desde las 8 h» es mejor que «te contactaremos pronto».
- Ofrece un camino hacia un humano. La Política de Mensajes de WhatsApp Business exige vías de escalamiento claras cuando la atención es automatizada.
- No pidas datos sensibles en la bienvenida. Documentos, tarjetas y contraseñas no van en un mensaje automático.
- Respeta a quien pidió la baja. Una respuesta automática no es motivo para reactivar el marketing. Consulta LGPD y WhatsApp.
- Combínalo con la distribución. Dentro del horario, la bienvenida puede preguntar el tema para derivar al equipo correcto, como en la atención con varios agentes.
- En agendas, deja que el bot trabaje fuera del horario. Una clínica puede reservar turnos a las 23 h con un agendamiento con IA en lugar de enviar solo la ausencia.
Cómo hacerlo con Vectalk
Con Vectalk, los webhooks que llegan a tu sistema son los de Meta. Registra tu URL con POST /api/webhooks, trata los mensajes recibidos como en el ejemplo y responde con POST /api/messages. Para los ice breakers y comandos, usa POST /api/automation con prompts y commands, y GET /api/automation para consultar la configuración actual; ambos endpoints usan el token de instancia. El endpoint también acepta enable_welcome_message, que activa la opción de bienvenida de Meta descrita arriba; como ya no figura en la documentación actual de Meta, mantén la bienvenida en tu webhook.
curl -X POST https://apis.vectalk.com.br/api/automation \
-H "Authorization: Bearer $VECTALK_TOKEN_INSTANCIA" \
-H "Content-Type: application/json" \
-d '{
"prompts": ["Quiero hacer un pedido", "Seguir mi pedido", "Cambios y devoluciones", "Hablar con un agente"],
"commands": [{ "command_name": "horario", "command_description": "Muestra el horario de atención" }]
}'
Referencia en docs.vectalk.com.br. Para empezar, crea tu cuenta en apps.vectalk.com.br/register.
Preguntas frecuentes
¿Puedo usar el mensaje de ausencia de la app junto con la API?
El mensaje de ausencia es una función de la app WhatsApp Business. La documentación de coexistencia de Meta incluye los mensajes de bienvenida y de ausencia entre las herramientas de la app que no se admiten en la Cloud API. Aunque el número esté en la app y en la API a la vez, mantén la bienvenida y la ausencia en tu sistema.
¿Necesito una plantilla para el mensaje de bienvenida?
No. La bienvenida responde a un mensaje del cliente, así que la ventana de 24 horas está abierta y puedes enviar texto libre o un mensaje interactivo. La plantilla solo es necesaria para iniciar o retomar la conversación fuera de la ventana.
¿El mensaje automático se cobra?
Es un mensaje de servicio. Desde el 1 de octubre de 2026, Meta cobra los mensajes de servicio a partir del número 1.001 entregado en el mes, por número. Por eso conviene limitar la ausencia a una vez por período.
¿Cómo sé si es el primer contacto del cliente?
La Cloud API no lo informa directamente. Guarda en tu base la fecha del último mensaje de cada wa_id y define tu propia regla, como «ningún mensaje en los últimos 14 días», parecida a la de la app.
¿Todos ven los ice breakers?
Solo quien abre una conversación nueva con el número. Quien ya tiene historial con la empresa no los ve, y quien llega por un enlace con texto prellenado tampoco.
Fuentes oficiales consultadas el 25/10/2026: Componentes conversacionales (ice breakers y comandos), Coexistencia, Webhook de mensajes, Precios de la plataforma, Política de Mensajes de WhatsApp Business, Servicio de ayuda de WhatsApp: mensajes de bienvenida, Servicio de ayuda de WhatsApp: mensajes de ausencia, Docs de Vectalk: automatización conversacional.
