emailr_
Todos os artigos
usecase·9 min

Emails de reengajamento: estratégias de reconquista

engagementretentionmarketing

Emails de reengajamento podem recuperar usuários prestes a churn antes que se vão de vez. O segredo é timing, relevância e o incentivo certo. Veja como criar campanhas de reconquista eficazes.

Gatilhos de reengajamento

Detecção de inatividade

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' }
];

Gatilhos 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 };
}

Sequência de reengajamento

Estágio inicial (7 dias)

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`
  }
});

Estágio intermediário (14 dias)

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}`
  }
});

Estágio tardio (30 dias)

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}`
  }
});

Estágio crítico (60 dias)

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`
  }
});

Estratégias de personalização

Conteúdo baseado em atividade

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'
  };
}

Mensagens específicas 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'
  }
};

Otimização de momento

Melhores horários de envio

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);
}

Limitação de frequência

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'
  ]
};

Mensurando o sucesso

Métricas-chave

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;
    };
  };
}

Teste A/B

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'
  }
];

Boas práticas

  1. Segmente agressivamente - Usuários diferentes precisam de mensagens diferentes
  2. Personalize o conteúdo - Referencie o uso real
  3. Escalone os incentivos - Comece leve, aumente o valor ao longo do tempo
  4. Defina limites claros - Não envie spam para usuários inativos indefinidamente
  5. Facilite a volta - Retorno em um clique com o contexto preservado
  6. Peça feedback - Entenda por que eles saíram
  7. Respeite descadastros - Pare imediatamente quando solicitado

Reengajamento é sobre lembrar os usuários do valor, não importuná-los. Foque no que estão perdendo, não no que você está perdendo.

e_

Escrito pela equipe emailr

Construindo infraestrutura de email para desenvolvedores

Pronto para começar a enviar?

Obtenha sua chave API e envie seu primeiro email em menos de 5 minutos. Não é necessário cartão de crédito.