Небольшая компания по услугам попросила одно место, где видно все заявки.
До этого заявки шли тремя дорогами - из телеграм-бота, с формы на сайте и просто в личку менеджеру.
Бот складывал их в общий чат, форма присылала письмо, личка не складывала никуда.
Один и тот же человек мог оставить заявку дважды, и ему звонили два разных менеджера.
Владелец не мог ответить на простые вопросы - сколько заявок было за неделю, у кого сколько в работе, на каком этапе всё встало.
Таблицу вели, но заполняли по памяти вечером, часть строк туда просто не доезжала.
Просили простую панель под свой процесс, без большой коробочной CRM.
Сделал веб-админку - FastAPI на бэке, React на фронте, база PostgreSQL, всё в Docker на VPS.
Приём заявок - один эндпоинт, в него шлют и бот, и форма сайта.
Заявка сохраняется вместе с источником и меткой, так-же видно, с какой страницы или из какого сценария бота она пришла.
Дубли ловятся по телефону и телеграм-id - повторная заявка прилипает к существующей карточке и новой сделки не заводит.
Карточка сделки - контакт, запрос, ответственный, сумма, комментарии, вложенные файлы.
Этапы воронки настраиваются в самой панели, названия заказчик правит без меня.
История изменений пишется отдельной таблицей - кто менял статус, когда, что стояло до этого.
Роли две - владелец видит все сделки и отчёты, менеджер только свои.
Отчёт по источникам и по конверсии между этапами, период выбирается, выгрузка в Excel одной кнопкой.
Первое, что рушит такую панель - заявка пропадает, если приёмник в момент отправки лежал или отвалилась база.
Поэтому сырое тело запроса пишется в лог до любой обработки, упавшие разборы прогоняются повторно и ничего не теряется.
Вторая беда - два менеджера открыли одну сделку и затёрли правки друг друга.
Закрыл версией записи, при сохранении сверяется, трогал ли карточку кто-то ещё.
Бэкап базы ночью, копия уезжает за пределы сервера.
Заявки собраны в одном списке, почту и переписку ради них больше не открывают.
Менеджер начинает день с фильтра по своим сделкам, ничего не выпадает из виду.
Владелец смотрит отчёт за неделю сам, просить выгрузку не нужно.
За первый месяц через панель прошло около 300 заявок, порядка тридцати из них склеилось как дубли.
Заказчику отдал исходники в его репозиторий, доступ к серверу и короткую инструкцию - как завести менеджера и как поменять этапы воронки.
После сдачи добавили две вещи по просьбе - уведомление в телеграм о заявке, которая висит без ответа дольше часа, и поле с датой следующего касания.