Skip to content

Recordatorios de eventos

Los eventos de calendario solo son útiles cuando las personas aparecen a ellos. Los recordatorios convierten el calendario en un empujón — un mensaje de WhatsApp un día antes del retiro de jóvenes, un correo la mañana de la reunión de líderes, un SMS una hora antes de que empiece la llamada de oración.

Los recordatorios no se configuran por evento. Se configuran una vez por organización, y cada evento con fecha futura y un canal coincidente pasa por la misma tubería.

Cómo funciona la configuración

Hay exactamente una fila event_reminder_config por org. Abre Configuración → Recordatorios para editarla.

sql
event_reminder_config(
  id, organization_id, is_enabled,
  reminder_offsets_hours integer[],
  channel_slugs text[],
  title_template text,
  body_template text,
  created_at, updated_at
)

Dos arrays hacen el trabajo:

  • reminder_offsets_hours — cuándo enviar. {24} es un solo recordatorio 24 horas antes del evento. {24, 1} son dos recordatorios: un día antes y una hora antes. {168, 24, 1} son tres recordatorios: una semana antes, un día antes y una hora antes.
  • channel_slugs — cómo enviar. Elige entre email, sms, whatsapp, push, in_app. El valor por defecto es {push, in_app} que nunca te cuesta créditos de mensajes.

Los dos arrays se multiplican. Si reminder_offsets_hours = {24, 1} y channel_slugs = {email, whatsapp}, cada evento dispara cuatro notificaciones: un correo y un mensaje de WhatsApp 24 horas antes, luego otra vez una hora antes.

Semántica de enviar-X-horas-antes

Los offsets son horas absolutas, no "la mañana de" o "el día antes." Un offset de 24 horas para un evento a las 7 PM del domingo envía a las 7 PM del sábado — no a las 9 AM del domingo. Si quieres recordatorios de la mañana de, configura el offset aproximadamente a la brecha entre la mañana y la hora del evento (10–12 horas para un evento del domingo en la noche).

Algunos patrones comunes:

Caso de usoOffsets
Solo empujón del día antes{24}
Día antes + hora antes{24, 1}
Semana antes + día antes para eventos grandes{168, 24}
Llamada de oración justo a tiempo{0.25} (15 min — pero solo enteros, así que usa 1)

WARNING

La columna es integer[]. Los offsets sub-hora no están soportados. Redondea hacia arriba — un offset de 0 horas competiría con el evento mismo.

Canales

Cada slug de canal mapea al canal configurado en tu Configuración de Mensajería. Para enviar recordatorios de WhatsApp, necesitas un canal activo de WhatsApp configurado bajo Mensajería → Canales; para enviar SMS, un canal SMS; para enviar correo, un canal de correo.

Si un slug de canal está en la configuración pero no existe un canal funcional para él, el recordatorio para ese slug falla silenciosamente. Los otros canales aún salen. Vigila la pantalla Notificaciones → Logs si los recordatorios se quedan callados — los canales fallidos aparecen ahí con el motivo de la falla.

Los dos canales gratuitos vale la pena destacarlos:

  • push — notificaciones push del navegador y PWA. Los miembros que instalaron la app o se suscribieron en su navegador reciben estas sin gastar créditos de mensajes.
  • in_app — notificaciones del ícono de campana. Visibles a cualquiera que inicie sesión.

La mayoría de las orgs corren {push, in_app, whatsapp} — push para alcance barato, WhatsApp para las personas que no instalaron la app.

Plantillas de título y cuerpo

Dos campos de texto llevan el copy del recordatorio:

  • title_template — por defecto es Upcoming: .
  • body_template — por defecto es on at .

Variables disponibles en ambas plantillas:

  • — el título del evento (o título anulado de una excepción).
  • — formateado en la zona horaria de la org.
  • — la hora de inicio, o vacío si el evento no tiene ninguna.
  • — prefijado con " at " cuando está presente, de lo contrario vacío.

Mantén los títulos cortos — SMS y push limitan los caracteres visibles. El cuerpo puede ser más largo para correo y WhatsApp.

Deduplicación

Los eventos recurrentes se repiten. Sin deduplicación enviarías el mismo recordatorio una vez por ocurrencia por offset por canal — rápidamente miles de mensajes. La tabla event_reminders_sent previene eso:

sql
event_reminders_sent(
  id, event_id, occurrence_date,
  organization_id, channel_slug, offset_hours,
  sent_at
)

El cron que despacha recordatorios verifica (event_id, occurrence_date, channel_slug, offset_hours) contra esta tabla antes de enviar. Si la fila existe, el recordatorio se omite. Si no, el recordatorio sale y la fila se inserta en la misma transacción.

La implicación: editar un evento recurrente no reenvía los recordatorios ya enviados, y volver a correr el cron después de una falla no enviará doble los que ya tuvo éxito.

Apagar los recordatorios

Pon is_enabled = false en la fila de configuración y el cron omite tu org por completo. Útil cuando estás sembrando una org de prueba, migrando de otra plataforma o probando creación de eventos sin spam a tus miembros.

También puedes apagar recordatorios por canal removiendo el slug de channel_slugs. Remover whatsapp a mitad de semana significa que el siguiente pase de recordatorios omite WhatsApp para todos, incluso para eventos ya en el calendario.

Qué se recuerda

Cada evento no eliminado con una ocurrencia futura dentro del siguiente offset programado recibe un recordatorio. Eso incluye:

  • Eventos únicos cuya event_date está en el futuro.
  • Cada ocurrencia futura de un evento recurrente, expandida desde la RRULE.
  • Eventos que caen en una fecha con una anulación — el recordatorio usa el título, hora y lugar anulados.
  • Eventos que la excepción no ha cancelado. Las ocurrencias canceladas se omiten.

Los cumpleaños actualmente no pasan por event_reminder_config — tienen un disparador de flujo de trabajo separado en el módulo de mensajería.