Blog · · 6 min de lectura

Cómo avisar a tus clientes antes de que caduque su bono de sesiones con n8n e IA

Guía paso a paso para que n8n revise cada mañana tus bonos de sesiones en Google Sheets, detecte los que caducan pronto y prepare con IA un aviso claro en Gmail antes de que se pierdan las clases.

En un gimnasio, una academia de idiomas, un centro de estética o cualquier negocio con bonos de sesiones (10 clases, pack de 5 tratamientos, bono de coaching…) anotas la fecha de caducidad… y se te pasa. El cliente se queda con sesiones sin usar, tú pierdes la oportunidad de renovar el pack y toca explicar a deshora que «ya no vale».

En esta guía vas a montar en n8n un flujo que cada mañana revisa un registro de bonos de sesiones en Google Sheets, detecta los que caducan en ~14 o ~3 días y redacta con IA un aviso claro en Gmail. Tú revisas el borrador y lo envías.

Esto no es lo mismo que un aviso de renovación de suscripción o cuota: ahí el cliente paga un plan recurrente que se renueva; aquí tiene un pack prepago con fecha de caducidad y sesiones pendientes. Tampoco sustituye a un aviso de fin de periodo de prueba: ese es un trial que acaba; este es un bono ya comprado que está a punto de caducar. Y no es un recordatorio de cita ya agendada: ahí la cita ya existe; aquí avisas de que el pack vence y aún quedan sesiones por usar.

Qué vas a construir

Un flujo de cinco pasos que funciona solo todos los días:

  1. Disparador diario: un nodo Schedule Trigger se ejecuta a las 9:25.
  2. Lectura de bonos: el nodo Google Sheets lee tu hoja «Bonos de sesiones».
  3. Filtro por caducidad y sesiones: un nodo Code se queda con las filas que caducan en ~14 o ~3 días, con sesiones restantes > 0 y que aún no han recibido el aviso de esa fase.
  4. Aviso con IA: un nodo Basic LLM Chain escribe un correo cercano que recuerda el pack, las sesiones que quedan y la fecha de caducidad.
  5. Borrador y registro: Gmail crea el borrador y Google Sheets anota la fase avisada en aviso_enviado.

Lo que necesitas

  • Una instancia de n8n (en la nube o instalada gratis en tu ordenador).
  • Google Sheets y Gmail conectados en n8n.
  • Una clave de API de OpenAI u otro proveedor de IA, con un límite mensual de gasto configurado en su panel.
  • Una hoja «Bonos de sesiones» con estas columnas: cliente, email, producto (nombre del bono/pack), sesiones_totales, sesiones_restantes, fecha_caducidad (AAAA-MM-DD), notas y aviso_enviado (vacía o 1 / 2).

Puedes rellenar la hoja a mano al vender un bono, o con otro flujo de n8n que escriba ahí cada venta y vaya descontando sesiones_restantes al consumir. Esta guía asume que las filas ya están en Sheets.

Paso 1: prepara la hoja de bonos

Mantén fecha_caducidad con formato de fecha coherente (AAAA-MM-DD). Deja solo bonos activos con sesiones pendientes; archiva los agotados o ya caducados. En producto usa nombres claros («Bono 10 clases yoga», «Pack 5 sesiones coaching», «Bono fisioterapia 8»). Actualiza sesiones_restantes cada vez que el cliente consume una sesión (a mano o con otro flujo). En notas apunta preferencias útiles («prefiere mañanas», «WhatsApp», «quiere renovar el mismo pack»).

Paso 2: disparador y lectura

Añade un Schedule Trigger diario a las 9:25 (revisa que la zona horaria del flujo, en Settings, sea Europe/Madrid). Conéctalo a Google Sheets → Get Row(s) apuntando a tu hoja «Bonos de sesiones».

Paso 3: filtra los bonos próximos a caducar

Añade un nodo Code (modo Run Once for All Items) con este código:

const hoy = new Date(); hoy.setHours(0, 0, 0, 0);
const salida = [];
for (const i of $input.all()) {
  const c = i.json;
  if (!c.email || !c.fecha_caducidad) continue;
  const restantes = Number(c.sesiones_restantes);
  if (!Number.isFinite(restantes) || restantes <= 0) continue; // pack agotado
  const cad = new Date(c.fecha_caducidad); cad.setHours(0, 0, 0, 0);
  const dias = Math.round((cad - hoy) / 86400000);
  if (dias < 0 || dias > 16) continue; // ya caducado o demasiado lejos
  const ya = Number(c.aviso_enviado || 0);
  let fase = null;
  if (ya < 1 && dias >= 12 && dias <= 15) fase = 1;   // ~14 días
  else if (ya <= 1 && dias >= 0 && dias <= 4) fase = 2; // ~3 días
  if (!fase) continue;
  salida.push({ json: { ...c, dias, fase, sesiones_restantes: restantes } });
}
return salida;

Así cada bono recibe como máximo dos avisos: uno ~dos semanas antes y otro los últimos días. Si sesiones_restantes es 0, se omite (no tiene sentido avisar de un pack vacío). Si no hay nada pendiente, el flujo termina sin gastar IA. Puedes ajustar las ventanas (12–15 y 0–4) a tu sector.

Paso 4: redacta el aviso con IA

Añade un Basic LLM Chain con un modelo pequeño y barato (por ejemplo, gpt-4o-mini) y este prompt:

Eres quien gestiona bonos y packs de [NOMBRE DEL NEGOCIO]. Escribe un correo breve para
{{ $json.cliente }} avisando de que su bono «{{ $json.producto }}» caduca el
{{ $json.fecha_caducidad }} (quedan {{ $json.dias }} días).
Sesiones totales: {{ $json.sesiones_totales }}. Sesiones restantes: {{ $json.sesiones_restantes }}.
Notas: {{ $json.notas }}
- Tono cercano y profesional, en español, máximo 7 frases.
- Recuerda que aún le quedan sesiones por usar y la fecha de caducidad; no alarmes ni culpes.
- Invita a reservar las sesiones pendientes o a renovar el pack si le interesa; no inventes precios ni descuentos.
- Si en notas hay preferencias (horario, canal), tenlas en cuenta sin inventar datos.
- No inventes enlaces de reserva, importes ni fechas que no estén en los datos.
Devuelve solo el cuerpo del correo.

Los datos salen de tu hoja; la IA solo pone el tono. Si tu software de reservas ya manda un email propio de caducidad, usa este flujo como segundo aviso más humano o para bonos que gestionas a mano.

Paso 5: crea el borrador y marca el aviso

Conecta un nodo Gmail → Create Draft con el destinatario {{ $('Code').item.json.email }}, el asunto Tu bono caduca pronto · {{ $('Code').item.json.producto }} y el texto de la IA en el cuerpo. Usar borradores te deja revisar antes de enviar, igual que en avisos de renovación de suscripciones o avisos de fin de periodo de prueba.

Después, un nodo Google Sheets → Update Row que busque por email + fecha_caducidad (o producto si un cliente tiene varios bonos) y escriba la fase en aviso_enviado.

Cuando tengas confianza en los textos, puedes cambiar Create Draft por Send.

Cómo probarlo

  1. Crea una fila de prueba con tu propio correo, un fecha_caducidad dentro de ~14 días, sesiones_restantes > 0 y aviso_enviado vacío.
  2. Ejecuta el flujo a mano y comprueba que aparece el borrador y que aviso_enviado pasa a 1.
  3. Ejecútalo otra vez: no debe crearse ningún borrador nuevo (fuera de la ventana de fase 1).
  4. Cambia fecha_caducidad para que queden ~3 días (dejando aviso_enviado en 1) y confirma que se prepara el segundo aviso.
  5. Pon sesiones_restantes a 0 y comprueba que el flujo no genera aviso.

Coste y buenas prácticas

  • Coste: cada aviso cuesta menos de una décima de céntimo en la API de IA. Pon un límite mensual de gasto en el panel del proveedor.
  • No seas pesado: como máximo ~2 avisos por bono; si no reserva, anótalo y, si aplica, pasa a un flujo de reactivación de clientes inactivos.
  • Mantén sesiones_restantes al día: si no descuentas al consumir, avisarás de packs ya agotados o te saltarás packs con saldo.
  • No inventes precios ni enlaces: el prompt no debe inventar ofertas de renovación que no estén en tus datos.
  • Avisa de errores: activa un flujo de errores para enterarte si Gmail o la hoja fallan, como en gestión de errores en n8n.
  • Combínalo con recordatorios de citas cuando el cliente ya haya reservado una sesión del bono, y con avisos de renovación de suscripciones si además tiene una cuota mensual aparte.

Empieza con plantillas listas para importar

Si quieres tener ya montada la base de atención al cliente en n8n, descarga gratis el agente de WhatsApp o echa un vistazo al pack completo AgentKiosk: 8 agentes probados en español e inglés, con su workflow, su prompt y su guía, listos para importar y combinar con estos avisos de caducidad de bonos de sesiones.