← усі кейси
Бренд одягу з продажами через Instagram E-commerce / Управлінська звітність ·

Таблиця план-факт, яку власниця вела руками: тепер вона рахується сама і зʼясувала, чому цифри не сходились

Щоденна таблиця продажів по менеджерах, план місяця, проєкція і повернення тепер збираються з CRM без жодного ручного введення. По дорозі знайшлись три помилки в ручній таблиці і причина, чому цифри «вчора» і «сьогодні» різні.

  • Щоденний облік продажів по менеджерах, план, проєкція на кінець місяця і повернення - без ручного введення
  • Історія з січня перерахована заднім числом: понад 28 тисяч замовлень, розбіжність із ручною таблицею за березень - 0,09%
  • У ручній таблиці знайдено три помилки розрахунку плану, через які виконання плану за історію показувалось хибно
  • Дрейф сум після продажу став окремою метрикою: видно, скільки продажів «сипеться» вже після оформлення
Python 3.12FastAPIAPSchedulerhttpxSQLiteGoogle Sheets APIDocker Compose

Власниця бізнесу щодня відкриває одну таблицю: скільки продали вчора, хто з менеджерів у плані, чи встигаємо на місяць, скільки повернулося. Таблицю хтось має заповнювати. Щовечора, руками, з CRM.

Ручна таблиця живе своїм життям. Формули копіюються з місяця в місяць, план змінюється, а поріг у форматуванні лишається старим. І коли цифри «не сходяться з CRM», ніхто не знає, хто правий.

Тепер таблиця заповнюється сама. А її перевірка по ходу пояснила, чому цифри розходились, - і виявилось, що праві були обидві сторони.

0
ручних полів у щоденних продажах
0,09%
розбіжність із ручною таблицею за березень
3
помилки в ручному розрахунку плану

Проблема: таблиця, якій довіряють, але яку ніхто не перевіряє

Продажі йдуть через дірект в Instagram, у кожної менеджерки свій KPI. Звіт у CRM показує не те й не так, як звикла дивитися власниця, тому паралельно ведеться своя таблиця. І саме вона стає джерелом рішень.

Чому ручна таблиця підводить

⏱ Час

  • Щовечора перенести продажі кожної менеджерки
  • Окремо порахувати повернення
  • Окремо - курс, середній чек, проєкцію

🧮 Формули

  • Копіюються з місяця в місяць разом зі старими порогами
  • Ніхто не перевіряє, чи ділить формула на 30 днів чи на 31

❓ Дві правди

  • Цифра в таблиці і цифра в CRM за той самий день різні
  • Незрозуміло, яка з них правильна

Як автоматизація це вирішує

Ми не підключали таблицю напряму до CRM. У CRM жорсткий ліміт звернень, який вона ділить з обміном з обліковою системою, і зайве навантаження зачепило б склад. Тому між ними стоїть проміжна ланка.

Від замовлення в CRM до рядка в таблиці
Замовлення в CRM → власна копія бази → розрахунок
знімок дня → план і проєкція → Google-таблиця

Замовлення складаються у власну копію бази, історія підтягується один раз, далі щогодини оновлюється лише поточний місяць. З копії рахується все: продажі по днях і по менеджерках, одиниці, середній чек, кількість одиниць у чеку, повернення, виконання плану, проєкція на кінець місяця. Готові цифри записуються в нову Google-таблицю з тим самим виглядом і кольорами, до яких звикла власниця.

Стару таблицю ми не чіпали. Поки цифри не зійшлися, вона велася паралельно - як страховка, а не як додаткова робота.

Ключова ідея: «зафіксовано» і «актуально» - це дві різні правильні цифри

Коли почали звіряти день у день, цифри розійшлися приблизно на 2%, і наші були переважно меншими. Помилки в розрахунку не було. Той самий день і ті самі замовлення, але сума одного замовлення вже інша: частину повернули, частину відредагували вже після продажу.

Ручна таблиця - це знімок у день продажу. CRM - живий стан сьогодні. Праві обидві. Тому в таблиці тепер три колонки: зафіксовано, актуально і різниця між ними. План і KPI менеджерок рахуються від зафіксованого, як і було заведено. А різниця стала окремою метрикою, якої раніше не існувало: скільки продажів «сипеться» після оформлення.

Один день, дві правильні цифри (схематично)
Зафіксовано в день продажуоснова для плану і KPI
Актуально через два тижніпісля повернень і правок

Що знайшлося в ручній таблиці

Звірка з автоматикою - це ще й аудит ручних формул. У таблиці знайшлося три різні уявлення про денний план одночасно. Кольорове форматування підсвічувало виконання за порогом, що лишився від місяця з іншим планом, - на третину вищим за реальний. Формула «мало бути» ділила план на 31 день у 30-денному місяці. А за всю історію виконання плану порівнювалось з одним і тим самим планом, хоча плани по місяцях різнилися майже вдвічі.

Що це дало бізнесу

Щоденна частина таблиці більше не потребує жодного ручного введення. Історія з січня перерахована заднім числом за правильними планами кожного місяця - понад 28 тисяч замовлень, і за березень розбіжність із ручною таблицею власниці склала 0,09%. Зʼявилися аркуші, яких раніше не було: підсумки по місяцях, матриця менеджерок по місяцях, проєкція на кінець місяця.

Разом із цим проявилась річ, яку ручна таблиця ховала: у березні повернень у CRM більше, ніж замовлень. Схоже, у момент, коли CRM почали вести коректно, старі замовлення масово закрили відмовою. Це не помилка розрахунку, а стан даних, і тепер він підписаний у таблиці, щоб на ньому не будували висновків.

Чесно про межі. Дві колонки - кількість діалогів і конверсія з діалогу в продаж - поки лишаються ручними: у CRM діалоги рахуються інакше, ніж бачить їх власниця, і потрібне калібрування під її фільтр. Повернення за перші місяці року недостовірні через стан CRM, а не через розрахунок.

Як це влаштовано всередині

Далі - інженерна частина

Наступний розділ пояснює, як система влаштована. Якщо вас цікавить лише результат, його можна пропустити - нижче є розділ про те, кому це підходить.

Сервіс на FastAPI з APScheduler, основа взята з уже працюючого щоденного звіту продажів для іншого клієнта. Клієнт CRM з повторами й пагінацією, віконна логіка Київ і UTC з урахуванням переходу на літній час, ідемпотентність запуску.

Шари системи
ДжерелоCRM через API: замовлення разом із менеджером і позиціями в одному запиті, без окремого звернення на кожне замовлення. Ліміт CRM спільний з обміном з обліковою системою, тому економія запитів - головна вимога
КешSQLite: історія тягнеться один раз помісячно, далі щогодини оновлюється лише поточний місяць. Без кешу рік історії коштував би близько 650 запитів на кожен прогін
ЗнімкиПісля завершення дня його значення фіксуються й більше не змінюються. Ручні цифри за перші дні місяця імпортовані як знімок, щоб KPI не «переписався» заднім числом
ПравилаПродаж менеджерки - лише канал Instagram. Сайт окремо, обмін не рахується, службові акаунти виключені чорним списком. Повернення - за днем повернення, лише з каналів, де вони бувають
ВивідGoogle Sheets через сервісний акаунт: пакетне форматування і повтори при перевищенні ліміту запису, інакше перерахунок кількох сотень днів упирався б у ліміт. Курс долара - з банку, який обрала власниця

Кілька технічних деталей, без яких цифри б не зійшлися. API CRM не вміє фільтрувати за датою закриття, тому береться ширша вибірка за датою оновлення і фільтрується вже в сервісі. Дата оновлення в CRM не змінюється при зміні оплати чи відповідального менеджера, тому вікно поточного місяця періодично перечитується повністю. Білий список менеджерів довелось замінити на чорний: із білим історія січня-липня показувала лише двох людей, бо частина менеджерів тоді ще працювала, а зараз уже ні.

Усі визначення - що вважати продажем, до якого дня його відносити, які джерела рахувати - узгоджувались із власницею по пунктах, а не вгадувались. Частина відповідей надходила голосовими повідомленнями, їх розшифровували локально.

Кому це підходить

Бізнесу, де власник чи керівник продажів веде свою таблицю паралельно з CRM, бо звіт CRM показує «не те». Особливо там, де у менеджерів є план і KPI, а продажі йдуть через месенджери й соцмережі.

Ознака, за якою легко перевірити, чи це про вас: якщо щовечора хтось переносить цифри з CRM в Excel, а на питання «чому в CRM інша сума» відповідають «ну, там щось змінилось», - так, це про вас.

Автоматизація таблиці - це ще й перший за довгий час аудит формул, яким усі довіряли просто тому, що вони завжди там були.

Потрібне схоже рішення?

Опишіть задачу - підберу архітектуру під ваш бюджет і дані.