Intégration Email
La solution de cashback nouvelle génération
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 |
VUE D'ENSEMBLE DE L'INTÉGRATION
2.1Objectifs
L'intégration email doit répondre aux exigences suivantes :
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
[Application/API] → [Email Service] → [Queue Bull] → [SendGrid API] → [Destinataire]
↓
[Webhooks] → [Event Handler] → [Base de données]
Flux d'envoi :
-
1
Appel du service
L'application appelle le service Email interne
-
2
Validation et mise en queue
Le service valide les données et crée une tâche dans la queue
-
3
Traitement
Le worker traite la queue et appelle l'API SendGrid
-
4
Délivrance
SendGrid délivre l'email
-
5
Tracking
Les webhooks informent REWAPP du statut de délivrance
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
npm install @sendgrid/mail @sendgrid/client
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)
npm install @getbrevo/brevo
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 |
TYPES D'EMAILS
4.1Emails Transactionnels
Les emails transactionnels sont déclenchés par une action utilisateur. Priorité maximale.
Emails Transactionnels
| 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
| 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
| 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 |
TEMPLATES ET PERSONNALISATION
5.1Structure des Templates
Tous les templates REWAPP suivent une structure cohérente :
<!-- 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}} ! 🎉
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 !
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]
SPÉCIFICATIONS API
6.1Service Email Backend
Interface du service email (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.
/internal/email/send
Envoi d'un email transactionnel via la queue.
Request Body
{
"to": "user@example.com",
"templateId": "d-welcome-user",
"dynamicData": {
"user_firstname": "Marie",
"user_lastname": "Dupont"
},
"options": {
"priority": 1,
"scheduledAt": null
}
}
Response 202 Accepted
{
"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) :
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 |
INTÉGRATION SENDGRID API
7.1Envoi d'Email Simple
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
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 :
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.
WEBHOOKS ET ÉVÉNEMENTS
8.1Configuration des Webhooks
URL du webhook REWAPP : https://api.rewapp.fr/webhooks/sendgrid
-
1
Mail Settings → Event Webhook
-
2
HTTP POST URL
https://api.rewapp.fr/webhooks/sendgrid
-
3
Actions
Sélectionner tous les événements
-
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
@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;
}
}
}
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
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 |
// 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
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)
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 |
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) | 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
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-user | Bienvenue utilisateur | Transactionnel |
d-verify-email | Vérification email | Transactionnel |
d-reset-password | Réinitialisation mot de passe | Transactionnel |
d-transaction-detected | Transaction détectée | Transactionnel |
d-points-credited | Points crédités | Transactionnel |
d-withdrawal-requested | Demande virement | Transactionnel |
d-withdrawal-completed | Virement effectué | Transactionnel |
d-qrcode-used | QR code utilisé | Transactionnel |
d-points-expiring-30 | Expiration J-30 | Notification |
d-points-expiring-7 | Expiration J-7 | Notification |
d-new-login-alert | Nouvelle connexion | Notification |
d-account-changed | Modification compte | Notification |
d-monthly-summary | Récapitulatif mensuel | Notification |
d-welcome-partner | Bienvenue partenaire | Transactionnel |
d-partner-stats | Stats partenaire | Notification |
d-newsletter | Newsletter | Marketing |
d-promo-partner | Promotion partenaire | Marketing |
d-personal-offers | Offres personnalisées | Marketing |
d-reengagement | Réengagement | Marketing |
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)