emailr_
Tous les articles
usecase·9 min

Emails de réengagement : stratégies de reconquête

engagementretentionmarketing

Les emails de réengagement peuvent récupérer des utilisateurs en churn avant qu’ils ne partent définitivement. La clé, c’est le bon timing, la pertinence et l’incitation adaptée. Voici comment construire des campagnes de reconquête efficaces.

Déclencheurs de réengagement

Détection d’inactivité

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

Déclencheurs personnalisés

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

Séquence de réengagement

Phase précoce (7 jours)

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

Phase intermédiaire (14 jours)

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

Phase tardive (30 jours)

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

Phase critique (60 jours)

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

Stratégies de personnalisation

Contenu basé sur l’activité

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

Messages spécifiques par segment

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

Optimisation du moment d’envoi

Meilleurs moments d’envoi

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

Plafonnement de la fréquence

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

Mesurer le succès

Indicateurs clés

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

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

Bonnes pratiques

  1. Segmenter de façon agressive - Différents utilisateurs ont besoin de messages différents
  2. Personnaliser le contenu - Référencez leur utilisation réelle
  3. Escalader les incitations - Commencez en douceur, augmentez la valeur au fil du temps
  4. Fixer des limites claires - Ne spammez pas les utilisateurs inactifs indéfiniment
  5. Faciliter le retour - Retour en un clic avec le contexte préservé
  6. Demander des retours - Comprendre pourquoi ils sont partis
  7. Respecter les désinscriptions - Arrêtez immédiatement quand on vous le demande

Le réengagement consiste à rappeler la valeur aux utilisateurs, pas à les importuner. Concentrez-vous sur ce qui leur manque, pas sur ce que vous perdez.

e_

Écrit par l'équipe emailr

Nous construisons l'infrastructure email pour les développeurs

Prêt à commencer à envoyer ?

Obtenez votre clé API et envoyez votre premier email en moins de 5 minutes. Aucune carte de crédit requise.