Integrates Gong/Chorus conversation intelligence with Salesforce and HubSpot.
From opspal-corenpx claudepluginhub revpalsfdc/opspal-commercial --plugin opspal-coresonnetTriages messages across email, Slack, LINE, Messenger, and calendar into 4 tiers, generates tone-matched draft replies, cross-references events, and tracks follow-through. Delegate for multi-channel inbox workflows.
Resolves TypeScript type errors, build failures, dependency issues, and config problems with minimal diffs only—no refactoring or architecture changes. Use proactively on build errors for quick fixes.
Software architecture specialist for system design, scalability, and technical decision-making. Delegate proactively for planning new features, refactoring large systems, or architectural decisions. Restricted to read/search tools.
Integrate Gong (or Chorus) conversation intelligence data with Salesforce and HubSpot CRMs. Enriches deals with call insights, surfaces competitive intelligence, tracks engagement patterns, and provides deal risk signals from conversation analysis.
| Endpoint Category | Description | Use Case |
|---|---|---|
| Calls | Call metadata and recordings | Activity tracking |
| Transcripts | Full call transcripts | Keyword extraction |
| Stats | Talk ratio, engagement metrics | Performance tracking |
| Trackers | Keyword and topic detection | Competitor/risk tracking |
| Scorecards | Call quality scores | Rep coaching |
| Users | Gong user data | Owner mapping |
| Deals | Gong deal data | Opportunity correlation |
| Workspaces | Account segmentation | Multi-org support |
{
"gong": {
"authType": "OAuth2",
"tokenUrl": "https://app.gong.io/oauth2/token",
"scopes": [
"api:calls:read:basic",
"api:calls:read:extensive",
"api:stats:user",
"api:crm:integration",
"api:meetings:user:basic"
],
"envVars": {
"accessKeyId": "GONG_ACCESS_KEY_ID",
"accessKeySecret": "GONG_ACCESS_KEY_SECRET"
}
}
}
| Gong Field | Salesforce Field | Notes |
|---|---|---|
title | Subject | Call title |
scheduled | StartDateTime | Scheduled time |
started | ActivityDate | Actual start |
duration | DurationInMinutes | Call length |
direction | Call_Direction__c | Inbound/Outbound |
parties[].emailAddress | WhoId (lookup) | Participants |
primaryUserId | OwnerId (lookup) | Call owner |
url | Gong_Recording_URL__c | Link to recording |
context[].objects | Related Opportunity | Deal association |
| Insight Category | Salesforce Field | Description |
|---|---|---|
| Talk Ratio | Rep_Talk_Ratio__c | % of call rep spoke |
| Longest Monologue | Longest_Monologue_Sec__c | Longest uninterrupted speech |
| Questions Asked | Questions_Asked__c | Count of questions |
| Engaging Questions | Engaging_Questions__c | Open-ended questions |
| Interactivity | Call_Interactivity__c | Back-and-forth score |
| Patience | Rep_Patience__c | Time before responding |
| Filler Words | Filler_Word_Rate__c | Per minute filler rate |
{
"trackerMappings": {
"competitor": {
"gongTrackers": ["Competitor - Salesforce", "Competitor - HubSpot", "Competitor - Other"],
"salesforceField": "Competitors_Mentioned__c",
"action": "append",
"alertChannel": "#competitive-intel"
},
"pricing": {
"gongTrackers": ["Pricing Objection", "Budget Concern", "Too Expensive"],
"salesforceField": "Pricing_Objection__c",
"action": "flag_if_mentioned"
},
"timeline": {
"gongTrackers": ["Urgency", "Timeline", "Decision Date"],
"salesforceField": "Timeline_Discussed__c",
"action": "flag_if_mentioned"
},
"risk": {
"gongTrackers": ["Going Dark", "No Response", "Delayed", "Reevaluate"],
"salesforceField": "Deal_Risk_Signal__c",
"action": "flag_and_alert"
},
"champion": {
"gongTrackers": ["Champion Identified", "Executive Sponsor", "Internal Advocate"],
"salesforceField": "Champion_Strength__c",
"action": "update_if_positive"
}
}
}
// Create call engagement in HubSpot
const callEngagement = {
engagement: {
type: 'CALL',
timestamp: new Date(gongCall.started).getTime(),
ownerId: hubspotOwnerId
},
associations: {
contactIds: participantContactIds,
companyIds: [hubspotCompanyId],
dealIds: [hubspotDealId]
},
metadata: {
toNumber: gongCall.parties.find(p => p.affiliation === 'External')?.phoneNumber,
fromNumber: gongCall.parties.find(p => p.affiliation === 'Internal')?.phoneNumber,
status: 'COMPLETED',
durationMilliseconds: gongCall.duration * 1000,
recordingUrl: gongCall.url,
body: `Gong Call: ${gongCall.title}\n\nKey Topics: ${gongCall.trackers.join(', ')}`
}
};
| Signal | Detection Method | Risk Impact | Action |
|---|---|---|---|
| Going Dark | No calls in 14+ days | HIGH | Alert CSM/AE |
| Competitor Mentioned | Tracker detection | MEDIUM | Competitive play |
| Budget Pushback | Tracker + sentiment | HIGH | Pricing discussion |
| Timeline Slip | "Delay" mentions | MEDIUM | Re-qualify timeline |
| Champion Left | Contact role change | CRITICAL | Identify new champion |
| No Multi-threading | Single stakeholder | MEDIUM | Expand contacts |
| Low Engagement | Poor talk ratio | LOW | Coaching needed |
// Aggregate deal risk from conversation signals
function calculateConversationRisk(calls, opportunity) {
let riskScore = 0;
const riskFactors = [];
// Days since last call
const daysSinceCall = daysBetween(lastCallDate, today);
if (daysSinceCall > 21) {
riskScore += 25;
riskFactors.push({ factor: 'Going Dark', value: `${daysSinceCall} days since last call`, impact: 25 });
} else if (daysSinceCall > 14) {
riskScore += 15;
riskFactors.push({ factor: 'Engagement Gap', value: `${daysSinceCall} days since last call`, impact: 15 });
}
// Competitor mentions
const competitorCalls = calls.filter(c => c.trackers.includes('Competitor'));
if (competitorCalls.length > 0) {
riskScore += 20;
riskFactors.push({ factor: 'Competitor Mentioned', value: `${competitorCalls.length} calls`, impact: 20 });
}
// Budget concerns
const budgetCalls = calls.filter(c => c.trackers.includes('Budget Concern'));
if (budgetCalls.length > 0) {
riskScore += 15;
riskFactors.push({ factor: 'Budget Concerns', value: `${budgetCalls.length} calls`, impact: 15 });
}
// Stakeholder diversity
const uniqueStakeholders = new Set(calls.flatMap(c => c.parties.filter(p => p.affiliation === 'External').map(p => p.email)));
if (uniqueStakeholders.size < 2 && opportunity.amount > 50000) {
riskScore += 15;
riskFactors.push({ factor: 'Single-threaded', value: `Only ${uniqueStakeholders.size} stakeholder(s)`, impact: 15 });
}
return {
riskScore: Math.min(riskScore, 100),
riskLevel: riskScore >= 50 ? 'HIGH' : riskScore >= 25 ? 'MEDIUM' : 'LOW',
riskFactors
};
}
Gong Call Completed
↓
Webhook fires to integration endpoint
↓
Extract call metadata and insights
↓
Lookup Opportunity in Salesforce
↓
Create Event + Update Opportunity fields
↓
Create Engagement in HubSpot
↓
Evaluate risk signals
↓
Trigger alerts if needed
Webhook Configuration:
{
"webhook": {
"url": "https://integration.yourcompany.com/gong/webhook",
"events": [
"call.created",
"call.updated",
"call.insights.ready",
"deal.updated"
],
"filters": {
"workspaceId": "${GONG_WORKSPACE_ID}",
"minDuration": 60
}
}
}
# Sync call insights from last 24 hours
node scripts/lib/gong-sync.js \
--mode insights \
--since "24h" \
--target salesforce \
--org production
# Analyze all open deals for conversation risk signals
node scripts/lib/gong-sync.js \
--mode risk-analysis \
--pipeline "Enterprise" \
--min-amount 50000 \
--output ./reports/deal-risk-signals.json
# Generate competitor mention report
node scripts/lib/gong-sync.js \
--mode competitor-report \
--period "2026-Q1" \
--output ./reports/competitive-intel.csv
{
"gong": {
"enabled": true,
"syncDirection": "gong-to-crm",
"realTimeSync": {
"enabled": true,
"webhookEndpoint": "/api/gong/webhook",
"minCallDuration": 60
},
"batchSync": {
"enabled": true,
"schedule": "0 6 * * *",
"lookbackDays": 1
},
"targets": {
"salesforce": {
"enabled": true,
"orgAlias": "production",
"callSync": true,
"insightsSync": true,
"riskSignals": true,
"trackerSync": true
},
"hubspot": {
"enabled": true,
"portalId": "${HUBSPOT_PORTAL_ID}",
"callSync": true,
"insightsSync": false
}
},
"trackers": {
"competitor": ["Competitor A", "Competitor B", "Alternative"],
"risk": ["Going Dark", "Delay", "Budget Issue", "Reevaluate"],
"positive": ["Champion", "Executive Buy-in", "Urgency", "Timeline Set"]
},
"riskThresholds": {
"daysSinceCall": {
"warning": 14,
"critical": 21
},
"talkRatio": {
"min": 30,
"max": 60
}
}
}
}
# Gong API credentials
GONG_ACCESS_KEY_ID=your_access_key
GONG_ACCESS_KEY_SECRET=your_secret_key
GONG_WORKSPACE_ID=your_workspace_id
# Webhook security
GONG_WEBHOOK_SECRET=your_webhook_secret
# Optional: Chorus support
CHORUS_API_KEY=your_chorus_key
{
"syncId": "gong-sync-2026-01-18-001",
"startTime": "2026-01-18T06:00:00Z",
"endTime": "2026-01-18T06:12:45Z",
"status": "completed",
"source": "gong",
"targets": ["salesforce", "hubspot"],
"summary": {
"callsProcessed": 45,
"callsSynced": 44,
"callsFailed": 1,
"insightsExtracted": 44,
"trackersDetected": 128,
"riskSignalsFlagged": 8,
"competitorMentions": 12
},
"riskAlerts": [
{
"opportunityId": "006xxx",
"opportunityName": "Acme Corp - Enterprise",
"riskLevel": "HIGH",
"signals": ["Going Dark (18 days)", "Competitor Mentioned"],
"alertSent": true
}
],
"competitorInsights": {
"Competitor A": 7,
"Competitor B": 3,
"Other": 2
}
}
{
"Id": "006xxx",
"Name": "Acme Corp - Enterprise Platform",
"Gong_Calls_Count__c": 12,
"Last_Gong_Call__c": "2026-01-15",
"Days_Since_Gong_Call__c": 3,
"Avg_Talk_Ratio__c": 42,
"Total_Call_Duration__c": 480,
"Stakeholders_Engaged__c": 4,
"Competitors_Mentioned__c": "Competitor A;Competitor B",
"Deal_Risk_Signal__c": "Competitor mentioned on 2 calls",
"Champion_Strength__c": "Strong - Multiple advocates",
"Conversation_Risk_Score__c": 35,
"Next_Steps_Discussed__c": true,
"Pricing_Objection__c": false,
"Timeline_Discussed__c": true
}
// Track stakeholder engagement across deal
function analyzeStakeholderEngagement(calls, opportunity) {
const stakeholders = new Map();
calls.forEach(call => {
call.parties.filter(p => p.affiliation === 'External').forEach(participant => {
const email = participant.emailAddress;
if (!stakeholders.has(email)) {
stakeholders.set(email, {
email,
name: participant.name,
title: participant.title,
callCount: 0,
totalDuration: 0,
lastCall: null,
talkTime: 0
});
}
const s = stakeholders.get(email);
s.callCount++;
s.totalDuration += call.duration;
s.lastCall = call.started;
s.talkTime += participant.talkTime || 0;
});
});
return {
totalStakeholders: stakeholders.size,
byRole: categorizeByRole(stakeholders),
engagementScore: calculateEngagementScore(stakeholders),
recommendations: generateEngagementRecommendations(stakeholders, opportunity)
};
}
{
"opportunityId": "006xxx",
"stakeholderAnalysis": {
"totalStakeholders": 4,
"byRole": {
"economic_buyer": 1,
"champion": 1,
"end_user": 2,
"technical": 0
},
"engagementScore": 72,
"mostEngaged": "jane.smith@acme.com (Champion)",
"leastEngaged": "bob.jones@acme.com (last call: 28 days ago)",
"recommendations": [
"Re-engage Bob Jones - no recent calls",
"Consider engaging technical stakeholder",
"Schedule executive alignment call"
]
}
}
This agent also supports Chorus with minor configuration changes:
{
"chorus": {
"enabled": true,
"apiBaseUrl": "https://chorus.ai/api/v1",
"authType": "APIKey",
"objectMapping": {
"calls": "meetings",
"transcripts": "transcripts",
"trackers": "trackers",
"insights": "analytics"
}
}
}
| Metric | Description | Target |
|---|---|---|
| Sync Success Rate | % of calls synced successfully | >99% |
| Sync Latency | Time from call end to CRM update | <15 min |
| Insight Coverage | % of calls with insights extracted | >95% |
| Risk Signal Accuracy | % of flagged risks that materialized | >70% |
| Tracker Detection Rate | % of relevant mentions caught | >90% |
{
"alerts": {
"dealGoingDark": {
"threshold": 14,
"unit": "days",
"channel": "#deal-alerts",
"assignee": "opportunity_owner"
},
"competitorMention": {
"minMentions": 1,
"channel": "#competitive-intel",
"assignee": "competitive_team"
},
"highRiskDeal": {
"riskScoreThreshold": 50,
"channel": "#deal-alerts",
"assignee": "sales_manager"
},
"syncFailure": {
"threshold": 5,
"period": "1h",
"channel": "#integration-alerts"
}
}
}
outreach-integration-agent - Sales engagement dataproduct-analytics-bridge - Product usage datarevops-deal-scorer - Uses conversation data for deal scoringrevops-churn-risk-scorer - Uses engagement data for churn predictionscripts/lib/gong-sync.js - Core sync enginescripts/lib/gong-webhook-handler.js - Webhook processingscripts/lib/gong-risk-analyzer.js - Risk signal detectionscripts/lib/gong-competitor-tracker.js - Competitive intelligenceThis integration requires proper API credentials from Gong/Chorus. Call recording and analysis may be subject to privacy regulations and consent requirements. Ensure compliance with local laws and company policies. Test thoroughly in sandbox environments before production deployment.