DEV Community

Hannah
Hannah

Posted on

Cómo probar emails de referidos en tu SaaS

Los emails de referidos parecen simples hasta que empiezas a medirlos en serio. En un SaaS pequeño vi que el problema no era enviar la invitación, sino probarla sin contaminar atribución, cohortes y eventos de activación. Si el mismo buzón recibe todo, terminas leyendo señales mezcladas y luego cuesta un monton explicar por qué una campaña "funcionó" en staging pero no en producción.

Por qué este flujo rompe métricas tan fácil

Un flujo de referidos suele tocar varias capas al mismo tiempo:

  • backend que genera el token de invitación
  • sistema de email transaccional
  • eventos de analytics
  • reglas de deduplicación para el referido y para quien invita

Cuando una sola persona del equipo reutiliza la misma cuenta de prueba, pasan dos cosas raras. Primero, se pisan eventos de apertura y clic. Segundo, el producto puede creer que ya existía una relación previa entre invitador y referido, así que la recompensa no sale o sale dos veces. No siempre se nota enseguida, y eso es lo que lo hace tan molesto.

En campañas con email, pequeños cambios importan bastante. Por ejemplo, la DMA reportó que el email marketing sigue entregando retornos fuertes cuando la medición y la segmentación están cuidadas, aunque el resultado cambia mucho según la calidad de datos y automatización: https://dma.org.uk/article/data-marketing-association-email-benchmarking-report-2025

El contrato mínimo que defino antes de probar

Antes de automatizar, dejo escrito un contrato de prueba muy corto. No hace falta ponerse dramatico con documentación enorme.

  1. Cada ejecución crea un referido nuevo y un invitador controlado.
  2. El email debe contener un enlace único y trazable.
  3. La apertura del mensaje no debe alterar métricas finales por sí sola.
  4. El premio o crédito solo aparece cuando el referido completa el hito correcto.

Ese contrato le da contexto al equipo de producto y al equipo de Backend. También ayuda si luego quieres comparar este flujo con otras pruebas, como probar emails en React sin romper estados accesibles, donde el foco está más en la UI que en la atribución.

Cómo monto una prueba repetible desde backend

Mi versión más simple usa datos efímeros por corrida, un outbox aislado y assertions sobre eventos. Si estás empezando, con eso ya vas bién.

type ReferralRun = {
  inviterId: string;
  inviteeEmail: string;
  referralToken: string;
};

async function createReferralRun(db: DB, outbox: Outbox): Promise<ReferralRun> {
  const inviterId = crypto.randomUUID();
  const inviteeEmail = `ref-${Date.now()}@example.test`;
  const referralToken = crypto.randomUUID();

  await db.users.insert({ id: inviterId, plan: "trial" });
  await db.referrals.insert({
    inviterId,
    inviteeEmail,
    referralToken,
    status: "pending"
  });

  const message = await outbox.waitFor(inviteeEmail);
  if (!message.html.includes(referralToken)) {
    throw new Error("El token de referido no llegó en el email");
  }

  return { inviterId, inviteeEmail, referralToken };
}
Enter fullscreen mode Exit fullscreen mode

Lo importante no es el snippet en sí. Lo importante es que el test controle identidad, token y destino del correo dentro de la misma corrida. Si mezclas esos datos entre suites, luego aparecen falsos positivos y cuesta bastante cazarlos.

Aquí es donde a veces veo búsquedas internas raras tipo temp mailid o tem email en notas del equipo. Suelen ser atajos para hablar de buzones desechables o cuentas efímeras, pero si el proceso no deja claro qué dato pertenece a cada corrida, da igual la herramienta: el ruido se queda.

Qué revisar para no confundir atribución y producto

Esta checklist me ha servido bastante:

  • El click del invitado crea un evento distinto al click del invitador.
  • El enlace expira de forma visible y testeable.
  • El reward no se asigna por abrir el correo.
  • Los reintentos de entrega no duplican créditos.
  • Las UTMs no reemplazan al identificador interno del referido.

También me gusta revisar una capa de observabilidad. Si tienes colas o jobs, agrega el referralToken al log estructurado. Así, cuando algo falla, puedes seguir el recorrido entero del email hasta la conversión. En sistemas más operativos, la idea se parece a validar correos de rollback en Kubernetes: no basta con ver que salió un mensaje, necesitas confirmar que representa el estado correcto del sistema.

Un detalle muy humano: no pruebes solo el caso feliz. En productos con loops virales, el bug más caro suele estar en estados intermedios:

  • referido ya invitado antes
  • invitador suspendido
  • premio emitido pero no reflejado en dashboard
  • enlace abierto en móvil y completado en desktop

Esos bordes parecen menores, pero son los que despues mueven soporte, métricas y confianza del equipo.

Preguntas rápidas que siempre salen

¿Hace falta testear aperturas reales?

No siempre. Si tu proveedor de email marca aperturas con pixel, muchas veces basta validar que el evento llega bien separado del evento de conversión. Para la lógica de negocio, el clic y la activación suelen importar más.

¿Y si mi stack todavía no tiene outbox de pruebas?

Empieza por lo mínimo: intercepta el payload antes del proveedor y guarda asunto, destinatario, cuerpo y metadatos de campaña. No es perfecto, pero ya te deja comprobar identidad y enlaces sin meter ruido en bandejas reales.

¿Cuándo paso esto a CI?

Cuando el flujo ya es razonablemente estable y tienes fixtures claras. Si lo subes muy pronto, cualquier cambio menor en plantillas o timing te va a romper la confianza en la suite.

Resumen corto

Para probar emails de referidos en un SaaS, yo separaría tres cosas: identidad del invitado, token del flujo y evento final de conversión. Si esas tres piezas quedan aisladas, la atribución mejora mucho y el test deja de ser una fuente de dudas. No hace falta un sistema fancy para empezar; hace falta que cada corrida sea clara, repetible y un poco aburrida. Eso, curiosamente, es una muy buena señal.

Top comments (0)