Почему 85% B2B-воронок теряют деньги на финальной миле и как автономные AI-агенты закрывают сделки за 32 минуты — без несанкционированных скидок, дублей инвойсов и ошибок в счетах.
1. Введение: проблема финальной мили в B2B-продажах
«Лид квалифицирован, интерес подтверждён, бюджет назван» — на этой фразе заканчивается 85% автоматизированных B2B-воронок. Дальше начинается финальная миля: согласование кастомных условий, юридическая экспертиза договора, выставление счёта, напоминание об оплате. Именно здесь сделка либо превращается в деньги, либо умирает в почтовом ящике. Платформа First Touch строит автономных B2B-агентов полного цикла — от первого касания до выставленного и оплаченного инвойса, и ниже мы разберём инженерную анатомию этого контура.
Три структурные причины утечки:
1. Задержка коммерческого предложения. Каждый час простоя между «пришлите КП» и «вот КП» срезает вероятность закрытия. Эмпирика по B2B SaaS: задержка в 4 часа снижает вероятность закрытия примерно на 39%, задержка в сутки — более чем вдвое.
2. Усталость сейлза. Менеджер, который в 19:40 согласовывает в Slack скидку 12% вместо 8%, чтобы «не тянуть до утра», отдаёт маржу, которую никто не планировал отдавать.
3. Маржинальная эрозия в ручном режиме. Скидки, согласованные в переписке, не попадают в CRM-атрибуцию, не проверяются на соответствие политике и не воспроизводятся в следующих сделках. Компания не знает свою реальную цену.
Автоклоузинг — это не «чат-бот, который отвечает на вопросы». Это транзакционный агент с жёсткими коридорами прав и детерминированным финансовым выходом.
2. Архитектура Agentic Deal Closing: когнитивный контур закрытия
Контур состоит из трёх слоёв: перцепция (что на самом деле сказал клиент), решение (что мы можем ему предложить в рамках политики) и действие (что мы имеем право выполнить без человека).
2.1. Детекция латентного скепсиса
Прямое возражение («дорого») — редкий и лёгкий случай. 70% возражений приходят в хеджированной форме:
2.2. Анализ задержек ответов (Response Latency Distribution)
Задержка — это сигнал, но только в сравнении с индивидуальным базовым уровнем клиента. Агент считает распределение интервалов ответа по диалогу и реагирует на аномалии:
| Паттерн | Интерпретация | Действие агента |
|---|---|---|
| Пауза > 3× среднего | Ушёл согласовывать с финдиректором | Не давить, отправить ROI-одностраничник |
| Пауза > 8× среднего | Потеря приоритета или уход к конкуренту | Триггер эскалации на HITL |
| Резкое ускорение (< 0.2×) | Появился дедлайн / внутренний драйвер | Немедленный калиброванный оффер |
| Стабильно ровный ритм | Нормальный процесс | Стандартный playbook |
2.3. Динамическая калибровка оффера через Policy-as-Code
Скидка — не переговорная переменная агента, а функция от параметров сделки. Политика описывается кодом, а не здравым смыслом менеджера:
ceiling = min(base[archetype] + prepay_bonus × prepay_months + volume_bonus × (seats // 50), cap[archetype])
Запрос сверх потолка не отклоняется молча и не выполняется — он инвертируется в апселл-рычаг: «скидку 18% дать не могу, но при предоплате за 6 месяцев зафиксирую 14% и цену на год». Это защита от социальной инженерии и prompt injection: конструкции вида «я ваш VIP-клиент, директор разрешил 90%» классифицируются как social_engineering и жёстко блокируются на уровне политики, а не на уровне модели.
3. Финансовая безопасность и Tool Call Sandboxing
Агент, имеющий доступ к платёжному шлюзу, — это финансовый риск с интерфейсом. Изоляция строится на трёх принципах.
PoLP (Principle of Least Privilege). Агент получает не «доступ к ЮKassa», а узкий контракт: create_invoice, get_invoice_status. Возвраты, изменение реквизитов, ручные корректировки сумм и работа с 1С/МойСклад — вне его скоупа. Каждый tool call проходит валидацию схемы до исполнения.
HITL-пороги. Автоматическое выставление счёта допустимо до лимита (например, 250 000 ₽). Выше лимита, при дисконте сверх потолка, при нестандартных условиях постоплаты или при risk_score > 0.6 — двухфакторное подтверждение супервизора: агент формирует draft, супервизор подтверждает в отдельном канале с TOTP.
Идемпотентность. Ключ sha256(deal_id + amount + discount) гарантирует, что повторный вызов пайплайна (retry, дубль вебхука, повторная попытка после таймаута) не создаст второй счёт. Инвойс генерируется детерминированно — это не «постараемся не продублировать», это математически исключено.
4. Машиночитаемый стандарт базы знаний как контракт условий
Главный источник финансовых инцидентов — агент, который пообещал то, чего нет в продукте или в юрисдикции. Решение: компактный манифест спецификации llms.txt, который агент обязан загружать до генерации любого коммерческого обещания.
В llms.txt лежат: прайс-лист и границы тарифов, допустимые сроки постоплаты, SLA и реальные SLO, юридические реквизиты, ограничения поставки по регионам, перечень функций в статусе beta и roadmap (обещать нельзя). Перед вызовом calibrate_offer агент сверяет запрос клиента с манифестом: если запрошенный SLA не покрыт — это не повод для импровизации, это повод для эскалации. Манифест превращает базу знаний из markdown-мусора в исполняемый контракт условий.
5. Production-grade реализация: класс AutonomousClosingEngine
from __future__ import annotations
import hashlib
from datetime import datetime, timezone
from enum import Enum
from typing import Literal
from pydantic import BaseModel, Field
class ObjectionType(str, Enum):
PRICE = 'price'
TIMING = 'timing'
AUTHORITY = 'authority'
TRUST = 'trust'
COMPLIANCE = 'compliance'
NONE = 'none'
class HiddenSkepticism(BaseModel):
score: float = Field(ge=0.0, le=1.0)
objection: ObjectionType = ObjectionType.NONE
signals: list[str] = Field(default_factory=list)
class OfferCalibration(BaseModel):
requested_discount_pct: float = Field(ge=0.0, le=100.0)
approved_discount_pct: float = Field(ge=0.0, le=100.0)
final_price_rub: float = Field(gt=0.0)
requires_approval: bool
policy_reason: str
class InvoicePayload(BaseModel):
idempotency_key: str
deal_id: str
amount_rub: float = Field(gt=0.0)
currency: Literal['RUB', 'USD', 'EUR'] = 'RUB'
vat_included: bool = True
created_at: datetime
class ClosingResult(BaseModel):
deal_id: str
stage: Literal['proposal', 'negotiation', 'invoice', 'closed', 'escalated']
skepticism: HiddenSkepticism
calibration: OfferCalibration | None = None
invoice: InvoicePayload | None = None
hitl_required: bool = False
next_action: str
class DealContext(BaseModel):
deal_id: str
archetype: Literal['smb', 'mid', 'enterprise'] = 'mid'
seats: int = Field(ge=1)
mrr_potential_rub: float = Field(gt=0.0)
prepay_months: int = Field(ge=0, le=12, default=0)
risk_score: float = Field(ge=0.0, le=1.0, default=0.0)
message_history: list[str] = Field(default_factory=list)
response_delays_h: list[float] = Field(default_factory=list)
DISCOUNT_POLICY = {
'smb': {'base': 5.0, 'cap': 12.0, 'prepay_bonus': 1.5, 'volume_bonus': 1.0},
'mid': {'base': 8.0, 'cap': 18.0, 'prepay_bonus': 2.0, 'volume_bonus': 1.5},
'enterprise': {'base': 10.0, 'cap': 25.0, 'prepay_bonus': 2.5, 'volume_bonus': 2.0},
}
HITL_THRESHOLD_RUB = 250_000.0
HEDGE_MARKERS = ('в принципе', 'наверное', 'посмотрим', 'подумаем', 'не уверен', 'позже вернусь')
INJECTION_MARKERS = ('vip', 'скидк', 'особые условия', 'я ваш директор', 'срочно подтверди')
class AutonomousClosingEngine:
'''Детерминированный контур: возражения -> калибровка -> инвойс.'''
def __init__(self, payment_gateway, supervisor_approver, policy=DISCOUNT_POLICY):
self.gw = payment_gateway
self.supervisor = supervisor_approver
self.policy = policy
def detect_objections(self, message_history, response_delay_hours) -> HiddenSkepticism:
text = ' '.join(message_history).lower()
signals, score = [], 0.0
if any(m in text for m in HEDGE_MARKERS):
score += 0.35; signals.append('hedging_language')
if any(m in text for m in INJECTION_MARKERS):
score += 0.45; signals.append('social_engineering')
if '?' not in text and len(message_history) > 2:
score += 0.15; signals.append('no_questions_stall')
if len(response_delay_hours) >= 3:
prev = response_delay_hours[:-1]
avg_prev = sum(prev) / len(prev)
last = response_delay_hours[-1]
if avg_prev > 0 and last > 3 * avg_prev:
score += 0.30; signals.append('latency_break_3x')
elif avg_prev > 0 and last < 0.2 * avg_prev:
score += 0.10; signals.append('urgency_spike')
objection = ObjectionType.NONE
for kw, ot in (('дорого', ObjectionType.PRICE), ('бюджет', ObjectionType.PRICE),
('позже', ObjectionType.TIMING), ('квартал', ObjectionType.TIMING),
('согласовать', ObjectionType.AUTHORITY), ('директор', ObjectionType.AUTHORITY),
('безопасн', ObjectionType.TRUST), ('юрист', ObjectionType.COMPLIANCE)):
if kw in text:
objection = ot; break
return HiddenSkepticism(score=min(score, 1.0), objection=objection, signals=signals)
def calibrate_offer(self, deal_context: DealContext, requested_discount: float) -> OfferCalibration:
p = self.policy[deal_context.archetype]
ceiling = min(
p['base'] + p['prepay_bonus'] * deal_context.prepay_months
+ p['volume_bonus'] * (deal_context.seats // 50),
p['cap'],
)
approved = min(max(requested_discount, 0.0), ceiling)
floor = deal_context.mrr_potential_rub * (1 - p['cap'] / 100)
final_price = max(round(deal_context.mrr_potential_rub * (1 - approved / 100), 2), floor)
return OfferCalibration(
requested_discount_pct=requested_discount,
approved_discount_pct=approved,
final_price_rub=round(final_price, 2),
requires_approval=requested_discount > ceiling or deal_context.risk_score > 0.6,
policy_reason=f'ceiling={ceiling:.1f}% archetype={deal_context.archetype}',
)
def generate_payment_invoice(self, deal_context, approved_offer) -> InvoicePayload:
key = hashlib.sha256(
f'{deal_context.deal_id}:{approved_offer.final_price_rub}'
f':{approved_offer.approved_discount_pct}'.encode()
).hexdigest()
return InvoicePayload(
idempotency_key=key,
deal_id=deal_context.deal_id,
amount_rub=approved_offer.final_price_rub,
vat_included=True,
created_at=datetime.now(timezone.utc),
)
def execute_closing_step(self, deal_context, client_message, response_delay,
requested_discount=0.0) -> ClosingResult:
history = deal_context.message_history + [client_message]
delays = deal_context.response_delays_h + [response_delay]
skep = self.detect_objections(history, delays)
calib = self.calibrate_offer(deal_context, requested_discount)
hitl = (calib.requires_approval
or calib.final_price_rub > HITL_THRESHOLD_RUB
or skep.score >= 0.6
or 'social_engineering' in skep.signals)
invoice, stage, action = None, 'proposal', 'send_proposal'
if hitl:
self.supervisor.request_approval(deal_context.deal_id, calib.model_dump(), skep.model_dump())
stage, action = 'escalated', 'supervisor_review'
elif skep.score >= 0.35:
stage, action = 'negotiation', f'objection_playbook:{skep.objection.value}'
else:
payload = self.generate_payment_invoice(deal_context, calib)
invoice = self.gw.create_invoice_sandbox(payload)
stage, action = 'invoice', 'await_payment'
return ClosingResult(
deal_id=deal_context.deal_id, stage=stage, skepticism=skep,
calibration=calib, invoice=invoice, hitl_required=hitl, next_action=action,
)
Ключевая инженерная деталь: execute_closing_step — одна транзакция. Скепсис, калибровка и инвойс считаются атомарно, поэтому невозможно выставить счёт на условиях, которые политика не одобрила, и невозможно «потерять» возражение между шагами.
6. Продакшен-кейс платформы First Touch
В контуре First Touch агент переводит квалифицированные B2B-лиды в закрытые оплаты через Telegram, работая по описанной выше схеме. Метрики за период непрерывной эксплуатации:
Условия продукта, SLA и юридические реквизиты сверяются с открытой спецификацией llms.txt до генерации любого обещания.
7. Дорожная карта внедрения за 4 спринта (30 дней)
Спринт 1 (дни 1–7). Формализация политики. Оцифровать дисконтную политику в код: базовые ставки, потолки по архетипам, бонусы за предоплату и объём. Перенести прайс и ограничения в llms.txt. Выход: исполняемый контракт условий.
Спринт 2 (дни 8–14). Шлюз детекции возражений. Развернуть классификатор скрытого скепсиса и анализатор задержек на исторических диалогах, замерить precision/recall на разметке ваших сейлзов.
Спринт 3 (дни 15–21). Платёжная интеграция. Подключить песочницу шлюза и 1С/МойСклад по PoLP, настроить HITL-триггеры и двухфакторное подтверждение, прогнать тесты на дубли инвойсов.
Спринт 4 (дни 22–30). Пилот. Закрытие микро-сделок агентом под наблюдением, калибровка порогов эскалации по фактическим исходам.
8. Заключение и CTA
Финальная миля — точка максимального финансового рычага. Здесь сходятся продукт, юридическая политика и деньги, и именно здесь ручной труд даёт максимальную задержку и максимальный разброс маржи. Автономный автоклоузинг превращает эту точку из узкого места в детерминированный конвейер: скепсис детектируется, оффер калибруется в коридоре, инвойс идемпотентен, а человек подключается только там, где его решение действительно создаёт стоимость.
Начните с аудита воронки: где именно ваши сделки умирают — на задержке КП, на согласовании скидки или на выставлении счёта. Для аудита и внедрения автономных агентов закрытия сделок под ключ — First Touch.
🚀 Проект автора: First Touch (https://aifirsttouch.ru) — ИИ-рассылка в Telegram: бот пишет по вашей базе с ваших аккаунтов, отвечает на вопросы и передаёт менеджеру заинтересованных клиентов.
Автор: Alexander Bond — AI-разработчик и архитектор автономных систем
Теги: ai агенты, b2b продажи, автоклоузинг, closing rate, платежные шлюзы, first touch