Quản lý thương vụ
Brevo CRM Deals API cho phép bạn quản lý quy trình bán hàng, theo dõi tiến độ thương vụ và tự động hóa các luồng công việc liên quan đến doanh thu ngay trong nền tảng Tajo.
Tổng quan
Quản lý thương vụ là yếu tố then chốt để:
- Theo dõi quy trình bán hàng theo từng giai đoạn kèm dự báo
- Quy kết doanh thu, liên kết thương vụ với hoạt động của khách hàng thương mại điện tử
- Tự động theo dõi tiếp khi thương vụ đổi giai đoạn
- Phân tích hiệu suất đội ngũ với theo dõi thắng/thua và tỷ lệ chuyển đổi
- Tích hợp chương trình khách hàng thân thiết, cộng điểm khi thương vụ chốt thành công
Bắt đầu nhanh
Tạo thương vụ
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 }}Phản hồi
{ "id": "deal_abc123def456", "name": "Acme Corp - Enterprise Loyalty Package", "created_at": "2026-01-25T14:30:00Z", "updated_at": "2026-01-25T14:30:00Z"}Lấy danh sách thương vụ
Liệt kê tất cả thương vụ
Truy xuất thương vụ kèm bộ lọc và phân trang:
GET https://api.brevo.com/v3/crm/deals?limit=50&offset=0&sort=descContent-Type: application/jsonapi-key: YOUR_API_KEYPhản hồi
{ "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}Lọc thương vụ theo giai đoạn
GET https://api.brevo.com/v3/crm/deals?filters[attributes.deal_stage]=Negotiation&sort=attributes.amount:descLấy một thương vụ
GET https://api.brevo.com/v3/crm/deals/{deal_id}Content-Type: application/jsonapi-key: YOUR_API_KEYCập nhật thương vụ
Cập nhật thuộc tính thương vụ
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" }}Phản hồi
{ "id": "deal_abc123def456", "updated_at": "2026-02-01T10:15:00Z"}Quản lý quy trình thương vụ
Cấu hình giai đoạn quy trình
Triển khai lộ trình thương vụ có cấu trúc cho hoạt động bán hàng thương mại điện tử:
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; } }}Dự báo thương vụ
Tạo dự báo doanh thu dựa trên dữ liệu quy trình:
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; }}Tự động hóa thương vụ thương mại điện tử
Tự động tạo thương vụ từ đơn hàng
Tự động tạo thương vụ từ hoạt động thương mại điện tử có giá trị cao:
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); }}Luồng khách hàng thân thiết kích hoạt bởi thương vụ
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); } }}Phân tích thương vụ
Chỉ số hiệu suất quy trình
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); }}Tham chiếu phương thức API
Thao tác CRUD với thương vụ
// 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});Truy vấn nâng cao
// 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' }});Thực hành tốt nhất
- Giai đoạn nhất quán: Xác định rõ các giai đoạn của quy trình cùng hành động mong đợi ở mỗi giai đoạn
- Theo dõi xác suất: Luôn cập nhật xác suất của thương vụ để dự báo chính xác hơn
- Cập nhật kịp thời: Cập nhật thuộc tính thương vụ ngay khi có thay đổi để quy trình luôn phản ánh đúng thực tế
- Tích hợp khách hàng thân thiết: Gắn việc chốt thương vụ với phần thưởng điểm để giữ chân khách hàng
- Luồng công việc tự động: Dùng trình kích hoạt theo giai đoạn để tự động hóa các việc cần theo dõi tiếp
- Rà soát quy trình định kỳ: Lên lịch rà soát quy trình hằng tuần để phát hiện thương vụ đình trệ hoặc có rủi ro
Xử lý lỗi
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); }}Bước tiếp theo
- Quản lý công ty - Quản lý tài khoản doanh nghiệp B2B
- Quản lý công việc - Quản lý hoạt động và việc theo dõi tiếp của thương vụ
- Ghi chú và tệp tin - Ghi lại các tương tác trong thương vụ
- Phân tích CRM - Báo cáo và thông tin chuyên sâu nâng cao