Skip to main content

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:

MetricBeforeAfterImprovement
Avg Handle Time (AHT)5:303:45-32%
First Call Resolution (FCR)68%85%+25%
Customer Satisfaction (CSAT)7.2/108.9/10+24%
Repeat Call Rate22%12%-45%
Agent Efficiency8 calls/hr11 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


Ready to reduce handle time and improve CSAT? Sign up for free →