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

Apple і Google повертають кошти лише у своєму магазині, тож ваша кросплатформна підписка має сама припинити доступ усюди інде

Коли Apple або Google повертає кошти за кросплатформну підписку, ваш застосунок для Android, застосунок для iPhone і вебсайт не дізнаються про це самі. Пояснюємо, як прив'язати кожну покупку в магазині до одного акаунта, відкликати правильне право доступу і перестати платити за обслуговування користувачів, які вже отримали кошти назад.

iPhone, телефон на Android і ноутбук поруч на столі, на всіх трьох виконано вхід в один акаунт кросплатформної підписки

Головне

  • App Review Guideline 3.1.3(b) від Apple дозволяє застосункам, що працюють на кількох платформах, надавати користувачам доступ до контенту й підписок, придбаних на інших платформах або на вебсайті розробника, за умови що ці позиції також доступні як покупки в застосунку.
  • Apple і Google повертають кошти лише за покупки у власному магазині, тому повернення від Apple за кросплатформну підписку не доходить до оплати клієнта в Google Play чи на вебі. Сервер розробника має сам скасувати доступ, який він надав на кожній платформі.
  • Apple надсилає сповіщення REFUND через App Store Server Notifications V2, коли повертає кошти за consumable, non-consumable, non-renewing підписку або auto-renewable підписку, і зазначає, що розробник відповідає за збереження, відстеження та обробку кожної транзакції з поверненням.
  • appAccountToken від Apple це UUID, який розробник додає до покупки в застосунку, а ендпоінт Set App Account Token в App Store Server API може пізніше додати його до покупок, здійснених поза застосунком, наприклад до активованого промокоду.
  • setObfuscatedAccountId у Google Play пов'язує покупку з акаунтом у застосунку розробника, обмежений 64 символами, а якщо містить відкриті персональні дані, як-от email, покупки блокуються.
  • Voided Purchases API у Google Play повідомляє про повернені й оскаржені через банк (chargeback) покупки з orderId та voidedSource, де 0 означає User, 1 означає Developer, а 2 означає Google.
  • Для замовлень у Google Play, оформлених після 3 серпня 2026 року, у разі задоволеного chargeback розробник сплачує ціну покупки за вирахуванням сервісного збору Play, а також комісії банку за chargeback.

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

Чому повернення в одному магазині не завершує кросплатформну підписку

Apple прямо дозволяє таку схему. App Review Guideline 3.1.3(b), Multiplatform Services, зазначає, що застосунки, які працюють на кількох платформах, можуть надавати користувачам доступ до контенту, підписок або функцій, придбаних у вашому застосунку на інших платформах чи на вашому вебсайті, за умови що ці позиції також доступні як покупки в застосунку.

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

У такої архітектури є наслідок, який часто упускають. Право доступу зберігається у вашій базі, але кожен магазин знає лише власні чеки. Apple може повернути кошти за покупку на iPhone і повідомити ваш сервер. Вашому застосунку для Android чи вебсайту вона нічого повідомити не може. Якщо обробник повернень оновлює лише клієнт iOS, клієнт отримує гроші назад і зберігає підписку всюди інде.

Де клієнт заплативХто вирішує щодо поверненняЯк про це дізнається ваш серверХто може зупинити продовження
App StoreAppleСповіщення REFUND в App Store Server Notifications V2Клієнт, у налаштуваннях підписок App Store або на екрані керування, який відкриває ваш застосунок
Google PlayGoogle протягом перших 48 годин, далі ви або GoogleVoided Purchases API та сповіщення для розробників у реальному часіКлієнт або ви через purchases.subscriptionsv2.cancel
Ваш вебсайтВиВебхуки вашого платіжного провайдераВи

Як відкликати доступ на кожній платформі після повернення

Прив'язуйте кожну покупку в магазині до одного акаунта

Зіставити повернення з конкретною людиною найскладніше, бо кожен магазин ідентифікує покупця по-своєму. Обидва дають поле для вашого власного ID акаунта. Використовуйте його в кожній покупці.

  • В Apple задайте appAccountToken, тобто згенерований вами UUID, на початку покупки. App Store повертає той самий UUID в інформації про транзакцію та продовження. Apple зазначає, що одне значення можна використовувати для всіх транзакцій одного клієнта.
  • Якщо клієнт купив поза вашим застосунком, наприклад активувавши промокод в App Store, транзакція не має токена. Ендпоінт Set App Account Token додає його. Для auto-renewable підписки це діє на поточне продовження й наступні, а не на минулі транзакції, і не працює для покупок, спільних через Family Sharing.
  • У Google Play передайте обфускований ID акаунта через setObfuscatedAccountId під час запуску процесу оплати. Він обмежений 64 символами. Google попереджає, що відкриті персональні дані, як-от email, призводять до блокування покупок, і радить шифрування або односторонній хеш.

Слухайте обидва магазини, а записуйте одне право доступу

Apple надсилає REFUND, коли повертає кошти за будь-який тип продукту, включно з auto-renewable підписками. Вона надсилає REFUND_REVERSED, коли скасовує вже надане повернення через спір, ініційований клієнтом. У Google Play Voided Purchases API перелічує повернені й оскаржені через банк покупки, кожна з orderId, який точно визначає покупку чи продовження. Ваш вебпровайдер надсилає власну подію повернення. Усі три мають потрапляти в один обробник і змінювати один запис.

Відкликайте право доступу, а не акаунт

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

Коли одна людина підписується у двох магазинах

Подвійні підписки це друга половина проблеми. Людина підписується на Android, купує новий iPhone, не входить в акаунт і підписується знову. Тепер вона платить двічі за одну послугу, і один із цих платежів зазвичай перетворюється на запит про повернення. Комерційна команда Apple, відповідаючи розробнику на Apple Developer Forums, сформулювала це просто: система акаунтів застосунку має містити логіку, яка запобігає повторній покупці на іншій платформі.

Перевіряйте всі магазини перед показом пейвола

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

За яку покупку повертати кошти, якщо дублювання вже сталося?

Повертайте ту, яку контролюєте ви. У Google Play ви можете самі оформити повернення в Play Console, а purchases.subscriptionsv2.cancel з DEVELOPER_REQUESTED_STOP_PAYMENTS зупиняє наступний платіж. Вебпідписку ви можете повернути напряму. Щодо повернень в App Store вирішує Apple, тож якщо дублікат на iPhone, клієнт подає запит до Apple, а ваш застосунок може відкрити цей запит через API запиту на повернення в StoreKit.

Скільки коштує повернення, що оминуло платформу

Повернена ціна лише перша втрата. Клієнт, чиє повернення від Apple так і не дійшло до вашого застосунку для Android чи вебсайту, далі користується тим, за роботу чого платите ви. Кожна сесія й надалі витрачає обчислювальні ресурси. Кожна AI-функція й надалі робить виклики сторонніх API, за які виставляють рахунок вам. Його файли й надалі займають сховище, а якщо ваш застосунок платить авторам за перегляд чи використання, ці виплати тривають. На річному тарифі це може означати цілий рік витрат на обслуговування акаунта, який тепер нічого не платить.

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

Що працює далі після пропущеного відкликанняХто за це платить
Серверні обчислення для кожної сесії на Android чи вебіВи
Виклики сторонніх API, які роблять ваші функціїВи
Сховище для файлів та історії користувачаВи
Виплати авторам за використання чи переглядВи
Комісії за chargeback для замовлення в Google Play після 3 серпня 2026 рокуВи, понад ціну покупки за вирахуванням сервісного збору Play
Рука тримає смартфон поруч із відкритим ноутбуком, а другий телефон лежить екраном донизу, звичний набір пристроїв користувача кросплатформної підписки

Кросплатформне використання теж є доказом

Один акаунт на всіх платформах допомагає й тоді, коли магазин запитує вашу позицію. Інформація про споживання в Apple запитує, яку частину consumable, non-consumable або non-renewing підписки спожив клієнт. Для auto-renewable підписок відсоток не надсилається, бо Apple обчислює його з часу, що минув. Розгляд chargeback у Google Play приймає до 1000 подій використання, і кожна з них може містити обфускований ID акаунта. Використання, зафіксоване під одним ID акаунта, з якого б пристрою воно не надходило, це використання, яке ви можете показати.

Які повернення ніколи не запитують вашої позиції

Більшість повернень вирішується без вас. Google Play може повернути кошти за покупку протягом 48 годин через власний процес повернення. Повернення через підтримку магазину, анульовані покупки та автоматичне повернення Google приблизно через 72 години для покупок, які ви так і не підтвердили, усе це відбувається спершу, а повідомляється потім. Для таких випадків описана вище логіка відкликання і є всією роботою.

Лише два процеси запитують докази. CONSUMPTION_REQUEST від Apple дає вам 12 годин, щоб надіслати інформацію про споживання. Розгляд chargeback у Google Play дає 24 години від PendingRefundReviewNotification, щоб відповісти через orders.reviewrefund, і Google зараховує лише ваш перший виклик. RefundHalt відповідає на обидва в межах цього строку, використовуючи дані про використання, які ви вже збираєте і які прив'язані до того самого акаунта в усіх ваших застосунках.

Короткий чекліст для кросплатформних повернень

  • Задавайте appAccountToken для покупок в Apple і обфускований ID акаунта для покупок у Google Play.
  • Доповнюйте відсутні токени Apple через Set App Account Token для активацій промокодів.
  • Спрямовуйте REFUND і REFUND_REVERSED від Apple, анульовані покупки Google Play і вебповернення в один обробник.
  • Зберігайте кожну покупку разом із джерелом і обчислюйте доступ з усіх активних покупок.
  • Перевіряйте покупки в усіх магазинах перед показом пейвола на будь-якій платформі.

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

Чи можу я дати користувачам iPhone доступ до підписки, купленої на Android або на моєму вебсайті?
Так. App Review Guideline 3.1.3(b) від Apple дозволяє застосункам, що працюють на кількох платформах, надавати користувачам доступ до контенту, підписок або функцій, придбаних на інших платформах чи на вашому вебсайті, за умови що ці позиції також доступні як покупки в застосунку для iPhone.
Якщо Apple повертає кошти підписнику, чи дізнаються про це Google Play або моя веббілінгова система?
Ні. Apple повідомляє лише ваш сервер через сповіщення REFUND в App Store Server Notifications V2, і більше нікого. Ваш сервер має прибрати доступ, який ця покупка надала на Android, у вебі та всюди, де акаунт виконує вхід.
Як зіставити повернення в App Store з акаунтом користувача?
Використовуйте appAccountToken, тобто UUID, який ваш застосунок додає до покупки і який App Store повертає в інформації про транзакцію. Для покупок поза вашим застосунком, як-от активації промокоду, ендпоінт Set App Account Token від Apple додає або замінює токен. Транзакції Family Sharing він не підтримує.
Клієнт підписаний і в App Store, і в Google Play. За яку підписку повертати кошти?
Повертайте ту, яку контролюєте ви. Замовлення в Google Play можна повернути в Play Console і зупинити наступний платіж через purchases.subscriptionsv2.cancel. Щодо повернень в App Store вирішує Apple, тому дублікат на iPhone проходить через запит на повернення в Apple, який ваш застосунок може відкрити через StoreKit.
Чи вважається використання на моєму вебсайті або в застосунку для Android доказом під час розгляду повернення?
Використання, зафіксоване під одним акаунтом, може підкріпити вашу відповідь. Інформація про споживання в Apple запитує, яку частину consumable, non-consumable або non-renewing підписки спожито, а розгляд chargeback у Google Play приймає до 1000 подій використання, які можуть містити обфускований ID акаунта.

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

RefundHalt

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

Читайте далі

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

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

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

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

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

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

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

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