Десять таблиц и два дня на зарплату
Агентство на 26 человек вело деньги в десятке Excel-таблиц. Приход, план и факт, распределение по фондам, расходы, ДДС, ОПИУ, точка безубыточности, зарплаты. Каждый файл жил своей жизнью.
Зарплату считали руками. Человек, который этим занимался, описал это одной фразой: «раньше я два дня ЗП считала». Формулы ломались или их забывали протянуть на новую строку. Сотрудник получал сумму и не понимал, откуда она взялась. Вопросы были одинаковые: почему так мало и почему у коллеги больше.
Лиды при этом жили в отдельной CRM, задачи в третьем месте. Цепочку «этот продавец привёл этого клиента, вот его комиссия, вот дата, когда деньги реально дошли» не видел целиком никто.
Деньги собрали в один контур
Весь финансовый учёт переехал в один сервис. Приход, план и факт по каждому клиенту, автоматическое распределение каждого поступления по семи фондам, расходы, ДДС, ОПИУ, точка безубыточности, платёжный календарь, P&L по проектам. Отдельно стоит симулятор финмодели: он отвечает на вопросы вида «что будет, если расширить команду» или «если потерять крупного клиента».
Подключили расчётные счета двух банков. Выписка подтягивается сама, операции разносятся по клиентам и статьям, часть из них автоправилами по ключевым словам. Переводы между своими счетами распознаются и в выручку не попадают. Банк объявлен источником правды по деньгам: расходится цифра, права выписка.
Ошибка, которую никто не показал, дороже ошибки, которая упала с грохотом. Теперь вся проверка данных идёт до первого изменения в базе, перед рискованным сохранением снимается точка отката, а галочка «сохранено» ставится только после ответа сервера. Молчаливого успеха в интерфейсе больше нет.
Зарплата считается сама и разбирается по строкам
Зарплатный движок считает всю команду на сервере: оклад, выработку, проценты по портфелю клиентов, KPI, премии. Два дня ручной работы каждый месяц освободились.
Каждый сотрудник открывает раздел «Мой доход» и видит свой расчёт построчно. Вопрос «почему столько» закрывается без похода к бухгалтеру. Закрытие месяца делает неизменяемый снимок условий, поэтому переписать расчёт задним числом нельзя.
Продажи связали с деньгами
Мы написали свою CRM внутри той же базы. Канбан и список, настраиваемые этапы, приём заявок с лендингов вместе с UTM-метками, причины отказов, сквозная аналитика сразу в деньгах: выручка, ROMI, стоимость лида. Лид оплатил, одна кнопка превращает его в клиента, и продавец в тот же момент попадает в зарплатную ведомость.
Вокруг финансов вырос рабочий контур.
- задачник с проектами, учётом времени и повторяющимися задачами
- внутренний мессенджер с реалтаймом, вложениями, реакциями и упоминаниями
- раздел «Чаты с клиентами»: видно, в каком чате мяч на нашей стороне
- база знаний, оргструктура, отпуска
- встроенное обучение по финансовой методике на 1 970 строк, читается прямо в разделе
Кто что видит и как это устроено
Доступ настраивается на 37 разделов тремя уровнями: нет, просмотр, редактирование. Плюс матрица прав на всю команду. Главное сделано глубже: данные закрыты правилами на уровне строк в самой базе, таких правил 187. Сотрудник не увидит чужую зарплату даже в обход интерфейса.
Снаружи это обычный сайт, который открывается в браузере и ставится как приложение на телефон и компьютер. Записи идут через серверные ручки под служебным ключом, поэтому браузер физически не может переписать чужие данные, даже если подобрать запрос. Деньги считаются в общих модулях, которые дёргают и интерфейс, и сервер: цифра на экране и цифра в выгрузке всегда совпадают.
Раз в сутки автоматический сторож проверяет права по четырём типовым шаблонам дыр и присылает отчёт в закрытый канал внутри продукта. Когда всё чисто, он молчит. Дисциплина тут регулярно даёт сбой: таблицы заводят в разное время и разными руками. Автоматика не забывает.
Выкатка тоже автоматическая. Разработчик делает push в GitHub, там собирается образ, сервер забирает его сам. Руками на сервер никто не заходит.
Грабли, за которые заплатили временем
Первая версия хранила вообще всё в одном большом поле. Работало ровно до требования «сотрудник видит только свою зарплату»: внутри такого поля построчные права не сделать. За несколько дней после релиза разнесли данные на нормальные таблицы, девять миграций подряд, на живых данных, без остановки работы команды.
Самый дорогой класс багов оказался тихим.
Отдельная история про отчёты. Владелец сказал, что не верит в распределение по фондам. Проверка показала: арифметика сходится копейка в копейку, а десятки поступлений просто висели неразнесёнными с апреля. Отчёт честно делил то, что видел. Вывод ушёл в методику: прежде чем чинить отчёт, проверьте полноту исходных данных.
Самой рискованной была перестройка под третий отдел компании. Система стояла на молчаливом допущении «отделов ровно два»: 287 мест в коде, из них 12 молча уводили деньги не туда, без единой ошибки на экране. Спаслись эталоном: до правок сняли снимок всех расчётов реальными модулями системы и сверяли после каждого шага. 11 сверок из 11 прошли без расхождений. Заодно выяснилось, что штатная выгрузка для бэкапа брала часть таблиц и молча резала каждую по тысяче строк. Переписали на постраничное чтение с отчётом о полноте.
Первый коммит 24 апреля 2026, релиз на всю команду 30 апреля. Дальше четыре месяца непрерывной работы: 934 коммита, 37 выкаток с описанием изменений человеческим языком и технический аудит финансов двенадцатью параллельными агентами, где из 114 находок 61 подтвердилась и была починена. Продукт живой, работает по адресу baza.l7agency.ru.
- Новые сотрудники и клиенты перестали сохраняться, и заметили это через четыре месяца: вставка падала на переполнении, а ошибку глотал пустой обработчик.
- У клиента разом пропали платежи: сохранение шло по схеме «удалить старые, вставить новые» без транзакции, и вставка упала уже после удаления.
- Кнопка «Сохранено» врала: автосейв отправлял данные и не проверял ответ, а у части людей корпоративные сети режут часть методов записи.
- Локальный кэш перебивал базу: клиенту сняли паузу, кэш подставлял старую дату, и клиент навсегда исчезал из раздела «Приход». Обновление страницы не помогало.
Частые вопросы
Сколько времени занимает разработка своей системы учёта для агентства?
Первая рабочая версия вышла на всю команду за шесть дней: первый коммит 24 апреля 2026, релиз 30 апреля. Дальше четыре месяца работы на живых данных: 934 коммита и 37 выкаток. Система выросла до 45 рабочих разделов, в ней ежедневно работают 26 человек.
Как автоматизировать расчёт зарплаты сотрудников?
Расчёт считается на сервере: оклад, выработка, проценты по портфелю клиентов, KPI и премии. Раньше на зарплату уходило два дня ручной работы каждый месяц, эти два дня освободились. Каждый сотрудник видит свой расчёт построчно в разделе «Мой доход». Закрытие месяца снимает неизменяемый снимок условий, поэтому переписать расчёт задним числом нельзя.
Можно ли заменить Excel и отдельную CRM одной системой?
Да. Десяток таблиц и отдельная CRM заменены 45 разделами внутри одной базы: приход, план и факт по клиентам, распределение каждого поступления по семи фондам, ДДС, ОПИУ, точка безубыточности, платёжный календарь, P&L по проектам. CRM живёт в той же базе, поэтому оплаченный лид одной кнопкой становится клиентом, и продавец сразу попадает в зарплатную ведомость. Выписки двух расчётных счетов подтягиваются сами, операции разносятся по клиентам и статьям.
Как закрыть доступ, чтобы сотрудник не видел чужую зарплату?
Доступ настраивается на 37 разделов тремя уровнями: нет, просмотр, редактирование. Глубже стоят правила на уровне строк в самой базе, их 187, поэтому чужую зарплату не увидеть даже в обход интерфейса. Записи идут через серверные ручки под служебным ключом, браузер не может переписать чужие данные. Раз в сутки автоматический сторож проверяет права по четырём типовым шаблонам дыр и присылает отчёт.
Что чаще всего ломается в самописной системе учёта?
Дороже всего обошлись ошибки, которые ничего не показывали на экране. Новые сотрудники и клиенты не сохранялись четыре месяца: вставка падала на переполнении, а ошибку глотал пустой обработчик. Кнопка «Сохранено» врала, потому что автосейв отправлял данные и не проверял ответ сервера. Теперь проверка идёт до первого изменения в базе, а галочка «сохранено» ставится только после ответа сервера.
