Event-Typen-Referenz
Diese umfassende Referenz behandelt alle in Brevo verfügbaren Webhook-Event-Typen mit spezifischen Beispielen für die Integration der Tajo-Treueplattform.
E-Mail-Events
delivered
Wird ausgelöst, wenn eine E-Mail erfolgreich im Postfach des Empfängers zugestellt wurde.
Payload-Beispiel:
{ "event": "delivered", "id": 123456, "date": "2024-01-25 14:30:00", "ts": 1640995200, "template_id": 101, "tags": ["loyalty", "points-earned"], "sending_ip": "185.107.232.1", "event_id": "evt_abc123"}Tajo-Integrations-Anwendungsfälle:
- Zustellungserfolgsrate in Kundenprofilen aktualisieren
- Folgeaktionen für Treuekampagnen auslösen
- E-Mail-Zustellungsleistung nach Stufe verfolgen
async function handleEmailDelivered(event) { const customer = await loyaltyService.getCustomer(event.email);
// Zustellungsstatistiken aktualisieren await loyaltyService.updateEngagement(event.email, { emailsDelivered: customer.emailsDelivered + 1, lastEmailDelivered: new Date(event.date), deliveryRate: calculateDeliveryRate(customer) });
// Treuekampagnen-Zustellung verfolgen if (event.tags.includes('loyalty')) { await loyaltyService.trackCampaignMetric('loyalty_email_delivered', { email: event.email, template_id: event.template_id, tier: customer.loyaltyTier }); }}opened
Wird ausgelöst, wenn ein Empfänger eine E-Mail öffnet (verfolgt das Laden des Tracking-Pixels).
Payload-Beispiel:
{ "event": "opened", "date": "2024-01-25 15:45:00", "ts": 1641000300, "template_id": 101, "tags": ["loyalty", "tier-upgrade"], "user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)", "geo": { "country": "US", "region": "CA", "city": "San Francisco" }}Tajo-Integrations-Anwendungsfälle:
- Kunden-Engagement-Score steigern
- Effektivität von Treuekampagnen verfolgen
- Verhaltensbasierte Belohnungen auslösen
- Zukünftige Kommunikation personalisieren
async function handleEmailOpened(event) { const customer = await loyaltyService.getCustomer(event.email);
// Bedeutendes Engagement - Score steigern await loyaltyService.updateEngagement(event.email, { emailsOpened: customer.emailsOpened + 1, lastEmailOpened: new Date(event.date), engagementScore: customer.engagementScore + 5, preferredDevice: getDeviceType(event['user-agent']) });
// Engagement für Treuemitglieder belohnen if (event.tags.includes('loyalty') && customer.loyaltyTier) { await loyaltyService.awardEngagementBonus(event.email, { type: 'email_engagement', points: getEngagementPoints(customer.loyaltyTier), reason: 'Email opened' }); }
// Zeitliche Muster zur Optimierung aufzeichnen await loyaltyService.recordEngagementTime(event.email, { campaign: event.template_id, openTime: new Date(event.date), timezone: getTimezone(event.geo) });}clicked
Wird ausgelöst, wenn ein Empfänger auf einen Link in einer E-Mail klickt.
Payload-Beispiel:
{ "event": "clicked", "date": "2024-01-25 16:20:00", "ts": 1641002400, "template_id": 101, "tags": ["loyalty", "rewards-reminder"], "link": "https://yourdomain.com/rewards?utm_source=brevo&utm_campaign=loyalty", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}Tajo-Integrations-Anwendungsfälle:
- Conversion-Funnel-Performance verfolgen
- Klick-Boni vergeben
- Hochwertige Inhalte identifizieren
- E-Mail-zu-Website-Fluss optimieren
async function handleEmailClicked(event) { const customer = await loyaltyService.getCustomer(event.email); const clickedUrl = new URL(event.link);
// Hochwertiges Engagement await loyaltyService.updateEngagement(event.email, { emailsClicked: customer.emailsClicked + 1, lastEmailClicked: new Date(event.date), engagementScore: customer.engagementScore + 15, clickThroughRate: calculateCTR(customer) });
// Bestimmte Link-Typen verfolgen if (clickedUrl.pathname.includes('/rewards')) { await loyaltyService.trackEvent(event.email, 'Rewards Page Clicked', { source: 'email', campaign: event.template_id, utm_campaign: clickedUrl.searchParams.get('utm_campaign') });
// Erkundungsbonus vergeben await loyaltyService.awardEngagementBonus(event.email, { type: 'rewards_exploration', points: 10, reason: 'Clicked rewards link' }); }
// Produktinteresse verfolgen if (clickedUrl.pathname.includes('/products')) { const productId = extractProductId(clickedUrl); await loyaltyService.trackProductInterest(event.email, productId, { source: 'email_click', timestamp: new Date(event.date) }); }}bounced / hard_bounced
Wird ausgelöst, wenn eine E-Mail zurückgewiesen wird (vorübergehender Fehler) oder hart zurückgewiesen wird (dauerhafter Fehler).
Payload-Beispiel:
{ "event": "hard_bounced", "date": "2024-01-25 14:35:00", "ts": 1640995500, "template_id": 101, "tags": ["loyalty"], "reason": "550 5.1.1 User unknown", "bounce_type": "hard"}Tajo-Integrations-Anwendungsfälle:
- E-Mail-Gültigkeitsstatus aktualisieren
- Zu alternativen Kommunikationskanälen wechseln
- Kundendatenbank bereinigen
- Weiteres Senden an ungültige Adressen verhindern
async function handleEmailBounced(event) { const isHardBounce = event.event === 'hard_bounced' || event.bounce_type === 'hard';
if (isHardBounce) { // Dauerhafter Fehler - E-Mail als ungültig markieren await loyaltyService.updateCustomerStatus(event.email, { emailStatus: 'invalid', emailBounced: true, bounceReason: event.reason, lastBounce: new Date(event.date), communicationPreference: 'sms' // Zu SMS wechseln, falls verfügbar });
// Aus E-Mail-Marketing-Listen entfernen await loyaltyService.removeFromEmailMarketing(event.email);
// Telefonverifizierung vorschlagen const customer = await loyaltyService.getCustomer(event.email); if (customer?.phone) { await loyaltyService.suggestPhoneVerification(customer.phone); }
} else { // Soft Bounce - vorübergehendes Problem await loyaltyService.updateEngagement(event.email, { softBounceCount: customer.softBounceCount + 1, lastSoftBounce: new Date(event.date) });
// Wiederholungslogik für Soft Bounces if (customer.softBounceCount < 5) { await loyaltyService.scheduleEmailRetry(event.email, event.template_id); } }}spam
Wird ausgelöst, wenn ein Empfänger eine E-Mail als Spam markiert.
Payload-Beispiel:
{ "event": "spam", "date": "2024-01-25 17:10:00", "ts": 1641005400, "template_id": 101, "tags": ["loyalty", "promotional"]}Tajo-Integrations-Anwendungsfälle:
- E-Mail-Kommunikation sofort stoppen
- E-Mail-Inhalte überprüfen und verbessern
- Spam-Muster nach Segment analysieren
- Strengere Opt-in-Prozesse implementieren
async function handleEmailSpam(event) { // E-Mail-Marketing sofort deaktivieren await loyaltyService.updateCustomerPreferences(event.email, { emailMarketing: false, marketingEnabled: false, spamReported: true, spamReportDate: new Date(event.date) });
// Marketing-Team zur Überprüfung benachrichtigen await loyaltyService.alertMarketing('spam_complaint', { email: event.email, template: event.template_id, campaign_tags: event.tags, severity: 'high' });
// Spam-Muster analysieren await loyaltyService.analyzeSpamPattern({ template_id: event.template_id, tags: event.tags, customer_segment: await loyaltyService.getCustomerSegment(event.email) });
// Konto-Überprüfung in Betracht ziehen, wenn mehrere Spam-Meldungen const customer = await loyaltyService.getCustomer(event.email); if (customer.spamReports > 2) { await loyaltyService.flagForReview(event.email, 'multiple_spam_reports'); }}SMS-Events
sms_delivered
Wird ausgelöst, wenn eine SMS erfolgreich auf dem Telefon des Empfängers zugestellt wurde.
Payload-Beispiel:
{ "event": "sms_delivered", "phone": "+1234567890", "date": "2024-01-25 14:45:00", "ts": 1640996700, "message-id": "sms_abc123", "tags": ["loyalty", "points-alert"], "sender": "TAJO", "content": "🎉 Great news! You earned 150 points from your recent purchase. Total: 1,250 points."}Tajo-Integrations-Anwendungsfälle:
- Erfolgreiche SMS-Zustellung bestätigen
- SMS-Engagement-Raten verfolgen
- Telefonnummerngenauigkeit validieren
- Carrier-Zustellungsleistung überwachen
async function handleSMSDelivered(event) { const customer = await loyaltyService.getCustomerByPhone(event.phone);
await loyaltyService.updateEngagement(customer.email, { smsDelivered: customer.smsDelivered + 1, lastSMSDelivered: new Date(event.date), smsDeliveryRate: calculateSMSDeliveryRate(customer), phoneStatus: 'valid' });
// Treue-SMS-Performance verfolgen if (event.tags.includes('loyalty')) { await loyaltyService.trackCampaignMetric('loyalty_sms_delivered', { phone: event.phone, content_type: getSMSContentType(event.content), customer_tier: customer.loyaltyTier }); }}sms_failed
Wird ausgelöst, wenn die SMS-Zustellung fehlschlägt.
Payload-Beispiel:
{ "event": "sms_failed", "phone": "+1234567890", "date": "2024-01-25 14:32:00", "ts": 1640996320, "message-id": "sms_def456", "tags": ["loyalty", "urgent"], "sender": "TAJO", "reason": "Invalid phone number format", "error_code": "30006"}Tajo-Integrations-Anwendungsfälle:
- Telefonnummernvalidität aktualisieren
- Zu E-Mail-Benachrichtigungen wechseln
- Telefonnummern-Datenbank bereinigen
- Kundendienst für manuelle Verifizierung benachrichtigen
async function handleSMSFailed(event) { const customer = await loyaltyService.getCustomerByPhone(event.phone);
await loyaltyService.updateCustomerStatus(customer.email, { phoneStatus: 'invalid', smsEnabled: false, smsFailureReason: event.reason, lastSMSFailure: new Date(event.date), communicationPreference: 'email' });
// Für dringende Treuebenachrichtigungen auf E-Mail zurückfallen if (event.tags.includes('urgent') || event.tags.includes('loyalty')) { await loyaltyService.sendEmailFallback(customer.email, { originalSMS: event.content, reason: 'SMS delivery failed' }); }
// Für Telefonnummernverifizierung markieren await loyaltyService.flagForPhoneVerification(customer.email);}sms_reply
Wird ausgelöst, wenn ein Empfänger auf eine SMS antwortet.
Payload-Beispiel:
{ "event": "sms_reply", "phone": "+1234567890", "date": "2024-01-25 15:20:00", "ts": 1641000000, "message-id": "sms_reply_123", "text": "BALANCE", "original_message_id": "sms_abc123"}Tajo-Integrations-Anwendungsfälle:
- Treueprogramm-Befehle verarbeiten
- Kundendienst-Anfragen bearbeiten
- Kommunikationspräferenzen aktualisieren
- Automatisierte Antworten auslösen
async function handleSMSReply(event) { const customer = await loyaltyService.getCustomerByPhone(event.phone); const replyText = event.text.toUpperCase().trim();
// Hohes Engagement - Kunde beteiligt sich aktiv await loyaltyService.updateEngagement(customer.email, { smsReplies: customer.smsReplies + 1, lastSMSReply: new Date(event.date), engagementScore: customer.engagementScore + 10 });
// Treuebefehle verarbeiten switch (replyText) { case 'BALANCE': await loyaltyService.sendPointsBalance(event.phone); break;
case 'REWARDS': await loyaltyService.sendAvailableRewards(event.phone, customer.loyaltyTier); break;
case 'TIER': await loyaltyService.sendTierInfo(event.phone, customer); break;
case 'HELP': await loyaltyService.sendSMSHelp(event.phone); break;
case 'STOP': case 'UNSUBSCRIBE': await loyaltyService.unsubscribeFromSMS(event.phone); break;
default: // An Kundendienst weiterleiten await loyaltyService.forwardToSupport(customer.email, { channel: 'sms', message: event.text, timestamp: new Date(event.date) }); }}Kontakt-Events
contact_created
Wird ausgelöst, wenn ein neuer Kontakt zu Brevo hinzugefügt wird.
Payload-Beispiel:
{ "event": "contact_created", "date": "2024-01-25 13:15:00", "ts": 1640992500, "attributes": { "FIRSTNAME": "John", "LASTNAME": "Doe", "LOYALTY_ID": "LYL-2024-001", "LOYALTY_TIER": "Bronze", "LOYALTY_POINTS": 0 }, "lists": [1, 5]}Tajo-Integrations-Anwendungsfälle:
- Willkommenskampagnen auslösen
- Treueprogramm-Einschreibung einrichten
- Customer Journey initialisieren
- Anmeldeboni vergeben
async function handleContactCreated(event) { const isLoyaltyMember = event.attributes?.LOYALTY_ID;
if (isLoyaltyMember) { // Neues Treuemitglied - Willkommensflow auslösen await loyaltyService.triggerWelcomeFlow(event.email, { loyaltyId: event.attributes.LOYALTY_ID, tier: event.attributes.LOYALTY_TIER || 'Bronze', signupBonus: 500 });
// Anmeldebonus vergeben await loyaltyService.awardPoints(event.email, { amount: 500, reason: 'Welcome bonus', type: 'signup_bonus' });
// Onboarding-E-Mails planen await loyaltyService.scheduleOnboardingSequence(event.email, { tier: event.attributes.LOYALTY_TIER, preferences: event.attributes }); }
// Anmeldequelle verfolgen await loyaltyService.trackSignupSource(event.email, { lists: event.lists, attributes: event.attributes, timestamp: new Date(event.date) });}contact_updated
Wird ausgelöst, wenn Kontaktinformationen aktualisiert werden.
Payload-Beispiel:
{ "event": "contact_updated", "date": "2024-01-25 16:45:00", "ts": 1641003900, "updated_attributes": { "LOYALTY_POINTS": 1250, "LOYALTY_TIER": "Silver", "TOTAL_SPENT": 899.99 }, "previous_attributes": { "LOYALTY_POINTS": 750, "LOYALTY_TIER": "Bronze", "TOTAL_SPENT": 549.99 }}Tajo-Integrations-Anwendungsfälle:
- Stufen-Upgrades erkennen
- Punktestandsänderungen verfolgen
- Profilvollständigkeit überwachen
- Stufenspezifische Kampagnen auslösen
async function handleContactUpdated(event) { const updated = event.updated_attributes; const previous = event.previous_attributes;
// Auf Stufen-Upgrade prüfen if (updated.LOYALTY_TIER && updated.LOYALTY_TIER !== previous.LOYALTY_TIER) { await loyaltyService.handleTierUpgrade(event.email, { previousTier: previous.LOYALTY_TIER, newTier: updated.LOYALTY_TIER, pointsBalance: updated.LOYALTY_POINTS });
// Glückwünsche senden await loyaltyService.sendTierUpgradeEmail(event.email, { newTier: updated.LOYALTY_TIER, benefits: loyaltyService.getTierBenefits(updated.LOYALTY_TIER) }); }
// Signifikante Punkteerhöhungen verfolgen const pointIncrease = updated.LOYALTY_POINTS - previous.LOYALTY_POINTS; if (pointIncrease > 0) { await loyaltyService.trackPointsEarned(event.email, { amount: pointIncrease, newTotal: updated.LOYALTY_POINTS, source: 'profile_update' }); }
// Ausgaben-Meilensteine überwachen if (updated.TOTAL_SPENT > previous.TOTAL_SPENT) { await loyaltyService.checkSpendingMilestones(event.email, { currentSpend: updated.TOTAL_SPENT, previousSpend: previous.TOTAL_SPENT }); }}Best Practices für die Event-Verarbeitung
1. Idempotenz-Behandlung
class WebhookProcessor { constructor() { this.processedEvents = new Set(); }
async processEvent(event) { const eventKey = `${event.event}_${event.email}_${event.ts}`;
if (this.processedEvents.has(eventKey)) { console.log('Duplicate event ignored:', eventKey); return; }
this.processedEvents.add(eventKey);
try { await this.handleEvent(event); } catch (error) { this.processedEvents.delete(eventKey); // Wiederholung erlauben throw error; } }}2. Event-Sequenzierung
async function processEventInSequence(event) { const customer = await loyaltyService.getCustomer(event.email); const lastProcessedTime = customer.lastWebhookProcessed || 0;
// Sicherstellen, dass Events in chronologischer Reihenfolge verarbeitet werden if (event.ts < lastProcessedTime) { console.warn('Out-of-order event received, queuing for later processing'); await loyaltyService.queueEventForLaterProcessing(event); return; }
await handleWebhookEvent(event);
// Zuletzt verarbeiteten Zeitstempel aktualisieren await loyaltyService.updateCustomer(event.email, { lastWebhookProcessed: event.ts });}3. Stapelverarbeitung
class BatchEventProcessor { constructor() { this.eventBatch = []; this.batchSize = 100; this.flushInterval = 5000; // 5 Sekunden
setInterval(() => this.flushBatch(), this.flushInterval); }
addEvent(event) { this.eventBatch.push(event);
if (this.eventBatch.length >= this.batchSize) { this.flushBatch(); } }
async flushBatch() { if (this.eventBatch.length === 0) return;
const batch = this.eventBatch.splice(0);
try { await loyaltyService.processBatchEvents(batch); } catch (error) { console.error('Batch processing failed:', error); // Fehlgeschlagene Events erneut in die Warteschlange stellen this.eventBatch.unshift(...batch); } }}Nächste Schritte
- Webhook-Sicherheitsleitfaden - Sicherheits-Best-Practices
- Webhooks testen - Testen und Debuggen
- Webhook-Analytics - Leistungsüberwachung
- Platform-Integration - Vollständige Integrationsanleitung