Усі статті
Deep dive8 хв читання

Повернення коштів за підписку працює не так, як повернення за разову покупку, і те, скільки ви маєте права голосу, вирішує магазин, у якому ви перебуваєте

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

Настінний календар із обведеними повторюваними щомісячними датами списань, кредитна картка навскіс на ньому та монети, частково засунуті назад, що ілюструють, як повернення за підписку скасовує розрахунковий період

Головне

  • Повернення за підписку це не те саме, що разове повернення. Одиниця, яка скасовується, це розрахунковий період, і в обох магазинах повернення за замовлення підписки скасовує підписку та відрізає доступ.
  • У App Store Apple вирішує кожне повернення за підписку. Клієнт звертається до Apple на reportaproblem.apple.com, Apple ухвалює рішення, а ваш сервер дізнається результат лише через сповіщення REFUND, REFUND_DECLINED або REFUND_REVERSED.
  • Коли Apple надає повернення за підписку, транзакція отримує revocationDate, а autoRenewStatus підписки встановлюється на false, тож вона перестає поновлюватися, і клієнт втрачає доступ.
  • Apple вимірює підписку з автоматичним поновленням часом, що минув, а не вашими показниками використання. Той, хто на шостому місяці річного плану, спожив близько 50 відсотків, і GRANT_PRORATED це єдина refundPreference, яку ви можете для неї виразити.
  • У Google Play ви самі оформлюєте повернення. purchases.subscriptionsv2.revoke приймає або fullRefund, який повертає весь поточний період, або proratedRefund, який повертає лише невикористаний час права доступу.
  • Те, яке замовлення ви повертаєте в Google Play, змінює результат. Поверніть найновіше замовлення, і підписку буде негайно видалено, а майбутні поновлення скасовано. Поверніть старіше замовлення, і підписка залишається активною.
  • Обмеження в Google Play суворі. Замовлення, старіші за три роки, повернути не можна, часткові повернення працюють лише для замовлень, розміщених після березня 2018, вони не поширюються на платні застосунки, і жодне повернення не можна скасувати після оформлення.

Повернення за підписку і повернення за окрему покупку в застосунку відчуваються як одна й та сама кнопка. Це не так. Разова покупка це одне списання, яке ви повертаєте. Підписка це повторюване списання з приєднаним живим правом доступу, тож повернення за підписку мусить відповісти на два питання, яких разове повернення ніколи не ставить: скільки поточного періоду ви повертаєте, і чи продовжує підписка діяти. App Store і Google Play відповідають на ці два питання протилежно, і ця відмінність вирішує, скільки у вас контролю і скільки грошей залишає ваш рахунок.

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

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

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

Одиниця, яка скасовується, це розрахунковий період

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

Хто вирішує, і є справжня різниця

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

Як App Store обробляє повернення за підписку

На боці Apple ви глядач із маленьким мікрофоном. Клієнт говорить з Apple, Apple ухвалює рішення, а ваш сервер читає результат.

Клієнт запитує Apple, і Apple ухвалює рішення

Клієнт App Store запитує повернення за підписку на reportaproblem.apple.com, а не у вас. Apple розглядає запит за своїми власними сигналами і вирішує. Ви його не схвалюєте, і немає кнопки в консолі Apple, яка дозволила б вам оформити повернення за підписку так, як це дозволяє Google Play. Apple має до 90 днів від покупки, щоб прийняти запит на розгляд, і щойно воно ухвалить рішення, це рішення Apple.

Що бачить ваш сервер, коли повернення надходить

Ви дізнаєтеся результат через App Store Server Notifications V2. Надане повернення надходить як сповіщення REFUND, і транзакція тепер несе revocationDate, що позначає, коли доступ має завершитися. autoRenewStatus підписки встановлюється на false, тож вона перестає поновлюватися, і клієнт втрачає право доступу. Якщо Apple відхиляє запит, ви отримуєте REFUND_DECLINED, а якщо Apple згодом скасовує вже надане повернення, ви отримуєте REFUND_REVERSED, і підписка повертається. Ваше завдання прочитати їх і перемкнути доступ, а не віддати голос.

СповіщенняЩо воно означаєЩо ви робите
REFUNDApple надало повернення; транзакція отримує revocationDateВідкликати доступ, трактувати autoRenewStatus як false
REFUND_DECLINEDApple відхилило запит клієнта на поверненняНічого не змінюється; підписка лишається
REFUND_REVERSEDApple скасувало надане поверненняВідновити доступ і продаж

Apple вимірює підписку часом, а не вашими показниками

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

Як Google Play обробляє повернення за підписку

Google Play віддає рішення у ваші руки. Є екран Play Console і набір методів API, які дозволяють повернути підписку напряму, обрати скільки, і вирішити, чи завершується доступ. Це протилежна до Apple позиція, і вона приходить із виборами, які вам треба зробити правильно.

Повне чи пропорційне, і це ваше рішення

Поточний спосіб повернути й відкликати підписку це purchases.subscriptionsv2.revoke, викликаний із revocationContext. Передайте fullRefund, і Google Play завершує підписку та повертає повну суму поточного розрахункового періоду. Передайте proratedRefund, і Google Play завершує підписку та повертає лише решту, невикористаний час права доступу. Старіший метод умів лише повні повернення, і саме тому варто використовувати новіший. Пропорційне відкликання це тіло з двох рядків, revocationContext, що обгортає proratedRefund, а ви підставляєте fullRefund для всього періоду. Будь-яке відкликання спричиняє сповіщення розробника в реальному часі SUBSCRIPTION_REVOKED, що є вашим сигналом відрізати доступ.

Те, яке замовлення ви повертаєте, змінює те, що відбувається

Google Play також дозволяє повернути замовлення без відкликання, через orders.refund, і тут кусається тонке правило. Якщо ви повертаєте найновіше замовлення підписки, замовлення повертається, підписка негайно видаляється, а майбутні цикли скасовуються. Якщо ви повертаєте старіше замовлення в ланцюжку, те замовлення повертається, але підписка залишається активною. В orders.refund параметр revoke відкликає лише тоді, коли замовлення найновіше, тож щоб завершити доступ при активній підписці, ви натомість використовуєте purchases.subscriptionsv2.revoke.

ДіяПовернене замовленняЩо стається з підпискою
Повернути найновіше замовленняОстанній розрахунковий періодВидалена негайно, майбутні поновлення скасовано
Повернути старіше замовленняМинулий розрахунковий періодЗалишається активною, поновлюється далі
subscriptionsv2.revoke, повне чи пропорційнеПоточний періодЗавершена зараз, надіслано SUBSCRIPTION_REVOKED
Два смартфони поруч на темному столі, що показують екрани оплати підписки, з частковою купкою повернених монет між ними, ілюструючи повне проти пропорційного повернення за підписку в App Store і Google Play

Обмеження, на яких спотикаються розробники

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

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

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

У що насправді обходиться вам повернення за підписку

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

Повне проти пропорційного це грошове рішення

Повне повернення в Google Play віддає весь поточний період, тож ви втрачаєте весь дохід періоду, зберігаючи кожен витрачений вами того періоду кошт. Пропорційне повернення віддає лише невикористаний шматок, тож ви зберігаєте дохід за ту частину, яку клієнт справді мав. Якщо клієнт на 60 відсотках через місячний період на плані за 10 доларів, повне повернення обходиться вам у повні 10 доларів, а пропорційне повернення обходиться приблизно в 4 долари, невикористані 40 відсотків. Apple застосовує на своєму боці ту саму логіку часу, що минув, коли визначає розмір повернення за підписку.

Тип поверненняЩо клієнт отримує назадЩо ви зберігаєте
Повне поверненняВесь поточний період, 10.00Нічого з цього періоду
Пропорційне поверненняНевикористані 40 відсотків, близько 4.00Використані 60 відсотків, близько 6.00

Витрати, які ніколи не повертаються

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

Як обробляти повернення за підписки без людини, яка спостерігає

Ніщо з цього не повинно чекати на когось, хто читає панель. Сповіщення надходять о будь-якій годині, і доступ має перемкнутися тієї миті, коли повернення надходить, а не наступного ранку.

Прочитайте результат і відкличте доступ в обох магазинах

У App Store слухайте REFUND, REFUND_DECLINED і REFUND_REVERSED, і використовуйте revocationDate та autoRenewStatus, щоб автоматично завершити або відновити доступ. У Google Play слухайте SUBSCRIPTION_REVOKED і сигнали про анульовані покупки і робіть те саме. Це той трубопровід, який RefundHalt веде за вас: сповіщення входить, обліковий запис зіставлено, доступ перемкнено, жодної людини в петлі.

Тримайте докази напоготові до спору

Вузькі вікна, які справді просять вашого внеску, 12-годинний CONSUMPTION_REQUEST Apple для витратних продуктів і 24-годинний розгляд chargeback Google Play, допомагають лише тоді, коли доказ уже існує. Приєднайте до кожної покупки ідентифікатор облікового запису, appAccountToken UUID в Apple і хешований setObfuscatedAccountId завдовжки 64 символи або менше в Google Play, і фіксуйте, що доставив кожен оплачений період. Тоді коли токен надходить, справа вже побудована, і відповідь у межах вікна це робота машини, а не паніка.

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

Чи відрізняється повернення за підписку від повернення за разову покупку?
Так. Разова покупка це одне замовлення, яке ви повертаєте. Підписка це ланцюжок замовлень із живим правом доступу, тож повернення за підписку діє на одному розрахунковому періоді і водночас вирішує, чи продовжує підписка діяти. І в App Store, і в Google Play повернення за замовлення підписки скасовує підписку та завершує доступ, і часто ви можете обрати між поверненням усього періоду чи лише невикористаної частини.
Чи може розробник оформити повернення за підписку App Store безпосередньо?
Ні. Повернення за підписки App Store вирішує Apple. Клієнт запитує його на reportaproblem.apple.com, Apple ухвалює рішення, а ви дізнаєтеся результат через сповіщення REFUND, REFUND_DECLINED або REFUND_REVERSED. Єдиний внесок, який ви можете запропонувати, це refundPreference, така як GRANT_PRORATED, і Apple трактує її як перевагу, а не рішення.
Як оформити пропорційне повернення за підписку в Google Play?
Викличте purchases.subscriptionsv2.revoke із revocationContext, встановленим на proratedRefund. Google Play завершує підписку та повертає лише решту, невикористаний час права доступу, потім надсилає сповіщення SUBSCRIPTION_REVOKED. Передайте натомість fullRefund, щоб повернути весь поточний період. Старіший метод revoke умів лише повні повернення.
Чому моє повернення в Google Play не скасувало підписку?
Бо ви повернули старіше замовлення в ланцюжку. У Google Play повернення найновішого замовлення видаляє підписку негайно і скасовує майбутні поновлення, але повернення старішого замовлення повертає той період, тоді як підписка залишається активною. Параметр revoke в orders.refund відкликає лише тоді, коли замовлення найновіше, тож щоб завершити активну підписку, використовуйте purchases.subscriptionsv2.revoke.
Як давно можна повернути замовлення підписки?
У Google Play замовлення, старіші за три роки, повернути не можна. Часткові повернення працюють лише для замовлень, розміщених після березня 2018, і ніколи для платних застосунків, і жодне повернення не можна скасувати після оформлення. У App Store Apple приймає запити клієнтів на повернення до 90 днів від покупки і вирішує кожен самостійно.

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

RefundHalt

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

Читайте далі

Deep dive8 хв читання

Різниця між поверненням платежу через банк і поверненням коштів зводиться до того, хто вирішує, і лише одне з них остаточне

Повернення коштів у App Store чи Google Play здійснює магазин, і магазин про нього вирішує. Повернення платежу через банк, це коли банк клієнта витягує гроші, і банк про нього вирішує, без права на оскарження. Для розробників застосунків розрив між ними тепер це гроші, адже з 3 серпня 2026 року Google Play перекладає витрати на повернення платежів через банк на вас.

Policy watch8 хв читання

Від 3 серпня витрати на зворотні платежі в Google Play перейшли на розробників, і ось що кожен спір тепер у вас забирає

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

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

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