Расчёт ROMI с ИИ даёт устойчивый ответ, когда деньги сначала сводят в единый денежный мост, а уже потом делят. В этом разборе ошибки расчёта ROMI возникают до формулы: дубликат платежа, неоплаченный заказ в выручке, себестоимость, вычтенная дважды, или маркетинговые затраты, не совпадающие с периодом. Ниже — последовательность, которая начинается с определения базы, затем собирает журнал платежей и себестоимости, передаёт ИИ сверяемый запрос и заканчивается проверкой исключений. Данные для ROMI и маржинальная прибыль — это разные множества, и путать их нельзя.
Формула и состав затрат ниже — явно объявленная управленческая конвенция, а не универсальное бухгалтерское определение. Все входы учебного примера вымышлены. Это не клиентский кейс и не выполненный тест нейросети.
Согласуйте определение ROMI
Сначала зафиксируйте письменно пять параметров: базу результата, период, валюту, режим налогов и состав затрат. Без этого процента не существует — есть только число, которое каждый считает по-своему.
Справка Google Рекламы сразу уточняет, что метод расчёта зависит от целей кампании, и показывает формулу: доход минус себестоимость проданного товара, делённый на эту себестоимость О рентабельности инвестиций. В её примере себестоимость проданного товара складывается из стоимости производства и расходов на рекламу, а доход — из выручки от продажи О рентабельности инвестиций. Поэтому знаменатель у Google включает рекламу в полную себестоимость, а в конвенции ниже знаменатель — только маркетинговые расходы. Не вычитайте одну и ту же затрату повторно внутри расчёта результата.
Для нашего примера выберем базу по маржинальному результату:
ROMI = (чистая выручка − чистая себестоимость − маркетинговые расходы) / маркетинговые расходы × 100
В этой конвенции себестоимость в маркетинговом знаменателе не дублируется. НДС и постоянные общехозяйственные расходы не включены — учебные суммы заданы на единой базе. Если ваш учёт включает налоги иначе, поменяйте конвенцию до расчёта и не сравнивайте результат с числом, посчитанным по другой базе.
Отдельно проверьте, что именно вы называете оплатой. В справке Google цена за конверсию описана как сумма, которую вы тратите на осуществление каждой продажи О рентабельности инвестиций. Для интернет-магазина это не нажатие «Оплатить», а зачисленный платёж. Цену цели регистрации или открытия страницы оплаты нельзя выдавать за цену оплаты.
Соберите денежный мост
Денежный мост — это таблица, где каждая строка журнала превращается в деньги ровно один раз. Порядок такой: уникальные платежи → возвраты → чистая выручка → чистая себестоимость → маржинальная прибыль до маркетинга → маркетинговые расходы → результат после маркетинга.
Ключевое различие — transaction ID и order ID. У одного заказа может быть несколько платежей, у одного платежа — свой уникальный идентификатор. Склеивать по order ID и по transaction ID нужно по-разному, иначе дубликат оплаты задвоит выручку.
Входные данные учебного примера за период 2026-09-01 — 2026-09-30 в RUB:
Платежи
| transaction | order | paid |
|---|---|---|
| P1 | O1 | 10000 |
| P2 | O2 | 6000 |
| P1 | O1 | 10000 |
Заказы
| order | status | cost_before_return |
|---|---|---|
| O1 | paid | 4000 |
| O2 | paid | 3000 |
| O3 | unpaid | 0 |
У заказа O3 указана отображаемая сумма 5000, но статус — unpaid, и себестоимость до возврата равна нулю.
Возврат
| refund | order | amount | cost_restored |
|---|---|---|---|
| R1 | O1 | 2000 | 400 |
Маркетинговые расходы
| id | type | amount |
|---|---|---|
| M1 | ad_placement | 4000 |
| M2 | creative_production | 1000 |
Первое исключение: строка P1 встречается дважды. Это дубликат одного платежа, поэтому уникальных транзакций две — P1 и P2. Их сумма 16000 — валовая сумма оплат до возврата.
Второе исключение: заказ O3 не оплачен. Его отображаемая сумма 5000 не становится выручкой по статусу — это не деньги, а желаемая цена. Если позже платёж по O3 появится, его нужно добавить отдельной транзакцией с собственным ID.
Дальше считаем по шагам:
- Чистая выручка: 16000 − 2000 = 14000.
- Чистая себестоимость: (4000 − 400) + 3000 = 6600. Возврат уменьшает и выручку, и себестоимость: 400 — восстановленная себестоимость возвращённого товара.
- Маржинальная прибыль до маркетинга: 14000 − 6600 = 7400.
- Маркетинговые расходы: 4000 + 1000 = 5000.
- Результат после маркетинга: 7400 − 5000 = 2400.
- ROMI: 2400 / 5000 × 100 = 48%.
Возврат и восстановленная себестоимость разнесены по разным строкам, поэтому себестоимость не вычитается дважды. Маржинальная прибыль до маркетинга — не чистая прибыль бизнеса: постоянные накладные расходы в пример не входят.
Дайте ИИ сверяемый запрос
Запрос для нейросети должен требовать, чтобы она сохраняла ID, показывала исключения и давала два независимых маршрута сверки. Передайте в запросе определение базы и правило дедупликации, затем проверьте, что модель их выполнила: иначе ответ нельзя сверить с эталоном. GigaChat, например, при работе с текстом рекомендует добавлять в запрос детали, которые делают результат точнее Генерация текста с помощью ГигаЧат — в денежном расчёте это значит передать сами строки, а не пересказ.
Рабочий промпт ниже содержит все нужные входы и работает сам по себе. Скопируйте его целиком и передайте модели вместе с таблицами.
Ты — аналитик. Рассчитай ROMI по маржинальному результату за период 2026-09-01 — 2026-09-30, валюта RUB.
Формула: (чистая выручка − чистая себестоимость − маркетинговые расходы) / маркетинговые расходы × 100.
Себестоимость в маркетинговом знаменателе не дублируется. НДС и постоянные расходы не включаются.
Правила:
1. Сохраняй все transaction ID и order ID в выводе.
2. Дубликат платежа учитывай один раз; явно назови, какие строки исключены и почему.
3. Неоплаченный заказ не превращай в выручку по отображаемой сумме.
4. Возврат уменьшает выручку; восстановленная себестоимость уменьшает себестоимость.
5. Дай два маршрута сверки чистой выручки: по уникальным транзакциям и по оплаченным заказам.
6. Перечисли unknowns и несверенные поля.
Вход — платежи (transaction, order, paid):
P1, O1, 10000
P2, O2, 6000
P1, O1, 10000
Заказы (order, status, cost_before_return, displayed_order_total):
O1, paid, 4000, -
O2, paid, 3000, -
O3, unpaid, 0, 5000
Возвраты (refund, order, amount, cost_restored):
R1, O1, 2000, 400
Маркетинговые расходы (id, type, amount):
M1, ad_placement, 4000
M2, creative_production, 1000
Выход строго в этой структуре:
1. Уникальные транзакции и сумма.
2. Исключённые строки с причиной.
3. Чистая выручка.
4. Чистая себестоимость.
5. Маржинальная прибыль до маркетинга.
6. Маркетинговые расходы.
7. Результат после маркетинга.
8. ROMI, %.
9. Сверка по транзакциям, сверка по заказам, разница.
10. Unknowns.
Запрос не просит модель объяснять причинность. Он просит арифметику и раскрытие исключений — это и есть зона, где ответ можно проверить.
Разберите расчёт 48% и ловушку 180%
Правильный результат после сверки — 48%. Три строки платежей превращаются в две уникальные транзакции, дают 16000 валовой суммы, после возврата 14000 чистой выручки. Себестоимость после восстановления 6600, маржинальная прибыль до маркетинга 7400, результат после маркетинга 2400 при расходах 5000.
Ловушка возникает, когда процент считают от выручки: (14000 − 5000) / 5000 × 100 = 180%. Это число не ошибочно арифметически, но оно игнорирует себестоимость. 180% — другой показатель с другой базой, а не тот же ROMI, посчитанный иначе. Сравнивать 48% и 180% как «оптимистичный и пессимистичный сценарий» нельзя: это два разных вопроса.
Разница баз объясняет, почему один и тот же набор данных даёт несопоставимые проценты. Если вы общаетесь с подрядчиком, спросите, что у него в знаменателе и учтена ли себестоимость. Ответ «180%» без этих уточнений ничего не говорит об отдаче.
Сведите результат к таблице денежного моста — так проще проверить каждую строку:
| Шаг | Сумма |
|---|---|
| Валовая сумма оплат (уникальные) | 16000 |
| Возврат | 2000 |
| Чистая выручка | 14000 |
| Чистая себестоимость | 6600 |
| Маржинальная прибыль до маркетинга | 7400 |
| Маркетинговые расходы | 5000 |
| Результат после маркетинга | 2400 |
| ROMI, % | 48 |
2400 — результат после маркетинга в этой конвенции, не чистая прибыль бизнеса. Постоянные расходы в пример не входят.
Проверьте исключения и вывод
Проверка исключений — обязательный шаг, а не формальность. Нулевой знаменатель: если маркетинговые расходы равны нулю, доля ROMI не определена. Не возвращайте 0% или бесконечную эффективность — это ошибка деления и смысла.
Неполнота затрат: если производство креативов M2 забыли отнести к кампании, знаменатель занижен, и процент растёт без реального улучшения. Незавершённая атрибуция: все оплаты учебно отнесены к одной кампании, но атрибутированная выручка не равна причинно добавочной выручке. Пересечение с другими каналами и влияние сезонности пример не оценивает.
Проверить результат можно двумя способами сверки, и оба должны дать одну сумму. По транзакциям: 10000 + 6000 − 2000 = 14000. По оплаченным заказам: O1 и O2 дают ту же чистую выручку 14000, разница 0. Если маршруты расходятся, ищите дубликат, возврат без привязки к заказу или заказ без транзакции.
Отдельно выпишите unknowns: платёж по O3, возможные поздние возвраты, комиссии платёжного провайдера, налоги. Пока они не закрыты, число 48% — расчёт по объявленному правилу, а не доказательство причинной отдачи рекламы. Переносить чужую окупаемость или норматив на свой проект нельзя: у другой базы и другого периода другое значение.
Если нужен общий разбор данных перед этим шагом, посмотрите материал о нейросети для анализа маркетинговых данных. Про тихие ошибки в ключах склейки и потере заказов — отдельный разбор данных, которые врут тихо.
Учебный пример
Полный учебный набор ниже — вымышленные деньги и ID. Это учебный расчёт, не клиентский кейс и не выполненный тест нейросети. Сначала входы, затем эталон, к которому можно сверить ответ модели.
Входные данные. Период 2026-09-01 — 2026-09-30, валюта RUB. Все перечисленные оплаченные заказы учебно отнесены к одной кампании; причинность этим не доказана.
Платежи (transaction, order, paid):
P1, O1, 10000
P2, O2, 6000
P1, O1, 10000
Заказы (order, status, cost_before_return, displayed_order_total):
O1, paid, 4000, -
O2, paid, 3000, -
O3, unpaid, 0, 5000
Возвраты (refund, order, amount, cost_restored):
R1, O1, 2000, 400
Маркетинговые расходы (id, type, amount):
M1, ad_placement, 4000
M2, creative_production, 1000
Формула: (чистая выручка − чистая себестоимость − маркетинговые расходы) / маркетинговые расходы × 100.
Эталон результата.
- Строк платежей во входе: 3.
- Уникальные транзакции: P1 и P2.
- Валовая сумма оплат после дедупликации: 16000.
- Возврат: 2000.
- Чистая выручка: 14000.
- Чистая себестоимость: 6600.
- Маржинальная прибыль до маркетинга: 7400.
- Маркетинговые расходы: 5000.
- Результат после маркетинга: 2400.
- ROMI по марже: 48%.
- Сравнение по выручке: 180%.
- Исключено: дубликат P1 и неоплаченный O3.
- Сверка по транзакциям: 14000; сверка по заказам: 14000; разница: 0.
- Нулевые расходы: доля ROMI не определена, не 0% и не бесконечность.
Проверки арифметики.
16000 − 2000 = 14000
(4000 − 400) + 3000 = 6600
14000 − 6600 = 7400
7400 − 5000 = 2400
2400 / 5000 × 100 = 48
(14000 − 5000) / 5000 × 100 = 180
Ловушка 180% — не ошибка счёта, а другая база: процент от выручки игнорирует себестоимость. Если в вашем ответе модели появилось 180% там, где ожидался ROMI по марже, проверьте, не потерялась ли строка себестоимости.
Ограничения эталона. Формула и затраты — управленческая конвенция, не универсальное бухгалтерское определение. Атрибутированная выручка не причинно добавочная выручка. Пример не включает постоянные накладные расходы и не показывает чистую прибыль бизнеса. Два маршрута сверки используют один учебный платёжный источник — это не независимая банковская сверка. Не переносите чужую окупаемость или норматив на свой проект.
Порядок для рабочего проекта: зафиксируйте конвенцию, выгрузите журнал с ID, проверьте дубликаты и неоплаченные заказы, отдайте промпт с полными строками, сверьте два маршрута и только затем показывайте процент руководителю.

