Все статьи
Playbook8 мин чтения

Ваши отчёты о возвратах никогда не совпадают в Apple, Google и на вашем сервере, вот как их сверить

Apple показывает возвраты в двух отчётах, Google показывает их ещё в двух, а ваш сервер видит четвёртый. Ни одна из цифр не совпадает, и эти расхождения заложены в самой конструкции. Вот почему каждая система относит возвраты по-разному и как сверять отчёты о возвратах со своими собственными записями по транзакциям.

Стол бухгалтера с тремя отдельными стопками распечатанных финансовых отчётов и лупой, показывающий, как трудно сверять отчёты о возвратах между Apple и Google

Главное

  • Apple разносит отчётность о возвратах по двум инструментам, которые по замыслу никогда не сходятся. Sales and Trends быстро оценивает возвраты в USD, а Payments and Financial Reports рассчитывает их позже по фискальному календарю Apple. Уведомление REFUND вашего сервера, это третий взгляд на то же событие в реальном времени.
  • В отчёте Apple Summary Sales Report возврат идёт отдельной строкой с отрицательным Units и отрицательным Customer Price, и отчёт не учитывает возвраты как вычет. Если суммировать столбец на глаз, вы ошибётесь, потому что строки возвратов стоят рядом со строками продаж, а не гасят их.
  • Финансовые отчёты Apple работают по фискальному календарю 4-4-5, а не по календарным месяцам, и отчёт за фискальный месяц доступен к первой пятнице следующего фискального месяца. Любая сумма возвратов, которую вы сравните с обычным календарным месяцем, будет неверна ещё до начала.
  • Google Play разделяет возвраты так же. Earnings report указывает Charge refund и Google fee refund как отдельные типы транзакций, каждый помечен как Full или Partial, тогда как estimated sales report, это аналитика с низкой задержкой, о которой Google прямо говорит, что она не для бухгалтерии.
  • Возврат относится к дате, когда он рассчитан, а не к дате исходной продажи, поэтому возврат мартовской покупки попадает в ваши апрельские цифры в обоих магазинах. Сверяйте возвраты по transaction id, а не выстраивая месячные итоги в ряд.
  • Разработчики регулярно находят больше уведомлений REFUND, чем строк возвратов в Summary Sales Report за тот же период, потому что они считают разные моменты. Эндпоинт Get Refund History в App Store Server API, это источник истины при сверке, по одному transaction id за раз.
  • Только две из этих систем созданы для бухгалтерии: финансовый отчёт Apple и earnings report Google. Сверяйте деньги по ним, сверяйте доступ по серверным уведомлениям и никогда не заставляйте одну цифру делать работу другой.

Возьмите число возвратов из App Store Connect, затем возьмите его со своего сервера, и две цифры не совпадут. Возьмите третью из финансового отчёта, и она не совпадёт ни с одной из них. Это не ошибка в чьей-то системе. Apple и Google каждая сообщает о возвратах через несколько систем, каждая система считает свой момент в жизни возврата, а ваш сервер видит четвёртый. Если вы когда-нибудь пытались сверить отчёты о возвратах и сдались, потому что итоги расходятся, вот почему они расходятся, какой цифре доверять для какой задачи и как выстроить их по транзакциям, а не по месяцам.

Почему один возврат появляется как три разные цифры

Один возврат проходит через несколько систем, прежде чем рассчитаться, и каждая система записывает его в свой момент. Ваш сервер узнаёт о нём первым, как о событии. Быстрый аналитический отчёт оценивает его следующим. Бухгалтерский отчёт фиксирует его последним, когда деньги действительно перемещены. Тот же возврат, три отметки времени, три итога. Ошибка в том, чтобы считать любые две из них равными в один и тот же день.

Apple даёт вам два семейства отчётов плюс ваш вебхук

Apple сообщает о возвратах в двух местах, которые не являются одним инструментом и не должны сходиться в конкретный день. Sales and Trends, это быстрый оценочный взгляд: ежедневные отчёты приходят на следующий день, недельные по понедельникам, месячные примерно через пять дней после конца месяца, обычно к 8 утра по времени Pacific. Он оценивает продажи и поступления в USD по скользящему среднему курсу предыдущего месяца, что делает его хорошим для отслеживания тренда и неверным для сверки выплаты. Payments and Financial Reports, это рассчитанный взгляд: формируется раз в месяц по фискальному календарю Apple, доступен к первой пятнице текущего фискального месяца за предыдущий фискальный месяц и формируется только если в этом периоде были покупки или возвраты. Он использует финальный курс, применённый к вашей выплате. Этот отчёт, это бухгалтерская запись. Наряду с обоими ваш сервер получает App Store Server Notification REFUND в момент, когда Apple предоставляет возврат, привязанный к одному transaction id.

Google делит так же

Google Play отражает то же разделение. Earnings report, это бухгалтерская запись, формируется ежемесячно и обычно доступна к 5-му числу следующего месяца, и она указывает возвраты как отдельные типы транзакций: Charge refund для денег, возвращённых покупателю, и Google fee refund для сервисного сбора, который Google возвращает, каждый помечен как Full или Partial. Estimated sales report, это аналитический взгляд с низкой задержкой, который показывает, сколько покупатели заплатили до налогов и сборов, и Google прямо говорит, что он подходит для аналитики и не рекомендуется для бухгалтерии. На стороне сервера вы получаете Real-time Developer Notification в реальном времени и можете считать возврат обратно через Voided Purchases API.

Как Apple показывает возврат внутри отчёта и ловушка отрицательной строки

Откройте Summary Sales Report, и возврат не вычтет себя тихо из продажи. Он появляется отдельной строкой. Units и Customer Price в этой строке отрицательны, именно так вы вообще замечаете возврат, а показатель Developer Proceeds ведёт себя не так, как цена. Отчёт по своей природе не учитывает возвраты как вычет. Он перечисляет строки возвратов рядом со строками продаж, и ваша задача, разложить их по корзинам. Просуммируйте столбец Units на глаз, и вы либо посчитаете дважды, либо вовсе пропустите возвраты, потому что строка возврата в минус одну единицу стоит в том же столбце, что и ваши положительные продажи.

Практическое правило простое: находите возвраты по отрицательному Units, складывайте эти строки отдельно и никогда не предполагайте, что отчёт уже вычел их за вас. Число ваших возвратов для featured snippet, это количество строк с отрицательным Units, а не арифметическая сумма столбца.

Система AppleДля чего онаКогда обновляетсяКак появляется возврат
Sales and TrendsБыстрая оценка тренда, не бухгалтерияЕжедневно на следующий день, ежемесячно примерно через 5 дней после конца месяцаОтрицательные единицы в тренде, оценка в USD
Summary Sales ReportСкачиваемая детализация за Sales and TrendsТот же ритм, что и Sales and TrendsОтдельная строка, отрицательные Units и отрицательный Customer Price
Payments and Financial ReportsБухгалтерская запись и запись о выплатеЕжемесячно по фискальному календарю Apple, к первой пятницеРассчитанный вычет из поступлений этого фискального месяца
Серверное уведомление REFUNDКонтроль доступа в реальном времениВ момент, когда Apple предоставляет возвратОдно событие, один transaction id

Фискальный календарь, вот почему ваши месячные итоги никогда не сходятся

Вот главная причина, по которой тщательная таблица всё равно отказывается сходиться. Финансовые отчёты Apple не работают по календарным месяцам. Они работают по фискальному календарю 4-4-5, где большинство фискальных месяцев по четыре недели, а каждый третий по пять недель. Разработчик, сравнивающий Financial Report с обычным окном с января по январь, сравнивает два разных промежутка дней, поэтому итоги возвратов не могут совпасть, даже когда каждая исходная цифра верна. Разработчики на собственных форумах Apple наблюдали, как цифры Sales и цифры Financial Report расходятся на тысячи долларов именно по этой причине, и разрыв растёт каждый месяц, пока они позволяют ему накапливаться.

Earnings report Google ежемесячный, но у него свои сроки и свой часовой пояс, и ни то, ни другое не совпадает с UTC вашего сервера. Более глубокая ловушка общая для обоих магазинов: возврат относится к дате, когда он рассчитан, а не к дате исходной продажи. Верните мартовскую покупку в начале апреля, и она уменьшит ваши апрельские цифры, а не мартовские. Выстройте два месяца по их меткам, и возврат словно исчезнет из одного и появится в другом.

Две распечатанные таблицы, положенные рядом, пока рука прослеживает одну строку через обе, показывая сверку отчётов о возвратах по transaction id

Сколько стоит возврат и в каком отчёте его читать

Сверка, по сути, бухгалтерский вопрос, поэтому идите за деньгами. При возврате магазин возвращает свою комиссию, а значит сумма, которая на самом деле уходит с вашего счёта, это ваша доля продажи, а не полная цена, которую покупатель видит возвращённой. В Google Play этот возврат, видимая строка: тип транзакции Google fee refund в вашем earnings report, это сервисный сбор, возвращающийся к вам, стоящий рядом с Charge refund, ушедшим покупателю. В App Store Apple вычитает ваши поступления после комиссии и возвращает свою комиссию тем же движением, поэтому финансовый отчёт показывает вычет за вычетом доли Apple.

Сроки движения денег, вот где разработчиков застаёт врасплох. В Google Play, если вы возвращаете заказ до того, как Google вам за него заплатил, вы просто никогда не получаете эту сумму. Если вы возвращаете после выплаты, Google вычитает её из будущей выплаты. А если волна возвратов уводит ваш баланс в минус и он остаётся отрицательным не менее 48 часов, Google спишет недостачу с банковского счёта, который обычно получает ваши выплаты. Чарджбэк, это более резкая версия того же события: в Google Play для заказов, размещённых 3 августа 2026 года или позже, чарджбэк переносит цену покупки плюс банковские сборы на разработчика, и он попадает в отчёт более позднего месяца, чем продажа.

При возвратеApp StoreGoogle Play
Что уходит с вашего счётаВаши поступления после комиссииЦена покупки за вычетом сервисного сбора Play
Что магазин возвращаетКомиссию AppleСервисный сбор, строкой Google fee refund
С каким отчётом сверятьPayments and Financial ReportsEarnings report
Когда рассчитываетсяФискальный месяц обработки, к первой пятнице послеВычитается из выплаты за этот период или следующий
Нюанс чарджбэкаApple берёт на себя механику спора по картеС 3 августа 2026 цена плюс банковские сборы переходят на вас

Как сверять отчёты о возвратах, шаг за шагом

Задача становится простой, как только вы перестаёте пытаться сделать каждую цифру равной и вместо этого назначаете каждой цифре тот вопрос, на который она отвечает. Вопросов всего два: сколько денег переместилось и у кого остался доступ.

  • Решите вопрос, прежде чем открывать отчёт. Для денег ответ живёт в финансовом отчёте Apple и earnings report Google, и точка. Для доступа ответ живёт в серверных уведомлениях. Никогда не сверяйте одно против другого.
  • Выберите transaction id как ключ соединения по всем четырём системам. Это единственное поле, которое делят продажа, её возврат, отчёты и ваш вебхук.
  • Для Apple, когда Summary Sales Report и ваш вебхук расходятся, вызовите эндпоинт Get Refund History в App Store Server API по адресу /inApps/v2/refund/lookup/{transactionId}. Он возвращает подписанные возвращённые транзакции клиента с revocationDate и revocationReason, по одному transaction id за раз, и постранично проходит их историю. Этот эндпоинт, решающий голос.
  • Для Google сверьте строки Charge refund в earnings report с тем, что Voided Purchases API сообщает по тем же заказам, и помните, что частичный возврат помечен как Partial и не обнулит исходное списание.
  • Ориентируйтесь на часы отчёта, а не на свои. У Apple это фискальный месяц по времени Pacific. У earnings report Google свой месяц и часовой пояс. Ваши логи почти наверняка в UTC. Приводите к календарю отчёта, прежде чем сравнивать, иначе одни только границы дней создадут фантомные расхождения.
  • Ожидайте, что оценка будет двигаться. Sales and Trends, это оценка, и она будет продолжать сдвигаться по мере расчёта транзакций. Сверяйте с финансовым отчётом, никогда с оценкой и никогда со вчерашним снимком оценки.

Когда ваш сервер показывает больше возвратов, чем отчёт

Самая частая паника, это найти больше уведомлений REFUND на сервере, чем строк возвратов в отчёте о продажах за тот же период. Обычно это не потерянные деньги. Две системы считают разные моменты, уведомление может опередить строку отчёта на дни, а частичный возврат или повторно поданный запрос могут породить более одного события. Разработчики сообщали именно о такой картине, тысячи уведомлений REFUND против меньшего числа строк с отрицательным Units за тот же месяц. Решайте это всегда одинаково: возьмите transaction id, которые видел ваш сервер, прогоните их через Get Refund History и позвольте собственной записи Apple решить, какие из них действительно возвращены и на какую сумму.

Короткая версия

Вы не можете заставить оценку Apple, финансовый отчёт Apple, earnings report Google и ваш вебхук показать один и тот же итог возвратов в один и тот же день, и вам стоит перестать пытаться. Читайте каждый для того, что он призван вам сказать. Доверяйте финансовому отчёту и earnings report для денег, доверяйте серверным уведомлениям для доступа, а когда две системы спорят, соединяйте их по transaction id и позвольте поиску Get Refund History или Voided Purchases разрешить спор. Сверенные возвраты, это не совпавшие итоги. Это совпавшие транзакции.

Частые вопросы

Почему мои продажи в App Store и финансовый отчёт не совпадают?
Они измеряют разные вещи по разным часам. Sales and Trends, это быстрая оценка в USD по скользящему среднему курсу, тогда как Payments and Financial Reports, это рассчитанная бухгалтерская запись по фискальному календарю Apple 4-4-5 с финальным курсом. Поскольку фискальные месяцы не совпадают с календарными, а возвраты рассчитываются позже продажи, два итога расходятся по замыслу. Для всего, что касается денег, сверяйте с финансовым отчётом.
Как возвраты показываются в App Store Summary Sales Report?
Возврат появляется отдельной строкой с отрицательным Units и отрицательным Customer Price. Отчёт не учитывает возвраты как вычет, поэтому строки возвратов стоят рядом со строками продаж, а не гасят их. Определяйте возвраты по отрицательному Units и суммируйте эти строки отдельно, потому что суммирование столбца на глаз ошибётся в подсчёте ваших возвратов.
Когда возвраты появляются в earnings report Google Play?
Earnings report формируется ежемесячно и обычно доступен к 5-му числу следующего месяца. Возврат появляется как два типа транзакций, Charge refund для денег, возвращённых покупателю, и Google fee refund для сервисного сбора, который Google возвращает вам, каждый помечен как Full или Partial. Если вы вернули до того, как Google вам заплатил, вы никогда не получаете эту сумму; если после, она вычитается из будущей выплаты.
Почему мой сервер показывает больше уведомлений REFUND, чем мой отчёт о продажах?
Потому что они считают разные моменты. Ваш сервер слышит событие возврата в реальном времени, тогда как отчёт о продажах фиксирует рассчитанную строку позже, а частичные или повторно поданные возвраты могут породить более одного уведомления. Чтобы уладить разницу, возьмите transaction id, которые видел ваш сервер, и прогоните их через эндпоинт Get Refund History в App Store Server API, который возвращает собственную запись Apple о том, что действительно возвращено.
Какую цифру возвратов использовать для бухгалтерии?
Payments and Financial Reports от Apple и earnings report от Google Play. Это рассчитанные записи бухгалтерского уровня. Sales and Trends от Apple и estimated sales report от Google, это быстрая аналитика, которую оба магазина советуют не использовать для бухгалтерии, а ваши серверные уведомления нужны для контроля доступа, а не для учёта выручки.
Появляется ли возврат в том же месяце, что и исходная продажа?
Обычно нет. Возврат относится к дате, когда он рассчитан, а не к дате исходной покупки, в обоих магазинах. Мартовская продажа, возвращённая в апреле, уменьшает ваши апрельские итоги, поэтому сопоставление двух месяцев по их меткам заставит возврат выглядеть так, будто он исчез из одного месяца и появился в другом. Сопоставляйте по transaction id.

Источники и дополнительное чтение

RefundHalt

Автопилот возвратов для App Store и Google Play

Читайте дальше

Следующий запрос на возврат уже в пути.

Настройте RefundHalt за то время, что уходит на чтение очередного письма в поддержку о возврате, который вы не успели оспорить.