Vender assinaturas

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

Este tópico descreve como processar eventos de ciclo de vida da assinatura, como renovações e expirações. Ele também descreve outros recursos de assinatura, como oferecer promoções e permitir que os usuários gerenciem as próprias assinaturas.

Antes de ler este tópico, consulte a página Integrar a Biblioteca Google Play Faturamento ao seu app para ter instruções gerais sobre como vender e gerenciar produtos no seu app.

Se você não configurou produtos por assinatura para seu app, consulte Criar e configurar seus produtos.

Visão geral das assinaturas

Uma assinatura representa um conjunto de benefícios a que os usuários têm acesso durante um determinado período, como um serviço de streaming de música, por exemplo.

É possível ter várias assinaturas no mesmo app para representar conjuntos de benefícios diferentes ou níveis diferentes de um único conjunto de benefícios (por exemplo, nível prata ou ouro).

Usando os planos básicos e as ofertas, é possível criar várias configurações para um mesmo produto por assinatura. Por exemplo, você pode criar uma oferta introdutória para usuários que nunca compraram uma assinatura no seu app ou uma oferta de upgrade para usuários que já têm uma assinatura.

Para saber mais detalhes sobre produtos por assinatura, planos básicos e ofertas, consulte a documentação na Central de Ajuda do Play Console.

Como gerenciar o ciclo de vida das assinaturas

Uma assinatura comprada pode passar por várias mudanças de estado ao longo do ciclo de vida, e seu app precisa responder a cada uma delas. Para verificar o estado da assinatura, o app pode fazer uma consulta usando BillingClient.queryPurchasesAsync() na Biblioteca Google Play Faturamento ou Purchases.subscriptionsv2:get na API Google Play Developer.

BillingClient.queryPurchasesAsync() Purchases.subscriptionsv2:get
Estado Será retornada? isAutoRenewing Será retornada? expiryTime subscriptionState autoRenewing
Ativa Sim Verdadeiro Sim Futuro SUBSCRIPTION_STATE_ACTIVE Verdadeiro
Cancelada Sim Falso Sim Futuro SUBSCRIPTION_STATE_CANCELED Falso
Em período de carência Sim Verdadeiro Sim Futuro (fim do período de carência) SUBSCRIPTION_STATE_IN_GRACE_PERIOD Verdadeiro
Em espera Não N/A Sim Passado (fim do prazo de validade previsto ou fim do período de carência, se houver) SUBSCRIPTION_STATE_ON_HOLD Verdadeiro
Pausada Não N/A Sim Atrasada SUBSCRIPTION_STATE_PAUSED Verdadeiro
Expirada Não N/A Sim Atrasada SUBSCRIPTION_STATE_EXPIRED Falso

Se o app armazenar o estado da assinatura em um servidor de back-end seguro, ele vai detectar mudanças de estado usando as Notificações do desenvolvedor em tempo real para garantir que o estado seja sincronizado. Uma SubscriptionNotification é enviada para eventos que afetam o estado da assinatura, como renovações e cancelamentos.

Seu app precisa processar as mudanças de estado descritas nas seções a seguir.

Novas inscrições

Siga nossas recomendações para gerenciar novas compras. Quando uma assinatura é comprada, ela é retornada por BillingClient.queryPurchasesAsync() e uma notificação SubscriptionNotification com o tipo SUBSCRIPTION_PURCHASED é enviada. Ao receber essa notificação, você precisa consultar a API Google Play Developer para ver o estado da assinatura mais recente. O recurso de assinatura é parecido com o exemplo abaixo. Observe que o recurso vai ter um acknowledgementState como ACKNOWLEDGEMENT_STATE_PENDING até que a compra seja confirmada:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_PENDING", // need to acknowledge new purchases
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

Renovações

Se uma assinatura for renovada, ela vai continuar sendo retornada por BillingClient.queryPurchasesAsync().

Uma notificação SUBSCRIPTION_RENEWED também é enviada quando a assinatura é renovada. Seu app deve garantir que o usuário ainda tenha a titularidade da assinatura e, em seguida, atualizar o estado dela com o novo expiryTime fornecido no recurso de assinatura retornado da API Google Play Developer. O recurso de assinatura é parecido com este:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ]
}

Expirações

Quando uma assinatura expira, ela não é mais retornada em BillingClient.queryPurchasesAsync(), e o usuário perde o acesso a ela.

Uma notificação SubscriptionNotification com o tipo SUBSCRIPTION_EXPIRED também é enviada quando a assinatura expira. Ao receber essa notificação, você precisa consultar a API Google Play Developer para ver o estado da assinatura mais recente. O recurso de assinatura é semelhante ao seguinte:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time_in_past,
      ...
    }
  ],
}

Cancelamentos

Um usuário pode cancelar uma assinatura na Play Store por vontade própria ou ter a assinatura cancelada automaticamente se não a recupera depois de uma suspensão de conta. Quando um usuário cancela uma assinatura, ele mantém o acesso ao conteúdo até o final do ciclo de faturamento atual. Quando o ciclo de faturamento termina, o acesso é revogado.

Quando uma assinatura é cancelada, mas ainda não expirou, ela é retornada de BillingClient.queryPurchasesAsync(). O cancelamento de uma assinatura aciona uma notificação SUBSCRIPTION_CANCELED. Quando você recebe essa notificação, o recurso de assinatura retornado da API Google Play Developer tem o subscriptionState definido como "SUBSCRIPTION_STATE_CANCELED", e o expiryTime contém a data em que o usuário vai perder o acesso à assinatura. Se expiryTime está no passado, o usuário perde a titularidade imediatamente. Caso contrário, o usuário mantém a titularidade até a data de expiração. O recurso de assinatura é semelhante ao seguinte:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time,
      ...
    }
  ],
}

Seu app pode analisar o cancelReason no recurso de assinatura retornado da API Google Play Developer para saber por que a assinatura foi cancelada (por exemplo, se o cliente cancelou ou houve problemas de faturamento). Se a assinatura tiver sido cancelada pelo usuário, você pode analisar o campo cancelSurveyResult para saber por que o usuário a cancelou.

Seu app pode mostrar uma mensagem informando ao usuário que a assinatura foi cancelada, como "Sua assinatura expira em data". O app também pode criar um link direto para a Google Play Store para permitir que os usuários restaurem a assinatura.

Se você mostrar essa mensagem, também vai precisar oferecer aos usuários a possibilidade de dispensar a notificação permanentemente.

Observe também que as mensagens de cancelamento podem frustrar os usuários, sobretudo os que cancelaram uma assinatura manualmente, em vez de terem a assinatura cancelada porque o pagamento estava desatualizado. Você pode optar por não informar os usuários que cancelaram manualmente uma assinatura.

Revogações

A assinatura de um usuário pode ser revogada por vários motivos, incluindo a revogação pelo app usando Purchases.subscriptions:revoke ou devido ao estorno da compra. Nessa situação, seu app deve revogar imediatamente a titularidade do usuário. Uma assinatura revogada não é mais retornada de BillingClient.queryPurchasesAsync(). Uma notificação SubscriptionNotification com o tipo SUBSCRIPTION_REVOKED também é enviada quando isso ocorre. Quando você recebe essa notificação, o recurso de assinatura retornado da API Google Play Developer tem o subscriptionState definido como "SUBSCRIPTION_STATE_EXPIRED", e o expiryTime contém a data em que o usuário vai perder o acesso à assinatura. O recurso de assinatura é parecido com este exemplo:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time,
      ...
    }
  ],
}

Suspensão de conta

A suspensão de conta é um estado de assinatura que começa quando a forma de pagamento de um usuário falha e qualquer período de carência associado termina sem a resolução do pagamento. Quando uma assinatura entra na suspensão de conta, você deve bloquear o acesso ao seu conteúdo ou serviço. O período de suspensão de conta dura até 30 dias.

Durante a suspensão de conta, a assinatura não é retornada por BillingClient.queryPurchasesAsync().

Durante a suspensão de conta, você deve gerenciar cancelamentos, restaurações ou recompras das suas assinaturas conforme necessário.

Quando ocorre uma suspensão de conta, use as notificações do desenvolvedor em tempo real para informar ao usuário por que o acesso à assinatura foi suspenso. No seu app, forneça uma mensagem com instruções de como atualizar a forma de pagamento e recuperar o acesso à assinatura. Sua mensagem deve incluir um link para as configurações de assinatura do Google Play para atualização da forma de pagamento. Por exemplo, você pode usar uma mensagem semelhante a esta:

"There is a problem with your subscription. Click here to go to the
Google Play subscription settings to fix your payment method."

Se os usuários puderem acessar o conteúdo da assinatura fora do app, envie uma notificação push ou um e-mail a eles para informar que a assinatura não está mais ativa.

Se o cliente corrigiu o problema de pagamento, você pode mostrar no app uma mensagem informando quando a assinatura foi restaurada. Por exemplo, você pode usar uma mensagem semelhante a esta:

"Your form of payment was updated, and your subscription has
been recovered."

Com as Notificações do desenvolvedor em tempo real, você recebe uma notificação SubscriptionNotification com o tipo SUBSCRIPTION_ON_HOLD quando uma assinatura entra em suspensão de conta. Chame a API Google Play Developer do seu servidor de back-end seguro para acessar as novas informações da assinatura. Durante a suspensão da conta, o expiryTime do recurso de assinatura é definido como um carimbo de data/hora no passado:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ON_HOLD",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_past,
      ...
    }
  ],
}

Depois que o usuário corrige a forma de pagamento, a assinatura retorna a um estado ativo, e você precisa restaurar o acesso ao conteúdo assinado.

Caso seu app dependa apenas de queryPurchasesAsync() para determinar se um usuário tem a titularidade de uma assinatura, ele vai processar automaticamente a recuperação da assinatura da suspensão de conta.

Se o app sincronizar o estado da assinatura com um servidor, você precisa detectar a notificação SubscriptionNotification com o tipo SUBSCRIPTION_RECOVERED para saber quando uma assinatura foi recuperada e restabelecer o acesso do usuário. Se você consultar uma assinatura depois de receber essa notificação, vai ver que o expiryTime agora é um carimbo de data/hora no futuro:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      ...
    }
  ],
}

Se o usuário não atualizar a forma de pagamento antes do término do período de suspensão de conta, você vai receber uma notificação do desenvolvedor em tempo real: SUBSCRIPTION_CANCELED. Para ver instruções sobre o processamento de cancelamentos, consulte Cancelar assinaturas. Quando você consulta a assinatura cancelada dessa maneira, o expiryTime retornado é definido como um carimbo de data/hora no passado:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_past,
      ...
    }
  ],
}

Acesso e recuperação de suspensão de conta

O exemplo abaixo mostra uma linha do tempo de uma assinatura que entra na suspensão de conta e é recuperada quando o usuário corrige a forma de pagamento.

Como no exemplo anterior, essa linha do tempo representa uma assinatura que primeiro entra em um período de carência antes de entrar na suspensão de conta.

Observe o seguinte:

  • Durante o período de carência, o usuário precisa manter o acesso aos benefícios da assinatura.
  • Antes que uma assinatura entre em suspensão de conta, o Google faz outras tentativas para cobrar a forma de pagamento por até 24 horas. O usuário mantém os benefícios da assinatura durante esse período. Após o período de nova tentativa, a assinatura entra em suspensão de conta, e o usuário perde o acesso aos benefícios associados a ela.
  • Quando uma assinatura é recuperada durante um período de carência, a data de renovação não é redefinida.
  • Quando a assinatura se recupera da suspensão de conta, a data de renovação é redefinida.

Período de carência

Em caso de problemas com o pagamento no final de um ciclo de faturamento, as assinaturas entrarão em um período de carência se ele estiver ativado. Durante esse período, o usuário ainda terá acesso à assinatura enquanto o Google Play tenta renová-la. No Google Play Console, é possível especificar a duração de um período de carência nas configurações do produto no app.

Se seu app depender apenas de queryPurchasesAsync() para verificar se um usuário tem a titularidade de uma assinatura, o app processará automaticamente o período de carência, enquanto queryPurchasesAsync() continua retornando compras canceladas antes da data de validade.

Se o app sincronizar o estado da assinatura com um back-end, você irá detectar a notificação SubscriptionNotification com o tipo SUBSCRIPTION_IN_GRACE_PERIOD quando o usuário entrar em um período de carência. Enquanto o usuário está no período de carência, o recurso de assinatura contém autoRenewEnabled = true.

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_IN_GRACE_PERIOD",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_future,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

Quando um usuário entrar em um período de carência, mostre uma mensagem no seu app informando como atualizar a forma de pagamento. Caso contrário, o usuário perde o acesso à assinatura ao final do período de carência. Essa mensagem pode conter um link direto para a Google Play Store para ajudar o usuário a gerenciar a assinatura.

Assim que o usuário atualiza a forma de pagamento, a assinatura é renovada, e o app pode processar essa ação, conforme descrito em Renovações.

Se o usuário não corrigir a forma de pagamento durante o período de carência, a assinatura vai ativar a suspensão de conta.

Período de carência para acesso e recuperação sem suspensão de conta

O exemplo a seguir mostra uma linha do tempo de uma assinatura que entra no período de carência e se recupera quando o usuário corrige a forma de pagamento. Neste exemplo, a assinatura não tem suporte à suspensão de conta. Portanto, quando o período de carência terminar, o usuário vai perder os benefícios da assinatura.

Observe o seguinte:

  • Durante o período de carência, o usuário precisa manter o acesso aos benefícios da assinatura.
  • Quando uma assinatura é recuperada durante um período de carência, a data de renovação não é redefinida.

Assinaturas pausadas

Você pode evitar o desligamento voluntário de usuários permitindo que eles pausem a assinatura. Quando o recurso de pausa é ativado, os usuários podem optar por pausar a assinatura por um período entre uma semana e três meses, dependendo do período recorrente. Depois de ativada, a opção de pausa aparece na central de assinaturas e no fluxo de cancelamento. As assinaturas anuais não podem ser pausadas, e os limites de pausa de uma semana e três meses estão sujeitos a mudanças a qualquer momento.

Para permitir que os usuários pausem a assinatura, faça o seguinte:

  1. Faça login no Google Play Console.
  2. Selecione seu app e acesse Presença na loja > Produtos no app > Assinaturas.
  3. Abra a seção Configurações de assinatura.
  4. Marque Permitir pausa.

Uma pausa de assinatura entra em vigor somente após o término do período de faturamento atual. Enquanto a assinatura estiver em pausa, o usuário não tem acesso a ela. No final do período de pausa, a assinatura será retomada, e o Google tentará fazer a renovação. Se a retomada for bem-sucedida, a assinatura será reativada. Se a retomada falhar devido a um problema de pagamento, o usuário vai entrar no estado de suspensão da conta, conforme mostrado na Figura 1:

Um usuário faz uma pausa na assinatura, e a conta entra no estado de suspensão.
Figura 1. Um usuário faz uma pausa na assinatura, e a conta entra no estado de suspensão.

Um usuário também pode optar por retomar manualmente uma assinatura a qualquer momento durante o período de pausa, conforme mostrado na Figura 2. Quando um usuário retoma manualmente, a data de faturamento muda para a data de retomada manual.

Um usuário faz uma pausa e, em seguida, retoma a assinatura.
Figura 2. Um usuário faz uma pausa e, em seguida, retoma a assinatura.

Quando a assinatura de um usuário é pausada, ela não é retornada por queryPurchasesAsync(). Se a assinatura for retomada, ela será retornada por queryPurchasesAsync().

Se o app sincronizar o estado da assinatura com um servidor de back-end seguro, você vai detectar as Notificações do desenvolvedor em tempo real para manter o estado. Essas notificações também permitem que você informe seus usuários no app que eles pausaram a assinatura e não têm acesso a ela. Você também deve fornecer uma maneira para o usuário retomar manualmente a assinatura usando um link direto para o Google Play.

Uma notificação SubscriptionNotification com o tipo SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED é enviada quando o usuário inicia uma pausa na assinatura. Nesse momento, o usuário mantém o acesso à assinatura, e o recurso de assinatura contém autoRenewing = true, paymentState = 1 (pagamento recebido) e valores futuros para expiryTime e autoResumeTimeMillis.

Uma notificação SubscriptionNotification com o tipo SUBSCRIPTION_PAUSED é enviada quando a pausa entra em vigor. Nesse momento, o usuário perde o acesso à assinatura, e o recurso de assinatura contém autoRenewing = true e paymentState = 0 (pendente), um valor futuro para autoResumeTimeMillis e um valor passado para expiryTime.

Uma SubscriptionNotification com o tipo SUBSCRIPTION_RENEWED será enviada se a assinatura for retomada automaticamente no final do período de pausa ou se o usuário retomar a assinatura manualmente. Isso precisa ser processado conforme descrito em Renovações.

Uma notificação SubscriptionNotification com o tipo SUBSCRIPTION_ON_HOLD será enviada se houver uma falha no pagamento ao tentar retomar a assinatura. Isso precisa ser processado conforme descrito na seção de Suspensão de conta.

Restaurações

Uma assinatura cancelada permanecerá visível no app Play Store até a data de validade. Um usuário pode restaurar uma assinatura cancelada antes que ela expire clicando na opção Renovar assinatura (antes chamada de Restaurar) na seção Assinaturas do app Google Play Store. Você também pode permitir que os usuários renovem a assinatura de um plano básico com renovação automática após a expiração configurando-o de acordo com a opção "Renovar assinatura".

Seção "Assinaturas" no app Google Play Store mostrando uma
            assinatura cancelada com um botão "Renovar assinatura"
Figura 3. Seção Conta > Assinaturas no app Google Play Store mostrando uma assinatura cancelada com um botão Renovar assinatura.

Restaurações antes da expiração

Caso seu app dependa apenas de queryPurchasesAsync() para determinar se um usuário tem a titularidade de uma assinatura, o app processará automaticamente as restaurações, enquanto queryPurchasesAsync() continua retornando compras canceladas antes da data de validade. Uma assinatura restaurada continua sendo renovada como se não tivesse sido cancelada.

Se o app sincronizar o estado da assinatura com um back-end, você vai detectar a SubscriptionNotification com o tipo SUBSCRIPTION_RESTARTED. Depois que ela é recebida, o app pode responder à notificação, registrar que a assinatura está configurada para ser renovada e parar de mostrar mensagens de restauração no app. O recurso de assinatura é semelhante a este exemplo:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date
      ...
    }
  ],
}

Renovações de assinaturas após a expiração

Se um produto por assinatura estiver configurado para permitir Renovar assinatura após a expiração, é possível que os usuários iniciem uma compra no app Play Store. Nesse caso, o Google Play vai emitir um token de nova compra e seu back-end vai receber uma notificação do desenvolvedor em tempo real SUBSCRIPTION_PURCHASED. O status para esse tipo de compra não inclui um linkedPurchaseToken nem os identificadores de conta ofuscados associados à compra original nesse caso, já que ele está completamente expirado.

A opção Renovar assinatura após a expiração exige que os usuários abram o app e que você processe esse tipo de compra da mesma forma que outras compras fora do app.

Upgrades, downgrades e novas assinaturas

Quando um usuário fizer upgrade, downgrade ou reativar a assinatura no app antes do vencimento, a antiga será invalidada e uma nova assinatura será criada com um novo token de compra.

Além disso, o recurso de assinatura retornado da API Google Play Developer vai ter um linkedPurchaseToken, que indica de qual compra antiga o usuário fez upgrade, downgrade ou a reativação da assinatura. Você pode usar o linkedPurchaseToken para procurar a assinatura antiga e identificar a conta de usuário existente para que seja possível associar a nova compra à mesma conta.

Antes de oferecer as opções de upgrade, downgrade ou nova assinatura no app, você precisa confirmar a assinatura atual. Qualquer mudança ou reinscrição do plano é bloqueada se a assinatura antiga está com confirmação pendente.

Após a mudança ou a nova assinatura do plano, você também precisa confirmar a nova compra de assinatura. A maneira recomendada é usar a API Google Play Developer para confirmar a compra e evitar o cancelamento dela. O recurso de assinatura é semelhante ao seguinte:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "linkedPurchaseToken": old_purchase_token,
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

Integração de planos pré-pagos

Os planos pré-pagos não são renovados automaticamente após o vencimento. Para estender o direito de assinatura sem que haja interrupção, o usuário precisa recarregar o plano pré-pago dessa assinatura.

Para recargas, inicie o fluxo de faturamento da mesma maneira que você faria para uma compra. Não é necessário indicar que a compra é uma recarga.

As recargas de planos pré-pagos sempre usam o modo de cálculo proporcional IMMEDIATE_AND_CHARGE_FULL_PRICE. Não é necessário definir esse modo explicitamente. O usuário é imediatamente cobrado por um período de faturamento completo, e o direito de uso é estendido pelo prazo especificado na recarga.

Após a recarga, os seguintes campos no objeto de resultado Purchase serão atualizados para refletir a compra de recarga mais recente:

  • ID do pedido
  • Horário da compra
  • Assinatura
  • Token da compra
  • Recebida

Os campos Purchase a seguir sempre contêm os mesmos dados encontrados na compra original:

  • Nome do pacote
  • Estado da compra
  • Produtos
  • Renovação automática

Confirmação de compra de planos pré-pagos

Assim como nas assinaturas de renovação automática, é necessário apresentar uma confirmação de compra para os planos pré-pagos. Tanto a primeira compra quanto todas as recargas posteriores precisam ser confirmadas. Para ver mais informações, consulte Como processar compras.

Alguns planos pré-pagos podem ter prazos de duração curtos. Por isso, é importante confirmar a compra o mais rápido possível.

Planos pré-pagos com prazo de uma semana ou mais precisam ser confirmados dentro de três dias.

Planos com prazo menor que uma semana precisam ser confirmados até metade do período de assinatura do plano. Por exemplo, para um plano pré-pago de três dias, os desenvolvedores têm até um dia e meio para enviar a confirmação.

Como desenvolvedor, você precisa facilitar o gerenciamento da assinatura dos seus clientes. Seu app precisa incluir um link em uma tela de configurações ou preferências para que os usuários possam gerenciar as assinaturas deles. Veja um exemplo desse link na Figura 4.

O botão "Assinaturas do Google Play" nesta imagem é
            um exemplo de link "Gerenciar assinaturas".
Figura 4. O botão Assinaturas do Google Play é um exemplo de link "Gerenciar assinaturas".

No gerenciador de cliques desse link, adicione uma lógica para determinar se o usuário tem assinaturas não vencidas do seu app, em que expiryTime esteja no futuro ou autoRenewing esteja definido como true.

O productId de cada assinatura corresponde ao ID do produto atribuído à assinatura no momento de criação no Play Console. Para determinar o productId de uma assinatura de forma programática, consulte a lista de assinaturas associadas a um usuário específico no back-end do app.

Se o usuário tiver uma assinatura não vencida, direcione-o para um URL semelhante ao seguinte, substituindo "your-sub-product-id" e "your-app-package" pelo ID da assinatura e pelas informações do pacote do aplicativo:

https://play.google.com/store/account/subscriptions?sku=your-sub-product-id&package=your-app-package

Se um usuário não tiver assinaturas não vencidas no seu app, use o seguinte URL para direcioná-lo à página que mostra todas as outras assinaturas, conforme mostrado nas figuras 5 e 6:

https://play.google.com/store/account/subscriptions
A tela de assinaturas da Play Store mostra o status de todas
            as assinaturas de um usuário.
Figura 5. A tela de assinaturas da Play Store mostra o status de todas as assinaturas de um usuário.
Toque em uma assinatura para ver mais detalhes.
Figura 6. Toque em uma assinatura para ver mais detalhes.

Você pode encontrar um código de exemplo para a lógica do link de assinatura no aplicativo de exemplo Classy Taxi (link em inglês).

Permitir que os usuários façam upgrade e downgrade ou modifiquem a assinatura

Você pode oferecer aos usuários diferentes níveis de assinatura, como um nível básico e um nível premium. A Figura 7 mostra uma tela que oferece dois níveis de assinatura:

Este app contém dois níveis de assinatura
Figura 7. Este app tem dois níveis de assinatura.

É importante que os usuários possam acessar uma tela semelhante à Figura 7 para fazer upgrade ou downgrade de uma assinatura. Ao fazer upgrade ou downgrade de uma assinatura, você pode definir o modo de cálculo proporcional, que determina como a mudança afeta os assinantes.

A tabela a seguir lista os modos de cálculo proporcional disponíveis:

Modo de cálculo proporcionalDescrição
IMMEDIATE_WITH_TIME_PRORATION A assinatura recebe upgrade ou downgrade imediatamente. Qualquer tempo restante é ajustado com base na diferença de preço e creditado à nova assinatura, adiando a próxima data de faturamento. Esse é o comportamento padrão.
IMMEDIATE_AND_CHARGE_PRORATED_PRICE A assinatura recebe upgrade imediatamente, e o ciclo de faturamento permanece o mesmo. A diferença de preço referente ao período restante é cobrada do usuário.
IMMEDIATE_WITHOUT_PRORATION A assinatura recebe upgrade ou downgrade imediatamente, e o novo preço é cobrado quando a assinatura é renovada. O ciclo de faturamento permanece o mesmo.
DEFERRED A assinatura só recebe upgrade ou downgrade quando ela é renovada.
IMMEDIATE_AND_CHARGE_FULL_PRICE O upgrade ou downgrade da assinatura é feito e o usuário recebe a cobrança imediata do preço total pela nova titularidade. O valor restante da assinatura anterior é transferido para a mesma titularidade ou um valor proporcional ao tempo é transferido ao mudar para uma titularidade diferente.

Se o usuário estiver mudando os direitos à assinatura, especifique a taxa de cálculo proporcional no ambiente de execução. Não é possível especificar um modo de cálculo proporcional padrão no Google Play Console para mudanças de direitos à assinatura.

Se o usuário não estiver mudando os direitos à assinatura, você poderá usar o modo de cálculo proporcional padrão configurado no Play Console. Também é possível modificar esse comportamento especificando um modo de cálculo proporcional em SubscriptionUpdateParams. Atente-se às seguintes restrições:

  • Ao fazer upgrade ou downgrade ou mudar uma mesma assinatura de um plano pré-pago ou com renovação automática para um plano pré-pago, o único modo de cálculo proporcional permitido é IMMEDIATE_AND_CHARGE_FULL_PRICE. Se você especificar qualquer outro modo de cálculo proporcional, a compra vai falhar e um erro será exibido ao usuário.
  • Ao mudar de plano em uma mesma assinatura de um plano pré-pago para um plano com renovação automática, os modos de cálculo proporcional válidos são IMMEDIATE_AND_CHARGE_FULL_PRICE e IMMEDIATE_WITHOUT_PRORATION. Se você especificar qualquer outro modo de cálculo proporcional, a compra vai falhar e um erro será exibido ao usuário.

Exemplos de cálculo proporcional

Para entender como cada modo de cálculo proporcional funciona, considere o seguinte cenário:

Paulo tem uma assinatura de conteúdo on-line do app Country Gardener. Atualmente, trata-se da assinatura mensal da versão de Nível 1 do conteúdo, que tem apenas texto. Essa assinatura custa R$ 2/mês e é renovada no primeiro dia do mês.

Em 15 de abril, Paulo optou por fazer upgrade para a versão anual do Nível 2, que inclui vídeos com novidades e custa R$ 36/ano.

Ao fazer upgrade da assinatura, o desenvolvedor seleciona um modo de cálculo proporcional. A lista a seguir descreve como cada modo de cálculo proporcional afeta a assinatura de Paulo.

IMMEDIATE_WITH_TIME_PRORATION
A assinatura do Nível 1 de Paulo termina imediatamente. Como o pagamento vale por um mês inteiro (de 1º a 30 de abril), mas Paulo usou apenas metade desse período, metade da assinatura de um mês (R$ 1) é aplicada à nova assinatura. No entanto, como a nova assinatura custa R$ 36 por ano, o saldo de crédito de R$ 1 paga por apenas 10 dias (16 a 25 de abril). Então, no dia 26 de abril, serão cobrados R$ 36 por uma nova assinatura e outros R$ 36 em 26 de abril de cada ano seguinte.
IMMEDIATE_AND_CHARGE_PRORATED_PRICE
Esse modo pode ser usado porque o preço da assinatura do Nível 2 por unidade de tempo (R$ 36/ano = R$ 3/mês) é maior que o preço da assinatura do Nível 1 por unidade de tempo (R$ 2/mês). A assinatura do Nível 1 de Paulo é encerrada imediatamente. Como ele pagou por um mês inteiro, mas usou apenas metade disso, metade da assinatura de um mês (R$ 1) é aplicada à nova assinatura. No entanto, como essa nova assinatura custa R$ 36 por ano, os 15 dias restantes custam R$ 1,50. Assim, ele recebe a cobrança da diferença de R $0,50 pela nova assinatura. Em 1º de maio, são cobrados R$ 36 pelo novo nível da assinatura, e outros R$ 36 no dia 1º de maio de cada ano.
IMMEDIATE_WITHOUT_PRORATION
A assinatura do Nível 1 de Paulo recebe imediatamente upgrade para o Nível 2, sem nenhum custo extra. Em 1º de maio, são cobrados R$ 36 pelo novo nível de assinatura e outros R$ 36 no dia 1º de maio de cada ano.
DEFERRED
A assinatura do Nível 1 de Paulo continua até a expiração, em 30 de abril. No dia 1º de maio, a assinatura do Nível 2 entra em vigor, e Paulo recebe uma cobrança de R$36 pelo novo nível de assinatura.
IMMEDIATE_AND_CHARGE_FULL_PRICE
A assinatura do Nível 1 de Paulo é encerrada imediatamente. A assinatura do Nível 2 começará imediatamente, com uma cobrança de R$36. Como ele pagou por um mês inteiro, mas usou apenas metade disso, metade da assinatura de um mês (R$1) é aplicada à nova assinatura. Como essa nova assinatura custa R$36/ano, ele receberia um período de 1/36 do ano adicionado ao período da assinatura (aproximadamente 10 dias). Portanto, a próxima cobrança de Paulo seria um ano e 10 dias após o dia atual, custando R$ 36. Depois disso, ele receberá uma cobrança de R$36 por ano seguinte.

Ao escolher um modo de cálculo proporcional, leia nossas recomendações de cálculo proporcional.

Seu app pode oferecer um upgrade ou downgrade aos usuários usando as mesmas etapas utilizadas para iniciar um fluxo de compra. No entanto, ao fazer upgrade ou downgrade, você precisa fornecer detalhes sobre a assinatura atual, a assinatura futura (upgrade ou downgrade) e o modo de cálculo proporcional a ser usado, conforme mostrado no exemplo a seguir:

String offerToken = productDetails
                        .getSubscriptionOfferDetails(selectedOfferIndex)
                        .getOfferToken();

BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(
        ImmuableList.of(
            ProductDetailsParams.newBuilder()
                // fetched via queryProductDetailsAsync
                .setProductDetails(productDetails)
                // offerToken can be found in
                // ProductDetails=>SubscriptionOfferDetails
                .setOfferToken(offerToken)
                .build()))
    .setSubscriptionUpdateParams(
        SubscriptionUpdateParams.newBuilder()
            // purchaseToken can be found in Purchase#getPurchaseToken
            .setOldSkuPurchaseToken("old_purchase_token")
            .setReplaceSkusProrationMode(ProrationMode.IMMEDIATE_AND_CHARGE_FULL_PRICE)
            .build())
    .build();

BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

// process purchase results from PurchasesUpdatedListener registered with BillingClient
public void onPurchaseUpdated(BillingResult billingResult, @Nullable List<Purchase> purchases) {
  // check BillingResult
  // process returned Purchase list, e.g. grant entitlement
}

Para os modos de cálculo proporcional de substituição imediata, o app recebe a nova compra no PurchasesUpdatedListener. A compra também está disponível em BillingClient.queryPurchasesAsync(). Ao receber o token de compra, siga o mesmo processo de verificação usado para um novo token. Confirme essas compras com BillingClient.acknowledgePurchase() da Biblioteca Google Play Faturamento ou Purchases.subscriptions:acknowledge da API Google Play Developer.

A API Google Play Developer retorna um linkedPurchaseToken no recurso de assinatura. Invalide o token fornecido no linkedPurchaseToken para garantir que o token antigo não seja usado para acessar seus serviços. Consulte Upgrades, downgrades e novas assinaturas para ver informações sobre como processar compras de upgrade e downgrade.

No modo de substituição adiada, seu app recebe uma chamada para a interface PurchasesUpdatedListener com a compra do plano de assinatura original e um status do sucesso do upgrade ou downgrade. Até que a substituição entre em vigor, BillingClient.queryPurchasesAsync() continua retornando a compra do plano de assinatura original. Quando o novo plano entra em vigor, queryPurchasesAsync() retorna os dados de compra da nova assinatura, e uma notificação SUBSCRIPTION_RENEWED é enviada ao servidor de back-end seguro. Para substituições adiadas, é altamente recomendável detectar essa notificação e confirmar a compra usando Purchases.subscriptions:acknowledge. O linkedPurchaseToken no recurso de assinatura pode ser usado para determinar qual usuário no back-end da assinatura, se aplicável, será atualizado com a nova titularidade. Seu app não deve depender de que o usuário abra o app e confirme via BillingClient.acknowledgePurchase(), já que o usuário pode não abrir o app em até três dias após a mudança do plano entrar em vigor.

Como fazer upgrade com ofertas de teste sem custo financeiro ou preço inicial

As configurações de qualificação para teste sem custo financeiro se aplicam quando um usuário faz upgrade ou downgrade. É possível ajustar as configurações de qualificação para teste sem custo financeiro no Google Play Console.

Observe o seguinte:

  • Se os usuários só tiverem direito a um teste sem custo financeiro para todas as assinaturas disponíveis no seu app, o novo plano que ele está assinando não terá período de teste nem oferta de preço inicial.
  • Se você oferecer um teste sem custo financeiro para cada produto por assinatura, o novo plano que o usuário está adotando poderá ter o período de teste ou a oferta preço inicial.

A tabela a seguir descreve o comportamento de cada modo de cálculo proporcional se os planos novos e antigos tiverem um teste sem custo financeiro e o usuário estiver fazendo upgrade durante esse período de teste:

Um teste sem custo financeiro por app Um teste sem custo financeiro para cada produto por assinatura
IMMEDIATE_WITH_TIME_PRORATION O usuário perde o teste sem custo financeiro imediatamente. O período de teste sem custo financeiro restante é convertido em um período sem custo financeiro equivalente do novo nível com base na diferença de preço. O usuário perde o teste sem custo financeiro anterior, mas inicia imediatamente um novo teste. Além disso, o período de teste gratuito restante do nível antigo é convertido em um período equivalente do novo nível e adicionado ao novo teste gratuito.
IMMEDIATE_AND_CHARGE_PRORATED_PRICE

O usuário perde o teste sem custo financeiro imediatamente. A diferença de preço referente ao período restante é cobrada do usuário. A próxima data de faturamento permanece inalterada.

Observação: essa opção está disponível apenas para um upgrade de assinatura, em que o preço por unidade de tempo aumenta.

IMMEDIATE_WITHOUT_PRORATION O usuário recebe um upgrade imediato para o novo nível. O usuário mantém o acesso ao teste sem custo financeiro para o novo nível até o final do período de faturamento anterior.
DEFERRED O usuário mantém o acesso ao teste sem custos financeiros da assinatura antiga até a próxima data de faturamento.
IMMEDIATE_AND_CHARGE_FULL_PRICE O usuário perde o teste sem custo financeiro imediatamente. O preço da nova assinatura será cobrado do usuário. A próxima data de faturamento passa a ser o novo período de assinatura somado ao tempo restante do teste sem custo financeiro.

Para entender como as transições de testes gratuitos funcionam no caso padrão de um teste por app, considere este cenário:

Maria tem uma assinatura de conteúdo on-line do app Country Gardener. Atualmente, trata-se da assinatura mensal da versão de Nível 1 do conteúdo, que tem apenas texto. Essa assinatura custa R$ 10/mês, e ela assinou no dia 1º de abril. Ela está aproveitando um teste sem custo financeiro de 30 dias como assinante pela primeira vez, o que significa que o primeiro pagamento vence em 1º de maio.

Em 15 de abril, Maria decide fazer upgrade para a assinatura de Nível 2, que inclui vídeos com novidades e custa R$ 20/mês. Essa segunda assinatura também tem um teste de 30 dias.

A lista a seguir descreve a transição do teste sem custo financeiro para cada modo de cálculo proporcional:

  • IMMEDIATE_WITH_TIME_PRORATION: Maria recebe um upgrade imediato para o Nível 2. Como Maria fez upgrade na metade do período de assinatura, metade da assinatura mensal (15 dias, no valor de R$10/mês) é aplicada à nova assinatura. No entanto, como essa nova assinatura custa R$ 20/mês, o saldo de 15 dias paga apenas por 7,5 dias. Maria não está qualificada para outro teste sem custo financeiro do Nível 2. Portanto, a partir de 22 de abril, ela vai receber uma cobrança mensal de R$ 20.
  • IMMEDIATE_AND_CHARGE_PRORATED_PRICE: este modo pode ser usado porque o preço da assinatura de Nível 2 por unidade de tempo (R$ 20/mês) é maior que o preço da assinatura de Nível 1 por unidade de tempo (R$ 10/mês). A assinatura do Nível 1 de Maria recebe um upgrade imediato para o Nível 2, e ela perde o teste sem custo financeiro. Como a próxima data de faturamento de Maria era 1º de maio, ela recebeu uma cobrança de R$ 10 para cobrir a segunda metade de abril. A partir de 1º de maio, ela receberá uma cobrança de R$ 20 todo mês.
  • IMMEDIATE_WITHOUT_PRORATION: a assinatura do Nível 1 de Maria recebe um upgrade imediato para o Nível 2. Maria continua com o teste sem custo financeiro até 30 de abril e agora tem acesso ao conteúdo do Nível 2. A partir de 1º de maio, ela recebe uma cobrança de R$ 20 ao mês.
  • DEFERRED: a assinatura do Nível 1 de Maria continua até o próximo pagamento, em 1º de maio. Em 1º de maio, a assinatura do Nível 2 entra em vigor, e a cobrança de R$ 20 é feita no primeiro dia de cada mês.
  • IMMEDIATE_AND_CHARGE_FULL_PRICE: a assinatura do Nível 1 de Maria recebe um upgrade imediato para o Nível 2, e ela perde o teste sem custo financeiro. Ela recebe uma cobrança de R$20 imediatamente. Como Maria tem 15 dias restantes no teste sem custo financeiro, a próxima data de faturamento é de 1 mês + 15 dias a partir de agora ou 1º de julho. A partir de 1º de julho, ela receberá uma cobrança de R$20 por mês.

A lista a seguir descreve o comportamento de transição se o desenvolvedor permitir um teste sem custo financeiro por assinatura:

  • IMMEDIATE_WITH_TIME_PRORATION: Maria recebe um upgrade imediato para o Nível 2. Como Maria fez upgrade na metade do período de assinatura, metade da assinatura mensal (15 dias, no valor de R$ 10/mês) é aplicada à nova assinatura. No entanto, como essa nova assinatura custa R$ 20/mês, o saldo de 15 dias paga apenas por 7,5 dias. Maria está qualificada para outro teste sem custo financeiro do Nível 2. Portanto, ela não é cobrada por mais 37,5 dias. A partir de 22 de maio, ela recebe uma cobrança de R$ 20 ao mês.
  • IMMEDIATE_AND_CHARGE_PRORATED_PRICE: este modo pode ser usado porque o preço da assinatura de Nível 2 por unidade de tempo (R$ 20/mês) é maior que o preço da assinatura de Nível 1 por unidade de tempo (R$ 10/mês). A assinatura do Nível 1 de Maria recebe um upgrade imediato para o Nível 2, e ela perde o teste sem custo financeiro. Como a próxima data de faturamento de Maria era 1º de maio, ela recebeu uma cobrança de R$ 10 para cobrir a segunda metade de abril. A partir de 1º de maio, ela receberá uma cobrança de R$ 20 todo mês.
  • IMMEDIATE_WITHOUT_PRORATION: a assinatura do Nível 1 de Maria recebe um upgrade imediato para o Nível 2. Maria continua com o teste sem custo financeiro até 30 de abril e agora tem acesso ao Nível 2.
  • DEFERRED: a assinatura do Nível 1 de Maria continua até o próximo pagamento, em 1º de maio. Em 1º de maio, a assinatura do Nível 2 entra em vigor, e a cobrança de R$ 20 é feita no primeiro dia de cada mês.
  • IMMEDIATE_AND_CHARGE_FULL_PRICE: a assinatura do Nível 1 de Maria recebe um upgrade imediato para o Nível 2, e ela perde o teste sem custo financeiro. Ela recebe uma cobrança de R$20 imediatamente. Como Maria tem 15 dias restantes no teste sem custo financeiro, a próxima data de faturamento é de 1 mês + 15 dias a partir de agora ou 1º de julho. A partir de 1º de julho, ela receberá uma cobrança de R$20 por mês.

Recomendações de cálculo proporcional

A tabela a seguir mostra diferentes cenários de cálculo proporcional e o que recomendamos para cada um deles:

Cenário Modo de cálculo proporcional recomendado Resultado
Upgrade para um nível mais caro IMMEDIATE_AND_CHARGE_PRORATED_PRICE O usuário recebe acesso imediatamente, mantendo o mesmo período de faturamento.
Downgrade para um nível mais barato DEFERRED O usuário já pagou pelo nível mais caro, então manterá o acesso até a próxima data de faturamento.
Mudança de período recorrente no mesmo nível (por exemplo, mensal para anual) DEFERRED O usuário pagará o novo preço recorrente na próxima data de faturamento.
Upgrade durante o teste sem custo financeiro, mantendo o teste IMMEDIATE_WITHOUT_PRORATION O usuário mantém o acesso ao teste sem custo financeiro, mas faz upgrade para um nível superior pelo restante do teste.
Upgrade durante o teste sem custo financeiro, encerrando o acesso a ele IMMEDIATE_AND_CHARGE_PRORATED_PRICE O usuário recebe acesso ao novo nível imediatamente, mas não tem mais o teste sem custo financeiro.

Gestão de clientes

Com as notificações do desenvolvedor em tempo real, é possível detectar imediatamente quando um usuário decide cancelar. Quando um usuário cancela a assinatura antes da expiração, você pode enviar notificações push ou mensagens no app para pedir que ele a renove.

Depois que um usuário cancela a assinatura, você pode usar o app ou a Play Store tentar convencer ele a renovar a assinatura. A tabela a seguir descreve vários cenários de assinatura, com ações associadas de recuperação e requisitos de app.

Antes da expiração da assinatura Após a expiração da assinatura
No app Na Play Store No app Na Play Store
Recurso de recuperação Assinatura no app Restauração Assinatura no app Nova assinatura
O usuário percorre o fluxo de finalização da compra Sim Não Sim Sim
A assinatura do usuário permanece associada ao mesmo SKU O usuário pode se inscrever para um SKU igual ou diferente Sim O usuário pode se inscrever para um SKU igual ou diferente Sim
Cria um novo token de compra Sim Não Sim Sim
Ativado por padrão Não Sim, a compatibilidade é necessária para todos os desenvolvedores Não

Apps sem a Biblioteca Faturamento versão 2.0 ou mais recente: não.

Apps com a Biblioteca Faturamento versão 2.0 ou mais recente: sim. Os desenvolvedores podem desativar no console.

Quando o usuário é cobrado

Se usar o mesmo SKU: no fim do período de faturamento atual.

Se usar um SKU diferente: depende do modo de cálculo proporcional.

Fim do período de faturamento atual Imediatamente Imediatamente
Implementação necessária Fornecer uma IU de nova assinatura no seu app

Detectar mudanças no estado da assinatura

Link direto para a Play Store

Fornecer uma IU de nova assinatura no seu app Processar compras fora do aplicativo

Antes da expiração da assinatura: no app

Para assinaturas que foram canceladas, mas ainda não expiraram, é possível permitir que os assinantes restaurem as assinaturas no seu app aplicando o mesmo fluxo de compra de produto no aplicativo usado para novos assinantes. Verifique se a IU reflete que o usuário tem uma assinatura existente. Por exemplo, é possível exibir a data de validade atual do usuário e o preço recorrente com um botão Reativar.

Na maioria das vezes, convém oferecer ao usuário o mesmo preço e o mesmo SKU que ele já assinava, conforme mostrado a seguir:

  • Inicie uma nova compra de assinatura com o mesmo SKU.
  • A nova assinatura substitui a antiga e será renovada na mesma data de validade. A assinatura antiga será marcada imediatamente como expirada.
  • Por exemplo, Ana tem uma assinatura do app Example Music, e a assinatura expira no dia 1º de agosto. Em 10 de julho, ela refaz a assinatura de um mês pelo mesmo preço mensal. A nova assinatura é proporcional ao crédito restante, fica ativa imediatamente e ainda é renovada em 1º de agosto.

Se quiser oferecer um preço diferente (por exemplo, um novo teste sem custo financeiro ou um desconto de recuperação), forneça um SKU diferente ao usuário:

  • Inicie um upgrade ou downgrade com um SKU diferente usando o modo de cálculo proporcional IMMEDIATE_WITHOUT_PRORATION.
  • A nova assinatura substitui a antiga e será renovada na mesma data de validade. O preço do novo SKU é cobrado do usuário, incluindo preços iniciais, na data de validade original. Se a assinatura antiga foi criada usando um ID ofuscado da conta, esse mesmo ID precisa ser transmitido para o BillingFlowParams para serem feitos upgrades e downgrades.
  • Por exemplo, Ana tem uma assinatura do app Example Music, e a assinatura expira no dia 1º de agosto. Em 10 de julho, ela refaz a assinatura anual com um preço inicial. A nova assinatura será ativada imediatamente, e o preço inicial do usuário será cobrado em 1º de agosto.
  • Se você decidir incluir um teste sem custo financeiro ou preço inicial no SKU de recuperação, torne o usuário qualificado para isso desmarcando a caixa Permitir um teste sem custo financeiro por app no Google Play Console, que restringe o usuário a apenas um teste sem custo financeiro por app.

Quando você receber o token, processe a compra como faria com uma nova assinatura. Além disso, a API Google Play Developer retorna um linkedPurchaseToken no recurso de assinatura. Invalide o token fornecido no linkedPurchaseToken para garantir que o token antigo não seja usado para acessar seus serviços.

Antes da expiração da assinatura na Play Store

Enquanto a assinatura está cancelada, mas ainda ativa, ela pode ser restaurada pelo usuário na central de assinaturas do Google Play, clicando na opção Renovar assinatura, antes chamada de Restaurar. Isso mantém o mesmo token de compra e assinatura.

Seção &quot;Assinaturas&quot; no app Google Play Store mostrando uma
            assinatura cancelada com um botão &quot;Assinar novamente&quot;.
Figura 8. Seção Conta > Assinaturas no app Google Play Store mostrando uma assinatura cancelada com um botão Renovar assinatura.

Para mais informações sobre como restaurar assinaturas, consulte Restaurações.

Após a expiração da assinatura: no app

É possível permitir que usuários com assinaturas expiradas refaçam a assinatura no app aplicando o mesmo fluxo de compra de produto no aplicativo usado para novos assinantes. Observe o seguinte:

  • Para dar um desconto aos usuários, ofereça um ID do produto com preços especiais para sua assinatura, também chamado de SKU de recuperação. Você pode disponibilizar a oferta no seu app ou notificar o usuário sobre a oferta fora do app, como por e-mail.
  • Para iniciar uma assinatura de recuperação, abra o fluxo de compra no seu app Android usando a Biblioteca Google Play Faturamento. Esse processo é igual ao de uma nova assinatura, mas você pode determinar o SKU disponível para o usuário.
  • Se você decidir incluir um teste sem custo financeiro ou preço inicial no SKU de recuperação, torne o usuário qualificado para isso desmarcando a caixa Permitir um teste sem custo financeiro por app no Google Play Console, que restringe o usuário a apenas um teste sem custo financeiro por app.
  • Se o usuário fizer uma nova assinatura do mesmo SKU, ele não estará mais qualificado para testes sem custo financeiros nem preço inicial. Garanta que a IU reflita isso.

Quando você receber o token, processe a compra como faria com uma nova assinatura. Você não receberá um linkedPurchaseToken no recurso de assinatura.

Após a expiração da assinatura: na Play Store

Se ativado, os usuários podem assinar novamente o mesmo SKU por até um ano após a validade. Basta clicar em Renovar assinatura na central de assinaturas do Google Play. Isso gera um novo token de compra e assinatura.

Seção &quot;Assinaturas&quot; no app Google Play Store mostrando uma
            assinatura cancelada e expirada com botões &quot;Assinar novamente&quot; e
            &quot;Remover&quot;.
Figura 9. Seção Conta > Assinaturas no app Google Play Store mostrando uma assinatura cancelada e expirada com botões Assinar novamente e Remover.

A nova assinatura é considerada uma compra fora do app. Por isso, siga as práticas recomendadas para processar compras feitas fora do app.

Promover sua assinatura

Crie códigos promocionais para oferecer a usuários selecionados um teste gratuito mais longo para uma assinatura já existente. Para saber mais, consulte Códigos promocionais.

O Google Play verifica se o usuário tem uma forma de pagamento válida antes de iniciar o teste sem custo financeiro. Alguns usuários podem ver essa verificação como uma retenção ou cobrança na forma de pagamento deles. A retenção ou cobrança é temporária e será revertida ou reembolsada posteriormente.

Após o término do período de teste, a forma de pagamento do usuário recebe uma cobrança referente ao valor total da assinatura.

Se um usuário cancela uma assinatura a qualquer momento durante o período de teste sem custo financeiro, ela permanece ativa até o final desse período e não é cobrada quando ele terminar.

Cancelar, reembolsar ou revogar

Você pode usar a API Google Play Developer para cancelar, reembolsar ou revogar uma assinatura. Essa funcionalidade também está disponível no Google Play Console.

  • Cancelar: os usuários podem cancelar uma assinatura no Google Play. Você também pode fornecer uma opção para os usuários cancelarem no seu app ou site. Seu app deve processar esses cancelamentos conforme descrito em Revogações.
  • Reembolsar: quando você faz um reembolso, o usuário pode continuar usando a assinatura. Os reembolsos poderão ser usados se, por exemplo, tiver ocorrido um erro técnico que impediu o usuário de acessar seu produto, mas o erro tiver sido resolvido. Para reembolsar mais do que o pagamento mais recente ou emitir um reembolso parcial, use o Google Play Console.
  • Revogar: quando você revoga a assinatura, o usuário perde imediatamente o acesso a ela. Isso poderá ser usado se, por exemplo, tiver ocorrido um erro técnico que impediu o usuário de acessar seu produto e ele não quiser continuar a usá-lo. Seu app deve processar esses cancelamentos conforme descrito em Revogações.

A tabela a seguir ilustra as diferenças entre cancelamento, reembolso e revogação.

Interrompe a renovação Reembolsa dinheiro Revoga o acesso
Cancelar Sim Não Não
Reembolsar Não Sim Não
Revogar Sim Sim Sim

Adiar o faturamento de um assinante

Você pode adiar a próxima data de faturamento de um assinante de um plano com renovação automática usando Purchases.subscriptions:defer da API Google Play Developer. Durante o período de adiamento, o usuário será assinante do conteúdo com acesso total, mas não será cobrado. A data de renovação da assinatura é atualizada para a nova data.

Para planos pré-pagos, é possível usar a API de adiamento de faturamento para adiar o prazo de vencimento.

O faturamento adiado permite:

  • Dar aos usuários acesso gratuito como uma oferta especial, por exemplo, oferecendo uma semana de uso grátis para quem comprar um filme.
  • Dar acesso sem custo financeiro aos clientes para desenvolver um bom relacionamento.

O faturamento pode ser adiado de um dia a um ano por chamada de API. Para adiar ainda mais o faturamento, chame a API novamente antes da nova data de faturamento.

Por exemplo, Daniela tem uma assinatura mensal de conteúdo on-line do aplicativo Fishing Quarterly. Normalmente, ela recebe uma cobrança de R$ 1,25 no primeiro dia de cada mês. Em março, ela participou de uma pesquisa on-line para o editor do app. O editor a recompensou com seis semanas sem custo financeiro, adiando o próximo pagamento até 15 de maio, o que corresponde a seis semanas após a data de faturamento anteriormente agendada para 1º de abril. Daniela não é cobrada em abril nem no início de maio e ainda tem acesso ao conteúdo. Em 15 de maio, ela é cobrada pela taxa de assinatura normal de R$ 1,25 para o mês. Agora, a próxima data de renovação é 15 de junho.

Com o adiamento, você pode notificar o usuário por e-mail ou no aplicativo que a data de faturamento foi modificada.

Como mudar preços da assinatura

É possível mudar o preço dos planos básicos e ofertas da assinatura. Por exemplo, você pode ter produtos digitais que precisam de ajustes anuais de preço ou talvez mude o conjunto de benefícios de um produto e queira refletir essas mudanças no preço.

Para ver informações sobre como mudar preços de uma assinatura usando o Play Console, consulte a documentação na Central de Ajuda do Play Console.

Gerenciar mudanças de preço para novas compras

Quando você muda o preço de um plano básico ou de uma oferta, a nova tarifa entra em vigor em algumas horas para todas as novas compras, sem que nenhuma outra ação seja necessária. As novas compras podem ser feitas por:

  • usuários que não têm uma assinatura no app;
  • usuários que já compraram um plano com renovação automática e agora estão comprando um plano diferente, como um período de faturamento mais longo ou um nível de serviço mais alto;
  • usuários com um plano pré-pago que estão comprando uma recarga.

As novas compras são processadas como qualquer outra.

Gerenciar mudanças de preço em compras de planos de assinatura com renovação automática

É possível mudar o preço de um plano básico com renovação automática a qualquer momento. Por padrão, os assinantes atuais não são afetados. Eles são colocados em uma coorte de preço legada em que continuam pagando o preço original do plano básico quando fazem a renovação. Você pode encerrar a coorte a qualquer momento e mover esses usuários para o preço atual do plano básico.

Da mesma forma, as mudanças de preços para ofertas especiais e fases de preços individuais não afetam os assinantes atuais. Eles continuam pagando os preços de quando compraram a assinatura.

Para saber mais sobre o uso de coortes de preço legadas, consulte a Central de Ajuda do Play Console.

Como mudar preços de assinaturas com a API Google Play Developer

Para mudar o preço do plano básico da assinatura de forma programática, use o método monetization.subscriptions.patch. Ele recebe um objeto Subscription com a configuração do produto por assinatura que está sendo modificada. Defina o novo preço no objeto RegionalBasePlanConfig no plano básico correto na coleção basePlans da assinatura. Isso pode ser muito útil caso você tenha um catálogo de tamanho considerável e precise atualizar todos os seus produtos em um curto período ou caso tenha um sistema para gerenciamento de catálogo de produtos que aplica mudanças automaticamente nos produtos por assinatura do Google Play Faturamento quando elas ocorrem.

Para mudar o preço do plano básico no Play Console, consulte esta Central de Ajuda.

Encerrar uma coorte de preço legada

Quando uma coorte de preço legada é encerrada, os usuários que pagam os valores mais antigos do plano básico com renovação automática são transferidos para a tarifa atual. Se quiser encerrar um preço legado no Play Console, consulte esta Central de Ajuda.

Encerrar uma coorte de preço legada com a API Google Play Developer

Para encerrar programaticamente uma coorte de preço legada, use o método monetization.subscriptions.basePlans.migratePrices. Ele migra os assinantes que estão pagando um preço antigo para o valor atual do plano básico da região especificada. Esse método vai acionar as notificações de mudança de preço para os usuários que estão pagando um valor anterior ao carimbo de data/hora fornecido. Os assinantes que não concordarem com o novo preço terão a assinatura encerrada na renovação seguinte.

Quando a mudança de preço entra em vigor

Depois que você encerra uma coorte de preço legada, um processo para transferir esses usuários para o preço atual do plano básico é iniciado. O Google Play notifica os usuários sobre a futura mudança, tanto para aumento quanto redução no preço.

Reduções de preço

Se o preço do plano básico atual for menor, o Google Play vai notificar os usuários por e-mail e eles pagarão o novo valor pela primeira vez na próxima data de renovação.

Aumentos de preço

Se o preço do plano básico atual for maior, o Google Play vai notificar os usuários por e-mail e notificações push. O preço será cobrado na primeira data de renovação após um período de aviso com antecedência de 37 dias: sete dias iniciais do período de espera e 30 dias quando as notificações começarem a ser enviadas aos usuários.

Os usuários precisam concordar com o valor mais alto durante o período de aviso prévio na Play Store antes da primeira cobrança do novo preço. Caso contrário, a assinatura vai ser cancelada automaticamente. O Google Play notifica os usuários por e-mail e notificações push 1 dia e 30 dias antes da primeira cobrança.

Comunicar a mudança de preço ao usuário

Notifique seus assinantes sempre que mudar o preço do plano básico ou encerrar a coorte legada. Para aumentos de preço, envie avisos prévios aos usuários e informe sobre a necessidade de aceitar o aumento.

Ao aumentar o preço de uma assinatura, você tem pelo menos sete dias após o encerramento de uma coorte legada para notificar os assinantes sobre a mudança antes que eles comecem a ser avisados pelo Google Play. Durante esse período, é possível cancelar um aumento de preço pendente fazendo outra mudança no valor original. Você também pode notificar os usuários afetados antes do Google Play fazer isso.

No app, recomendamos que você notifique os usuários afetados e forneça um link direto para a tela de assinatura da Play Store, ajudando-os a aceitar o novo preço mais facilmente.

Os usuários podem analisar o aumento de preço na tela de assinatura da Play Store, em que uma caixa de diálogo parecida com a Figura 13 será exibida.

Caixa de diálogo genérica que notifica o usuário sobre uma mudança no preço da assinatura
Figura 13. Caixa de diálogo de exemplo notificando o usuário sobre uma mudança no preço da assinatura.

Exemplos

Exemplo 1 (assinatura mensal): no dia 3 de março, o SuperStreamz aumenta o preço do SuperStreamz Pro, a assinatura de streaming de vídeo premium, encerrando uma coorte de preço legado. Os usuários são movidos da coorte de preço legado de US $1 para o preço atual do plano básico de US $2. O início da vigência da mudança de preço é 9 de abril (37 dias após 3 de março).

  • Alice já é assinante, com a próxima renovação para 5 de março. A primeira renovação após o início da vigência será em 5 de maio. Portanto, ela vai ser renovada pelo preço antigo (US$ 1) em 5 de março e em 5 de abril. Na renovação seguinte, em 5 de maio, o novo preço será cobrado (US$ 2). O Google Play começará a notificar Alice sobre a mudança de preço em 5 de abril, 30 dias antes da primeira data de renovação com o novo preço.
Diagrama do cronograma genérico da mudança de preço de uma assinatura mensal com data de renovação em 5 de março
Figura 14. Exemplo de diagrama do cronograma da mudança de preço de uma assinatura mensal com data de renovação em 5 de março.
  • Beto já é assinante, com a próxima renovação para 29 de março. Essa renovação será pelo preço antigo (US$ 1), porque a mudança de preço ainda não está em vigor. Quando a assinatura for renovada novamente em 29 de abril, o novo preço será cobrado (US$ 2). Beto vai começar a receber notificações sobre essa mudança em 30 de março, 30 dias antes da primeira data de renovação com o novo preço.
Diagrama do cronograma genérico da mudança de preço de uma assinatura mensal com data de renovação em 29 de março
Figura 15. Exemplo de diagrama do cronograma da mudança de preço de uma assinatura mensal com data de renovação em 29 de março.

Exemplo 2 (assinatura de três meses): no dia 3 de março, a FindMyLove encerra uma coorte de preço legado e aumenta a tarifa trimestral do FindMyLove Premium de US $1 para o preço do plano básico de US $2. O início da vigência da mudança de preço é 9 de abril (37 dias após 3 de março).

  • Alice já é assinante, com a próxima renovação para 5 de março. Essa renovação será pelo preço antigo (US$ 1), porque a mudança de preço ainda não está em vigor. Quando a assinatura for renovada novamente em 5 de junho, o novo preço será cobrado (US$ 2). Alice vai começar a receber notificações sobre a mudança no preço em 6 de maio, 30 dias antes da primeira data de renovação com o novo preço.
Diagrama do cronograma genérico da mudança de preço de uma assinatura trimestral com data de renovação em 5 de março
Figura 16. Exemplo do diagrama de cronograma da mudança de preço de uma assinatura trimestral com data de renovação em 5 de março.
  • Beto já é assinante, com a próxima renovação para 11 de abril. Ela vai ser renovada pelo novo antigo (US$ 2), porque essa data é posterior ao início da vigência. Beto vai começar a receber notificações sobre essa mudança em 12 de março, 30 dias antes da primeira data de renovação.
Diagrama do cronograma genérico da mudança de preço de uma assinatura trimestral com data de renovação em 11 de abril
Figura 17. Exemplo de diagrama de cronograma da mudança de preço de uma assinatura trimestral com data de renovação em 11 de abril.

Exemplo 3 (assinatura semanal): no dia 3 de março, a CutePetsNews encerra uma coorte de preço legado, acionando a migração de preço semanal de alertas semanais sobre cães de US $1 para US $2. O início da vigência da mudança de preço é 9 de abril.

  • Alice já é assinante, com a próxima renovação semanal marcada para 6 de março. A renovação vai ocorrer nos dias 6, 13, 20 e 27 de março e no dia 3 de abril pelo preço antigo (US$ 1), porque a mudança de preço ainda não está em vigor. Quando a assinatura for renovada novamente no dia 10 de abril, o novo preço será cobrado (US$ 2). Alice vai começar a receber notificações sobre a mudança de preço em 11 de março, 30 dias antes da primeira data de renovação com o novo preço.
Diagrama do cronograma genérico da mudança de preço de uma assinatura semanal com data de renovação em 6 de abril
Figura 18. Exemplo de diagrama do cronograma da mudança de preço de uma assinatura semanal com data de renovação em 6 de abril.

Exemplo 4 (assinatura mensal, várias mudanças de preço): este exemplo mostra como várias mudanças de preço são processadas.

No dia 3 de março, o SuperStreamz aciona uma migração de preço para o SuperStreamz Pro, a assinatura de streaming de vídeo premium, aumentando o preço de US $1 para US $2 por mês. No dia 10 de março, o desenvolvedor aciona uma segunda migração de preço, aumentando o preço para US $3/mês.

O início da vigência da primeira mudança de preço é 9 de abril (37 dias após 3 de março), e o da segunda mudança de preço é 16 de abril (37 dias após 10 de março).

  • A próxima renovação da Alice vai ser no dia 5 de março. A primeira renovação após o início da vigência será em 5 de maio. A assinatura vai ser renovada pelo preço antigo (US$ 1) em 5 de março e em 5 de abril. Quando a assinatura for renovada novamente no dia 5 de maio, o novo preço será cobrado (US$ 2). A Alice só receberá notificações sobre a segunda mudança de preço, porque ela ocorreu no período de aviso de sete dias. A Alice vai começar a receber notificações sobre a mudança de preço em 5 de abril, 30 dias antes da primeira data de renovação com o novo preço.
Diagrama do cronograma genérico da mudança de preço de uma assinatura mensal com várias mudanças de preço
Figure 19. Exemplo de diagrama de cronograma da mudança de preço de uma assinatura mensal com várias mudanças de preço e data de renovação em 5 de março.

Processar a confirmação do usuário sobre a mudança de preço

Quando um usuário aceita o aumento no preço da assinatura, você recebe uma SubscriptionNotification com o tipo SUBSCRIPTION_PRICE_CHANGED_CONFIRMED. Com uma desistência de redução no preço ou quando o aumento no preço da assinatura for renovado, você receberá uma SubscriptionNotification com o tipo SUBSCRIPTION_RENEWED. Processe essa notificação como qualquer outra renovação.

Processar uma recusa do aumento de preço

Se um usuário não concordar com um aumento de preço antes de precisar renovar com o novo valor, a assinatura será cancelada automaticamente, e você receberá uma SubscriptionNotification com o tipo SUBSCRIPTION_CANCELED. Esse evento pode ser processado conforme descrito em Cancelamentos.

Mudança acidental de preço

Se você mudou o preço de uma assinatura sem querer, reverta a mudança imediatamente. Desde que o preço seja revertido em até sete dias, os assinantes atuais não serão notificados sobre a mudança acidental de preço. Os novos assinantes poderão receber o preço acidental durante o período entre a primeira mudança de preço e a reversão.

Como fazer duas mudanças de preço seguidas

Se você mudar o preço de uma assinatura duas vezes em um período de sete dias, os usuários afetados precisarão concordar apenas com a mudança mais recente. Por exemplo, se você encerrar uma coorte com um aumento de preço e depois mudar o valor novamente, os usuários qualificados não precisarão responder ao primeiro aumento de preço, já que somente o segundo será válido.

Faça apenas uma mudança de preço por vez. Não mude o preço do usuário para fins de teste.

Processar pagamentos recusados

Se houver problemas de pagamento no final de um ciclo de faturamento, o Google vai tentar renovar periodicamente a assinatura por algum tempo antes do cancelamento. Esse período de repetição pode durar até 30 dias mais qualquer período de carência especificado. Durante esse período, o Google também envia e-mails e notificações ao usuário pedindo que ele atualize a forma de pagamento.

Após a recusa do pagamento, a assinatura entra no período de carência, se ativado. Durante esse período, o usuário ainda vai ter acesso à assinatura.

Após qualquer período de carência, a assinatura entra na suspensão de conta por até 30 dias. Durante a suspensão de conta, você pode bloquear o acesso à assinatura.

Para maximizar a probabilidade de recuperação da assinatura durante uma recusa de pagamento, você pode informar o usuário sobre um problema de pagamento e solicitar que ele o corrija.

Você pode fazer isso por conta própria, conforme descrito nas seções período de carência e suspensão de conta, ou implementar a API de mensagens no app, em que o Google mostra uma mensagem aos usuários no seu app.

Mensagens no app

Se você tiver ativado as mensagens no app com o InAppMessageCategoryId.TRANSACTIONAL, o Google Play vai mostrar as mensagens durante o período de carência e a suspensão de conta uma vez por dia, além de fornecer a eles uma oportunidade de corrigir o pagamento sem sair do app.

Snackbar notificando o usuário para que ele corrija o pagamento
Figura 20. Snackbar notificando o usuário para que ele corrija o pagamento.

Recomendamos que você chame essa API sempre que o usuário abrir o app para determinar se a mensagem vai ser exibida.

Se o usuário recuperar a assinatura, você vai receber um código de resposta de SUBSCRIPTION_STATUS_UPDATED com um token de compra. Use esse token de compra para chamar a API Google Play Developer e atualizar o status da assinatura no app.

Integrar mensagens no app

Para mostrar mensagens no app ao usuário, use BillingClient.showInAppMessages().

Veja um exemplo de como acionar o fluxo de mensagens no app:

Kotlin

val inAppMessageParams = InAppMessageParams.newBuilder()
        .addInAppMessageCategoryToShow(InAppMessageCategoryId.TRANSACTIONAL)
        .build()

billingClient.showInAppMessages(activity,
        inAppMessageParams,
        object : InAppMessageResponseListener() {
            override fun onInAppMessageResponse(inAppMessageResult: InAppMessageResult) {
                if (inAppMessageResult.responseCode == InAppMessageResponseCode.NO_ACTION_NEEDED) {
                    // The flow has finished and there is no action needed from developers.
                } else if (inAppMessageResult.responseCode
                        == InAppMessageResponseCode.SUBSCRIPTION_STATUS_UPDATED) {
                    // The subscription status changed. For example, a subscription
                    // has been recovered from a suspend state. Developers should
                    // expect the purchase token to be returned with this response
                    // code and use the purchase token with the Google Play
                    // Developer API.
                }
            }
        })

Java

InAppMessageParams inAppMessageParams = InAppMessageParams.newBuilder()
        .addInAppMessageCategoryToShow(InAppMessageCategoryId.TRANSACTIONAL)
        .build();

billingClient.showInAppMessages(activity,
        inAppMessageParams,
        new InAppMessageResponseListener() {
            @Override
            public void onInAppMessageResponse(InAppMessageResult inAppMessageResult) {
                if (inAppMessageResult.responseCode
                        == InAppMessageResponseCode.NO_ACTION_NEEDED) {
                    // The flow has finished and there is no action needed from developers.
                } else if (inAppMessageResult.responseCode
                        == InAppMessageResponseCode.SUBSCRIPTION_STATUS_UPDATED) {
                    // The subscription status changed. For example, a subscription
                    // has been recovered from a suspend state. Developers should
                    // expect the purchase token to be returned with this response
                    // code and use the purchase token with the Google Play
                    // Developer API.
                }
            }
        });