Выгрузка показывает 11 903 заказа, дашборд — 12 480: как найти, где расходятся цифры до презентации руководству
Выгрузка даёт 11 903 заказа, дашборд — 12 480. Разбираю по шагам, где строки задваиваются или выпадают и как выйти к собственнику с защищаемыми числами.

За день до отчёта собственнику маркетолог и руководитель отдела продаж открывают две системы и видят разные числа. Выгрузка из базы — 11 903 заказа. Дашборд — 12 480. Дельта в 577 строк, и до презентации непонятно, какому источнику верить и что отвечать на первый же вопрос про выручку.
Сразу скажу главное: версия «дашборд врёт» проверяется последней. Почти всегда причина в другом — разные определения метрики, разные фильтры, часовые пояса или размножение строк при соединении таблиц. Я разберу, как за час пройти путь от «две цифры разъехались» до «вот где именно и на сколько», чтобы выйти к собственнику с числами, которые выдерживают вопросы.
Почему нельзя просто подогнать фильтр
Соблазн понятный: покрутить условия в дашборде, поймать 11 903 и идти на встречу. Это закрывает симптом и оставляет ошибку в данных. Следующий отчёт разъедется снова, а атрибуция окупаемости рекламы останется кривой — бюджет распределяется по каналам, которые посчитаны с задвоением или недосчётом. Поэтому я не подгоняю итог, а диагностирую, где рождается разница.
Первый шаг — свести обе цифры к одинаковым параметрам
Пока источник и дашборд считают по разным условиям, сравнивать 11 903 и 12 480 бессмысленно. Я фиксирую для обеих сторон один набор: что именно считаем, период вплоть до минут, какие фильтры включены (тестовые сделки, отмены), в каком разрезе и на какой момент сделана выгрузка.
Здесь чаще всего вылезает классическая ошибка границ периода. Одна сторона берёт условие < '2026-03-31' и теряет последний день месяца, другая включает его целиком. На месячном отчёте это ровно одни сутки расхождения — и часть дельты снимается уже на этом шаге, до всякого разбора самих строк.
Характер дельты подсказывает причину

Форма расхождения экономит перебор гипотез. По ней я понимаю, куда смотреть дальше:
- Кратная дельта — умножение в ×2 или ×1,5 — это размножение строк при соединении таблиц или дубли.
- Маленькая дельта в 0,5–5% — разные фильтры: тестовые сделки, отмены, которые одна сторона учитывает, а другая нет.
- Дельта нарастает к концу периода — лаг между датой заказа и датой оплаты: заказ уже создан, оплата ещё не проведена, и системы фиксируют его в разные моменты.
- Ровный сдвиг со всплесками на стыках суток — источник и дашборд считают в разных часовых поясах. База хранит время в UTC, дашборд показывает в московском, и заказ, оформленный близко к полуночи, попадает в разные сутки.
Где строки задваиваются: дубли и размножение при соединении
Дубли ловятся тремя счётчиками по выгрузке: COUNT(*), COUNT(order_id) и COUNT(DISTINCT order_id). Если строк больше, чем уникальных идентификаторов, есть задвоение. В нашем разборе 577 лишних строк на 11 903 заказа — это 4,8% дублей. Такой доли достаточно, чтобы разъехались и количество заказов, и сумма выручки.
Отдельно раздувает деньги размножение при связывании таблиц один-ко-многим. Когда заказы соединяются со строками заказа, сумма по заказу повторяется на каждую позицию, и SUM считает её несколько раз. Проверяю это сравнением COUNT(*) против COUNT(DISTINCT parent_id) на результате соединения. Лечение — предварительная агрегация в отдельном подзапросе (CTE) до нужной гранулярности, а уже потом соединение. Так сумма по заказу остаётся одной строкой.
Обратная сторона — потеря строк. INNER JOIN выбрасывает несоединённые записи без предупреждения, LEFT JOIN сохраняет их со значением NULL. Когда я сравнил множества ключей и нашёл выпавшие заказы, я смотрю на них вручную и ищу закономерность: все ли это отмены, все ли с is_test=true, все ли одной конкретной даты. Закономерность и есть ответ, почему строки не соединились.
Одно имя, разные метрики
Часть разницы держится на том, что под словом «выручка» две системы меряют разное. Заказанная, выставленная в счёт, полученная, признанная — это четыре разных числа, и каждое технически верно, просто отвечает на свой вопрос бизнеса. Пока определение метрики не проговорено, спор «чья цифра правильная» бессмыслен.
В связке сквозной аналитики Roistat с amoCRM или Bitrix24 корень расхождений обычно в качестве данных самой CRM. Сделки, заведённые менеджером вручную без источника. Дубли контактов, когда клиент попал в базу и как заявка с сайта, и как карточка после звонка. Сделки без суммы, которых для аналитики фактически не существует. Всё это искажает и выручку, и распределение по каналам. Похожая механика разбирается в материале о том, почему Директ, Метрика и CRM показывают разное число заявок — там разница живёт на стыке рекламных систем и карточки сделки.
Повторная отправка формы и повторный импорт данных способны раздуть воронку на 10–15% (эта оценка из веб-аналитики, на выгрузки из базы её переношу с осторожностью). Даже с поправкой вывод остаётся: расхождение в сотни заказов между двумя источниками объяснимо одними задвоениями, без всякой пропажи данных.
Что вынести к собственнику и как закрыть тему
Перед встречей я отвечаю на три вопроса. Меняется ли управленческий вывод из-за расхождения — если решение по бюджету одинаковое при 11 903 и при 12 480, дельта не блокирует отчёт. Какой цифрой пользуемся сегодня — одна согласованная, с оговоркой о доверительном интервале. Когда будет полный разбор — с датой. Эти три ответа дают защищаемую позицию даже с ещё не устранённой разницей.
Дальше расхождение оформляется тикетом, а сходимость источника и витрины ставится на регулярную автоматическую проверку. Ручная сверка перед каждым отчётом — это повторяющиеся часы и та же ошибка на следующем месяце. Постоянную проверку сходимости и корректную структуру витрины я закладываю на этапе разработки дашбордов, чтобы отчёт не собирался заново вручную. Если расхождение упирается в расходы рекламных кабинетов, отдельно помогает разбор, где Roistat не сходится с кабинетом Яндекса.
Итог этой работы — числа по потоку сделок и выручке, которые не рассыпаются при первом вопросе, и корректная атрибуция окупаемости рекламы. Решения по бюджету опираются на данные, которые я могу защитить построчно.

Никита Бердников
Официальный партнёр amoCRM (ID 28602378), Roistat, SIPUNI и Wazzup24. 5+ лет настраиваю CRM, сквозную аналитику и телефонию под выручку — лично, без агентских посредников. 25+ проектов, ₽100M+ выручки клиентов.
Похожие статьи

Дашборд повторных продаж и LTV в DataLens: как увидеть, кто приносит прибыль не с первой покупки
Как собрать в DataLens отчёт повторных сделок и LTV из данных amoCRM, чтобы видеть истинную окупаемость каждого рекламного источника по когортам.

Дашборд собственника в Yandex DataLens: пять денежных отчётов, по которым решают, куда давать бюджет
Какие показатели выручки и окупаемости выводить в дашборд собственника на Yandex DataLens, чтобы он отвечал на вопрос, куда давать рекламный бюджет.

Живая панель выручки в Yandex DataLens: автосбор из amoCRM, Roistat и Директа вместо утреннего сведения в Excel
Настраиваю панель в Yandex DataLens, которая сама тянет данные из amoCRM, Roistat и Директа: окупаемость рекламы утром за минуты, без ручных выгрузок в Excel.
Кейс по теме
Собственный проект — nikitaberdnikov.ru — Услуги для бизнеса0 ₽/мес · за сквозную аналитику вместо подписки на сервис
Разберу вашу ситуацию
Если статья попала в вашу задачу — напишите, что у вас сейчас со связкой реклама → CRM → выручка. Отвечу лично в течение рабочего дня.