Привет. В этой статье мы поговорим про такую частую проблему, как ошибка оплаты в мобильных приложениях с подписочной моделью. Если взять средние данные из системы Qonversion, то 15-20% триалов переходят в Billing Issue. Из них около 15% возвращаются в платное состояние. Поддержка Grace Period позволит улучшить пользовательский опыт и повысить процент возврата в платное состояние.
План:
- Как устроен Billing Retry?
- Что такое Grace Period?
- Продуктовые подходы для работы с Billing Retry
Как устроен Billing Retry?
Ошибки с оплатой являются одной из частых причин потери подписчиков.
Для наглядности, рассмотрим следующий пример.
За некоторое время до завершения очередного оплаченного периода, Apple совершает попытку списать средства со счёта пользователя. Если при этом возникает ошибка, пользователь переходит в состояние Billing Retry. В таком состоянии он может находиться до 60 дней. При этом Apple периодически совершает попытку произвести оплату за следующий период подписки. Всё это время доступ к приложению для пользователя закрыт. На примере видно, что через 10 дней после успешного совершения оплаты возобновляется цикл списания средств. Всё это усложняет расчёт LTV, а также приводит к ухудшению пользовательского опыта.
При проверке чека пользователя мы обнаружим поле is_in_billing_retry_period
и expiration_intent
:
"pending_renewal_info": [
{
"expiration_intent": "2",
"auto_renew_product_id": "product.99.trial.3d",
"original_transaction_id": "10000000306492965",
"is_in_billing_retry_period": "1",
"product_id": "product.99.trial.3d",
"auto_renew_status": "1"
}
]
Эти поля сообщают нам о неудачной попытке списать средства.
Что такое Grace Period?
Для улучшения пользовательского опыта в течение периода, когда Apple не может совершить списание средств за следующий автовозобновляемый период, ваше приложение может предоставлять доступ к контенту. Для этого вам необходимо использовать Grace Period. Grace Period включается для авто-возобновляемых подписок Enable Billing Grace Period for Auto-Renewable Subscriptions, в этом случае пользователь сохраняет полный контроль над приложением, пока Apple пытается произвести оплату.
Продолжительность Grace Period зависит от продолжительности вашей подписки:
Давайте рассмотрим два примера:
Пример 1: успешное списание в течение Grace Period
За некоторое время до завершения первого автовозобновляемого периода, Apple совершает неудачную попытку списать средства. Такой результат при отключенном Grace Period означал был моментальный переход в состояние Billing Retry с заблокированным доступом к приложению. Однако при включённом Grace Period, начинается следующий автовозобновляемый период, а пользователь продолжает сохранять доступ к контенту. Через некоторое время Apple совершает успешное списание средств, таким образом существующий цикл оплаты не прерывается.
Пример 2: неудачное списание в течение Grace Period
Во втором примере Apple не удаётся списать средства в течение Grace Period, что приводит к изменению текущего цикла списаний, а пользователь переходит в статус Billing Retry с заблокированным доступом. Через некоторое время Apple удаётся произвести списание денежных средств, при этом запускается новый автовозобновляемый период со дня списания.
После включения Grace Period в настройках приложения, JSON response, который вы получаете при валидации чека будет содержать дополнительное поле grace_period_expires_date_ms
, именно это поле и означает новый период завершения доступа к контенту в приложении.
"pending_renewal_info": [
{
"expiration_intent": "2",
"grace_period_expires_date": "2020-09-05 23:41:42 Etc/GMT",
"auto_renew_product_id": "product.99.trial.3d",
"original_transaction_id": "10000000306492965",
"is_in_billing_retry_period": "1",
"grace_period_expires_date_pst": "2020-09-05 16:41:42 America/Los_Angeles",
"product_id": "product.99.trial.3d",
"grace_period_expires_date_ms": "1599349302000",
"auto_renew_status": "1"
}
]
Как только платеж будет успешно совершён, поле исчезнет из чека вместе с is_in_billing_retry_period
. В этом случае актуальным по истечению срока действия подписки станет поле expires_date_ms
которое нужно брать уже из receipt.in_app
"in_app": [
{
"quantity": "1",
"product_id": "product.99.trial.3d",
"transaction_id": "0000000306492966",
"original_transaction_id": "0000000306492965",
"purchase_date": "2020-08-25 02:53:10 Etc/GMT",
"purchase_date_ms": "1598323990000",
"purchase_date_pst": "2020-08-24 19:53:10 America/Los_Angeles",
"original_purchase_date": "2020-08-25 02:53:12 Etc/GMT",
"original_purchase_date_ms": "1598323992000",
"original_purchase_date_pst": "2020-08-24 19:53:12 America/Los_Angeles",
"expires_date": "2020-09-25 02:53:10 Etc/GMT",
"expires_date_ms": "1601002390000",
"expires_date_pst": "2020-09-24 19:53:10 America/Los_Angeles",
"web_order_line_item_id": "000000003253190",
"is_trial_period": "false",
"is_in_intro_offer_period": "false"
}
]
Если платёж не будет успешно совершен после истечения 60 дней, поля is_in_billing_retry_period
и grace_period_expires_date
исчезнут из чека, и можно будет использовать expires_date_ms
, однако в этом случае подписка будет истёкшей, а поле auto_renew_status будет равно 0
Продуктовые подходы для работы с Billing Retry и Grace Period
При обнаружении проблемы с оплатой рекомендуется сообщать об ошибке пользователю непосредственно внутри приложения, направив на страницу изменения настроек оплаты.
Для этого вам необходимо обрабатывать рецепт на серверной стороне исходя из изменений выше или использовать готовые решения.
Qonversion.checkPermissions { (permissions, error) in
if let error = error {
// handle error
return
}
if let premium = permissions["premium"], premium.isActive {
switch premium.renewState {
case .billingIssue:
// Grace period: permission is active, but there was some billing issue.
// Prompt the user to update the payment method.
break
default: break
}
}
}