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

Кожне продовження підписки отримує власний ідентифікатор замовлення Google Play, і саме його варто перевірити, перш ніж повертати кошти

Ідентифікатор замовлення Google Play на кшталт GPA.1234-5678-9012-34567..2 вказує на одне конкретне списання. Пояснюємо, як читати суфікс продовження, як знайти замовлення в Play Console або через Orders API і як повернути кошти саме за те списання, яке має на увазі клієнт, не платячи за чуже.

Розробник за столом порівнює квитанцію з електронної пошти на Android-телефоні зі списком замовлень на ноутбуці, зіставляючи ідентифікатор замовлення Google Play з потрібним списанням

Головне

  • Ідентифікатор замовлення Google Play має вигляд GPA.1234-5678-9012-34567, а продовження підписки додають суфікс, тож GPA.1234-5678-9012-34567..0 означає перше продовження цієї підписки.
  • Метод getOrderId() у Play Billing Library для продовжень підписки повертає ідентифікатор початкового замовлення, а не власний ідентифікатор продовження, і повертає null, поки покупка перебуває у стані PENDING.
  • 21 травня 2025 року Google додав методи get і batchGet до ресурсу Orders у Play Developer API. batchGet приймає від 1 до 1 000 різних ідентифікаторів замовлень, і весь запит завершується помилкою, якщо хоча б одного з них не знайдено.
  • Об'єкт Order з Orders API має стан PENDING, PROCESSED, CANCELED, PENDING_REFUND, PARTIALLY_REFUNDED або REFUNDED, а також поле developerRevenueInBuyerCurrency, яке враховує часткові повернення, податки й комісії.
  • Метод orders.refund у Google Play не може повернути кошти за замовлення, старші за 3 роки, а параметр revoke=true негайно припиняє доступ клієнта до підписки або товару.
  • У Play Console опція «Повернути кошти й відкликати» (Refund and revoke) застосовується до останнього замовлення в підписці, а «Лише повернути кошти» (Refund only) застосовується до старішого замовлення й залишає підписку активною.
  • Запити на повернення протягом 48 годин після покупки Google Play обробляє сам. Після 48 годин він направляє клієнтів до розробника, і саме тоді ідентифікатор замовлення зазвичай потрапляє до вашої служби підтримки.

Перш ніж повертати кошти клієнтові Google Play, подивіться на кінець номера замовлення. GPA.1234-5678-9012-34567 це перше списання за підпискою. GPA.1234-5678-9012-34567..2 це третє. У них спільна основа, але це різні платежі, і під час повернення Play Console поводиться з ними по-різному. Ідентифікатор замовлення Google Play єдиний, який бачить ваш клієнт, тому саме він опиняється у вашій службі підтримки. Прочитайте його правильно, і ви повернете кошти саме за те списання, яке засмутило клієнта, і лише один раз.

Що повідомляє ідентифікатор замовлення Google Play

Документація Play Billing Library від Google пояснює формат на прикладі. Ідентифікатор замовлення починається з GPA, далі йдуть групи цифр. Для підписок кожне продовження отримує базовий ідентифікатор замовлення плюс дві крапки й лічильник, що починається з нуля. Отже, початкова покупка не має суфікса, перше продовження має ..0, друге ..1 і так далі.

Тому суфікс швидко показує, як довго людина платить. Клієнт, який пише щодо GPA.3333-4137-0319-36762..11, мав дванадцять продовжень. Клієнт, який наводить базовий ідентифікатор без суфікса, або купив щось один раз, або має на увазі свій найперший платіж.

Ідентифікатор замовленняЩо це
GPA.1234-5678-9012-34567Разова покупка або перше списання за підпискою
GPA.1234-5678-9012-34567..0Перше продовження цієї підписки
GPA.1234-5678-9012-34567..1Друге продовження
null у Billing LibraryПокупка, що ще перебуває у стані PENDING, до того як Google обробить платіж

Де з'являється ідентифікатор замовлення і яку його версію ви отримуєте

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

  • Квитанція Google Play у клієнта показує ідентифікатор замовлення саме того списання, якого вона стосується, включно з продовженнями.
  • У вашому застосунку Purchase.getOrderId() з Play Billing Library для продовжень підписки повертає ідентифікатор початкового замовлення. Приклад від самого Google: замість GPA.1234-5678-9012-34567..0 ви отримаєте GPA.1234-5678-9012-34567.
  • На вашому сервері purchases.subscriptionsv2 надає кожній позиції поле latestSuccessfulOrderId, тобто ідентифікатор останнього успішного замовлення для цієї позиції. Google додав це поле 21 травня 2025 року.
  • У Voided Purchases API поле orderId однозначно ідентифікує разову покупку, покупку підписки або продовження підписки. Документація Google радить використовувати orderId, а не токен покупки, щоб розрізняти продовження.

Для чого тоді потрібен токен покупки

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

Як знайти замовлення Google Play

У Play Console

Розділ «Керування замовленнями» (Order management) приймає в рядку пошуку або ідентифікатор замовлення, або повну адресу електронної пошти клієнта. Кожне замовлення має один із таких статусів: «Оброблено» (Processed), «Скасовано» (Cancelled), «Очікує» (Pending), «Очікує повернення» (Pending refund), «Повернено» (Refunded), «Очікує часткового повернення» (Pending partial refund) або «Частково повернено» (Partially refunded). Якщо клієнт надає адресу пошти замість квитанції, шукайте за поштою, оберіть списання за датою, а потім перевірте суфікс, перш ніж діяти.

Через Orders API

Починаючи з 21 травня 2025 року ресурс Orders у Google Play Developer API має метод orders.get для одного замовлення та orders.batchget для списку. На практиці важливі кілька обмежень:

  • batchget приймає від 1 до 1 000 ідентифікаторів замовлень на запит, і вони мають бути різними.
  • Якщо хоча б один ідентифікатор замовлення не знайдено або він не належить до пакета, весь запит batchget завершується помилкою.
  • Виклики Orders API враховуються у квоті Play Developer API, яка за замовчуванням становить 200 000 викликів на день.

Найкорисніше тут об'єкт Order, який ви отримуєте у відповідь. Він містить стан замовлення, його purchaseToken, createTime і lastEventTime, загальну суму й податок, salesChannel, наприклад IN_APP або PLAY_STORE, а також orderHistory з подіями обробки, скасування, повернення та часткового повернення. Також є поле developerRevenueInBuyerCurrency, яке Google визначає як ваш дохід у валюті покупця за вирахуванням часткових повернень, податків і комісій. Коли продавцем, що несе відповідальність (merchant of record), є Google, адреса покупця містить лише країну.

Стан замовленняЩо сказано в довіднику Google
PENDINGСтворено й очікує обробки
PROCESSEDУспішно оброблено
CANCELEDСкасовано до обробки
PENDING_REFUNDЗапитане повернення очікує обробки
PARTIALLY_REFUNDEDЧастину суми замовлення повернено
REFUNDEDПовну суму замовлення повернено

Повернення коштів за правильне замовлення

Коли ви знаєте, яке саме списання має на увазі клієнт, Play Console пропонує вибір, що залежить від місця цього замовлення в підписці.

ОпціяЗастосовується доЩо відбувається
Повернути кошти й відкликати (Refund and revoke)Останнього замовлення в підписціКошти повертаються, підписку негайно видалено, майбутні продовження скасовано
Лише повернути кошти (Refund only)Старішого замовлення в підписціКошти повертаються, підписка залишається активною
Часткове повернення (Partial refund)Покупок у застосунку й підписок, замовлених після березня 2018 року, але не платних застосунківБудь-який відсоток менше 100% або сума без податку, менша за загальну суму замовлення
Скасувати підписку (Cancel subscription)Активної підпискиБез повернення коштів, доступ зберігається до кінця поточного розрахункового періоду

Через API метод orders.refund приймає назву пакета та ідентифікатор замовлення. Замовлення, старші за 3 роки, повернути не можна. Необов'язковий параметр revoke зі значенням true негайно припиняє доступ до підписки або товару в застосунку. У довідці Google також зазначено, що повернення не можна скасувати після здійснення, тож ідентифікатор замовлення, який ви передаєте, остаточний.

Чому в передплатника з'являється замовлення на $0.00?

Це пояснює документація Google про життєвий цикл підписки. Коли користувач знову оформлює в застосунку той самий базовий план до завершення своєї підписки, Google Play створює замовлення на $0.00. Гроші з нього не списуються, бо він уже заплатив за поточний період, і звичайне виставлення рахунків відновлюється з початкової дати продовження. Це не безкоштовний пробний період і не акція. За таким замовленням нічого повертати. Якщо клієнт хоче повернути гроші, знайдіть оплачене замовлення перед ним.

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

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

Ось як це трапляється. Клієнт на місячному плані пише щодо списання ..4, того, що було минулого тижня. Хтось із вашої команди шукає за поштою, бачить перше замовлення вгорі списку й натискає «Лише повернути кошти» для базового замовлення кількамісячної давності. Тепер клієнт отримав гроші за період, яким користувався. Списання, на яке він скаржився, залишилося незмінним, і підписка продовжується далі. Він усе ще може попросити свій банк скасувати списання минулого тижня.

Руки тримають Android-телефон над роздрукованою банківською випискою та ручкою, у момент, коли клієнт зіставляє списання з ідентифікатором замовлення Google Play

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

Які повернення ніколи не доходять до вашої підтримки

Більшість повернень у Google Play взагалі не потребують ні вас, ні ідентифікатора замовлення. Політика повернень Google передбачає, що клієнт може отримати повернення протягом 48 годин після покупки через Google Play, а після 48 годин має звертатися до розробника. Google також повертає кошти й відкликає підписки, які ви не підтвердили протягом трьох днів. Про них ви дізнаєтеся згодом через Voided Purchases API, який повідомляє voidedSource (0 для користувача, 1 для розробника, 2 для Google) і voidedReason, наприклад Remorse, Chargeback або Unacknowledged_purchase.

Лише один процес повернення в Google Play запитує вашу позицію. Коли чарджбек потребує перевірки розробником, у вас є 24 години, щоб відповісти через orders.reviewrefund, вказавши бажане рішення APPROVE, DECLINE або NEUTRAL і докази використання покупки. RefundHalt відповідає на таку перевірку за вас у межах цього вікна, використовуючи дані про використання, які у вас уже є, тож спірне замовлення отримує ваші докази, а не мовчання.

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

  • Попросіть повний ідентифікатор замовлення з квитанції Google Play, разом із суфіксом.
  • Знайдіть його в Play Console або через orders.get і спершу перевірте його стан.
  • Переконайтеся, що дата списання збігається з тим, що описує клієнт.
  • Використовуйте «Повернути кошти й відкликати» лише для останнього замовлення, а «Лише повернути кошти» для старіших.
  • Записуйте ідентифікатор замовлення, за яким повернули кошти, щоб пізніший чарджбек за іншим замовленням було легко помітити.

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

Що означає ..0 в кінці ідентифікатора замовлення Google Play?
Це позначка першого продовження підписки. Google Play надає кожному продовженню базовий ідентифікатор замовлення підписки плюс дві крапки й лічильник, що починається з нуля, тож GPA.1234-5678-9012-34567..0 це перше продовження, а ..1 друге. Базовий ідентифікатор без суфікса означає початкове списання.
Чому getOrderId() у моєму застосунку повертає інший ідентифікатор замовлення, ніж у квитанції клієнта?
Тому що Play Billing Library для продовжень підписки повертає ідентифікатор початкового замовлення. Приклад від Google: замість GPA.1234-5678-9012-34567..0 для першого продовження getOrderId() повертає GPA.1234-5678-9012-34567. Щоб отримати власний ідентифікатор продовження, використовуйте latestSuccessfulOrderId з purchases.subscriptionsv2 на своєму сервері.
Як знайти замовлення Google Play за ідентифікатором замовлення?
Знайдіть його в розділі «Керування замовленнями» (Order management) у Play Console, який приймає ідентифікатор замовлення або повну адресу електронної пошти клієнта, або викличте orders.get у Google Play Developer API. orders.batchget шукає від 1 до 1 000 різних ідентифікаторів замовлень за раз, і весь запит завершується помилкою, якщо хоча б одного з них не знайдено.
Чи можна повернути кошти за замовлення Google Play, якому більше року?
Так, до 3 років. У довіднику Google щодо orders.refund сказано, що замовлення, старші за 3 роки, повернути не можна. Для старішого замовлення в підписці опція «Лише повернути кошти» (Refund only) у Play Console повертає гроші й залишає підписку активною.
Чому в передплатника є замовлення Google Play на $0.00?
Воно з'являється, коли користувач знову оформлює в застосунку той самий базовий план до завершення своєї підписки. Гроші не списуються, бо він уже заплатив за поточний період, і звичайне виставлення рахунків відновлюється з початкової дати продовження. Google зазначає, що це не означає надання безкоштовного пробного періоду чи акційної знижки.

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

RefundHalt

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

Читайте далі

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

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

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

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

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

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

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

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