Use cases at a glance
Support is both a churn signal and a retention lever. Accounts with escalating ticket volume, aging SLA tickets, or declining CSAT are likely to churn — unless your team intervenes early. Combine support signals with usage data to create a holistic customer health score.
📈 Ticket Volume Spikes
Alert when daily ticket volume jumps above baseline. Indicates customer frustration or product issues.
⏰ SLA Aging Alerts
Flag tickets that have exceeded SLA without resolution. Different SLAs per tier (48h for free, 24h for growth, 4h for enterprise).
❤️ Customer Health Score
Combine support signals (ticket volume, SLA, CSAT) with usage signals (DAU, login recency, feature adoption) into one 0-100 score.
📊 CSAT Trend Monitoring
Track satisfaction scores per account and alert when an account's CSAT drops >20 points year-over-year.
🚨 Multi-Ticket Accounts
Flag accounts with 5+ open tickets. High volume + extended age signals systemic customer dissatisfaction.
Connecting Intercom or Zendesk
Both platforms offer REST APIs for ticket and conversation data. Choose based on your support setup:
|
| | Platform | Auth Method | Setup Steps |
| Intercom | Access Token (OAuth) | (1) Go to Settings → Developers → Your apps → Create app. (2) Add 'Conversations' scope. (3) Install app, copy Access Token. (4) Store as INTERCOM_ACCESS_TOKEN in secrets.env |
| Zendesk | API Token | (1) Go to Admin → Apps & integrations → Zendesk API. (2) Enable API token auth. (3) Click 'Settings'. (4) Generate new token. (5) Store email + token as ZENDESK_EMAIL and ZENDESK_API_TOKEN in secrets.env |
✅ Recommended: Zendesk has more mature SLA tracking and reporting APIs. If you're starting fresh, Zendesk is easier to configure with OpenClaw. Intercom is stronger if you want unified customer conversations in one platform.
Ticket volume spike detection
Monitor your daily ticket volume and alert when it spikes above a threshold. This can signal a product incident, new customer onboarding friction, or a single angry customer.
agents:
ticket-volume-monitor:
description: "Alert when daily ticket volume exceeds baseline"
tools:
- zendesk-api
config:
zendesk_email: "${ZENDESK_EMAIL}"
zendesk_api_token: "${ZENDESK_API_TOKEN}"
lookback_days: 14 # compute baseline from last 14 days
spike_threshold: 2.0 # alert if today > (14d avg × 2.0)
minimum_tickets: 3 # only alert if spike is >3 tickets anyway
exclude_statuses: ["solved", "closed"]
output:
format: markdown
include_top_tickets_by_age: true
urgency: high
heartbeats:
ticket-spike-watch:
schedule: "0 * * * *" # every hour
agent: ticket-volume-monitor
SLA aging alerts
Flag tickets that have passed their SLA without resolution. Configure different SLAs per plan tier so enterprise customers are prioritized.
agents:
sla-aging-alert:
description: "Flag tickets past SLA grouped by account and tier"
tools:
- zendesk-api
- stripe-api
config:
zendesk_email: "${ZENDESK_EMAIL}"
zendesk_api_token: "${ZENDESK_API_TOKEN}"
stripe_key: "${STRIPE_RESTRICTED_KEY}"
tier_slas:
- plan_name: "free"
sla_hours: 48
- plan_name: "growth"
sla_hours: 24
- plan_name: "enterprise"
sla_hours: 4
exclude_statuses: ["solved", "closed", "pending"]
alert_on:
- first_response_sla_breached: true
- resolution_sla_breached: true
output:
format: markdown
include_response_time_stats: true
group_by_tier: true
heartbeats:
sla-aging-check:
schedule: "0 * * * *" # every hour
agent: sla-aging-alert
Customer health scoring
Combine support signals (ticket volume, SLA, CSAT) with usage signals (DAU, login recency, feature adoption) into one 0-100 health score. Accounts under 40 are flagged as at-risk.
agents:
customer-health-scorer:
description: "Score customer health from support + usage signals"
tools:
- zendesk-api
- stripe-api
- analytics-api
config:
zendesk_email: "${ZENDESK_EMAIL}"
zendesk_api_token: "${ZENDESK_API_TOKEN}"
stripe_key: "${STRIPE_RESTRICTED_KEY}"
analytics_platform: "mixpanel" # or posthog, amplitude, postgres
support_signals:
open_ticket_count:
weight: 0.4
scales: [
{threshold: 1, score: 100},
{threshold: 5, score: 70},
{threshold: 10, score: 40},
{threshold: 20, score: 10}
]
sla_breaches_this_month:
weight: 0.3
scales: [{threshold: 0, score: 100}, {threshold: 1, score: 50}, {threshold: 3, score: 20}]
csat_trend:
weight: 0.3
scales: [{min: 4.5, score: 100}, {min: 4.0, score: 80}, {min: 3.5, score: 60}]
usage_signals:
days_since_login:
weight: 0.5
scales: [{threshold: 0, score: 100}, {threshold: 7, score: 60}, {threshold: 30, score: 10}]
monthly_active_users_trend:
weight: 0.3
scales: [{drop: 0, score: 100}, {drop: 0.25, score: 70}, {drop: 0.5, score: 40}]
feature_adoption:
weight: 0.2
scales: [{adoption: 0.75, score: 100}, {adoption: 0.5, score: 70}]
tier_weights:
- plan: "free"
support_weight: 0.2
usage_weight: 0.8
- plan: "growth"
support_weight: 0.4
usage_weight: 0.6
- plan: "enterprise"
support_weight: 0.6
usage_weight: 0.4
at_risk_threshold: 40
output:
format: markdown
include_signal_breakdown: true
include_at_risk_accounts: true
heartbeats:
health-scores-daily:
schedule: "0 9 * * *" # 9am daily
agent: customer-health-scorer
CSAT trend monitoring
Track customer satisfaction scores and alert when an account's CSAT drops sharply or falls below a target (e.g., <4.0 stars).
agents:
csat-trend-monitor:
description: "Monitor CSAT per account and alert on drops"
tools:
- zendesk-api
- stripe-api
config:
zendesk_email: "${ZENDESK_EMAIL}"
zendesk_api_token: "${ZENDESK_API_TOKEN}"
lookback_days: 30
minimum_responses: 5 # only calculate CSAT if 5+ surveys
alert_on:
- absolute_drop: 0.5 # alert if CSAT drops 0.5+ stars this month vs last
- below_target: 4.0 # alert if current CSAT < 4.0
- drop_percentage: 0.20 # alert if drops 20% yoy
exclude_archived_accounts: true
output:
format: markdown
include_trend_chart: true
heartbeats:
csat-watch:
schedule: "0 10 * * *" # 10am daily
agent: csat-trend-monitor
Accounts with multiple open tickets
Flag accounts with 5+ open tickets, especially with tickets older than 7 days. This signals potential customer dissatisfaction that needs immediate CS attention.
agents:
multi-ticket-detector:
description: "Flag accounts with multiple long-standing open tickets"
tools:
- zendesk-api
- stripe-api
config:
zendesk_email: "${ZENDESK_EMAIL}"
zendesk_api_token: "${ZENDESK_API_TOKEN}"
stripe_key: "${STRIPE_RESTRICTED_KEY}"
alert_on:
- open_ticket_count_threshold: 5
- oldest_open_ticket_days: 7
group_by: "requester_email" # aggregate per customer
include_mrr: true # show revenue impact
output:
format: markdown
include_priority_ranking: true
heartbeats:
multi-ticket-watch:
schedule: "0 8 * * *" # 8am daily
agent: multi-ticket-detector
HEARTBEAT templates
heartbeats:
# Ticket spike watch — hourly
spike-watch:
schedule: "0 * * * *"
agent: ticket-volume-monitor
# SLA aging — hourly
sla-watch:
schedule: "0 * * * *"
agent: sla-aging-alert
# Customer health scores — daily at 9am
health-scores:
schedule: "0 9 * * *"
agent: customer-health-scorer
# CSAT monitoring — daily at 10am
csat-watch:
schedule: "0 10 * * *"
agent: csat-trend-monitor
# Multi-ticket alerts — daily at 8am
multi-ticket-check:
schedule: "0 8 * * *"
agent: multi-ticket-detector
Sample health report
## Customer Health Report — Thursday, March 26, 2026
**Summary:** 47 accounts scored. 8 flagged as at-risk (score <40). 3 critical (score <20).
### 🔴 CRITICAL — Immediate Action Needed
1. **Acme Corp** — Health: 15/100
- Support: 8/100 (12 open tickets, 3 SLA breaches, 3.2★ CSAT)
- Usage: 35/100 (28 days since login, DAU down 60%, 1 feature adopted)
- MRR: $2,400 | Action: CS contact + product check-in TODAY
2. **Brightfield Inc** — Health: 22/100
- Support: 45/100 (6 open, 1 SLA breach, 4.1★ CSAT)
- Usage: 5/100 (42 days since login, no DAU, 0 features)
- MRR: $1,200 | Action: Account owner outreach, consider success plan
### 🟡 HIGH RISK — Follow Up This Week
3. **TechVenture Labs** — Health: 38/100
4. **Startup XYZ** — Health: 36/100
5. **Mid-Market Corp** — Health: 35/100
### 🟢 HEALTHY (47 accounts)
- Avg support score: 78/100
- Avg usage score: 82/100
- Avg combined health: 79/100
FAQ
Should I use Intercom or Zendesk with OpenClaw?
Zendesk is better if your team needs advanced routing, reporting, and multi-channel support (email, chat, phone, social). Intercom is better if you want a unified customer platform with in-app messaging and automated workflows. For SLA tracking, Zendesk has more mature native SLA rules. For customer health scoring combined with in-app messaging, Intercom is stronger. Most OpenClaw teams use Zendesk for the API maturity and SLA integration.
What makes a customer 'healthy' vs 'at-risk'?
Healthy customers combine positive support signals (fast response times, low ticket volume, high CSAT) with positive usage signals (daily logins, feature adoption, no usage drop). At-risk customers show one or both: (1) support red flags (multiple open tickets, SLA breaches, declining CSAT), or (2) usage red flags (zero logins, usage drop >50%, feature gaps). The customer health score weights both sets of signals. A customer with 50+ open tickets but high usage is medium-risk; a customer with 2 open tickets but zero logins is high-risk.
How do I combine support + usage signals into one health score?
The customer-health-scorer agent queries both Zendesk and your analytics platform (Mixpanel, PostHog, Amplitude). It computes a support score (weighted by ticket volume, SLA aging, CSAT) and a usage score (weighted by DAU, feature adoption, login recency). Each score is 0-100. Final health = (support_score × 0.4) + (usage_score × 0.6), adjustable by tier (free customers weight usage higher, enterprise weight support higher). Accounts scoring below 40 are flagged as at-risk.