Blog · · 6 min de lectura

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

Guía paso a paso para que n8n revise cada mañana tus pagadores recurrentes en Google Sheets, detecte las tarjetas que caducan pronto y prepare con IA un aviso claro en Gmail antes de que falle el cobro.

En un gimnasio, una academia, un SaaS pequeño o cualquier negocio con cuotas recurrentes la tarjeta del cliente caduca… y el siguiente cobro rebota. Tú te enteras tarde, el cliente cree que sigue al día y toca perseguir actualizaciones de tarjeta a deshora.

En esta guía vas a montar en n8n un flujo que cada mañana revisa un registro de pagadores recurrentes en Google Sheets, detecta las tarjetas que caducan en 30 o 7 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 cobro recurrente fallido: ahí el cargo ya ha fallado; aquí avisas antes, para que actualicen la tarjeta y el cobro no se caiga. Tampoco sustituye a un aviso de renovación de suscripción: ese recuerda que el plan vence; este se centra solo en la fecha de caducidad de la tarjeta.

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:15.
  2. Lectura de pagadores: el nodo Google Sheets lee tu hoja «Tarjetas recurrentes».
  3. Filtro por días hasta caducar: un nodo Code se queda con las filas que caducan en ~30 o ~7 días y aún no han recibido el aviso de esa fase.
  4. Aviso con IA: un nodo Basic LLM Chain escribe un correo cercano que pide actualizar la tarjeta con enlace al portal si lo tienes.
  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 «Tarjetas recurrentes» con estas columnas: cliente, email, plan, caducidad (AAAA-MM, o AAAA-MM-01), ultimos4 (opcional), enlace_portal (opcional), notas y aviso_enviado (vacía o 1 / 2).

Puedes rellenar la hoja pegando un export de Stripe, Lemon Squeezy o tu pasarela (muchas muestran mes/año de caducidad), o a mano cuando das de alta un pago recurrente. No guardes el número completo de la tarjeta: solo mes/año y, si quieres, los últimos 4 dígitos. Esta guía asume que las filas ya están en Sheets.

Paso 1: prepara la hoja de tarjetas recurrentes

Mantén caducidad con formato coherente (2026-11 o 2026-11-01). Deja solo filas de clientes con cobro activo; archiva cancelados o ya actualizados. En ultimos4 pon los cuatro dígitos si tu pasarela los muestra (ayuda a que el cliente reconozca la tarjeta). En enlace_portal pon el enlace al portal de cliente o a «actualizar método de pago»; si no tienes, déjalo vacío. En notas apunta preferencias útiles («prefiere WhatsApp», «viaja hasta el viernes»).

Paso 2: disparador y lectura

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

Paso 3: filtra las tarjetas próximas 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.caducidad) continue;
  // Acepta AAAA-MM o AAAA-MM-DD; la tarjeta caduca el último día del mes
  const partes = String(c.caducidad).trim().split(/[-/]/);
  const y = Number(partes[0]), m = Number(partes[1]);
  if (!y || !m) continue;
  const finMes = new Date(y, m, 0); // día 0 del mes siguiente = último del mes m
  finMes.setHours(0, 0, 0, 0);
  const dias = Math.round((finMes - hoy) / 86400000);
  if (dias < 0 || dias > 35) continue; // ya caducada o demasiado lejos
  const ya = Number(c.aviso_enviado || 0);
  let fase = null;
  if (ya < 1 && dias <= 30 && dias >= 25) fase = 1; // ~30 días
  else if (ya <= 1 && dias <= 7 && dias >= 0) fase = 2; // ~7 días (o menos)
  if (!fase) continue;
  salida.push({ json: { ...c, dias, fase, caducidad_fin: finMes.toISOString().slice(0, 10) } });
}
return salida;

Así cada tarjeta recibe como máximo dos avisos: uno ~un mes antes y otro la última semana. Si no hay nada pendiente, el flujo termina sin gastar IA.

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 cobros de [NOMBRE DEL NEGOCIO]. Escribe un correo breve para
{{ $json.cliente }} avisando de que la tarjeta asociada a su plan {{ $json.plan }}
caduca el {{ $json.caducidad }} (quedan {{ $json.dias }} días).
Últimos 4 dígitos (si existen, menciónalos; si no, no inventes): {{ $json.ultimos4 }}
Enlace para actualizar la tarjeta (si existe, inclúyelo; si está vacío, no inventes uno): {{ $json.enlace_portal }}
Notas: {{ $json.notas }}
- Tono cercano y profesional, en español, máximo 6 frases.
- Explica que avisas para evitar un fallo en el próximo cobro; no alarmes ni culpes.
- Si hay enlace_portal, invita a actualizar la tarjeta con un clic; si no, pide responder a este correo.
- No inventes importes, descuentos, fechas de corte ni datos de tarjeta 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 pasarela ya manda un email propio de caducidad, usa este flujo solo para el segundo aviso educado o para clientes sin ese email.

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 tarjeta caduca pronto · {{ $('Code').item.json.plan }} y el texto de la IA en el cuerpo. Usar borradores te deja revisar antes de enviar, igual que en avisos de cobro recurrente fallido o avisos de renovación de suscripciones.

Después, un nodo Google Sheets → Update Row que busque por email + caducidad 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 y un caducidad que termine dentro de ~28 días, con 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 caducidad para que queden ~5 días (dejando aviso_enviado en 1) y confirma que se prepara el segundo 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.
  • Privacidad: nunca pongas el PAN completo ni el CVV en Sheets; mes/año y últimos 4 bastan.
  • No seas pesado: como máximo ~2 avisos por ciclo de caducidad; si no actualiza, anótalo y prepárate para el flujo de cobro fallido.
  • No inventes enlaces: si enlace_portal está vacío, el prompt pide responder al correo.
  • 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 avisos de renovación de suscripciones cuando el plan también vence pronto, y con avisos de cobro fallido si, pese al aviso, el cargo acaba rechazado.

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 tarjeta.