Stakeholder Sentiment Extraction
Extract per-stakeholder sentiment, priorities, and concerns from discovery call transcripts using Claude API
Instructions
Stakeholder Sentiment Extraction
Analyze discovery call transcripts to extract each stakeholder's individual sentiment, priorities, concerns, and level of support for the proposed solution. Produces a structured per-stakeholder assessment from a single call or across multiple calls.
Prerequisites
- Anthropic API key from console.anthropic.com
- Call transcript from Fireflies (via
fireflies-transcriptionfundamental) - Stakeholder role classifications (from
stakeholder-role-classificationfundamental) - Deal context from Attio (deal stage, known contacts)
Steps
1. Retrieve the transcript
Use the Fireflies API to fetch the full transcript with speaker labels:
query {
transcript(id: "{transcript_id}") {
id
title
sentences {
speaker_name
text
start_time
end_time
}
}
}
Group sentences by speaker. If speaker names are not correctly labeled, use title/role context to match speakers to known contacts.
2. Call Claude API for per-stakeholder extraction
POST https://api.anthropic.com/v1/messages
Headers: x-api-key: {ANTHROPIC_API_KEY}, anthropic-version: 2023-06-01
Body: {
"model": "claude-sonnet-4-20250514",
"max_tokens": 4096,
"temperature": 0.2,
"messages": [{"role": "user", "content": "TRANSCRIPT:\n{full_transcript}\n\nSTAKEHOLDER MAP:\n{name_1}: {title_1}, {role_1}\n{name_2}: {title_2}, {role_2}\n...\n\nFor EACH stakeholder who spoke in this call, extract:\n1. SENTIMENT: Positive, Neutral, Cautious, Negative, or Hostile toward the proposed solution\n2. SUPPORT_LEVEL: Champion (actively advocates), Supporter (positive but passive), Neutral, Skeptic (has concerns), Blocker (actively resists)\n3. TOP_PRIORITIES: 1-3 things this stakeholder cares most about (ranked by how much time they spent on each)\n4. CONCERNS: Specific objections, worries, or risks they raised (with direct quotes)\n5. QUESTIONS_ASKED: Key questions they asked (verbatim)\n6. DECISION_CRITERIA: What would need to be true for this stakeholder to say yes\n7. ENGAGEMENT_LEVEL: High (asked many questions, leaned in), Medium (participated when prompted), Low (quiet, checked out)\n8. RELATIONSHIP_TO_OTHERS: Any dynamics observed between stakeholders (agreements, disagreements, deference)\n9. KEY_QUOTE: The single most revealing thing this stakeholder said (verbatim)\n\nAlso extract:\n- CONSENSUS_AREAS: Topics where all stakeholders agreed\n- CONFLICT_AREAS: Topics where stakeholders disagreed or had competing priorities\n- UNRESOLVED: Questions or concerns that were raised but not addressed\n\nReturn as JSON:\n{\n \"stakeholders\": [{\"name\": \"...\", \"sentiment\": \"...\", \"support_level\": \"...\", \"top_priorities\": [...], \"concerns\": [...], \"questions_asked\": [...], \"decision_criteria\": [...], \"engagement_level\": \"...\", \"relationship_notes\": \"...\", \"key_quote\": \"...\"}],\n \"consensus_areas\": [...],\n \"conflict_areas\": [...],\n \"unresolved\": [...]\n}"}]
}
3. Parse and validate
Extract the JSON response. Validate:
- Every stakeholder from the map who spoke is represented
- Sentiments are one of the 5 defined levels
- Key quotes are actual verbatim excerpts from the transcript (spot-check 2-3)
- Conflict areas match actual disagreements in the transcript
4. Store in CRM
Push per-stakeholder sentiment to Attio using attio-custom-attributes:
{
"data": {
"values": {
"stakeholder_sentiment": [{"option": "{sentiment}"}],
"stakeholder_support_level": [{"option": "{support_level}"}],
"stakeholder_priorities": [{"value": "{priorities_json}"}],
"stakeholder_concerns": [{"value": "{concerns_json}"}],
"engagement_level": [{"option": "{engagement_level}"}]
}
}
}
Store the full extraction as an Attio note on the deal with tag stakeholder-sentiment.
5. Track sentiment changes over time
When extracting sentiment from subsequent calls, compare to prior extractions:
- Sentiment improved: positive signal, the stakeholder is warming
- Sentiment degraded: risk signal, something went wrong since last interaction
- New concern raised: flag for follow-up
- Prior concern resolved: remove from active risk list
Log changes as PostHog events: stakeholder_sentiment_changed with properties {stakeholder_role, old_sentiment, new_sentiment, deal_id}.
Via Gong
If using Gong instead of Fireflies:
- Use
gong-call-recordingto retrieve the transcript - Gong provides its own speaker identification and key topic detection
- Use the same Claude API prompt above with Gong's transcript format
Tool Alternatives
| Tool | Method | Notes | |------|--------|-------| | Anthropic Claude | Messages API | Best for nuanced multi-stakeholder extraction | | OpenAI GPT-4 | Chat Completions API | Good alternative | | Gong | Native deal intelligence | Tracks stakeholder engagement automatically | | Chorus.ai (ZoomInfo) | Call intelligence | Similar native stakeholder tracking | | Fireflies + Claude | Transcription + API | Most flexible, works with any video platform |
Error Handling
- Speakers not identified: If the transcript does not label speakers, use Claude to infer speakers from context (title mentions, voice patterns described, topic expertise). Accuracy drops to ~70% without labels.
- Large group calls (6+ participants): Some stakeholders may barely speak. Flag anyone with <5% of speaking time as
engagement_level: Lowand note that sentiment assessment has low confidence. - Conflicting signals: A stakeholder who asks tough questions but then says "this looks promising" is likely a Cautious Supporter, not a Blocker. Use the overall arc of the conversation, not isolated quotes.
- API token limits: For calls >90 minutes, split the transcript into 30-minute chunks and run extraction per chunk, then merge results with a final consolidation call.