Усі статті
Посібник9 хв читання

Пропущені сповіщення про повернення коштів можуть забрати у вас єдині повернення, які ви маєте право оскаржити, і обидва магазини дають змогу їх відновити, якщо перевірити вчасно

Коли ваш сервер пропускає сповіщення про повернення коштів, два процеси, у яких магазин просить ваші докази, закриваються без вас. Розповідаємо, як Apple і Google Play повторюють доставку, за який період можна відновити пропущені сповіщення про повернення та де в цьому відновленні прогалини.

Серверна стійка вночі з одним бурштиновим попереджувальним вогником серед рівних зелених і ноутбуком на візку перед нею. Саме такий тихий збій стоїть за пропущеними сповіщеннями про повернення коштів

Головне

  • Apple повторює невдалу доставку App Store Server Notifications V2 п'ять разів, через 1, 12, 24, 48 і 72 години після попередньої спроби, тому друга повторна спроба надходить приблизно через 13 годин після першої.
  • Apple просить розробників відповісти на CONSUMPTION_REQUEST протягом 12 годин після отримання, тож сервер, який пропустив першу доставку і повтор через годину, може побачити запит лише тоді, коли це вікно, найімовірніше, вже минуло.
  • Ендпоінт Get Notification History від Apple повертає сповіщення V2 за останні 180 днів у продакшні, по 20 записів на сторінку, а прапорець onlyFailures обмежує результати сповіщеннями, які так і не дійшли до вашого сервера, а також тими, доставку яких ще повторюють.
  • Google Play надсилає перевірки чарджбеків лише через PendingRefundReviewNotification, і pendingRefundToken, потрібний для виклику orders.reviewrefund протягом 24 годин, приходить саме в цьому сповіщенні. Google не документує окремого API, який показував би список очікуваних перевірок.
  • Google Cloud Pub/Sub зберігає непідтверджені повідомлення 7 днів за замовчуванням, максимум 31 день, і видаляє підписку після 31 дня без активності підписника, якщо ви не зміните її термін дії.
  • Google Play Voided Purchases API відновлює повернення коштів, відкликання та чарджбеки за останні 30 днів із квотою 6000 запитів на день і 30 запитів за будь-які 30 секунд, але не може відновити перевірку чарджбеку, на яку ви так і не відповіли.
  • Sandbox від Apple надсилає кожне сповіщення один раз без повторів, тож процедуру відновлення, яку запускали лише в sandbox, ніколи не перевіряли на справжньому графіку повторів Apple.

Пропущені сповіщення про повернення коштів непомітно позбавляють розробника голосу в тих двох рішеннях про повернення, де він узагалі може його мати. І CONSUMPTION_REQUEST від Apple, і перевірка чарджбеку в Google Play починаються зі сповіщення, і обидва процеси мають короткий термін: 12 годин в Apple, 24 години в Google. Якщо в момент надходження повідомлення ваш сервер не працює, повільно відповідає або неправильно налаштований, магазин не чекатиме. Він ухвалить рішення на основі того, що вже має.

Добра новина в тому, що жоден магазин не викидає повідомлення після першої невдачі. Apple повторює доставку і зберігає 180-денну історію, яку можна запитати. Google публікує через Pub/Sub, а той тримає непідтверджені повідомлення кілька днів. Погана новина в тому, що графік повторів не збігається з термінами відповіді, а для одного з двох процесів API для відновлення немає взагалі.

Як кожен магазин доставляє сповіщення про повернення коштів

Apple надсилає App Store Server Notifications безпосередньо на HTTPS URL, який ви вказуєте в App Store Connect. Google не звертається до вашого сервера напряму. Він публікує Real-time developer notifications у topic Google Cloud Pub/Sub, а ваша підписка на цей topic або надсилає їх (push) на ваш ендпоінт, або чекає, поки сервер сам їх забере (pull).

ПитанняApp StoreGoogle Play
Канал доставкиHTTPS POST на ваш URLTopic Cloud Pub/Sub, push або pull
Що вважається успіхомHTTP від 200 до 206Підтвердження повідомлення Pub/Sub або код успіху від push-ендпоінта
Повтори5 для V2, через 1, 12, 24, 48 і 72 години після попередньої спробиPub/Sub доставляє повторно до підтвердження або до кінця терміну зберігання
Скільки живе пропущене повідомлення180 днів у Get Notification History7 днів за замовчуванням у підписці, до 31 дня
Повернення, для якого потрібні ваші доказиCONSUMPTION_REQUEST, відповідь протягом 12 годинPendingRefundReviewNotification, відповідь протягом 24 годин
Резерв на основі pull для схвалених поверненьGet Notification History, Get Refund HistoryVoided Purchases API, останні 30 днів
Поведінка в sandbox або тестіОдна спроба, без повторівSend Test Message з Play Console

Що Apple вважає невдачею

Документація Apple конкретна. Поверніть будь-який статус від 200 до 206, і доставку завершено. Поверніть 40x або 50x, і Apple повторить спробу. Будь-який інший код Apple теж вважає невдалим. Кожну спробу записують із полем sendAttemptResult, і його значення читаються як перелік реальних збоїв: TIMED_OUT, TLS_ISSUE, CIRCULAR_REDIRECT, NO_RESPONSE, PREMATURE_CLOSE, UNSUCCESSFUL_HTTP_RESPONSE_CODE і ще кілька. Щодо TIMED_OUT Apple радить перевірити, чи не обробляє ваш сервер повідомлення ще до відповіді.

Що Google вважає невдачею

У push-підписці код успіху від вашого ендпоінта і є підтвердженням. У pull-підписці сервер має підтвердити кожне отримане повідомлення, інакше Pub/Sub доставить його знову. Стандартний термін підтвердження становить 10 секунд, максимальний 600 секунд. Посібник Google з RTDN додає ще одне правило, яке варто повторити: сповіщення лише повідомляє, що щось змінилося, тож повний стан покупки все одно треба отримати через Google Play Developer API.

Чому графік повторів Apple не вкладається у 12-годинне вікно

Інтервали повторів Apple відраховують від попередньої спроби, а не від першої. Якщо їх скласти, для одного сповіщення V2, яке ваш сервер раз у раз не приймає, вийде така хронологія.

СпробаОчікування після попередньої спробиГодин від першої спроби
Перша доставкаНемає0
Повтор 11 година1
Повтор 212 годин13
Повтор 324 години37
Повтор 448 годин85
Повтор 572 години157

Apple просить відповісти протягом 12 годин після отримання CONSUMPTION_REQUEST. Якщо ваш сервер не працював під час першої доставки і повтору через годину, наступна спроба надійде через 13 годин після першої. Apple не уточнює, чи отримує запит, уперше прийнятий під час повтору, нові 12 годин. Обережніше вважати, що відлік почався з першої спроби. Отже, самі лише повтори не врятують запит, який ви пропустили більш ніж на годину.

Чи повторює Apple доставку після HTTP 400?

Так, згідно з документацією. Apple називає 40x і 50x кодами, що запускають повтор. У березні 2026 року один розробник написав на форумах Apple, що повтори після відповідей 400 начебто припинилися, потім повідомив, що доставка відновилася через день чи два, і Apple попросила надіслати звіт через Feedback Assistant. Вважайте задокументовану поведінку правилом, а власний моніторинг доказом.

Відновлюйте пропущені сповіщення App Store через Get Notification History

Get Notification History повертає сповіщення версії 2, які Apple намагалася надіслати на ваш сервер за обраний вами проміжок часу. Кожен запис містить повний підписаний payload, тож його можна передати тому самому обробнику, що й живе сповіщення. Кожен запис також має масив sendAttempts до шести елементів: один для першої спроби і по одному для кожного з п'яти повторів.

  • startDate і endDate обов'язкові, а startDate має бути в межах останніх 180 днів у продакшні або останніх 30 днів у sandbox.
  • Установіть onlyFailures у true, щоб отримати лише сповіщення, які не дійшли до вашого сервера, а також ті, доставку яких Apple ще повторює.
  • Фільтруйте за одним notificationType, наприклад CONSUMPTION_REQUEST або REFUND, або за transactionId одного клієнта, але не за обома в одному запиті.
  • Кожен виклик повертає до 20 записів. Продовжуйте викликати з paginationToken, поки hasMore дорівнює true, і щоразу надсилайте те саме тіло запиту.

Для повернень коштів важливе одне застереження. Apple зазначає, що записи історії відображають стан покупки на момент першого надсилання сповіщення, а не поточний. Тож відновлений REFUND є фактом про минуле. Перш ніж відкликати доступ, перевірте поточний стан через ендпоінти статусу транзакції або підписки.

Сповіщення V1 так відновити не вдасться

Get Notification History охоплює лише версію 2. Сповіщення V1 Apple повторює тричі, через 6, 24 і 48 годин після попередньої спроби, і якщо всі вони невдалі, історії для повторного відтворення немає. Це ще одна причина перевести на V2 кожен застосунок, який досі працює на V1.

Відновлюйте пропущені сповіщення Google Play про повернення коштів

Страховкою в Google є сам Pub/Sub. Поки існує ваша підписка, повідомлення, яке ніхто не підтвердив, лишається там протягом терміну зберігання: 7 днів за замовчуванням і до 31 дня, якщо його збільшити. Щойно ваш ендпоінт знову запрацює, доставка відновиться. Два налаштування можуть непомітно звести це нанівець.

  • Dead-letter topic переносить повідомлення з вашої підписки після заданої кількості невдалих спроб доставки. За замовчуванням це 5, і зі стандартною політикою негайної повторної доставки п'ять спроб можуть минути дуже швидко. Якщо ви його використовуєте, стежте за dead-letter topic як за другою поштовою скринькою.
  • Підписка без активності підписника, тобто без відкритих з'єднань, активних pull-запитів чи успішних push-доставок, за замовчуванням спливає через 31 день. Ендпоінт, який не працює місяць, може втратити саму підписку разом з усім, що в ній чекало.

Для скасованих покупок є 30-денний резерв

Для повернень, які вже відбулися, резервом на основі pull є Voided Purchases API. Він показує скасовані покупки за останні 30 днів, до 1000 на сторінку, з квотою 6000 запитів на день і 30 запитів за будь-які 30 секунд для кожного застосунку. Передайте type 1, щоб разом з одноразовими продуктами отримати й підписки. Щоденний запуск виявляє кожне повернення, яке пропустив ваш конвеєр сповіщень, і тримає доступи та цифри доходу точними.

Для перевірок чарджбеків резерву немає

PendingRefundReviewNotification працює інакше. Воно містить pendingRefundToken, який треба передати в orders.reviewrefund, і з моменту отримання у вас є 24 години, щоб надіслати свою позицію щодо повернення та докази використання. Google фіксує ваш перший виклик і ігнорує решту. Документація Google не описує жодного ендпоінта зі списком очікуваних перевірок, тож якщо це повідомлення Pub/Sub загубиться, разом із ним загубляться й ваші докази для цього чарджбеку.

Скільки коштує пропущене сповіщення про повернення

Пропущене сповіщення про вже остаточне повернення коштує вам лише облікової роботи. Ви знаходите його пізніше у Voided Purchases API або Get Notification History, відкликаєте доступ, якщо цього вимагає ваша політика, і звіти наздоганяють реальність. Неприємно, але дешево.

Пропущене сповіщення в одному з двох процесів, які можна оскаржити, коштує реальних грошей, бо магазин вирішує без ваших доказів. В Apple це означає, що рішення про повернення ухвалюють без ваших даних про споживання. У Google Play для замовлень, оформлених після 3 серпня 2026 року, програний чарджбек коштує вам ціни покупки за вирахуванням сервісного збору Play, плюс комісії за чарджбек, яку стягує банк покупця. Google покриває лише власний сервісний збір.

А гроші, які ви витратили на надання покупки, зникли ще до початку суперечки.

  • Обчислення: час GPU і серверів за кожною генерацією, рендером чи відповіддю моделі, якими покупець уже скористався.
  • Виклики API: запити до сторонніх сервісів, оплачені в момент виконання, часто за кожен виклик.
  • Сховище: файли та медіа, створені покупцем, які досі є у вашому рахунку за хостинг.
  • Виплати: частки доходу, уже виплачені авторам, афіліатам чи партнерам із цього продажу.

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

Надійна процедура відновлення

  • Спочатку підтверджуйте. Збережіть сирий payload, поверніть код успіху, а потім обробіть його в черзі.
  • Кожні кілька хвилин опитуйте Get Notification History від Apple з onlyFailures щодо CONSUMPTION_REQUEST, щоб збій коштував лише кількох хвилин 12-годинного вікна.
  • Щодня запускайте перевірку Get Notification History з onlyFailures за останні кілька днів для всіх типів і повторно обробляйте знайдене.
  • Щодня викликайте Voided Purchases API з type 1 для кожного застосунку в Google Play і звіряйте результат із уже записаними поверненнями.
  • У Pub/Sub тримайте термін зберігання повідомлень 7 днів або більше, налаштуйте сповіщення для dead-letter topic, якщо він є, і сповіщення про накопичення недоставлених повідомлень.
  • Перевіряйте весь шлях також у продакшні. Sandbox від Apple надсилає кожне сповіщення один раз без повторів, а Request a Test Notification разом із Get Test Notification Status точно показують, як відповів ваш сервер.
Смартфон лежить екраном догори біля чашки кави та блокнота на столі в ранковому світлі. Спокійний початок щоденної перевірки пропущених сповіщень про повернення коштів

RefundHalt отримує сповіщення обох магазинів замість вас і автоматично відповідає на CONSUMPTION_REQUEST та перевірки чарджбеків у межах їхніх термінів, тож стежити за годинником доводиться не вам.

Поширені запитання

Як довго Apple повторює невдале серверне сповіщення App Store?
Приблизно шість із половиною днів для версії 2. Apple повторює доставку п'ять разів, через 1, 12, 24, 48 і 72 години після попередньої спроби, тож останній повтор надходить через 157 годин після першої доставки. Сповіщення версії 1 отримують три повтори, через 6, 24 і 48 годин після попередньої спроби.
За який період можна відновити пропущені серверні сповіщення App Store?
За 180 днів у продакшні. Ендпоінт Get Notification History від Apple повертає сповіщення версії 2 за останні 180 днів, або за останні 30 днів у sandbox, по 20 записів на виклик, а прапорець onlyFailures обмежує результати сповіщеннями, які так і не дійшли до вашого сервера.
Чи повторює Apple сповіщення, якщо мій сервер повертає HTTP 400?
Так, згідно з документацією Apple. Apple повторює доставку, коли ваш сервер повертає статус 40x або 50x, а статуси від 200 до 206 вважає успішними. Будь-який інший статус теж вважається невдалим.
Чи можна відновити пропущену перевірку чарджбеку в Google Play?
Лише поки існує повідомлення Pub/Sub. pendingRefundToken, потрібний для orders.reviewrefund, надходить у PendingRefundReviewNotification, а Google не документує жодного API зі списком очікуваних перевірок. Тож непідтверджені повідомлення підписки, які за замовчуванням зберігаються 7 днів, є вашою єдиною копією.
Як знайти повернення коштів у Google Play, які пропустив мій сервер?
Викличте Voided Purchases API. Він повертає скасовані покупки за останні 30 днів, зокрема повернення коштів, відкликання та чарджбеки, до 1000 результатів на сторінку, з квотою 6000 запитів на день для кожного застосунку. Передайте type 1, щоб включити підписки.

Джерела та додаткове читання

RefundHalt

Автопілот повернень для App Store і Google Play

Читайте далі

Посібник8 хв читання

Надмірні запити на повернення коштують дорожче за самі повернення: обидва магазини застосунків вважають їх сигналом якості

Правило 5.6.4 Apple прямо називає надмірні запити на повернення ознакою того, що застосунок не відповідає стандартам якості, а угода Google про розповсюдження дозволяє видаляти застосунки нових розробників через частку повернень. Розбираємо, що пише кожен магазин, скільки коштує видалення і як не потрапити під удар.

Детальний розбір8 хв читання

Перевіряйте серверні сповіщення App Store, перш ніж діяти щодо повернення коштів, бо надіслати запит на ваш webhook URL може будь-хто

Сповіщення про повернення коштів залишається звичайним HTTPS-запитом, доки ви не перевірите його підпис. Пояснюємо, як перевіряти серверні сповіщення App Store і повідомлення Google Play RTDN, що саме підписує кожен магазин і скільки коштує підроблене або помилково відхилене повернення.

Наступний запит на повернення вже в дорозі.

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