v1.0 Novembre 2025
7.4.2

Intégration Email

La solution de cashback nouvelle génération

24 novembre 2025
Version 1.0
1

INTRODUCTION

Ce document détaille l'intégration du service d'envoi d'emails dans l'écosystème REWAPP. Les emails constituent un canal de communication essentiel pour :

  • Confirmer les actions utilisateurs (inscription, transactions)
  • Informer sur l'état du compte (points crédités, virements effectués)
  • Alerter sur les événements importants (expiration de points, sécurité)
  • Engager les utilisateurs (newsletters, promotions)

Usage Email par Composante

Composante Usage Email
Application Mobile Confirmation inscription, réinitialisation mot de passe, récapitulatifs
Site Vitrine Formulaire de contact, inscription newsletter
Dashboard Admin Notifications internes, rapports automatiques
Dashboard Partenaire Bienvenue partenaire, rapports statistiques, alertes
2

VUE D'ENSEMBLE DE L'INTÉGRATION

2.1Objectifs

L'intégration email doit répondre aux exigences suivantes :

> 99% Taux de délivrabilité
< 2s Temps d'envoi
100K+ Emails/jour

2.2Fournisseurs Recommandés

RECOMMANDATION

SendGrid est le fournisseur principal. Brevo est l'alternative recommandée.

Comparaison Fournisseurs

Critère SendGrid Brevo
Prix (emails/mois) 40 000 gratuits puis 0,00065$/email 300 gratuits puis 0,00080€/email
API REST v3 v3
Templates dynamiques Oui Oui
Webhooks Complet Complet
Support français Anglais Français
Conformité RGPD Oui Données EU

2.3Architecture Globale

ARCHITECTURE
[Application/API] → [Email Service] → [Queue Bull] → [SendGrid API] → [Destinataire]
                                           ↓
                                    [Webhooks] → [Event Handler] → [Base de données]

Flux d'envoi :

  1. 1
    Appel du service

    L'application appelle le service Email interne

  2. 2
    Validation et mise en queue

    Le service valide les données et crée une tâche dans la queue

  3. 3
    Traitement

    Le worker traite la queue et appelle l'API SendGrid

  4. 4
    Délivrance

    SendGrid délivre l'email

  5. 5
    Tracking

    Les webhooks informent REWAPP du statut de délivrance

3

CONFIGURATION TECHNIQUE

3.1Configuration SendGrid

Prérequis :

  • Compte SendGrid vérifié
  • Domaine REWAPP authentifié (SPF, DKIM, DMARC)
  • API Key générée avec permissions restreintes
BASH
npm install @sendgrid/mail @sendgrid/client
TYPESCRIPT - email.module.ts
import { Module } from '@nestjs/common';
import { BullModule } from '@nestjs/bull';
import { EmailService } from './email.service';
import { EmailProcessor } from './email.processor';

@Module({
  imports: [
    BullModule.registerQueue({
      name: 'email',
      defaultJobOptions: {
        attempts: 3,
        backoff: { type: 'exponential', delay: 5000 },
        removeOnComplete: 100,
        removeOnFail: 1000,
      },
    }),
  ],
  providers: [EmailService, EmailProcessor],
  exports: [EmailService],
})
export class EmailModule {}

3.2Configuration Brevo (Alternative)

BASH
npm install @getbrevo/brevo
TYPESCRIPT
import * as Brevo from '@getbrevo/brevo';

const apiInstance = new Brevo.TransactionalEmailsApi();
apiInstance.setApiKey(
  Brevo.TransactionalEmailsApiApiKeys.apiKey,
  process.env.BREVO_API_KEY
);

3.3Variables d'Environnement

Variables Requises

Variable Description Exemple
SENDGRID_API_KEY Clé API SendGrid SG.xxxxxxxxxxxxx
SENDGRID_FROM_EMAIL Email expéditeur par défaut noreply@rewapp.fr
SENDGRID_FROM_NAME Nom expéditeur REWAPP
SENDGRID_WEBHOOK_SECRET Secret pour validation webhooks whsec_xxxxx
EMAIL_QUEUE_REDIS_URL URL Redis pour la queue redis://localhost:6379
EMAIL_RATE_LIMIT Limite d'envoi par seconde 100
4

TYPES D'EMAILS

4.1Emails Transactionnels

Les emails transactionnels sont déclenchés par une action utilisateur. Priorité maximale.

Emails Transactionnels

Email Déclencheur Template ID Priorité
Bienvenue Inscription confirmée d-welcome-user Haute
Confirmation email Inscription d-verify-email Critique
Réinitialisation MDP Demande utilisateur d-reset-password Critique
Transaction détectée Nouvelle transaction d-transaction-detected Haute
Points crédités Crédit de points d-points-credited Haute
Virement demandé Demande de cashback bancaire d-withdrawal-requested Haute
Virement effectué Virement complété d-withdrawal-completed Haute
QR code utilisé Scan QR validé d-qrcode-used Moyenne

4.2Emails Marketing

Les emails marketing sont envoyés selon un calendrier ou segmentation. Consentement requis.

Emails Marketing

Email Fréquence Template ID Cible
Newsletter Hebdomadaire d-newsletter Opt-in newsletter
Promotions partenaires Sur événement d-promo-partner Opt-in promo
Offres personnalisées Mensuel d-personal-offers Utilisateurs actifs
Réengagement J+30 inactivité d-reengagement Utilisateurs inactifs

4.3Emails de Notification

Les emails de notification informent sur des événements système ou compte.

Emails de Notification

Email Déclencheur Template ID Priorité
Expiration points J-30 Batch quotidien 8h d-points-expiring-30 Moyenne
Expiration points J-7 Batch quotidien 8h d-points-expiring-7 Haute
Nouvelle connexion Connexion nouveau device d-new-login-alert Haute
Modification compte Changement email/MDP d-account-changed Haute
Récapitulatif mensuel 1er du mois d-monthly-summary Basse
5

TEMPLATES ET PERSONNALISATION

5.1Structure des Templates

Tous les templates REWAPP suivent une structure cohérente :

HTML - Template Structure
<!-- Header -->
<div style="background-color: #6366F1; padding: 20px; text-align: center;">
  <img src="{{logo_url}}" alt="REWAPP" height="40" />
</div>

<!-- Content -->
<div style="padding: 30px; font-family: 'Segoe UI', Arial, sans-serif;">
  <h1 style="color: #1F2937; font-size: 24px;">{{subject}}</h1>
  <p style="color: #4B5563; font-size: 16px; line-height: 1.6;">
    {{content}}
  </p>
  {{#if cta_url}}
  <a href="{{cta_url}}" style="display: inline-block; background-color: #6366F1; 
     color: white; padding: 12px 24px; border-radius: 8px; text-decoration: none;">
    {{cta_text}}
  </a>
  {{/if}}
</div>

<!-- Footer -->
<div style="background-color: #F3F4F6; padding: 20px; text-align: center; font-size: 12px;">
  <p>© 2025 REWAPP - La solution de cashback nouvelle génération</p>
  <p>
    <a href="{{unsubscribe_url}}">Se désinscrire</a> | 
    <a href="{{preferences_url}}">Préférences</a>
  </p>
</div>

5.2Variables Dynamiques

Variables communes à tous les templates :

Variables Communes

Variable Type Description
{{user_firstname}} string Prénom de l'utilisateur
{{user_lastname}} string Nom de l'utilisateur
{{user_email}} string Email de l'utilisateur
{{logo_url}} string URL du logo REWAPP
{{support_email}} string Email support (support@rewapp.fr)
{{unsubscribe_url}} string Lien de désinscription
{{preferences_url}} string Lien préférences email
{{current_year}} number Année en cours

Variables spécifiques par template

Template Points Crédités (d-points-credited) :

  • {{points_amount}} : Nombre de points crédités
  • {{points_value}} : Valeur en euros (points × 0,10€)
  • {{partner_name}} : Nom du commerçant partenaire
  • {{transaction_date}} : Date de la transaction
  • {{total_balance}} : Solde total de points

Template Virement Effectué (d-withdrawal-completed) :

  • {{withdrawal_amount}} : Montant en euros
  • {{points_debited}} : Points débités
  • {{iban_last4}} : 4 derniers chiffres IBAN
  • {{transfer_date}} : Date du virement

5.3Templates REWAPP

Template Bienvenue (d-welcome-user)

Objet

Bienvenue sur REWAPP, {{user_firstname}} ! 🎉

CORPS DU MESSAGE
Bonjour {{user_firstname}},

Bienvenue dans la communauté REWAPP ! Vous avez fait le bon choix 
en rejoignant la solution de cashback nouvelle génération.

Voici comment démarrer :
1. Liez votre carte bancaire (une seule fois)
2. Faites vos achats chez nos partenaires
3. Recevez automatiquement vos points
4. Convertissez-les en cashback bancaire ou dépensez-les en magasin

⚡ Rappel : 1 point = 0,10€

À très vite !
L'équipe REWAPP

Template Expiration Points J-7 (d-points-expiring-7)

Objet

⚠️ {{points_expiring}} points expirent dans 7 jours !

CORPS DU MESSAGE
Bonjour {{user_firstname}},

Attention ! {{points_expiring}} points (soit {{points_value}}€) 
vont expirer le {{expiration_date}}.

Ne laissez pas vos récompenses disparaître :
• Demandez un virement bancaire (minimum 100 points)
• Utilisez-les chez un partenaire via QR code

[Bouton : Utiliser mes points]
6

SPÉCIFICATIONS API

6.1Service Email Backend

Interface du service email (email.service.ts) :

TYPESCRIPT - email.service.ts
import { Injectable } from '@nestjs/common';
import { InjectQueue } from '@nestjs/bull';
import { Queue } from 'bull';
import * as sgMail from '@sendgrid/mail';

@Injectable()
export class EmailService {
  constructor(
    @InjectQueue('email') private emailQueue: Queue,
  ) {
    sgMail.setApiKey(process.env.SENDGRID_API_KEY);
  }

  async sendTransactional(
    to: string,
    templateId: string,
    dynamicData: Record<string, any>,
    options?: EmailOptions
  ): Promise<void> {
    await this.emailQueue.add('send', {
      type: 'transactional',
      to,
      templateId,
      dynamicData,
      ...options,
    }, {
      priority: options?.priority || 2,
    });
  }

  async sendBulk(
    recipients: BulkRecipient[],
    templateId: string,
    options?: EmailOptions
  ): Promise<void> {
    await this.emailQueue.add('send-bulk', {
      type: 'bulk',
      recipients,
      templateId,
      ...options,
    }, {
      priority: 3,
    });
  }
}

6.2Endpoints Internes

ATTENTION

Ces endpoints sont internes et non exposés publiquement.

POST /internal/email/send

Envoi d'un email transactionnel via la queue.

Request Body
JSON
{
  "to": "user@example.com",
  "templateId": "d-welcome-user",
  "dynamicData": {
    "user_firstname": "Marie",
    "user_lastname": "Dupont"
  },
  "options": {
    "priority": 1,
    "scheduledAt": null
  }
}
Response 202 Accepted
JSON
{
  "success": true,
  "jobId": "email-12345",
  "message": "Email queued successfully"
}

Endpoints Disponibles

Méthode Endpoint Description
POST /internal/email/send Envoi email transactionnel
POST /internal/email/send-bulk Envoi email en masse
POST /internal/email/webhook Réception webhooks SendGrid
GET /internal/email/stats Statistiques d'envoi

6.3Modèle de Données

Table email_logs (PostgreSQL) :

SQL
CREATE TABLE email_logs (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id UUID REFERENCES users(id),
  recipient_email VARCHAR(255) NOT NULL,
  template_id VARCHAR(100) NOT NULL,
  subject VARCHAR(500),
  status VARCHAR(50) NOT NULL DEFAULT 'queued',
  sendgrid_message_id VARCHAR(255),
  sent_at TIMESTAMP,
  delivered_at TIMESTAMP,
  opened_at TIMESTAMP,
  clicked_at TIMESTAMP,
  bounced_at TIMESTAMP,
  error_message TEXT,
  metadata JSONB,
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_email_logs_user ON email_logs(user_id);
CREATE INDEX idx_email_logs_status ON email_logs(status);
CREATE INDEX idx_email_logs_template ON email_logs(template_id);

Statuts Possibles

Statut Description
queued En attente dans la queue
sending En cours d'envoi
sent Envoyé à SendGrid
delivered Délivré au destinataire
opened Ouvert par le destinataire
clicked Lien cliqué
bounced Rebond (email invalide)
dropped Supprimé (spam, blocklist)
failed Échec d'envoi
7

INTÉGRATION SENDGRID API

7.1Envoi d'Email Simple

TYPESCRIPT
import * as sgMail from '@sendgrid/mail';

async function sendSimpleEmail(
  to: string,
  subject: string,
  htmlContent: string
): Promise<void> {
  const msg = {
    to,
    from: {
      email: 'noreply@rewapp.fr',
      name: 'REWAPP',
    },
    subject,
    html: htmlContent,
    trackingSettings: {
      clickTracking: { enable: true },
      openTracking: { enable: true },
    },
  };

  try {
    const [response] = await sgMail.send(msg);
    console.log('Email sent, status:', response.statusCode);
  } catch (error) {
    console.error('SendGrid error:', error.response?.body);
    throw error;
  }
}

7.2Envoi avec Template

TYPESCRIPT
async function sendTemplatedEmail(
  to: string,
  templateId: string,
  dynamicData: Record<string, any>
): Promise<string> {
  const msg = {
    to,
    from: {
      email: 'noreply@rewapp.fr',
      name: 'REWAPP',
    },
    templateId,
    dynamicTemplateData: {
      ...dynamicData,
      logo_url: 'https://cdn.rewapp.fr/logo.png',
      support_email: 'support@rewapp.fr',
      unsubscribe_url: 'https://rewapp.fr/unsubscribe?email=' + encodeURIComponent(to),
      current_year: new Date().getFullYear(),
    },
  };

  const [response] = await sgMail.send(msg);
  
  // Récupérer le Message-ID pour le tracking
  const messageId = response.headers['x-message-id'];
  return messageId;
}

7.3Envoi en Masse

Pour les envois en masse (newsletter, promotions), utiliser la personnalisation multiple :

TYPESCRIPT
async function sendBulkEmail(
  recipients: Array<{ email: string; data: Record<string, any> }>,
  templateId: string
): Promise<void> {
  const personalizations = recipients.map(r => ({
    to: [{ email: r.email }],
    dynamicTemplateData: {
      ...r.data,
      unsubscribe_url: 'https://rewapp.fr/unsubscribe?email=' + encodeURIComponent(r.email),
    },
  }));

  // SendGrid limite à 1000 destinataires par appel
  const chunks = chunkArray(personalizations, 1000);

  for (const chunk of chunks) {
    const msg = {
      from: { email: 'newsletter@rewapp.fr', name: 'REWAPP' },
      templateId,
      personalizations: chunk,
    };

    await sgMail.send(msg);
    
    // Rate limiting : 100 requêtes/seconde max
    await sleep(100);
  }
}
LIMITE SENDGRID

Maximum 1000 destinataires par appel API. Chunker les listes plus volumineuses.

8

WEBHOOKS ET ÉVÉNEMENTS

8.1Configuration des Webhooks

URL du webhook REWAPP : https://api.rewapp.fr/webhooks/sendgrid

  1. 1
    Mail Settings → Event Webhook
  2. 2
    HTTP POST URL

    https://api.rewapp.fr/webhooks/sendgrid

  3. 3
    Actions

    Sélectionner tous les événements

  4. 4
    Security

    Activer "Signed Event Webhook" et sauvegarder la clé de vérification

8.2Événements Supportés

Événements Webhook

Événement Description Action REWAPP
processed Email accepté par SendGrid Mettre à jour statut → 'sent'
delivered Email délivré Mettre à jour statut → 'delivered'
open Email ouvert Enregistrer opened_at
click Lien cliqué Enregistrer clicked_at + URL
bounce Rebond (hard/soft) Marquer email invalide, alerter
dropped Email supprimé Logger la raison
spam_report Signalé comme spam Désinscrire utilisateur, alerter
unsubscribe Désinscription via lien Mettre à jour préférences

8.3Traitement des Événements

TYPESCRIPT - webhook.controller.ts
@Controller('webhooks')
export class SendGridWebhookController {
  @Post('sendgrid')
  @HttpCode(200)
  async handleWebhook(
    @Body() events: SendGridEvent[],
    @Headers('x-twilio-email-event-webhook-signature') signature: string,
    @Headers('x-twilio-email-event-webhook-timestamp') timestamp: string,
  ) {
    // Vérifier la signature
    if (!this.verifySignature(events, signature, timestamp)) {
      throw new UnauthorizedException('Invalid webhook signature');
    }

    for (const event of events) {
      await this.processEvent(event);
    }

    return { received: true };
  }

  private async processEvent(event: SendGridEvent) {
    const { email, event: eventType, sg_message_id, timestamp } = event;

    switch (eventType) {
      case 'delivered':
        await this.emailLogService.updateStatus(sg_message_id, 'delivered', {
          delivered_at: new Date(timestamp * 1000),
        });
        break;

      case 'bounce':
        await this.emailLogService.updateStatus(sg_message_id, 'bounced', {
          bounced_at: new Date(timestamp * 1000),
          error_message: event.reason,
        });
        await this.userService.markEmailInvalid(email, event.reason);
        break;

      case 'spam_report':
        await this.userService.unsubscribeFromAll(email);
        await this.alertService.notify('SPAM_REPORT', { email });
        break;
    }
  }
}
9

GESTION DES ERREURS

9.1Codes d'Erreur

Codes d'erreur SendGrid API

Codes HTTP SendGrid

Code HTTP Signification Action
200-202 Succès Aucune
400 Requête invalide Logger et corriger les données
401 API Key invalide Vérifier configuration
403 Accès refusé Vérifier permissions API Key
429 Rate limit atteint Implémenter backoff exponentiel
500-503 Erreur serveur SendGrid Retry automatique

Codes d'erreur internes REWAPP

Codes Internes

Code Message Description
EMAIL_001 INVALID_RECIPIENT Adresse email invalide
EMAIL_002 TEMPLATE_NOT_FOUND Template ID inexistant
EMAIL_003 MISSING_REQUIRED_DATA Variables obligatoires manquantes
EMAIL_004 USER_UNSUBSCRIBED Utilisateur désinscrit
EMAIL_005 RATE_LIMIT_EXCEEDED Limite d'envoi dépassée
EMAIL_006 QUEUE_FULL Queue de traitement saturée

9.2Stratégie de Retry

TYPESCRIPT - Configuration Bull Queue
const retryConfig = {
  attempts: 5,
  backoff: {
    type: 'exponential',
    delay: 5000, // 5s, 10s, 20s, 40s, 80s
  },
};

async processEmailJob(job: Job<EmailJobData>) {
  try {
    await this.sendEmail(job.data);
  } catch (error) {
    if (this.isRetryableError(error)) {
      throw error; // Bull va automatiquement réessayer
    }
    
    // Erreur non récupérable → logger et abandonner
    await this.logFailedEmail(job.data, error);
    return; // Ne pas throw → job marqué comme complété
  }
}

private isRetryableError(error: any): boolean {
  const retryableCodes = [429, 500, 502, 503, 504];
  return retryableCodes.includes(error.code);
}

9.3File d'Attente (Queue)

Priorités de Queue

Priorité Type Délai Max Exemples
1 (Critique) Authentification 30 secondes Reset password, vérification email
2 (Haute) Transactionnel 2 minutes Transaction, points crédités
3 (Normale) Notification 5 minutes Alertes, rappels
4 (Basse) Marketing 30 minutes Newsletter, promotions
TYPESCRIPT - Workers par priorité
// Création des queues par priorité
const criticalQueue = new Bull('email-critical', { redis: redisConfig });
const transactionalQueue = new Bull('email-transactional', { redis: redisConfig });
const marketingQueue = new Bull('email-marketing', { redis: redisConfig });

// Workers avec concurrence adaptée
criticalQueue.process(10, processor); // 10 jobs simultanés
transactionalQueue.process(5, processor); // 5 jobs simultanés
marketingQueue.process(2, processor); // 2 jobs simultanés
10

CONFORMITÉ ET BONNES PRATIQUES

10.1Conformité RGPD

EXIGENCES RGPD

Toutes les exigences RGPD sont implémentées dans REWAPP.

Conformité RGPD

Exigence Implémentation REWAPP
Consentement explicite Opt-in lors de l'inscription (case non pré-cochée)
Droit d'accès Export des emails envoyés via API profil
Droit de rectification Modification email dans paramètres
Droit à l'oubli Suppression compte = suppression logs email (30 jours)
Droit d'opposition Lien désinscription dans chaque email
Portabilité Export JSON des préférences email
Minimisation Seules les données nécessaires dans les templates

Préférences email utilisateur

Catégories de Préférences

Catégorie Par défaut Modifiable
Emails transactionnels ✓ Obligatoire Non
Emails de sécurité ✓ Obligatoire Non
Notifications de compte ✓ Activé Oui
Newsletter REWAPP ○ Désactivé Oui
Promotions partenaires ○ Désactivé Oui
Offres personnalisées ○ Désactivé Oui

10.2Conformité CAN-SPAM

Règles CAN-SPAM respectées :

  • Header "From" clairement identifié : REWAPP <noreply@rewapp.fr>
  • Objet non trompeur
  • Identification comme publicité (si applicable)
  • Adresse physique dans le footer
  • Lien de désinscription fonctionnel (1 clic, traité sous 10 jours)
  • Pas d'adresses récoltées (harvesting)

10.3Délivrabilité

Configuration DNS obligatoire :

  • SPF : v=spf1 include:sendgrid.net ~all
  • DKIM : Clé 2048 bits fournie par SendGrid
  • DMARC : v=DMARC1; p=quarantine; rua=mailto:dmarc@rewapp.fr

Hygiène de liste :

  • Suppression automatique des hard bounces
  • Suppression après 3 soft bounces consécutifs
  • Désactivation automatique des plaintes spam
  • Nettoyage des inactifs > 12 mois (marketing uniquement)

Réputation expéditeur :

  • IP dédiée pour volume > 100k emails/mois
  • Warm-up progressif des nouvelles IP
  • Monitoring du sender score (> 80 requis)
11

MONITORING ET ANALYTICS

11.1Métriques Clés

KPIs Email

Métrique Description Seuil Alerte
Delivery Rate % emails délivrés < 95%
Open Rate % emails ouverts < 20%
Click Rate % liens cliqués < 2%
Bounce Rate % rebonds > 5%
Spam Rate % plaintes spam > 0.1%
Unsubscribe Rate % désinscriptions > 0.5%
Queue Lag Temps d'attente en queue > 5 min
SQL - Métriques par template
SELECT 
  template_id,
  COUNT(*) as total_sent,
  COUNT(*) FILTER (WHERE status = 'delivered') as delivered,
  COUNT(*) FILTER (WHERE opened_at IS NOT NULL) as opened,
  COUNT(*) FILTER (WHERE clicked_at IS NOT NULL) as clicked,
  COUNT(*) FILTER (WHERE status = 'bounced') as bounced
FROM email_logs
WHERE created_at > NOW() - INTERVAL '7 days'
GROUP BY template_id;

11.2Alertes

Configuration Alertes CloudWatch

Alerte Condition Canal Priorité
Email Queue Full Queue size > 10000 Slack + SMS P1
High Bounce Rate Bounce > 5% (1h) Slack P2
Spam Reports Spam > 0.1% (24h) Email P2
SendGrid API Error 5xx errors > 10 (5min) PagerDuty P1
Delivery Delay 95p latency > 60s Slack P3

11.3Reporting

Rapport hebdomadaire automatique (envoyé aux admins) :

  • Volume total d'emails envoyés
  • Répartition par type (transactionnel / marketing)
  • Taux de délivrabilité global
  • Top 5 templates par volume
  • Évolution des métriques vs semaine précédente
  • Anomalies détectées
12

CONCLUSION

L'intégration email REWAPP via SendGrid assure une communication fiable et conforme avec les utilisateurs et partenaires. Les points clés de cette architecture :

  • Fiabilité : Queue asynchrone avec retry automatique
  • Performance : Envoi < 2 secondes, capacité 100k+ emails/jour
  • Traçabilité : Logs complets et webhooks temps réel
  • Conformité : RGPD, CAN-SPAM, désinscription 1-clic
  • Monitoring : Alertes proactives et reporting automatisé
PROCHAINES ÉVOLUTIONS
  • Intégration A/B testing natif
  • Personnalisation IA des heures d'envoi
  • Templates multilingues (expansion internationale)

Annexe A : Liste Complète des Templates

Tous les Templates

Template ID Nom Catégorie
d-welcome-userBienvenue utilisateurTransactionnel
d-verify-emailVérification emailTransactionnel
d-reset-passwordRéinitialisation mot de passeTransactionnel
d-transaction-detectedTransaction détectéeTransactionnel
d-points-creditedPoints créditésTransactionnel
d-withdrawal-requestedDemande virementTransactionnel
d-withdrawal-completedVirement effectuéTransactionnel
d-qrcode-usedQR code utiliséTransactionnel
d-points-expiring-30Expiration J-30Notification
d-points-expiring-7Expiration J-7Notification
d-new-login-alertNouvelle connexionNotification
d-account-changedModification compteNotification
d-monthly-summaryRécapitulatif mensuelNotification
d-welcome-partnerBienvenue partenaireTransactionnel
d-partner-statsStats partenaireNotification
d-newsletterNewsletterMarketing
d-promo-partnerPromotion partenaireMarketing
d-personal-offersOffres personnaliséesMarketing
d-reengagementRéengagementMarketing

Annexe B : Checklist de Mise en Production

  • Compte SendGrid vérifié et API Key générée
  • Domaine authentifié (SPF, DKIM, DMARC)
  • Templates créés et testés dans SendGrid
  • Webhook configuré et secret stocké
  • Queue Redis configurée et testée
  • Variables d'environnement définies
  • Alertes CloudWatch configurées
  • Tests de charge effectués (1000 emails/min)
  • Procédure de fallback documentée (Brevo)