Gestion des transactions
L’API Deals du CRM Brevo vous permet de gérer votre pipeline commercial, de suivre l’avancement des transactions et d’automatiser les workflows liés au chiffre d’affaires au sein de la plateforme Tajo.
Vue d’ensemble
La gestion des transactions est essentielle pour :
- Suivi du pipeline commercial avec une progression par étapes et des prévisions
- Attribution du chiffre d’affaires en reliant les transactions à l’activité e-commerce des clients
- Relances automatisées déclenchées par les changements d’étape des transactions
- Analyse de la performance de l’équipe avec le suivi des affaires gagnées ou perdues et des taux de conversion
- Intégration du programme de fidélité avec l’attribution de points à la conclusion d’une transaction
Démarrage rapide
Créer une transaction
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 }}Réponse
{ "id": "deal_abc123def456", "name": "Acme Corp - Enterprise Loyalty Package", "created_at": "2026-01-25T14:30:00Z", "updated_at": "2026-01-25T14:30:00Z"}Récupérer les transactions
Lister toutes les transactions
Récupérez les transactions avec filtrage et pagination :
GET https://api.brevo.com/v3/crm/deals?limit=50&offset=0&sort=descContent-Type: application/jsonapi-key: YOUR_API_KEYRéponse
{ "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}Filtrer les transactions par étape
GET https://api.brevo.com/v3/crm/deals?filters[attributes.deal_stage]=Negotiation&sort=attributes.amount:descRécupérer une transaction
GET https://api.brevo.com/v3/crm/deals/{deal_id}Content-Type: application/jsonapi-key: YOUR_API_KEYMettre à jour une transaction
Mettre à jour les attributs d’une transaction
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" }}Réponse
{ "id": "deal_abc123def456", "updated_at": "2026-02-01T10:15:00Z"}Gestion du pipeline de transactions
Configuration des étapes du pipeline
Mettez en place une progression structurée des transactions pour les ventes e-commerce :
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}`); }
// Update deal with new stage await this.dealsApi.updateDeal(dealId, { attributes: { deal_stage: newStage, probability: stageConfig.probability, stage_changed_at: new Date().toISOString(), previous_stage: deal.attributes.deal_stage } });
// Execute stage-specific actions 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; } }}Prévision des transactions
Générez des prévisions de chiffre d’affaires à partir des données du pipeline :
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;
// Aggregate by stage 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;
// Aggregate by 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;
// Aggregate by month 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; }}Automatisation des transactions e-commerce
Création automatisée de transactions à partir des commandes
Créez des transactions automatiquement à partir de l’activité e-commerce à forte valeur :
class EcommerceDealAutomation { async createDealFromOrder(order) { // Only create deals for high-value or B2B orders 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); }}Workflows de fidélité déclenchés par les transactions
class DealLoyaltyIntegration { async onDealStageChange(dealId, oldStage, newStage) { const deal = await this.dealsApi.getDeal(dealId);
// Award milestone points at key stages 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 } ); }
// Trigger tier evaluation on deal closure 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); } }}Analyse des transactions
Indicateurs de performance du pipeline
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); }}Référence des méthodes de l’API
Opérations CRUD sur les transactions
// Create a new dealconst deal = await dealsApi.createDeal({ name: 'New Enterprise Deal', attributes: { deal_stage: 'Lead', amount: 50000, pipeline: 'Enterprise Sales' }});
// Get deal by IDconst deal = await dealsApi.getDeal('deal_abc123def456');
// Update deal attributesawait dealsApi.updateDeal('deal_abc123def456', { attributes: { deal_stage: 'Negotiation', amount: 55000, probability: 80 }});
// Delete a dealawait dealsApi.deleteDeal('deal_abc123def456');
// List deals with filteringconst deals = await dealsApi.getDeals({ filters: { 'attributes.deal_stage': 'Qualified', 'attributes.amount': '>10000' }, sort: 'attributes.amount:desc', limit: 50});Requêtes avancées
// Find deals closing this quarterconst 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' }});
// Find high-value stale deals (no update in 14 days)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' }});
// Get deals by owner for performance reviewconst ownerDeals = await dealsApi.getDeals({ filters: { 'attributes.deal_stage': 'Closed Won' }});Bonnes pratiques
- Des étapes cohérentes : définissez des étapes de pipeline claires, avec les actions attendues à chacune d’elles
- Suivi de la probabilité : maintenez les probabilités à jour pour améliorer la précision des prévisions
- Mises à jour rapides : actualisez les attributs des transactions sans attendre, afin de conserver une vision fidèle du pipeline
- Intégration de la fidélité : reliez la conclusion des transactions à l’attribution de points de fidélité pour favoriser la rétention
- Workflows automatisés : servez-vous des déclencheurs de changement d’étape pour automatiser les tâches de relance
- Revue régulière du pipeline : planifiez une revue hebdomadaire du pipeline pour repérer les transactions dormantes ou à risque
Gestion des erreurs
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); }}Prochaines étapes
- Gestion des entreprises - Gérez les comptes d’entreprise B2B
- Gestion des tâches - Gérez les activités et les relances liées aux transactions
- Notes et fichiers - Documentez les interactions liées aux transactions
- Analyse du CRM - Rapports et analyses avancés