Разработка AI-системы автообзвона клиентов для подтверждения заказов
Автообзвон подтверждения заказов — один из первых массовых кейсов голосовых ботов в e-commerce РФ. Снижает долю незабранных заказов (unconfirmed orders) с 15–25% до 5–8%, автоматизируя операционную функцию без потери качества.
Бизнес-логика автообзвона
from datetime import datetime, timedelta
class OrderConfirmationCampaign:
CALL_TRIGGERS = {
"new_order": timedelta(minutes=30), # через 30 мин после оформления
"unpaid_order": timedelta(hours=2), # если не оплачен через 2 ч
"address_change": timedelta(minutes=10), # немедленно при смене адреса
}
async def schedule_confirmation_call(self, order: dict) -> None:
trigger_type = self.detect_trigger(order)
delay = self.CALL_TRIGGERS.get(trigger_type, timedelta(hours=1))
await task_queue.schedule(
task="confirm_order_call",
args={"order_id": order["id"]},
eta=datetime.utcnow() + delay,
priority="high" if order["total"] > 5000 else "normal"
)
async def execute_confirmation_call(self, order_id: str) -> dict:
order = await orders_api.get(order_id)
# Проверяем актуальность — не подтверждён ещё?
if order["status"] not in ["pending", "awaiting_confirmation"]:
return {"skipped": True, "reason": "already_processed"}
# Инициируем звонок
call_result = await voice_bot.call(
phone=order["customer_phone"],
script="order_confirmation",
context=self.build_context(order)
)
# Обновляем заказ
if call_result["outcome"] == "confirmed":
await orders_api.confirm(order_id)
elif call_result["outcome"] == "cancelled":
await orders_api.cancel(order_id, reason="customer_request")
elif call_result["outcome"] == "address_changed":
await orders_api.update_address(order_id, call_result["new_address"])
return call_result
Варианты исходов звонка
CONFIRMATION_OUTCOMES = {
"confirmed": "Заказ подтверждён — обновляем статус, запускаем логистику",
"cancelled": "Заказ отменён по желанию клиента",
"address_changed": "Адрес изменён — обновляем, переподтверждаем",
"reschedule": "Клиент просит перенести доставку — обновляем дату",
"no_answer": "Нет ответа — добавляем в retry-очередь",
"wrong_number": "Неверный номер — помечаем для ручной обработки",
"transferred": "Сложный вопрос — передаём оператору",
}
Retry-стратегия
RETRY_SCHEDULE = [
timedelta(minutes=30), # первый retry
timedelta(hours=2), # второй retry
timedelta(hours=6), # третий retry
# После 3 неудачных попыток — SMS + ручная обработка
]
async def handle_no_answer(order_id: str, attempt: int):
if attempt < len(RETRY_SCHEDULE):
await task_queue.schedule(
task="confirm_order_call",
args={"order_id": order_id, "attempt": attempt + 1},
eta=datetime.utcnow() + RETRY_SCHEDULE[attempt]
)
else:
await sms.send(order_id)
await notify_operations_team(order_id)
ROI расчёт
- Операторский звонок: ~50–80 руб. (включая FTE)
- Bot звонок: ~5–15 руб.
- 10 000 заказов/месяц × 30% требуют подтверждения × экономия 45 руб. = 135 000 руб./месяц
Сроки: MVP бота подтверждения — 2–3 недели. С retry-логикой и CRM — 4–6 недель.







