Введение:
Заказчик — разработчик CRM для застройщиков. У клиентов компании стоял отдельный сервис: забирал заявки из рекламных кабинетов Facebook и складывал их в CRM. Вёл его подрядчик со стороны — известная на рынке студия.
В какой-то момент подрядчик подвёл. Пятьдесят компаний остались без канала между рекламой и отделом продаж. Деньги на рекламу тратятся, заявки приходят, до менеджеров не доходят.
Когда встал вопрос, что делать с этими клиентами, я взял три дня на первую версию.
Дальше — интерфейс той самой первой версии, которая принимает заявки до сих пор. Названия компаний, имена и телефоны на снимках скрыты: данные компаний и заявок не показываются.

Ход работы:
Первая версия не похожа на то, что работает сейчас. Я взял самые простые методы, проверенные временем — по сути вручную настраиваемый алгоритм. Плоский PHP, никакой сборки, клиент заводится директорией на диске. Создал папку — получил адрес для вебхука.
Звучит грубо. Зато клиент подключается за минуту, а не через миграцию базы.



Первые месяцы проект выглядел закрытой админкой для команды внедрения и сопровождения. У клиента не было ничего, кроме оповещений в Telegram. Так и задумывалось: сначала надо было, чтобы заявки просто ходили.
Попутно закрылись дыры, которые прежний подрядчик не трогал годами. Сквозная разметка кампаний, теги, передача причин отказа обратно в рекламу, выбор установки CRM по стране — у компании их пять.
Пожар потушили. Дальше сервис несколько месяцев превращался в то, что стоит в бою сегодня — простой движок, раскачанный на максималках.

Заявка любой формы. Рекламные формы у всех разные: поля называются так, как придумал маркетолог. Если имя и телефон лежат в понятных полях, заявка идёт напрямую. Если нет — её разбирает языковая модель.
Модель работает на моём сервере. Это принципиально: в заявке лежат имя и телефон живого человека, и такие данные не должны покидать контур. Никаких облачных сервисов в этой цепочке нет — заявка от рекламного кабинета до CRM не показывается никому третьему.
Если и модель не справилась, работает третья ступень — разбор регулярками по сырым данным.


Доставка без потерь. Заявку принимает вебхук и кладёт в очередь, разбирает крон раз в минуту. Если CRM не ответила, заявка не теряется: повторные попытки идут с нарастающим интервалом — 15 минут, полчаса, час, три часа, восемь. Отдельно есть догрузка: если авария случилась раньше, чем починка, пропущенные заявки доезжают задним числом.
Дублей я боялся больше всего. Позвонить человеку дважды хуже, чем не позвонить. На каждой заявке стоит отметка о доставке — повторная попытка её видит и проходит мимо.

данные на 2 сентября 2026
57
подключённых компаний
77
рекламных страниц
3 423 формы сбора заявок
459 000+
обработанных заявок
~1 950
заявок в сутки
около 78 000 в месяц
100%
доставка без потерь
успешных за последнюю неделю наблюдения
Результат:
Сервис работает седьмой месяц. Пятьдесят семь компаний, семьдесят семь рекламных страниц, три с половиной тысячи форм.
Через него прошло больше 459 000 заявок. В сутки около двух тысяч. За последнюю неделю наблюдения не потерялась ни одна.
Сейчас запущена вторая версия: автооплата, личные кабинеты с настройками, централизованное управление.
Стек:
Backend — Laravel, PostgreSQL, очереди на Redis. Frontend — Vue и TypeScript. Разворачивается в Docker.