emailr_
Todos los artículos
usecase·9 min

Emails de re-engagement: estrategias de win-back

engagementretentionmarketing

Los emails de re-engagement pueden recuperar a usuarios en riesgo de churn antes de que se vayan para siempre. La clave está en el timing, la relevancia y el incentivo adecuado. Así se construyen campañas de win-back efectivas.

Disparadores de re-engagement

Detección de inactividad

interface InactivityTrigger {
  userId: string;
  lastActiveAt: Date;
  daysInactive: number;
  previousEngagement: 'high' | 'medium' | 'low';
  accountValue: number;
}

const reEngagementTiers = [
  { daysInactive: 7, tier: 'early', urgency: 'low' },
  { daysInactive: 14, tier: 'mid', urgency: 'medium' },
  { daysInactive: 30, tier: 'late', urgency: 'high' },
  { daysInactive: 60, tier: 'critical', urgency: 'critical' }
];

Disparadores personalizados

async function getReEngagementContent(user: User, trigger: InactivityTrigger) {
  // What did they use most?
  const topFeatures = await getTopFeatures(user.id);
  
  // What's new since they left?
  const newFeatures = await getFeaturesSince(trigger.lastActiveAt);
  
  // What did their peers accomplish?
  const peerActivity = await getPeerHighlights(user.industry);
  
  return { topFeatures, newFeatures, peerActivity };
}

Secuencia de re-engagement

Etapa temprana (7 días)

await sendEmail({
  to: user.email,
  subject: 'We noticed you haven\'t been around',
  template: 're-engagement-early',
  data: {
    user,
    lastActivity: trigger.lastActiveAt,
    topFeature: content.topFeatures[0],
    quickActionUrl: getQuickActionUrl(user),
    unsubscribeUrl: `${baseUrl}/preferences`
  }
});

Etapa media (14 días)

await sendEmail({
  to: user.email,
  subject: 'Here\'s what you\'ve missed',
  template: 're-engagement-mid',
  data: {
    user,
    newFeatures: content.newFeatures,
    peerHighlights: content.peerActivity,
    incentive: {
      type: 'extended_trial',
      value: '7 extra days free'
    },
    returnUrl: `${baseUrl}/welcome-back?token=${token}`
  }
});

Etapa tardía (30 días)

await sendEmail({
  to: user.email,
  subject: 'We want you back',
  template: 're-engagement-late',
  data: {
    user,
    offer: {
      type: 'discount',
      value: '50% off next month',
      code: generateOfferCode(user.id),
      expiresAt: addDays(new Date(), 7)
    },
    testimonial: await getRelevantTestimonial(user.industry),
    returnUrl: `${baseUrl}/welcome-back?offer=${offerCode}`
  }
});

Etapa crítica (60 días)

await sendEmail({
  to: user.email,
  subject: 'Before you go...',
  template: 're-engagement-critical',
  data: {
    user,
    dataWarning: 'Your data will be deleted in 30 days',
    exportUrl: `${baseUrl}/export?token=${exportToken}`,
    lastChanceOffer: {
      type: 'free_month',
      value: 'One month free to try again'
    },
    feedbackUrl: `${baseUrl}/feedback/churned`
  }
});

Estrategias de personalización

Contenido basado en actividad

async function getPersonalizedContent(user: User) {
  const usage = await getUserUsagePatterns(user.id);
  
  if (usage.primaryUseCase === 'reporting') {
    return {
      headline: 'Your reports are waiting',
      feature: 'New dashboard templates',
      cta: 'See your latest data'
    };
  }
  
  if (usage.primaryUseCase === 'collaboration') {
    return {
      headline: 'Your team misses you',
      feature: 'New commenting features',
      cta: 'Catch up with your team'
    };
  }
  
  return {
    headline: 'We\'ve been improving',
    feature: 'See what\'s new',
    cta: 'Explore updates'
  };
}

Mensajería específica por segmento

const segmentMessages = {
  power_user: {
    tone: 'We miss your expertise',
    incentive: 'early_access',
    focus: 'new_features'
  },
  casual_user: {
    tone: 'Quick check-in',
    incentive: 'simplicity',
    focus: 'easy_wins'
  },
  trial_abandoned: {
    tone: 'Give us another chance',
    incentive: 'extended_trial',
    focus: 'onboarding_help'
  },
  churned_paid: {
    tone: 'We want to earn you back',
    incentive: 'discount',
    focus: 'value_proposition'
  }
};

Optimización del timing

Mejores horas de envío

async function getOptimalSendTime(user: User): Promise<Date> {
  // Use historical engagement data
  const engagementHistory = await getUserEngagementTimes(user.id);
  
  if (engagementHistory.length > 0) {
    // Send when they typically engaged
    return getNextOccurrence(engagementHistory.peakHour, user.timezone);
  }
  
  // Default to industry benchmarks
  const industryDefaults = {
    b2b: { day: 'tuesday', hour: 10 },
    b2c: { day: 'saturday', hour: 11 },
    default: { day: 'wednesday', hour: 9 }
  };
  
  const defaults = industryDefaults[user.industry] || industryDefaults.default;
  return getNextOccurrence(defaults.hour, user.timezone, defaults.day);
}

Limitación de frecuencia

const reEngagementRules = {
  maxEmailsPerSequence: 4,
  minDaysBetweenEmails: 5,
  stopConditions: [
    'user_returned',
    'user_unsubscribed',
    'user_deleted_account',
    'sequence_complete'
  ],
  
  // Don't re-engage if:
  exclusions: [
    'received_re_engagement_last_90_days',
    'marked_as_spam',
    'bounced_email'
  ]
};

Medición del éxito

Métricas clave

interface ReEngagementMetrics {
  // Email performance
  openRate: number;
  clickRate: number;
  
  // Business outcomes
  returnRate: number;        // % who came back
  reactivationRate: number;  // % who became active again
  conversionRate: number;    // % who converted (if applicable)
  
  // By sequence stage
  byStage: {
    [stage: string]: {
      sent: number;
      returned: number;
      returnRate: number;
    };
  };
}

A/B testing

const reEngagementTests = [
  {
    name: 'subject_line_test',
    variants: [
      { id: 'a', subject: 'We miss you' },
      { id: 'b', subject: 'Your account is waiting' },
      { id: 'c', subject: '&#123;&#123;user.name&#125;&#125;, come back?' }
    ],
    metric: 'open_rate'
  },
  {
    name: 'incentive_test',
    variants: [
      { id: 'a', incentive: 'none' },
      { id: 'b', incentive: '20% discount' },
      { id: 'c', incentive: 'free month' }
    ],
    metric: 'return_rate'
  }
];

Mejores prácticas

  1. Segmenta agresivamente - Usuarios distintos necesitan mensajes distintos
  2. Personaliza el contenido - Haz referencia a su uso real
  3. Escala los incentivos - Empieza suave, incrementa el valor con el tiempo
  4. Define límites claros - No hagas spam a los usuarios inactivos para siempre
  5. Facilita el regreso - Retorno con un clic manteniendo el contexto
  6. Pide feedback - Aprende por qué se fueron
  7. Respeta las bajas - Detente de inmediato cuando te lo pidan

El re-engagement consiste en recordar a los usuarios el valor, no en molestarlos. Enfócate en lo que se están perdiendo, no en lo que tú estás perdiendo.

e_

Escrito por el equipo de emailr

Construyendo infraestructura de email para desarrolladores

¿Listo para empezar a enviar?

Obtén tu clave API y envía tu primer email en menos de 5 minutos. No se requiere tarjeta de crédito.