Repeat Caller Recognition
Instantly identify returning customers and provide personalized greetings to reduce handle time and improve satisfaction.
Business Problem
Scenario: Customer calls back about the same issue
Without context:
- Agent asks: "What can I help you with today?"
- Customer repeats entire story
- Agent searches for previous interaction
- Time wasted: 2-3 minutes
With Sticky Calls:
- System recognizes caller instantly
- Agent sees: "Customer called 2 days ago about billing issue"
- Agent: "Hi Sarah, I see you called about your billing question. Let me help you with that."
- Time saved: 2-3 minutes
ROI:
- ⏱️ 30% faster call resolution
- 📈 25% improvement in CSAT
- 💰 Reduced handle time = more calls handled
- 😊 Better customer experience
Implementation
1. Call Start - Identify Caller
curl -X POST https://api.stickycalls.com/v1/calls/start \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"call_id": "call_001",
"identity_hints": {
"ani": "+14155551234"
}
}'
Response (Returning Caller):
{
"call_id": "call_001",
"customer_ref": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"call_start": "2026-02-07T10:30:00.000Z",
"identity": {
"confidence": 0.95,
"level": "very_high",
"sources": ["ani:mobile", "recency:2day"],
"recommendation": "reuse"
},
"open_intents": [],
"variables": {
"last_issue": {
"value": "Duplicate billing charge - refund processed for $50",
"source": null,
"ttl_seconds": 2592000
}
}
}
2. Personalized IVR Greeting
Standard Greeting:
"Thank you for calling. Please hold while we connect you to the next available agent."
Personalized Greeting (High Confidence):
"Welcome back! I see you previously called about a billing issue. Let me connect you to our billing department."
Implementation:
IF identity.confidence >= 0.8:
Play: "Welcome back, {customer_name}!"
IF open_intents is empty:
Play: "I see your previous issue was resolved. How can I help you today?"
ELSE:
Play: "I see you previously called about {open_intents[0].intent}. Let me connect you to the right team."
Route to: Appropriate queue based on context
ELSE:
Play: Standard greeting
3. Agent Screen Pop
Display context immediately when call routes:
┌─ Caller History ─────────────────────┐
│ Name: Sarah Johnson │
│ Phone: +1 (415) 555-1234 │
│ │
│ Previous Context: │
│ "Called 2 days ago about duplicate │
│ billing charge. Refund processed │
│ for $50. Customer was satisfied." │
│ │
│ Last Call: Jan 26, 2025 2:30 PM │
│ Confidence: 95% │
│ Open Issues: None │
└───────────────────────────────────────┘
4. Agent Script
Opening: "Hi Sarah, I see you called us recently about a billing issue. The notes say we processed a $50 refund for you. Is there anything else I can help you with today?"
Benefits:
- Customer feels remembered
- No need to repeat information
- Faster resolution
- Higher satisfaction
Example Scenarios
Scenario 1: Follow-Up Call
Day 1 - Initial Call:
- Customer: "I was charged twice for my subscription"
- Agent: Processes $50 refund
- Context saved: "Duplicate charge - refunded $50"
Day 3 - Follow-Up:
- Customer calls back
- System recognizes caller (confidence: 92%)
- IVR: "Welcome back! I see your refund was processed. Let me connect you to billing."
- Agent sees full history immediately
- Agent: "Hi! Just checking - did you receive the $50 refund?"
- Customer: "Yes! I just wanted to confirm it won't happen again."
- Agent: Quick resolution with no story repetition
Result:
- Handle time: 2 minutes (vs. 5 minutes without context)
- CSAT: 9/10 (vs. 7/10 typical)
Scenario 2: Recurring Technical Issue
Week 1:
- Customer: Internet keeps disconnecting
- Agent: Troubleshooting steps attempted
- Context: "Internet disconnection - rebooted modem, issue persists"
Week 2:
- Customer calls again
- System shows previous troubleshooting
- Agent: "I see we tried rebooting the modem last week. Let's try the next step..."
- No wasted time re-attempting same fixes
Scenario 3: VIP Customer
Last Month:
- Customer: Enterprise account inquiry
- Context saved: "VIP - Enterprise tier, $50K/year account"
This Month:
- Customer calls
- System identifies as VIP (confidence: 100%)
- Auto-route to: Priority queue
- Agent sees VIP status immediately
- Personalized service from start
Configuration Examples
Five9 IVR Script
<!-- Get caller context -->
<WebConnector name="StickyCallsStart" />
<!-- Branch based on match -->
<Branch>
<Condition>matchFound = true AND confidence > 0.8</Condition>
<Then>
<PlayMessage>Welcome back! I see you previously called about $(context).</PlayMessage>
<RouteToQueue>$(recommendedQueue)</RouteToQueue>
</Then>
<Else>
<PlayMessage>Welcome to our contact center.</PlayMessage>
<Menu>Standard IVR menu</Menu>
</Else>
</Branch>
NICE CXone Studio
RESTful API Action: IdentifyCaller
↓
Branch on {matchFound} AND {confidenceScore} > 0.8
↓
TRUE: Play "Welcome back, we have your information"
Route to specialized queue
↓
FALSE: Standard greeting and menu
Generic IVR (Pseudocode)
# At call start
result = api.identify_caller(call_id, ani)
if result['match_found'] and result['confidence_score'] > 0.8:
play_audio("welcome_back.wav")
# Extract key info from context
if "billing" in result['context'].lower():
route_to_queue("billing_priority")
elif "technical" in result['context'].lower():
route_to_queue("technical_support")
else:
route_to_queue("general_priority")
# Show context to agent
screen_pop({
"previous_context": result['context'],
"last_call_date": result['last_call_at'],
"confidence": result['confidence_score']
})
else:
play_audio("standard_greeting.wav")
show_standard_menu()
Key Metrics
Track these KPIs to measure success:
| Metric | Before | After | Improvement |
|---|---|---|---|
| Avg Handle Time (AHT) | 5:30 | 3:45 | -32% |
| First Call Resolution (FCR) | 68% | 85% | +25% |
| Customer Satisfaction (CSAT) | 7.2/10 | 8.9/10 | +24% |
| Repeat Call Rate | 22% | 12% | -45% |
| Agent Efficiency | 8 calls/hr | 11 calls/hr | +38% |
Best Practices
1. Set Confidence Thresholds
> 0.9: Full personalization, auto-route
> 0.7: Personalization with verification
> 0.5: Show context to agent, standard flow
< 0.5: Treat as new caller
2. Save Rich Context
Bad:
"Issue resolved"
Good:
"Billing issue resolved. Customer reported duplicate charge for subscription ($50). Refund processed on 1/26. Customer confirmed satisfaction. No further action needed."
3. Update Context Throughout Call
Don't just save at the end - update as conversation progresses:
# During call
api.update_context(call_id, "Customer mentioned wanting to upgrade plan")
# At end
api.save_context(call_id, full_summary, open_intents)
4. Handle Low Confidence Gracefully
IF confidence 0.5-0.7:
Agent sees context (for reference)
BUT ask verification question:
"Before we begin, can I confirm your account number?"
5. Train Agents
Agent Training Points:
- How to interpret confidence scores
- When to trust automated context
- How to verify customer identity if uncertain
- How to write good context summaries
ROI Calculator
Assumptions:
- 10,000 inbound calls/month
- 30% are repeat callers (3,000 calls)
- 2 minutes saved per repeat caller
- Agent cost: $25/hour
Time Savings:
- 3,000 calls × 2 minutes = 6,000 minutes = 100 hours/month
- Annual: 1,200 hours
Cost Savings:
- 1,200 hours × $25 = $30,000/year
Sticky Calls Investment: View current pricing →
Massive ROI - Save thousands on handle time while improving customer satisfaction
Implementation Checklist
- Sign up for Sticky Calls API at stickycalls.com
- Get API key from dashboard
- Integrate /calls/start at beginning of call
- Parse response and set IVR variables
- Create personalized greeting for high-confidence matches
- Configure agent screen pop with context display
- Integrate /calls/end to save context
- Test with known phone numbers
- Train agents on new workflow
- Monitor metrics (AHT, CSAT, FCR)
- Iterate and optimize
Next Steps
- View API Reference - Complete endpoint documentation
- Five9 Integration - Platform-specific guide
- NICE CXone Integration - Platform-specific guide
- Proactive Callback Use Case - Another scenario
- Contact Support - Get help
Ready to reduce handle time and improve CSAT? Sign up for free →