Разработка AI-системы автообзвона для возврата потерянных клиентов (Win-Back)
Win-back автообзвон обращается к клиентам, которые перестали пользоваться сервисом: выясняет причину ухода, предлагает персонализированный стимул возврата, фиксирует обратную связь. Конверсия в возврат: 5–15% в зависимости от отрасли.
Сегментация базы для Win-back
from enum import Enum
from datetime import datetime, timedelta
class ChurnReason(Enum):
PRICE = "price"
QUALITY = "quality"
COMPETITOR = "competitor"
LIFECYCLE = "lifecycle" # переехал, изменились потребности
SERVICE = "service" # плохой опыт обслуживания
class WinbackSegment(Enum):
RECENT_CHURNED = "0-30_days" # только ушли
MEDIUM_CHURNED = "31-90_days" # потенциально восстановимые
LONG_CHURNED = "91-180_days" # сложнее, нужен сильный оффер
HIGH_VALUE = "high_ltv" # VIP-клиенты — максимальный приоритет
async def segment_churned_customers(customers: list) -> dict[WinbackSegment, list]:
"""Сегментируем ушедших клиентов"""
now = datetime.utcnow()
segments = {seg: [] for seg in WinbackSegment}
for customer in customers:
days_since_last = (now - customer["last_activity"]).days
if customer["ltv"] > HIGH_VALUE_THRESHOLD:
segments[WinbackSegment.HIGH_VALUE].append(customer)
elif days_since_last <= 30:
segments[WinbackSegment.RECENT_CHURNED].append(customer)
elif days_since_last <= 90:
segments[WinbackSegment.MEDIUM_CHURNED].append(customer)
else:
segments[WinbackSegment.LONG_CHURNED].append(customer)
return segments
Персонализированный Win-back скрипт
WINBACK_SCRIPTS = {
WinbackSegment.RECENT_CHURNED: """
{name}, добрый день! Мы заметили, что вы давно не были с нами.
Хотим понять — всё ли было в порядке с нашим сервисом?
{personalized_issue_if_known}
Мы подготовили для вас специальное предложение: {offer}.
""",
WinbackSegment.HIGH_VALUE: """
{name}, здравствуйте! Вы были одним из наших лучших клиентов.
Для нас важно понять, что произошло, и сделать вам персональное предложение.
Наш менеджер хотел бы с вами поговорить — соединяю!
"""
}
async def build_personalized_offer(customer: dict) -> str:
"""Генерируем персональный оффер на основе истории клиента"""
last_products = customer.get("last_purchases", [])
avg_order = customer.get("avg_order_value", 0)
if avg_order > 10000:
return "скидку 20% на следующую покупку + бесплатную доставку"
elif last_products:
return f"специальную цену на {last_products[0]['category']}"
return "промокод на скидку 15%"
Анализ причин оттока
CHURN_REASON_PATTERNS = {
ChurnReason.PRICE: ["дорого", "цена", "дешевле", "конкурент предлагает меньше"],
ChurnReason.QUALITY: ["плохое качество", "бракованный", "не то заказал"],
ChurnReason.SERVICE: ["плохой сервис", "грубость", "долго ждать", "не дозвониться"],
}
async def detect_churn_reason(customer_response: str) -> ChurnReason:
response_lower = customer_response.lower()
for reason, patterns in CHURN_REASON_PATTERNS.items():
if any(p in response_lower for p in patterns):
return reason
return ChurnReason.LIFECYCLE
Сроки: win-back бот с базовым сценарием — 2–3 недели. С сегментацией и персонализацией офферов — 1.5 месяца.







