name: nepq-phase-analyzer description: "Analyze call transcripts for NEPQ phase transitions and conversation flow. Use when: (1) Debugging why a call stalled, (2) Understanding objection patterns, (3) Reviewing agent performance, (4) Identifying script improvements, (5) Training analysis"
NEPQ Phase Analyzer
Parses call transcripts, maps turns to NEPQ phases, detects transition issues, and provides actionable insights.
Commands
/analyze-call [call_id]— Analyze specific call from Supabase/analyze-call --transcript [text]— Analyze pasted transcript/analyze-call --file [path]— Analyze transcript file/analyze-calls --recent [n]— Analyze last N calls/analyze-calls --failed— Analyze calls that didn't reach commitment
Reference Files
references/phase-patterns.md— NEPQ phase signatures and detection rulesreferences/objection-taxonomy.md— Objection classification system
NEPQ Phases Reference
| Phase | Purpose | Key Signals |
|---|---|---|
| CONNECTING | Pattern interrupt, get permission | "bad time", "homeowner", "speaking with" |
| SITUATION_ASSESSMENT | Understand current state | "how long owned", "living there", "currently" |
| PROBLEM_AWARENESS | Surface and amplify pain | "challenge", "frustrating", "affecting", "difficult" |
| SOLUTION_AWARENESS | Explore options tried | "looked into", "considered", "tried" |
| CONSEQUENCE_PHASE | Create urgency | "what happens if", "another year", "continue" |
| COMMITMENT_CHECK | Get micro-commitments | "make sense", "send info", "schedule", "next step" |
Analysis Output
Phase Timeline
Shows how conversation moved through phases:
Call Timeline: call_abc123 (2:35 duration)
═══════════════════════════════════════════
Turn 1 [0:00] CONNECTING
Bot: "Hey, did I catch you at a bad time?"
User: "No, go ahead."
→ Micro-commitment detected (+1)
Turn 2 [0:08] CONNECTING
Bot: "Great. Am I speaking with the homeowner at 123 Main St?"
User: "Yeah, that's me."
→ Micro-commitment detected (+1)
Turn 3 [0:15] SITUATION_ASSESSMENT ← Phase advanced
Bot: "How long have you owned the property?"
User: "About three years now."
Turn 4 [0:22] SITUATION_ASSESSMENT
Bot: "Is anyone living there currently?"
User: "No, it's been vacant for a while."
Turn 5 [0:30] PROBLEM_AWARENESS ← Phase advanced
Bot: "What's been the biggest challenge with it being vacant?"
User: "Honestly, it's a money pit. I'm behind on taxes."
→ Pain discovered: "behind on taxes"
...
Phase Analysis Summary
Phase Progression Analysis
══════════════════════════
Phases Reached: 5/6
✓ CONNECTING (2 turns)
✓ SITUATION_ASSESSMENT (3 turns)
✓ PROBLEM_AWARENESS (4 turns) ← Longest phase
✓ SOLUTION_AWARENESS (2 turns)
✓ CONSEQUENCE_PHASE (2 turns)
✗ COMMITMENT_CHECK (not reached)
Issues Detected:
⚠ Stalled in PROBLEM_AWARENESS (4 turns, max recommended: 3)
⚠ Call ended before commitment phase
Objections Raised: 1
• "I want to think about it" → Handled with isolation question
Pain Points Discovered: 2
• "behind on taxes"
• "money pit"
Micro-commitments: 4
• "go ahead" (turn 1)
• "that's me" (turn 2)
• "makes sense" (turn 7)
• "fair enough" (turn 9)
Recommendations
Recommendations for Improvement
═══════════════════════════════
1. PROBLEM_AWARENESS was too long (4 turns)
→ Recommendation: After discovering 2 pain points, advance to
SOLUTION_AWARENESS. Don't over-explore once pain is clear.
2. Call ended during CONSEQUENCE_PHASE
→ Recommendation: The "think about it" objection should have
been followed by commitment attempt. Example:
"Totally understand. Before you think it over, would it help
if I sent you some info on how this works? No commitment."
3. Good: Pain discovery was effective
→ "behind on taxes" emerged organically from situation question
4. Good: Micro-commitment rate was healthy (4 in 11 turns)
Usage Examples
Analyze Specific Call
User: /analyze-call call_abc123
Claude: Fetching transcript from Supabase...
[Shows full analysis as above]
Analyze Recent Failures
User: /analyze-calls --failed --recent 5
Claude: Analyzing 5 most recent calls that didn't reach commitment...
Call 1 (call_xyz): Stalled at CONNECTING (prospect hung up)
Issue: No pattern interrupt - jumped straight to pitch
Call 2 (call_abc): Stalled at PROBLEM_AWARENESS
Issue: Didn't discover pain, only asked situation questions
Call 3 (call_def): Reached CONSEQUENCE but lost
Issue: "Think about it" objection not properly isolated
Common Patterns:
- 3/5 calls had inadequate pattern interrupts
- 2/5 calls failed to discover genuine pain
- Average phase reached: SITUATION_ASSESSMENT
Recommendation: Focus on CONNECTING phase pattern interrupts
and deeper PROBLEM_AWARENESS questioning.
Analyze Pasted Transcript
User: /analyze-call --transcript
Bot: Hey John, did I catch you at a bad time?
User: What is this about?
Bot: I'm calling about your property on Main Street...
Claude: Analyzing transcript...
Phase Analysis:
Turn 1: CONNECTING - Pattern interrupt delivered
Turn 2: CONNECTING - Prospect asked clarifying question
→ Note: Prospect didn't give clear permission yet.
Should have answered question then re-asked for permission.
Issue: Moved forward without explicit permission
Objection Analysis
The analyzer categorizes objections by type:
| Category | Examples | Handling Strategy |
|---|---|---|
| Price | "How much?", "What's your offer?" | Deflect, continue discovery |
| Competition | "I have a realtor", "Someone else called" | Differentiate, explore gaps |
| Timing | "Call me back", "Think about it" | Isolate, soft close |
| Trust | "How do I know you're legit?" | Social proof, transparency |
| Ownership | "Not the owner", "Renting" | Verify, redirect or exit |
Objection Handling Score
Objection Handling Analysis
═══════════════════════════
Total objections: 3
Successfully handled: 2 (67%)
Objection 1: "How much are you offering?"
Category: Price
Response: "Great question. To give you an accurate number, I'd need to
understand more about the property's condition..."
Result: ✓ Successfully deflected, returned to discovery
Objection 2: "I want to think about it"
Category: Timing
Response: "Totally understand. When you say think about it, is it the
timing or is there something specific you're unsure about?"
Result: ✓ Successfully isolated concern
Objection 3: "I'm not interested"
Category: Rejection
Response: "I appreciate that. Just curious, what would change your mind?"
Result: ✗ Prospect hung up
Score: 67% (2/3)
Benchmark: 60% (above average)
Script Integration
Run analysis programmatically:
# Analyze single call
python skills/nepq-phase-analyzer/scripts/analyze_call.py --call-id call_abc123
# Analyze with JSON output
python skills/nepq-phase-analyzer/scripts/analyze_call.py --call-id call_abc123 --json
# Batch analysis
python skills/nepq-phase-analyzer/scripts/analyze_call.py --recent 10 --output report.json
Database Schema Expected
The analyzer expects these fields in conversation_transcripts:
SELECT
call_id,
lead_id,
turns, -- JSONB array of {speaker, text, timestamp}
phases, -- JSONB array of phase transitions
metrics, -- JSONB with micro_commitments, objections, etc.
created_at
FROM conversation_transcripts
WHERE call_id = 'call_abc123';