Para automatizar reservas por WhatsApp necesitas un número verificado en la WhatsApp Cloud API, un workflow en n8n que reciba cada mensaje, extraiga personas y hora, y responda de inmediato, y un calendario o libro de mesas donde guardar el resultado. Una configuración básica se monta en una tarde y atiende reservas las 24 horas.
¿Qué necesitas antes de empezar?
Antes de tocar n8n conviene tener claro el flujo que quieres: cuántas mesas tienes, qué horarios aceptas y qué hace el sistema cuando no hay lugar. Un restaurante en Montrose o en Heights suele resolver el 80% de las reservas con tres datos: personas, fecha y hora. Define también quién recibe la alerta cuando un grupo grande pide mesa, porque esos casos deben pasar a una persona. Con eso claro, reúne los accesos de la lista siguiente; la mayoría se obtienen el mismo día, salvo la verificación del negocio en Meta, que puede tardar más.
- 01Cuenta de Meta Business verificada: es el requisito que más tarda, así que inicia el trámite primero.
- 02Número dedicado: debe poder recibir un código y no estar activo en la app normal de WhatsApp.
- 03Acceso a WhatsApp Cloud API: genera el token y el ID del número desde Meta for Developers.
- 04Instancia de n8n: en la nube o autoalojada, con una URL pública HTTPS para el webhook.
- 05Calendario o libro de mesas: Google Calendar, Sheets o el sistema de reservas que ya uses.
- 06Plantillas aprobadas: mensajes de confirmación y recordatorio para escribir fuera de la ventana de 24 horas.
- 07Regla de escalamiento: grupos grandes o peticiones raras pasan a una persona del equipo.
¿Por qué conviene automatizar las reservas por WhatsApp?
Porque el cliente ya está en WhatsApp y porque una reserva respondida tarde suele perderse. En Houston gran parte de las preguntas llegan fuera de horario, cuando el equipo está sirviendo mesas. Según OpenTable, en el Reino Unido solo el 4.4% de las reservas online terminó en no-show frente al 4.6% de las telefónicas; es un dato histórico y de otro mercado, pero muestra que el canal importa menos que la confirmación. Un flujo que confirma al instante y recuerda antes de la visita protege tu agenda sin sumar horas de trabajo al anfitrión.
Paso 1: conectar WhatsApp Cloud API con n8n
En Meta for Developers crea una app de tipo Business, agrega el producto WhatsApp y anota el ID del número y el token de acceso. Luego, en n8n, crea un nodo Webhook con método POST y copia la URL de producción. Pégala en la configuración de webhooks de la app de Meta y suscribe el campo messages. Meta primero envía una petición GET de verificación con un desafío; si usas el workflow de abajo en producción, añade una rama que devuelva ese valor. Guarda el token como credencial de n8n y nunca lo pegues en un mensaje, un correo o un repositorio público.
Paso 2: importar el workflow de reservas
El workflow tiene seis nodos. «Webhook WhatsApp» recibe el mensaje. «Extraer datos» es un nodo Code que busca el número de personas y la hora con expresiones regulares. «¿Datos completos?» decide el camino: si están ambos datos, «Confirmar reserva» envía la confirmación por la API de WhatsApp; si falta alguno, «Pedir datos» pregunta lo que falta. «Responder 200» devuelve el OK que Meta espera. Cambia PHONE_NUMBER_ID por el ID de tu número y TU_TOKEN por tu token, y agrega después un nodo de Google Calendar para guardar la mesa. Es una base mínima, no un sistema de reservas completo.
{
"name": "Reservas por WhatsApp",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "reservas-whatsapp",
"responseMode": "responseNode",
"options": {}
},
"name": "Webhook WhatsApp",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
0,
0
]
},
{
"parameters": {
"jsCode": "const body = $input.first().json.body || {};\nconst msg = body.entry?.[0]?.changes?.[0]?.value?.messages?.[0];\nif (!msg || msg.type !== 'text') {\n return [{ json: { valid: false, from: msg?.from || '', reply: 'Escribe: reserva 4 personas viernes 7:30pm' } }];\n}\nconst text = msg.text.body.toLowerCase();\nconst size = (text.match(/(\\d+)\\s*(personas|people|pax)/) || [])[1];\nconst time = (text.match(/(\\d{1,2}(:\\d{2})?\\s*(am|pm))/) || [])[1];\nconst valid = Boolean(size && time);\nreturn [{ json: {\n valid,\n from: msg.from,\n size,\n time,\n reply: valid\n ? `Listo: mesa para ${size} a las ${time}. Te confirmamos en unos minutos.`\n : 'Para reservar dime cuántas personas y la hora. Ej: 4 personas 7:30pm'\n} }];"
},
"name": "Extraer datos",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
220,
0
]
},
{
"parameters": {
"conditions": {
"boolean": [
{
"value1": "={{ $json.valid }}",
"value2": true
}
]
}
},
"name": "¿Datos completos?",
"type": "n8n-nodes-base.if",
"typeVersion": 1,
"position": [
440,
0
]
},
{
"parameters": {
"method": "POST",
"url": "https://graph.facebook.com/v21.0/PHONE_NUMBER_ID/messages",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer TU_TOKEN"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ JSON.stringify({ messaging_product: 'whatsapp', to: $json.from, type: 'text', text: { body: $json.reply } }) }}",
"options": {}
},
"name": "Confirmar reserva",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
680,
-100
]
},
{
"parameters": {
"method": "POST",
"url": "https://graph.facebook.com/v21.0/PHONE_NUMBER_ID/messages",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer TU_TOKEN"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ JSON.stringify({ messaging_product: 'whatsapp', to: $json.from, type: 'text', text: { body: $json.reply } }) }}",
"options": {}
},
"name": "Pedir datos",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
680,
100
]
},
{
"parameters": {
"respondWith": "text",
"responseBody": "ok",
"options": {}
},
"name": "Responder 200",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
900,
0
]
}
],
"connections": {
"Webhook WhatsApp": {
"main": [
[
{
"node": "Extraer datos",
"type": "main",
"index": 0
}
]
]
},
"Extraer datos": {
"main": [
[
{
"node": "¿Datos completos?",
"type": "main",
"index": 0
}
]
]
},
"¿Datos completos?": {
"main": [
[
{
"node": "Confirmar reserva",
"type": "main",
"index": 0
}
],
[
{
"node": "Pedir datos",
"type": "main",
"index": 0
}
]
]
},
"Confirmar reserva": {
"main": [
[
{
"node": "Responder 200",
"type": "main",
"index": 0
}
]
]
},
"Pedir datos": {
"main": [
[
{
"node": "Responder 200",
"type": "main",
"index": 0
}
]
]
}
}
}Paso 3: ¿cuánto cuesta enviar mensajes por WhatsApp?
Depende de quién inicia la conversación. Según la documentación de precios de Meta, desde julio de 2025 se cobra por mensaje, y los mensajes no plantilla son gratis dentro de la ventana de atención de 24 horas que se abre cuando el cliente te escribe; las plantillas de utilidad enviadas dentro de esa ventana también son gratis. Fuera de ella solo puedes usar plantillas aprobadas, que sí se cobran según el país y la categoría. Para reservas esto es favorable: el cliente escribe primero, así que la confirmación queda dentro de la ventana. Revisa la tarifa vigente en la página de Meta antes de proyectar costos.
"Una reserva automática solo es buena si el cliente recibe una confirmación clara y el equipo sabe cuándo intervenir."
Equipo DavarionPaso 4: probar antes de abrirle la puerta a los clientes
Prueba con tu propio número y con cinco o seis frases reales: «mesa para 4 el viernes 7:30pm», «reserva 2 personas 8pm», mensajes con errores, audios y fotos. Mira qué responde el flujo y qué se rompe. Los audios y las imágenes no son texto, así que el workflow debe contestar con una instrucción amable o pasar el caso a una persona. Activa el workflow en modo producción solo cuando las pruebas pasen, y revisa las ejecuciones de n8n durante la primera semana. Si quieres ver cómo se ve un flujo terminado, mira nuestros ejemplos y las demos.
¿Puedo hacerlo sin saber programar?
Sí para lo básico: importar el JSON y cambiar el token y el ID del número no requiere código. Lo que sí exige criterio es decidir qué pasa con los casos raros, cómo se conecta tu calendario real y cómo se protege el token. Si prefieres no montarlo tú, nuestro servicio de automatización de WhatsApp lo configura y lo mantiene, y el paquete SPARK incluye un chatbot más una automatización como esta.
¿Qué pasa si el cliente escribe fuera de horario?
El flujo responde igual, porque no depende de que alguien esté despierto. Recibe el mensaje, extrae los datos y confirma. Lo que conviene ajustar es la política: puedes aceptar la reserva y marcarla para revisión, o informar que se confirmará al abrir. Lo importante es que el cliente nunca reciba silencio. Si usas una plantilla fuera de la ventana de 24 horas, recuerda que tiene que estar aprobada de antemano por Meta.
¿Reemplaza a un sistema como OpenTable o Resy?
No necesariamente. Si ya usas una plataforma de reservas, el workflow puede convivir con ella: WhatsApp atiende la conversación y tu sistema guarda la mesa. Si hoy llevas las reservas en una libreta o una hoja de cálculo, este flujo ya es una mejora clara. Evalúa según volumen: con pocas reservas diarias basta Google Calendar; con mucha rotación, integra un sistema especializado. Nuestro servicio de automatización con IA en Houston ayuda a decidir.
¿Quieres que lo revisemos contigo?
Si tu restaurante recibe reservas por WhatsApp, llamadas o Instagram y quieres ver qué se puede automatizar sin perder el trato personal, agenda una auditoría gratuita de 15 minutos con el equipo de Davarion. Revisamos tu flujo actual, te decimos qué conviene automatizar primero y qué no vale la pena tocar.