Deal-Management
Mit der Brevo CRM Deals API verwaltest du deine Sales-Pipeline, verfolgst den Deal-Fortschritt und automatisierst umsatzbezogene Workflows innerhalb der Tajo-Plattform.
Überblick
Deal-Management ist essenziell für:
- Sales-Pipeline-Tracking mit phasenbasiertem Fortschritt und Prognosen
- Umsatzattribution, die Deals mit E-Commerce-Kundenaktivität verknüpft
- Automatische Follow-ups, ausgelöst durch Phasenwechsel
- Team-Performance-Auswertungen mit Win/Loss-Tracking und Conversion-Raten
- Loyalty-Programm-Integration mit Punktevergabe bei Deal-Abschluss
Schnellstart
Deal anlegen
POST https://api.brevo.com/v3/crm/dealsContent-Type: application/jsonapi-key: YOUR_API_KEY
{ "name": "Acme Corp - Enterprise Loyalty Package", "attributes": { "deal_stage": "Qualified", "amount": 75000, "close_date": "2026-06-30", "pipeline": "Enterprise Sales", "deal_type": "new_business", "probability": 60, "company_id": "comp_123456789", "contact_id": "contact_987654321", "source": "inbound_lead", "loyalty_points_bonus": 5000, "contract_length_months": 12 }}Antwort
{ "id": "deal_abc123def456", "name": "Acme Corp - Enterprise Loyalty Package", "created_at": "2026-01-25T14:30:00Z", "updated_at": "2026-01-25T14:30:00Z"}Deals abrufen
Alle Deals auflisten
Rufe Deals mit Filtern und Pagination ab:
GET https://api.brevo.com/v3/crm/deals?limit=50&offset=0&sort=descContent-Type: application/jsonapi-key: YOUR_API_KEYAntwort
{ "items": [ { "id": "deal_abc123def456", "name": "Acme Corp - Enterprise Loyalty Package", "attributes": { "deal_stage": "Qualified", "amount": 75000, "close_date": "2026-06-30", "pipeline": "Enterprise Sales", }, "created_at": "2026-01-25T14:30:00Z", "updated_at": "2026-01-25T14:30:00Z" } ], "total": 1}Deals nach Phase filtern
GET https://api.brevo.com/v3/crm/deals?filters[attributes.deal_stage]=Negotiation&sort=attributes.amount:descEinzelnen Deal abrufen
GET https://api.brevo.com/v3/crm/deals/{deal_id}Content-Type: application/jsonapi-key: YOUR_API_KEYDeal aktualisieren
Deal-Attribute aktualisieren
PATCH https://api.brevo.com/v3/crm/deals/{deal_id}Content-Type: application/jsonapi-key: YOUR_API_KEY
{ "attributes": { "deal_stage": "Negotiation", "amount": 82000, "probability": 75, "next_activity_date": "2026-02-15" }}Antwort
{ "id": "deal_abc123def456", "updated_at": "2026-02-01T10:15:00Z"}Deal-Pipeline-Management
Pipeline-Phasen konfigurieren
Setze einen strukturierten Deal-Verlauf für E-Commerce-Verkäufe um:
class TajoDealPipeline { constructor() { this.dealsApi = new DealsApi(); this.stages = [ { name: 'Lead', probability: 10, actions: ['qualify_lead'] }, { name: 'Qualified', probability: 25, actions: ['schedule_demo'] }, { name: 'Demo', probability: 40, actions: ['send_proposal'] }, { name: 'Proposal', probability: 60, actions: ['negotiate_terms'] }, { name: 'Negotiation', probability: 80, actions: ['finalize_contract'] }, { name: 'Closed Won', probability: 100, actions: ['onboard_customer', 'award_loyalty_points'] }, { name: 'Closed Lost', probability: 0, actions: ['analyze_loss', 'schedule_followup'] } ]; }
async advanceDealStage(dealId, newStage) { const deal = await this.dealsApi.getDeal(dealId); const stageConfig = this.stages.find(s => s.name === newStage);
if (!stageConfig) { throw new Error(`Invalid stage: ${newStage}`); }
// Deal mit neuer Phase aktualisieren await this.dealsApi.updateDeal(dealId, { attributes: { deal_stage: newStage, probability: stageConfig.probability, stage_changed_at: new Date().toISOString(), previous_stage: deal.attributes.deal_stage } });
// Phasenspezifische Aktionen ausführen for (const action of stageConfig.actions) { await this.executeStageAction(dealId, action, deal); }
return { dealId, newStage, probability: stageConfig.probability }; }
async executeStageAction(dealId, action, deal) { switch (action) { case 'award_loyalty_points': if (deal.attributes.loyalty_points_bonus > 0) { await loyaltyService.awardCorporatePoints( deal.attributes.company_id, deal.attributes.loyalty_points_bonus, { reason: 'Deal closure bonus', dealId } ); } break;
case 'onboard_customer': await this.triggerOnboardingWorkflow(deal); break;
case 'analyze_loss': await this.logDealLoss(dealId, deal); break;
case 'schedule_followup': await this.createFollowUpTask(dealId, deal); break; } }}Deal-Prognosen
Erstelle Umsatzprognosen aus Pipeline-Daten:
class DealForecasting { async generateForecast(pipeline, timeframe) { const deals = await this.dealsApi.getDeals({ filters: { 'attributes.pipeline': pipeline, 'attributes.close_date': `<${timeframe.end}`, 'attributes.deal_stage': '!Closed Lost' } });
const forecast = { pipeline, timeframe, totalPipeline: 0, weightedPipeline: 0, byStage: {}, byOwner: {}, byMonth: {} };
for (const deal of deals.items) { const amount = deal.attributes.amount || 0; const probability = deal.attributes.probability || 0; const weighted = amount * (probability / 100); const stage = deal.attributes.deal_stage; const owner = deal.attributes.deal_owner; const month = new Date(deal.attributes.close_date).toISOString().slice(0, 7);
forecast.totalPipeline += amount; forecast.weightedPipeline += weighted;
// Aggregation nach Phase if (!forecast.byStage[stage]) { forecast.byStage[stage] = { count: 0, total: 0, weighted: 0 }; } forecast.byStage[stage].count++; forecast.byStage[stage].total += amount; forecast.byStage[stage].weighted += weighted;
// Aggregation nach Owner if (!forecast.byOwner[owner]) { forecast.byOwner[owner] = { count: 0, total: 0, weighted: 0 }; } forecast.byOwner[owner].count++; forecast.byOwner[owner].total += amount; forecast.byOwner[owner].weighted += weighted;
// Aggregation nach Monat if (!forecast.byMonth[month]) { forecast.byMonth[month] = { count: 0, total: 0, weighted: 0 }; } forecast.byMonth[month].count++; forecast.byMonth[month].total += amount; forecast.byMonth[month].weighted += weighted; }
return forecast; }}Deal-Automatisierung im E-Commerce
Automatische Deal-Erstellung aus Bestellungen
Erstelle Deals automatisch aus hochwertigen E-Commerce-Aktivitäten:
class EcommerceDealAutomation { async createDealFromOrder(order) { // Deals nur für hochwertige oder B2B-Bestellungen anlegen if (order.total < 5000 && !order.isB2B) return null;
const deal = { name: `${order.customerName} - Order #${order.id}`, attributes: { deal_stage: order.isB2B ? 'Qualified' : 'Proposal', amount: order.total, close_date: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(), pipeline: order.isB2B ? 'Enterprise Sales' : 'E-Commerce Upsell', deal_type: 'new_business', source: 'ecommerce_order', order_id: order.id, product_categories: order.categories.join(', '), contact_id: order.contactId, company_id: order.companyId || null, loyalty_points_bonus: Math.floor(order.total * 0.1) } };
return await this.dealsApi.createDeal(deal); }
async createRenewalDeal(subscription) { const renewalDate = new Date(subscription.expiresAt); const createDate = new Date(renewalDate.getTime() - 90 * 24 * 60 * 60 * 1000);
if (new Date() < createDate) return null;
const deal = { name: `${subscription.customerName} - Renewal`, attributes: { deal_stage: 'Qualified', amount: subscription.annualValue, close_date: subscription.expiresAt, pipeline: 'Renewals', deal_type: 'renewal', probability: 70, source: 'auto_renewal', subscription_id: subscription.id, contact_id: subscription.contactId, company_id: subscription.companyId, contract_length_months: 12, loyalty_points_bonus: Math.floor(subscription.annualValue * 0.05) } };
return await this.dealsApi.createDeal(deal); }}Deal-getriggerte Loyalty-Workflows
class DealLoyaltyIntegration { async onDealStageChange(dealId, oldStage, newStage) { const deal = await this.dealsApi.getDeal(dealId);
// Meilenstein-Punkte an wichtigen Phasen vergeben const milestoneStages = { 'Demo': 100, 'Proposal': 250, 'Closed Won': deal.attributes.loyalty_points_bonus || 1000 };
if (milestoneStages[newStage] && deal.attributes.contact_id) { await loyaltyService.awardPoints( deal.attributes.contact_id, milestoneStages[newStage], { reason: `Deal milestone: ${newStage}`, dealId } ); }
// Tier-Bewertung beim Deal-Abschluss anstoßen if (newStage === 'Closed Won' && deal.attributes.company_id) { const company = await this.companiesApi.getCompany(deal.attributes.company_id); const newTotal = (company.attributes.annual_spend || 0) + deal.attributes.amount;
await this.companiesApi.updateCompany(deal.attributes.company_id, { attributes: { annual_spend: newTotal, last_deal_closed: new Date().toISOString() } });
await this.tierManager.evaluateTierUpgrade(deal.attributes.company_id, newTotal); } }}Deal-Analytics
Pipeline-Performance-Kennzahlen
class DealAnalytics { async getPipelineMetrics(pipeline, timeframe) { const allDeals = await this.dealsApi.getDeals({ filters: { 'attributes.pipeline': pipeline } });
const closedDeals = allDeals.items.filter( d => d.attributes.deal_stage === 'Closed Won' || d.attributes.deal_stage === 'Closed Lost' );
const wonDeals = closedDeals.filter(d => d.attributes.deal_stage === 'Closed Won'); const lostDeals = closedDeals.filter(d => d.attributes.deal_stage === 'Closed Lost');
return { totalDeals: allDeals.total, openDeals: allDeals.total - closedDeals.length, wonDeals: wonDeals.length, lostDeals: lostDeals.length, winRate: closedDeals.length > 0 ? (wonDeals.length / closedDeals.length * 100).toFixed(1) : 0, totalRevenue: wonDeals.reduce((sum, d) => sum + (d.attributes.amount || 0), 0), averageDealSize: wonDeals.length > 0 ? wonDeals.reduce((sum, d) => sum + (d.attributes.amount || 0), 0) / wonDeals.length : 0, averageSalesCycle: this.calculateAverageSalesCycle(wonDeals), loyaltyPointsAwarded: wonDeals.reduce( (sum, d) => sum + (d.attributes.loyalty_points_bonus || 0), 0 ) }; }
calculateAverageSalesCycle(wonDeals) { if (wonDeals.length === 0) return 0;
const totalDays = wonDeals.reduce((sum, deal) => { const created = new Date(deal.created_at); const closed = new Date(deal.attributes.stage_changed_at || deal.updated_at); return sum + Math.floor((closed - created) / (1000 * 60 * 60 * 24)); }, 0);
return Math.round(totalDays / wonDeals.length); }}API-Methoden-Referenz
CRUD-Operationen für Deals
// Neuen Deal anlegenconst deal = await dealsApi.createDeal({ name: 'New Enterprise Deal', attributes: { deal_stage: 'Lead', amount: 50000, pipeline: 'Enterprise Sales' }});
// Deal per ID abrufenconst deal = await dealsApi.getDeal('deal_abc123def456');
// Deal-Attribute aktualisierenawait dealsApi.updateDeal('deal_abc123def456', { attributes: { deal_stage: 'Negotiation', amount: 55000, probability: 80 }});
// Deal löschenawait dealsApi.deleteDeal('deal_abc123def456');
// Deals mit Filtern auflistenconst deals = await dealsApi.getDeals({ filters: { 'attributes.deal_stage': 'Qualified', 'attributes.amount': '>10000' }, sort: 'attributes.amount:desc', limit: 50});Erweiterte Abfragen
// Deals, die in diesem Quartal abschließenconst quarterEnd = new Date();quarterEnd.setMonth(quarterEnd.getMonth() + 3);const closingDeals = await dealsApi.getDeals({ filters: { 'attributes.close_date': `<${quarterEnd.toISOString()}`, 'attributes.deal_stage': '!Closed Won,!Closed Lost' }});
// Hochwertige stale Deals (kein Update seit 14 Tagen)const staleDate = new Date(Date.now() - 14 * 24 * 60 * 60 * 1000);const staleDeals = await dealsApi.getDeals({ filters: { 'attributes.amount': '>25000', 'updated_at': `<${staleDate.toISOString()}`, 'attributes.deal_stage': '!Closed Won,!Closed Lost' }});
// Deals nach Owner für Performance-Reviewconst ownerDeals = await dealsApi.getDeals({ filters: { 'attributes.deal_stage': 'Closed Won' }});Best Practices
- Konsistente Phasen: Definiere klare Pipeline-Phasen mit erwarteten Aktionen je Phase
- Wahrscheinlichkeit pflegen: Halte Deal-Wahrscheinlichkeiten aktuell, um die Prognose-Genauigkeit zu verbessern
- Zeitnahe Updates: Aktualisiere Deal-Attribute zeitnah, damit die Pipeline-Sicht stimmt
- Loyalty-Integration: Verknüpfe Deal-Abschlüsse mit Loyalty-Punkten für die Kundenbindung
- Automatisierte Workflows: Nutze Phasenwechsel-Trigger, um Follow-up-Aufgaben zu automatisieren
- Regelmäßige Pipeline-Reviews: Plane wöchentliche Pipeline-Reviews, um stale oder gefährdete Deals zu erkennen
Fehlerbehandlung
try { const deal = await dealsApi.createDeal(dealData); console.log('Deal created:', deal.id);} catch (error) { if (error.status === 400) { console.error('Invalid deal data:', error.message); } else if (error.status === 404) { console.error('Associated company or contact not found'); } else if (error.status === 409) { console.error('Duplicate deal detected'); } else { console.error('Unexpected error:', error); }}Nächste Schritte
- Unternehmensverwaltung – B2B-Firmenkonten verwalten
- Aufgabenverwaltung – Deal-Aktivitäten und Follow-ups verwalten
- Notizen und Dateien – Deal-Interaktionen dokumentieren
- CRM-Analytics – Erweitertes Reporting und Insights