Перейти к содержимому

Собрал CRM, которая не путает найденную компанию со сделкой

Константин Потапов
7 мин

Пятого августа папка sales была пустая. Сейчас на sales.potapov.me закрытая бета: агент ищет сигналы, система требует доказательство, человек решает, кому писать.

Собрал CRM, которая не путает найденную компанию со сделкой

Я продаю услуги сам, поэтому сам ищу, кому они сейчас нужны. Хабр, вакансии, чужой пост про сорванный релиз, вакансия senior Python, которая висит 60 дней. Вечером это кажется работой. Утром половина уже шум: ссылку не сохранил, дату не записал, модель в соседней вкладке «почувствовала потенциал».

В обычной CRM после такого разбора остаётся карточка «компания, контакт, статус». Откуда взялась потребность, в карточке нет. Найденный адрес притворяется сделкой. Мне нужна ссылка, дата и что именно произошло. Без этого очередь врёт так же уверенно, как зелёные колонки воронки.

Пятого августа папка sales была пустая. Сейчас на sales.potapov.me закрытая бета. Продукт называется LeadForge, карточка в портфолио здесь.

Зачем это мне

Мне нужна очередь, где у возможности есть наблюдаемый сигнал и доказательство. CTO написал, что релиз уехал. Вакансия висит два месяца. Это можно проверить. Если модель ставит высокий score без источника, карточку создавать незачем. Зелёная колонка без ссылки это декорация.

Пилот взял свой: компании, которым нужна срочная помощь с FastAPI или Django. Двадцать минут про блокеры или короткая платная диагностика. Если на моей услуге система врёт, чужим её рано отдавать. Чужой пилот на непроверенной модели это способ подарить людям красивую ложь и потом чинить репутацию.

Кто что делает

CRM хранит компании, людей, сигналы, лиды, решения и следующее действие. Если здесь разъедется состояние, чинить поиск и письма бесполезно. Компания это юрлицо. Лид это одна потребность вокруг одного происшествия. У одной компании их может быть две. В одну карточку мешать нельзя: тогда «сайт» и «упавший прод» начнут делить один статус и один следующий шаг.

Hermes внешний агент. Ходит в источники и тащит факты. Стадию сделки не ставит и письма не шлёт. Если агент сам решает, кому писать, получается чёрный ящик. Только дороже.

Встроенная модель смотрит только то, что уже лежит в CRM. Наблюдения идут со ссылками на evidence. Итоговый score считает код по весам стратегии. Модель предлагает формулировку. Код считает вес. Человек говорит, писать или нет.

Отдельной сущности Opportunity поверх Lead в первом релизе нет. Лид и есть проектная возможность вокруг одной потребности. Ещё один слой на старте только плодит карточки, в которых удобно прятать отсутствие решения.

Чего в бете нет

Нет автономной отправки, покупки баз и парсеров HH или Telegram внутри CRM. Первое письмо уходит руками. Система готовит черновик, проверяет запрет контакта и лимит, отдаёт текст. Я копирую, отправляю, регистрирую результат. В чужом инбоксе сюрприза нет. Уровень отправки в бете ручной, L2. Автопилот подождёт, пока я не увижу, что черновик врёт реже, чем я.

Есть аварийная остановка и потолки: сколько кандидатов в день, сколько первых обращений, сколько денег на поиск и модель. Повтор того же вызова агента не плодит дубли. Иначе за вечер одна и та же вакансия родит три «новых» лида, и утром очередь снова врёт.

Как собрано

Backend: Python 3.12, FastAPI, SQLAlchemy, PostgreSQL 16. Один модульный монолит, без микросервисов. Frontend на Next.js 16, TypeScript и FSD. Очередь на Celery и Redis 7. Модели ходят через OpenRouter.

Интерфейс ходит в REST, Hermes в MCP. Оба вызывают одни и те же use case. Если правило «нельзя активировать лид без сигнала» работает только в UI, агент его обойдёт и будет прав по-своему: ему никто не сказал.

Каноническое состояние в Postgres. Redis можно потерять. Лид из-за Redis нельзя. Redis здесь курьер очереди, не сейф.

С пятого августа до беты шли этапы: фундамент, дизайн-система, проект, поиск, приём сигналов, дедуп, квалификация, очередь, обращения, аналитика, прод. Уже на стенде чинил очевидное: на телефоне из меню нельзя было попасть в лиды. Пока продукт не открыли с телефона, он ещё чертеж. После этого уже очередь, в которую сам же не можешь зайти.

Сейчас

sales.potapov.me закрыт паролем, публичной регистрации нет. Гоняю на нём свои поиски и смотрю, где карточка врёт, где доказательство тонкое, где черновик звучит как рассылка.

Диалоги и встречи из этого не следует. Если основание не развалится на моих сделках, открою шире.