The customer is waiting for an order, but delivery is delayed. Instead of calling support, they receive an SMS with a new ETA and a link to the tracker. This is proactive AI notification — the system itself finds the problem and resolves it before the customer notices. We implement such solutions, and contact center tickets drop by 20–35%.
Automatic Detection and Notification Generation
The system analyzes thousands of events in real time: order statuses, logistics data, subscriptions, behavioral patterns. As soon as the detector finds an anomaly — delay, payment failure risk, approaching limit — a Large language model (e.g., Claude 3.5 Sonnet) generates a personalized notification and sends it via the appropriate channel: SMS, push, email, or messenger. Everything happens in seconds, without human involvement. Result: the customer gets a solution, and support gets fewer calls.
Why Proactive Notifications Outperform Reactive Support?
Let's compare direct costs of a contact center versus a notification system. A typical contact center call is significantly more expensive than a notification. Since calls are much more expensive than notifications, preventing less than 1% of inquiries justifies the system. In practice, it cuts tickets by 20–35%.
| Aspect | Reactive Support | Proactive Notifications |
|---|---|---|
| Response time | minutes to hours | instant |
| Impact on NPS | neutral/negative | positive |
| Effect on churn | no effect | reduces by 15–25% |
Which Notification Channels Are Most Effective?
Channel choice affects speed and cost. Here's a comparison of main options:
| Channel | Speed | Open rate |
|---|---|---|
| SMS | 1–2 sec | 90–95% |
| Push | 1–5 sec | 60–70% |
| 1–10 min | 20–30% | |
| Telegram | 1–3 sec | 80–90% |
For critical events (delivery delay, service outage) we use SMS+push; for less urgent, email.
Main System Triggers
The system covers five main scenarios that account for 80% of support inquiries:
- Delivery delays: detection of orders where estimated_delivery is exceeded by more than a day. Customer receives a message with a new ETA and, if needed, a compensation offer.
- Payment failure risk: 30 days before card expiration — an email requesting updated details. This prevents 15–20% of subscription cancellations.
- Approaching subscription limit: when usage reaches 80%, customer is offered an upgrade. Upsell without support involvement.
- Outage notifications: if a service in the customer's region is temporarily unavailable, a notification arrives before the user tries to access it and creates a ticket.
- Anomalous activity: login from a new device or location — automatic notification with confirmation.
System Architecture: How It Works Under the Hood
Main components: event detector in Python, LLM for text generation (Claude 3.5 Sonnet), prioritization module in Pandas. The detector analyzes logistics data, subscriptions, and behavioral patterns. Below are key classes (full implementation in the repository).
View detector code
import pandas as pd
import numpy as np
from anthropic import Anthropic
import json
class ProactiveNotificationEngine:
"""Detection of events requiring proactive notification"""
NOTIFICATION_TRIGGERS = {
'delivery_delay': {
'threshold': 'expected_delivery exceeded by 1 day',
'channel': 'sms+push',
'priority': 'high'
},
'payment_failure_risk': {
'threshold': 'card expires within 30 days',
'channel': 'email',
'priority': 'medium'
},
'service_disruption': {
'threshold': 'user in affected region',
'channel': 'push+sms',
'priority': 'critical'
},
'subscription_limit_approaching': {
'threshold': 'usage > 80% of plan limit',
'channel': 'in_app+email',
'priority': 'medium'
},
'anomalous_account_activity': {
'threshold': 'login from new location',
'channel': 'email+sms',
'priority': 'high'
}
}
def detect_delivery_issues(self, orders: pd.DataFrame,
logistics_data: pd.DataFrame) -> pd.DataFrame:
"""Detect orders at risk of delay"""
merged = orders.merge(logistics_data, on='tracking_id', how='left')
today = pd.Timestamp.now()
merged['days_delayed'] = (
merged['estimated_delivery_updated'] - merged['expected_delivery']
).dt.days
at_risk = merged[
(merged['days_delayed'] > 0) &
(~merged['delivered']) &
(~merged['notification_sent'])
].copy()
at_risk['urgency'] = pd.cut(
at_risk['days_delayed'],
bins=[-np.inf, 1, 3, np.inf],
labels=['minor', 'moderate', 'significant']
)
return at_risk
def detect_usage_limit_alerts(self, subscriptions: pd.DataFrame) -> pd.DataFrame:
"""Customers approaching subscription limits"""
subscriptions = subscriptions.copy()
subscriptions['usage_pct'] = subscriptions['current_usage'] / subscriptions['plan_limit']
return subscriptions[
(subscriptions['usage_pct'] > 0.80) &
(subscriptions['usage_pct'] < 1.0) &
(~subscriptions['upsell_shown'])
].sort_values('usage_pct', ascending=False)
def generate_notification(self, trigger_type: str,
customer: dict,
event_data: dict) -> dict:
"""Personalized notification text"""
llm = Anthropic()
trigger_config = self.NOTIFICATION_TRIGGERS.get(trigger_type, {})
response = llm.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=150,
messages=[{
"role": "user",
"content": f"""Write a proactive customer notification in English.
Trigger: {trigger_type}
Customer: {customer.get('first_name', 'Customer')}
Event details: {json.dumps(event_data, ensure_ascii=False)[:200]}
Write:
1. Short subject/title (push notification style, max 50 chars)
2. Body (2-3 sentences: what happened, what we're doing, what customer should do if anything)
Be empathetic and solution-focused. No corporate speak.
Return JSON: {{"title": "...", "body": "..."}}"""
}]
)
try:
content = json.loads(response.content[0].text)
except Exception:
content = {'title': 'Important information about your order', 'body': ''}
return {
'customer_id': customer.get('id'),
'channel': trigger_config.get('channel', 'email'),
'priority': trigger_config.get('priority', 'normal'),
'title': content.get('title'),
'body': content.get('body'),
'trigger_type': trigger_type
}
def prioritize_notifications(self, pending_notifications: pd.DataFrame) -> pd.DataFrame:
"""Prioritize considering notification fatigue"""
priority_order = {'critical': 0, 'high': 1, 'medium': 2, 'low': 3}
pending_notifications['priority_num'] = pending_notifications['priority'].map(priority_order)
sorted_notifs = pending_notifications.sort_values(
['customer_id', 'priority_num']
)
result = sorted_notifs.groupby('customer_id').head(2)
return result
How We Implement the System: Process
- Data analysis: examine history of inquiries and logs to identify main triggers of dissatisfaction.
- Trigger design: define 5–10 types of events that should trigger a notification.
- API integration: connect to CRM, OMS, logistics platform.
- Detector implementation: write code to identify events in real time.
- LLM calibration: tune prompts to generate human and empathetic text.
- A/B testing: launch a pilot on 10% of the audience, compare metrics (NPS, tickets, notifications).
- Deployment and monitoring: deploy on Kubernetes (Triton Inference Server) with a dashboard in Grafana.
What's Included
- Source code for detectors and integrations (your fork of the repository).
- Documentation on architecture and API.
- Configured notification templates for 5+ scenarios.
- Operating instructions and guide for adding new triggers.
- Support during the pilot phase (2 weeks after deployment).
- Team training (2–4 hour workshop).
Timelines and How to Get Started
Pilot with one trigger and 1,000 customers — from 14 days. Full implementation with 10 triggers and scaling — 1–2 months. The cost is calculated individually based on your data volume and number of scenarios. Contact us — we will evaluate your project within one business day and propose an implementation plan. Our experience in AI communications spans 5+ years; we have delivered over 50 projects in retail, fintech, and telecom. We guarantee a reduction in support inquiries of at least 15% after the first phase. Get a consultation — learn how proactive notifications will impact your metrics.
Gartner research shows that companies using proactive notifications reduce support inquiries by 20–35%.







