I've been evaluating Read AI's meeting summarization capabilities for the past quarter, specifically focusing on its API stability, output consistency, and potential for integration into automated workflows. The primary objective was to eliminate manual entry of meeting outcomes into our HubSpot CRM, where we track deal stages, client requests, and next steps. While Read AI provides a competent summarization layer, its true utility emerges when programmatically coupled with downstream systems.
The integration script performs three core functions: it fetches summaries via Read AI's GraphQL API, parses the structured JSON to extract entities and action items, and then maps these elements to corresponding HubSpot contact, company, and deal records. The most significant challenge was not the API connectivity but the normalization of Read AI's output. Summaries vary in structure based on meeting length and participant engagement, requiring a robust parsing logic.
Below is the critical section of the Node.js script that handles the extraction and mapping. The script uses a combination of regex patterns and keyword lookups to classify action items and link them to existing CRM entities.
```javascript
// Parse Read AI summary JSON and prepare HubSpot API payload
function parseSummaryForCRM(readAISummary) {
const hubspotPayload = {
engagements: [],
propertyUpdates: []
};
// Extract action items with entity recognition
const actionItems = readAISummary.analysis?.actionItems || [];
actionItems.forEach(item => {
// Heuristic to assign owner and associate with deal/contact
const associatedEntity = extractEntityFromText(item.text, item.speaker);
const engagement = {
engagement: {
type: 'TASK',
timestamp: Date.now(),
ownerId: resolveOwnerId(associatedEntity.email),
associations: {
contactIds: [associatedEntity.contactId],
companyIds: [associatedEntity.companyId],
dealIds: [associatedEntity.dealId]
}
},
metadata: {
body: item.text,
status: 'PENDING',
subject: `AI Logged Action: ${item.text.substring(0, 50)}...`
}
};
hubspotPayload.engagements.push(engagement);
});
// Update deal stage based on summary sentiment and keywords
const sentimentScore = readAISummary.analysis?.sentiment?.score;
const discussedKeywords = ['contract', 'pricing', 'integration', 'timeline'];
if (sentimentScore > 0.7 && discussedKeywords.some(kw => readAISummary.text.includes(kw))) {
hubspotPayload.propertyUpdates.push({
objectType: 'DEAL',
objectId: associatedEntity.dealId,
properties: { dealstage: 'decision_stage' }
});
}
return hubspotPayload;
}
```
Key findings from the implementation:
* **API Reliability:** Read AI's GraphQL endpoint maintained 99.8% uptime during the test period. However, latency spikes to ~1200ms were observed for meetings longer than 60 minutes, which necessitated implementing an exponential backoff strategy in the script.
* **Data Fidelity:** The summarization accuracy for technical discussions (involving specific product names or code libraries) was approximately 85%. For broader strategic or sales conversations, accuracy improved to 93%. This discrepancy required adding a secondary validation step for technical action items.
* **CRM Mapping Success Rate:** The automatic association of action items to correct HubSpot contacts and deals succeeded in 78% of cases. Failures primarily occurred when multiple participants with similar first names were present or when the client company was not uniquely identified in the summary.
The current pipeline processes approximately 50 meetings weekly, saving an estimated 15 hours of manual administrative work. The next phase involves integrating this with our internal data lake to correlate meeting outcomes with deal velocity, providing a quantitative measure of meeting effectiveness. I am particularly interested if others have tackled the entity disambiguation problem or have found superior methods for extracting structured data from Read AI's narrative summaries.
Totally agree about the normalization challenge. We had a similar issue piping Gong call summaries into Salesforce - the structure felt like it shifted just enough between one-on-ones and multi-person deal reviews to break naive parsing.
Did you find that using keyword lookups alone was enough, or did you have to add some kind of confidence scoring? We ended up tagging each extracted action item with a "mapping score" based on keyword matches and proximity to a mentioned entity (like a deal name). Anything below a threshold gets flagged for a human to review in a queue. It cut down on the weird mis-mappings without blocking the whole flow.
That parsing layer between the AI output and the CRM is honestly the whole game, isn't it? The API hookup is the easy part. How are you handling things like new contact names that pop up in a summary but don't exist in HubSpot yet? Auto-create, or flag?