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

Головне
- Повернення коштів при підвищенні підписки є автоматичним. Коли клієнт посеред циклу переходить на вищий рівень, магазин зараховує або повертає невикористані дні старого плану, не питаючи вас, а гроші списуються з виторгу, який ви вже провели.
- В App Store підвищення набуває чинності одразу, і Apple повертає пропорційну суму початкової підписки. Пониження чекає до наступної дати поновлення і не повертає нічого.
- Apple не надсилає суму повернення при підвищенні на ваш сервер. Підвищена транзакція позначена isUpgraded, але поле ціни все ще показує повну ціну нового рівня, тож виторг, який ви обчислюєте з App Store Server Notifications, виходить завищеним.
- Фінансові звіти в App Store Connect, це єдине місце, де враховано пропорційне повернення при підвищенні. Співробітники Apple кажуть, що ця сума недоступна через App Store Server API, Notifications чи StoreKit.
- Google Play при підвищенні не повертає гроші на картку. Він зараховує невикористаний час або стягує різницю в ціні, і що саме станеться, залежить від режиму заміни, який ви встановите. Типовий режим, це WITH_TIME_PRORATION.
- Повернення при підвищенні, це не запит клієнта на повернення. Тут немає CONSUMPTION_REQUEST і немає розгляду зворотного платежу, тож немає вікна на 12 годин чи 24 години і немає що оскаржувати. Ви його звіряєте, а не боретеся з ним.
- Режим заміни, це рішення про виторг. WITH_TIME_PRORATION дає клієнту додатковий оплачений час, який ви надаєте за вартістю вищого рівня, тоді як CHARGE_PRORATED_PRICE стягує різницю одразу, тож неправильний типовий режим випускає маржу, одне підвищення за іншим.
Клієнт торкається підвищення, переходить з вашого рівня за п'ять доларів на рівень за десять доларів, і ви проводите більший продаж. Магазин у ту саму мить робить дещо інше, і ви цього ніколи не бачите. Він дає цьому клієнту повернення коштів при підвищенні підписки за дні, які він уже оплатив на старому плані, і ці гроші списуються з вашого виторгу. Ніхто вас не питав. В App Store ви навіть не знайдете цю суму в подіях, які отримує ваш сервер.
Це не те повернення, з яким можна боротися. Це не CONSUMPTION_REQUEST від Apple і не розгляд зворотного платежу від Google Play. Це пропорційний розрахунок, вбудований у те, як обидва магазини дозволяють людям змінювати плани, і він спрацьовує сам щоразу, коли підписник піднімається на рівень вище. Ось чим повернення при підвищенні є насправді в кожному магазині, чому Apple не передає цю суму на ваш сервер, і скільки коштує вам неправильне налаштування в Google Play.
Чим насправді є повернення коштів при підвищенні підписки
Повернення при підвищенні, це розрахунок магазину за час, який клієнт оплатив, але не використає. Воно не має нічого спільного зі скаргою, спором чи вашою політикою повернень. Його запускає сама механіка зміни плану.
Це пропорційний розрахунок, а не скарга клієнта
Коли підписник посеред розрахункового періоду переходить на вищий рівень, він уже сплатив до кінця цього періоду за старою ціною. Магазин відшкодовує йому невикористану частину. Apple оформлює пропорційне повернення початкової підписки. Google Play зараховує невикористану вартість на новий план. Жоден із них не проходить через процес, на який ви можете відреагувати, і жоден не чекає на ваше схвалення.
Його запускає лише підвищення
Напрямок зміни вирішує гроші. В App Store підвищення, це перехід на продукт вищого рангу в тій самій групі підписки, і лише цей перехід є миттєвим і з поверненням. Пониження, це перехід на нижчий ранг, і воно набуває чинності при наступному поновленні, без повернення. Горизонтальна зміна, це перехід між продуктами того самого рангу, і її час залежить від задіяних тривалостей. Розставте ранги продуктів неправильно в App Store Connect, і зміна, яку ви вважаєте підвищенням, поведеться інакше.
| Зміна в App Store | Коли набуває чинності | Що відбувається з грошима |
|---|---|---|
| Підвищення на вищий рівень | Одразу | Apple повертає пропорційну суму початкової підписки |
| Пониження на нижчий рівень | У наступну дату поновлення | Без повернення, поновлюється за нижчою ціною |
| Горизонтальна зміна, той самий термін оплачений наперед | Одразу | Починається нова підписка, оплачена послуга триває |
| Горизонтальна зміна, різні терміни | У наступну дату поновлення | Без повернення посеред циклу |
Чому App Store приховує повернення при підвищенні від вашого сервера
Ось частина, яка ламає звітність про виторг. Apple оформлює повернення при підвищенні, але ніколи не повідомляє вашому серверу, скільки повернув.
isUpgraded, це єдиний сигнал, і ціна неправильна
Нова транзакція надходить із isUpgraded, встановленим на true, що каже вам, що сталася зміна плану. Поле ціни в цій транзакції все ще показує повну відображувану ціну нового рівня, а не суму, яку Apple відібрало у старого. Жодна App Store Server Notification не несе суми повернення. Словами самого Apple на форумах для розробників, пропорційна сума повернення недоступна через App Store Server API, Notifications чи StoreKit, а звітність App Store Connect, це ваше джерело для всіх цілей фінансового обліку.
Фінансовий звіт, це єдиний чесний запис
Фінансові та звіти про продажі App Store Connect враховують пропорційне повернення при підвищенні, бо саме ці звіти визначають, скільки Apple насправді вам виплачує. Це робить їх джерелом істини для будь-якого підписника, який колись піднявся вище. Будуйте свій облік на звітах, а серверні події сприймайте як сигнали прав доступу, а не виторг.

Скільки це вам коштує, у грошах
Повернення при підвищенні, це не похибка округлення. Це реальний виторг, а в Google Play ви ще й обираєте, скільки невикористаного часу віддаєте.
Повернення, це виторг, який ви вже провели
Візьміть підписника на вашому рівні за 9.99 на місяць, який на 20 день 30-денного циклу підвищується до 19.99. Приблизно третина місяця невикористана, тож Apple повертає близько 3.33 з початкових 9.99. Ви не втрачаєте весь продаж. Ви віддаєте частину, яку клієнт оплатив наперед і не використає. Важливо те, що віддача автоматична і лягає на старий продаж, тож виторг, який ви вже порахували, згодом зменшується. Помножте це на кожного підписника, який піднімається посеред циклу, і це рядок, який ви маєте бачити, а не прогалина, яку ви знаходите у виплаті.
У Google Play режим заміни, це справжній важіль витрат
Google Play при підвищенні не повертає гроші на картку. Він розраховує невикористаний час одним із кількох способів, а ви обираєте який, передаючи режим заміни під час запуску процесу купівлі. Вибір вирішує, чи дасте ви клієнту оплачений час, чи стягнете з нього різницю. Google рекомендує CHARGE_PRORATED_PRICE для підвищень і DEFERRED для понижень, але типовий режим бібліотеки, це WITH_TIME_PRORATION, тож процес, який ви ніколи не налаштовували, тихо зараховує час.
| Режим заміни в Google Play | Коли набуває чинності | Що відбувається з невикористаним часом |
|---|---|---|
| WITH_TIME_PRORATION (типовий) | Одразу | Зараховується як додатковий час на новому плані, наступна дата списання відсунута |
| CHARGE_PRORATED_PRICE (лише підвищення) | Одразу | Різниця в ціні за решту періоду стягується зараз, дата списання без змін |
| WITHOUT_PRORATION | Одразу | Зараз нічого не розраховано, нова ціна починається при наступному поновленні |
| CHARGE_FULL_PRICE | Одразу | Повна ціна нового плану стягується зараз, залишкова вартість переноситься або розраховується пропорційно |
| DEFERRED | При наступному поновленні | Поточний план діє до закінчення, потім починається новий план |
Як не дати поверненням при підвищенні заскочити ваш облік
Ви не можете вимкнути пропорційний розрахунок, та й не захотіли б, бо саме він робить зміну плану справедливою для клієнта. Що ви можете зробити, це побачити його, оцінити його вартість і тримати окремо від повернень, які ви справді можете оскаржити.
Звіряйте підвищення Apple з фінансовим звітом
Оскільки сума повернення ніколи не досягає вашого сервера, фінансові та звіти про продажі App Store Connect, це єдине місце, де з'являється пропорційне повернення при підвищенні. Звіряйте виторг від підписників із цими звітами щоперіоду і не рахуйте виторг із поточної суми Server Notifications. Прапорець isUpgraded каже вам, що сталася зміна. Звіт каже вам, скільки вона коштувала.
Обирайте режим заміни в Google Play свідомо
Передавайте режим заміни для кожної зміни плану свідомо. Використовуйте CHARGE_PRORATED_PRICE, коли хочете стягнути різницю в ціні при підвищенні зараз. Залишайте WITH_TIME_PRORATION лише тоді, коли маєте намір дати клієнту решту часу. Використовуйте DEFERRED для понижень, щоб зберегти поточний виторг до кінця терміну. Типовий режим, це рішення, а неправильний типовий режим віддає маржу, одне підвищення за іншим.
Тримайте повернення при підвищенні окремо від повернень, які можна оскаржити
Повернення при підвищенні за задумом автоматичне й остаточне. Це не клієнт, який просить свої гроші назад. Повернення, на які ви справді можете вплинути, це ті, що ініційовані клієнтом, коли Apple надсилає CONSUMPTION_REQUEST і дає вам 12 годин на відповідь, і коли Google Play відкриває розгляд зворотного платежу через orders.reviewrefund з вікном на 24 години. Позначайте свої дані так, щоб ці два ніколи не змішувалися. Один рядок ви звіряєте. На інший рядок ви відповідаєте, у стислий строк.
Коротка версія
Коли клієнт підвищує підписку, магазин розраховує за нього невикористаний час автоматично. Apple повертає пропорційну суму старого плану одразу і ніколи не надсилає цю цифру на ваш сервер, тож фінансові звіти App Store Connect, це єдиний точний запис. Google Play зараховує час або стягує різницю залежно від режиму заміни, який ви встановите, а типовий режим дає клієнту оплачений час, який ви надаєте за собівартістю. Ніщо з цього не проходить через CONSUMPTION_REQUEST чи розгляд зворотного платежу, тож немає що оскаржувати. Звіряйте повернення при підвищенні, встановлюйте режим Google Play свідомо і тримайте його окремо від повернень, з якими ще можна боротися.
Поширені запитання
- Чи запитує повернення коштів при підвищенні підписки моє схвалення?
- Ні. Повернення коштів при підвищенні підписки є автоматичним. Коли клієнт посеред циклу переходить на вищий рівень, магазин сам розраховує невикористаний час на старому плані, без запиту до вас і без вікна на відповідь. Apple повертає пропорційну суму початкової підписки, а Google Play зараховує невикористаний час або стягує різницю в ціні залежно від режиму заміни, який ви встановите.
- Чому мій виторг з App Store не збігається з виплатою після підвищень?
- Бо Apple не надсилає суму повернення при підвищенні на ваш сервер. Підвищена транзакція несе isUpgraded, встановлене на true, але поле ціни все ще показує повну ціну нового рівня, і жодна App Store Server Notification не містить повернення. Виторг, обчислений із серверних подій, рахує новий продаж і пропускає повернення на старому плані, тож виходить завищеним, доки ви не звірите його з фінансовими звітами App Store Connect.
- Чи повертає Google Play гроші на картку, коли клієнт підвищується?
- Ні. Google Play вважає невикористаний час зарахуванням, а не поверненням готівки. Залежно від режиму заміни він або зараховує решту часу на новий план і відсуває наступну дату списання, або стягує різницю в ціні за решту періоду. Типовий режим, це WITH_TIME_PRORATION, який зараховує час.
- Чи можу я оскаржити повернення коштів при підвищенні підписки?
- Ні. Повернення при підвищенні, це не запит клієнта на повернення. Немає CONSUMPTION_REQUEST від Apple і немає розгляду зворотного платежу від Google Play, тож немає вікна на 12 годин чи 24 години і немає чого надсилати. Повернення при підвищенні ви звіряєте. Оскаржувати можна лише повернення та зворотні платежі, ініційовані клієнтом.
- Чи дає пониження клієнту повернення?
- Ні. В App Store пониження набуває чинності в наступну дату поновлення і не повертає нічого, оскільки клієнт зберігає вищий рівень до кінця оплаченого періоду. У Google Play рекомендований спосіб обробити пониження, це режим заміни DEFERRED, який зберігає поточний план до закінчення, а потім запускає нижчий.
- Який режим заміни в Google Play використати для підвищення?
- Google рекомендує CHARGE_PRORATED_PRICE для підвищень, який стягує різницю в ціні за решту періоду одразу і залишає дату списання без змін. Типовий WITH_TIME_PRORATION натомість зараховує невикористаний час як додаткову послугу на вищому рівні, тож використовуйте його лише тоді, коли маєте намір цей час віддати.
Джерела та додаткове читання
- Apple Developer: Auto-renewable subscriptions (upgrade, downgrade, and crossgrade behavior and prorated refunds)
- Apple Developer Forums: Retrieving the prorated refund amount after an upgrade (Apple staff on isUpgraded, the price field, and financial reports as the source)
- Android Developers: BillingFlowParams.SubscriptionUpdateParams.ReplacementMode (all replacement mode constants)
- Android Developers: About subscriptions (proration, default replacement mode, upgrade and downgrade recommendations)
- Google Play Developer API: Method orders.reviewrefund (chargeback review, 24 hours)
- Apple Developer: Send Consumption Information (CONSUMPTION_REQUEST response window)
RefundHalt
Автопілот повернень для App Store і Google Play
Читайте далі
Несанкціоновані покупки в застосунках, які роблять діти, майже завжди повертають батькам, а витрати несете ви
Коли дитина купує набір монет на телефоні батьків, і Apple, і Google повертають кошти, і жоден із них не питає вас першим. Регулятори збудували це саме так. Ось як ці повернення за несанкціоновані покупки в застосунках працюють у кожному магазині, вікно у 15 хвилин, куди йдуть гроші, і скільки одна така покупка насправді вам коштує.
Ви ніколи не володіли податком у поверненні коштів за застосунок, тож повернення коштує вам вашу частку, а не суму на чеку
Поверніть кошти за покупку в застосунку, і чек покаже, що назад ідуть ціна плюс податок. Цей податок ніколи не був вашими грошима. Apple і Google збирають і перераховують його як продавець-платник, а потім скасовують під час повернення, не торкаючись вашої частки. Ось скільки насправді коштує повернення і єдине налаштування, за якого податок стає вашим.