VERIFIED CASE / 02 / 03

Как превратить разрозненные сообщения лида в проверяемый CRM-сигнал

CASE / WEBHOOK / LEAD QUALIFICATION

Лид редко присылает готовый бриф одним сообщением. Система должна безопасно накопить имя, задачу, бюджет, срок и контакт, пережить повторную доставку webhook и создать CRM-действие только один раз.

FORMAT
TECHNICAL CASE
PROJECT
Vibe
PUBLISHED

01 / CHALLENGE

Задача

Входящие сообщения приходят частями и могут дублироваться. Неподписанный запрос нельзя считать доверенным, а раннее создание сделки приводит к неполным карточкам и дублям. При этом демонстрационный MVP должен оставаться бесплатным и воспроизводимым.

02 / SOLUTION

Решение

FastAPI-сервис проверяет HMAC-SHA256 на исходных байтах webhook, нормализует событие, вычисляет стабильный ключ идемпотентности и накапливает бриф в SQLite. Детерминированные правила извлекают поля, задают следующий конкретный вопрос и при первом переходе в ready возвращают единственное разрешённое действие crm.deal.add.

03 / OUTCOME

Результат

Получился объяснимый квалификатор с типизированным API и контролируемой границей CRM. Повторная доставка возвращает сохранённый результат, а отсутствие внешней LLM делает тесты быстрыми, бесплатными и полностью воспроизводимыми.

ENGINEERING / DECISIONS

Ключевые решения

  1. 01

    HMAC по raw body

    Подпись проверяется до доверия к payload, а replay и размер тела ограничиваются на входе.

  2. 02

    Локальная идемпотентность

    Стабильный ключ события предотвращает повторное изменение состояния при повторной доставке.

  3. 03

    Whitelist действий

    Готовый бриф может вернуть только явно разрешённое crm.deal.add, а не произвольную CRM-команду.

VALIDATION / PUBLIC EVIDENCE

Что подтверждено

  • В публичном README зафиксирован успешный набор из 61 автоматического теста.
  • Официальный webhook self-test был доставлен с HTTP 200 и нулевой стоимостью.
  • HMAC, replay, ограничение тела и rate limiting проверены на постоянном HTTPS endpoint.
  • Секреты отсутствуют в репозитории и примерах конфигурации.