Recordatorio: A partir del 2 de agosto de 2022, todas las apps nuevas deben usar la Biblioteca de Facturación 4 o versiones posteriores. A partir del 1 de noviembre de 2022, todas las actualizaciones de apps existentes deberán usar la versión 4 o posterior de la Biblioteca de Facturación. Más información.

Vende suscripciones

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

En este tema, se describe cómo controlar los eventos del ciclo de vida de las suscripciones, como las renovaciones y los vencimientos. También se describen funciones de suscripción adicionales, como ofrecer promociones y permitir que los usuarios administren sus propias suscripciones.

Antes de leer este tema, asegúrate de leer Cómo integrar la Biblioteca de Facturación Google Play a la app a fin de obtener instrucciones generales para vender y administrar productos en tu app.

Si no configuraste los productos de suscripción para tu app, consulta Cómo crear y configurar tus productos.

Descripción general de las suscripciones

Una suscripción representa un conjunto de beneficios a los que los usuarios pueden acceder durante un período específico. Por ejemplo, una suscripción podría permitir que un usuario acceda a un servicio de transmisión de música.

Puedes tener varias suscripciones dentro de la misma app, ya sea para representar diferentes conjuntos de beneficios o diferentes niveles de un solo conjunto de beneficios (por ejemplo, los niveles "Plata" y "Oro").

Con los planes básicos y las ofertas, puedes crear varias configuraciones para el mismo producto de suscripción. Por ejemplo, puedes crear una oferta de lanzamiento para los usuarios que nunca se suscribieron a tu app. Del mismo modo, puedes crear una oferta de actualización para los usuarios que ya están suscritos.

Para obtener una descripción general detallada de los productos de suscripción, los planes básicos y las ofertas, consulta la documentación del Centro de ayuda de Play Console.

Administra el ciclo de vida de la suscripción

Una suscripción puede pasar por varios cambios de estado durante su ciclo de vida, y tu app debe responder a cada uno de ellos. Para comprobar el estado del suscriptor, tu app puede consultar mediante BillingClient.queryPurchasesAsync(), en la Biblioteca de Facturación Google Play, o mediante Purchases.subscriptionsv2:get, en la API de Google Play Developer.

BillingClient.queryPurchasesAsync() Purchases.subscriptionsv2:get
Estado ¿Se muestra? isAutoRenewing ¿Se muestra? expiryTime subscriptionState autoRenewing
Activa Verdadero Futuro SUBSCRIPTION_STATE_ACTIVE Verdadero
Cancelado Falso Futuro SUBSCRIPTION_STATE_CANCELED Falso
En período de gracia Verdadero Futuro (fin del período de gracia) SUBSCRIPTION_STATE_IN_GRACE_PERIOD Verdadero
Cuenta suspendida No N/A Pasado (finalización del tiempo de vencimiento previsto o fin del período de gracia, si corresponde) SUBSCRIPTION_STATE_ON_HOLD Verdadero
Pausada No N/A Pasado SUBSCRIPTION_STATE_PAUSED Verdadero
Vencida No N/A Pasado SUBSCRIPTION_STATE_EXPIRED Falso

Si tu app almacena el estado de la suscripción en un servidor de backend seguro, deberías detectar cambios de estado mediante notificaciones para desarrolladores en tiempo real a fin de garantizar que el estado se mantenga sincronizado. Se envía una SubscriptionNotification para los eventos que modifican el estado de la suscripción, como las renovaciones y las cancelaciones.

Tu app debe controlar los cambios de estado que se describen en las siguientes secciones.

Nuevas suscripciones

Asegúrate de seguir nuestras recomendaciones para controlar las compras nuevas. Cuando se compra una suscripción, BillingClient.queryPurchasesAsync() la muestra y se envía una notificación SubscriptionNotification con el tipo SUBSCRIPTION_PURCHASED. Cuando recibas esta notificación, deberás consultar la API de Google Play Developer para obtener el estado de la suscripción más reciente. El recurso de suscripción es similar al siguiente: Ten en cuenta que el recurso tendrá un acknowledgementState de ACKNOWLEDGEMENT_STATE_PENDING hasta que reconozcas la compra:

{
  "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
      }
    }
  ],
}

Renovaciones

Si una suscripción se renueva con éxito, BillingClient.queryPurchasesAsync() seguirá mostrándola.

También se envía una notificación de SUBSCRIPTION_RENEWED cuando se renueva una suscripción. Tu app debe asegurarse de que el usuario siga teniendo derecho a la suscripción y, luego, actualizar el estado de la suscripción con el expiryTime nuevo proporcionado en el recurso de suscripción de la API de Google Play Developer. El recurso de suscripción es similar al siguiente:

{
  "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
      }
    }
  ]
}

Vencimientos

Una vez que vence una suscripción, esta ya no se muestra en BillingClient.queryPurchasesAsync(), y el usuario debería perder el acceso a ella.

Cuando vence una suscripción, también se envía una SubscriptionNotification con el tipo SUBSCRIPTION_EXPIRED. Cuando recibas esta notificación, deberás consultar la API de Google Play Developer para obtener el estado de la suscripción más reciente. El recurso de suscripción es similar al siguiente:

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

Cancelaciones

Un usuario puede cancelar una suscripción voluntariamente desde Play Store o hacer que se cancele automáticamente si no la recupera después de una suspensión de la cuenta. Cuando un usuario cancela una suscripción, conserva el acceso al contenido hasta el final del ciclo de facturación actual. Cuando finaliza el ciclo de facturación, se revoca el acceso.

Cuando se cancela una suscripción, pero esta aún no venció, se muestra desde BillingClient.queryPurchasesAsync(). La cancelación de una suscripción activa una notificación de SUBSCRIPTION_CANCELED. Cuando recibes esta notificación, el recurso de suscripción que muestra la API de Google Play Developer tiene el subscriptionState establecido en "SUBSCRIPTION_STATE_CANCELED", y expiryTime contiene la fecha en la que el usuario debería perder el acceso a la suscripción. Si expiryTime tiene un valor de pasado, el usuario pierde la autorización de inmediato. De lo contrario, el usuario debería conservar la autorización hasta que venza. El recurso de suscripción es similar al siguiente:

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

La app puede observar el cancelReason en el recurso de suscripción que muestra la API de Google Play Developer para conocer el motivo por el que se canceló la suscripción (p. ej., el cliente la canceló o tiene problemas de facturación). Si el usuario canceló la suscripción, puedes consultar el campo cancelSurveyResult para conocer el motivo de la cancelación.

Es posible que tu app muestre un mensaje en el que se le informe al usuario que se canceló su suscripción. Por ejemplo: "Tu suscripción vencerá el _una fecha". Tu app también puede utilizar un vínculo directo a Google Play Store para que los usuarios puedan restablecer su suscripción.

Si muestras este mensaje, también debes ofrecer a los usuarios la posibilidad de descartarlo de forma permanente.

Además, ten en cuenta que los mensajes de cancelación pueden frustrar a los usuarios, especialmente cuando se deben a que cancelaron manualmente la suscripción y no a un pago desactualizado. Puedes elegir no informar a los usuarios que cancelaron manualmente una suscripción.

Revocaciones

Un usuario puede revocar una suscripción por varios motivos, incluida la revocación de la app con Purchases.subscriptions:revoke o la devolución del cargo de la compra. En esta situación, tu app debe revocar la autorización del usuario de inmediato. BillingClient.queryPurchasesAsync() ya no muestra una suscripción revocada. Cuando esto ocurre, también se envía una SubscriptionNotification con el tipo SUBSCRIPTION_REVOKED. Cuando recibes esta notificación, el recurso de suscripción que muestra la API de Google Play Developer tiene el valor subscriptionState establecido en "SUBSCRIPTION_STATE_EXPIRED", y expiryTime contiene la fecha en la que el usuario debería perder el acceso a la suscripción. El recurso de suscripción es similar al siguiente:

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

Suspensión de la cuenta

La suspensión de la cuenta es un estado de suscripción que comienza cuando falla la forma de pago y finaliza cualquier período de gracia asociado sin una resolución de pago. Cuando una suscripción entra en suspensión de la cuenta, debes bloquear el acceso a tu contenido o servicio. El período de suspensión de la cuenta dura hasta 30 días.

Durante la suspensión de la cuenta, BillingClient.queryPurchasesAsync() no muestra la suscripción.

Durante la suspensión de la cuenta, debes controlar las cancelaciones, los restablecimientos o las recompras de tus suscripciones, según sea necesario.

Cuando un usuario acepta la suspensión de la cuenta, debes aprovechar las notificaciones para desarrolladores en tiempo real a fin de informarle por qué se suspendió el acceso a la suscripción. En la app, debes proporcionar un mensaje con instrucciones para corregir la forma de pago y recuperar el acceso a la suscripción. Tu mensaje debe incluir un vínculo a la configuración de suscripción de Google Play para que el usuario pueda corregir su forma de pago. Por ejemplo, puedes usar un mensaje similar al siguiente:

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

Si tus usuarios pueden acceder al contenido de suscripciones fuera de tu app, tal vez quieras enviarle una notificación push o un correo electrónico al usuario para que sepa que la suscripción ya no está activa.

Si tu cliente pudo corregir su problema de pago, puedes mostrar un mensaje en tu app que informe a los usuarios cuándo se restableció la suscripción. Por ejemplo, puedes usar un mensaje similar al siguiente:

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

Con las notificaciones para desarrolladores en tiempo real, recibirás una SubscriptionNotification con el tipo SUBSCRIPTION_ON_HOLD cuando se suspenda una cuenta. Llama a la API de Google Play Developer desde tu servidor de backend seguro para recuperar la información de suscripción nueva. Durante la suspensión de la cuenta, el expiryTime del recurso de suscripción se establece en una marca de tiempo de pasado:

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

Una vez que el usuario corrija su forma de pago, la suscripción volverá a un estado activo y deberás restablecer el acceso al contenido de la suscripción.

Si tu app se basa únicamente en queryPurchasesAsync() para determinar si un usuario tiene derecho a una suscripción, debería controlar automáticamente la recuperación de la suscripción tras revertirse la suspensión de la cuenta.

Si tu app sincroniza el estado de la suscripción con un servidor, debes escuchar a SubscriptionNotification con el tipo SUBSCRIPTION_RECOVERED para recibir una notificación cuando se recupere una suscripción, y el usuario debería recuperar el acceso. Si consultas por una suscripción después de recibir esta notificación, ahora se establece expiryTime en una marca de tiempo de futuro:

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

Si el usuario no corrige su forma de pago antes de que finalice el período de suspensión de la cuenta, recibirás SUBSCRIPTION_CANCELED como notificación para desarrolladores en tiempo real. A fin de obtener instrucciones para controlar una cancelación, consulta la sección Cancelaciones de suscripciones. Cuando consultas la suscripción que se canceló de esta manera, se establece el expiryTime que se muestra en una marca de tiempo de pasado:

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

Acceso a una cuenta suspendida y recuperación

En el siguiente ejemplo, se muestra el cronograma de una suscripción que entra en suspensión de la cuenta y, luego, se recupera cuando el usuario corrige la forma de pago.

Al igual que en el ejemplo anterior, este cronograma representa una suscripción que primero entra en un período de gracia antes de entrar en suspensión de la cuenta.

Ten en cuenta lo siguiente:

  • Durante el período de gracia, el usuario debería conservar el acceso a los beneficios de la suscripción.
  • Antes de que una suscripción entre en suspensión de la cuenta, Google realizará intentos adicionales para realizar el cobro al método de pago durante un máximo de 24 horas. El usuario retiene los beneficios de la suscripción durante este período. Una vez transcurrido este período de reintento, la suscripción entra en suspensión de la cuenta y el usuario debería perder el acceso a los beneficios de la suscripción.
  • Cuando una suscripción se recupera durante un período de gracia, la fecha de renovación no se restablece.
  • Cuando se recupere la suspensión de una cuenta, se restablecerá la fecha de renovación.

Período de gracia

Si el período de gracia está habilitado, las suscripciones entran en un período de gracia cuando hay problemas de pago al final de un ciclo de facturación. Durante este tiempo, el usuario aún debe tener acceso a la suscripción mientras Google Play intenta renovarla. Puedes especificar la duración de un período de gracia desde la configuración del producto integrado en la app de Google Play Console.

Si tu app se basa únicamente en queryPurchasesAsync() para verificar si un usuario tiene derecho a una suscripción, debería controlar automáticamente el período de gracia, ya que queryPurchasesAsync() continúa mostrando compras canceladas antes de sus fechas de vencimiento.

Si tu app sincroniza el estado de la suscripción con un backend, debes escuchar la SubscriptionNotification con el tipo SUBSCRIPTION_IN_GRACE_PERIOD para recibir una notificación cuando el usuario ingresa en un período de gracia. Mientras el usuario se encuentra en un período de gracia, el recurso de suscripción contiene autoRenewEnabled = true.

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

Cuando un usuario ingresa a un período de gracia, debes mostrar un mensaje en tu app que indique a los usuarios cómo corregir su forma de pago. De lo contrario, el usuario perderá el acceso a la suscripción cuando este finalice. Este mensaje puede funcionar como un vínculo directo a Google Play Store para ayudar al usuario a administrar la suscripción.

Cuando el usuario corrige su forma de pago, se renueva la suscripción y tu app puede controlar la renovación como se describe en Renovaciones.

Si el usuario no corrige la forma de pago durante el período de gracia, se suspenderá la cuenta.

Acceso y recuperación del período de gracia sin suspensión de la cuenta

En el siguiente ejemplo, se muestra el cronograma de una suscripción que entra en un período de gracia y se recupera cuando el usuario corrige la forma de pago. En este ejemplo, la suscripción no admite la suspensión de la cuenta, por lo que, una vez que finaliza el período de gracia, el usuario debería perder los beneficios de la suscripción.

Ten en cuenta lo siguiente:

  • Durante el período de gracia, el usuario debería conservar el acceso a los beneficios de la suscripción.
  • Cuando una suscripción se recupera durante un período de gracia, la fecha de renovación no se restablece.

Suscripciones pausadas

Puedes permitir que los usuarios pausen sus suscripciones para reducir la deserción voluntaria. Cuando habilitas la función de pausa, los usuarios pueden elegir si desean pausar su suscripción por un período de tiempo de entre una semana y tres meses, según el período recurrente. Una vez habilitada, la opción de pausa aparece en el centro de suscripciones y en el flujo de cancelación. Ten en cuenta que las suscripciones anuales no se pueden pausar, y los límites de pausa de una semana y tres meses están sujetos a cambios en cualquier momento.

Para permitir que los usuarios puedan pausar su suscripción, haz lo siguiente:

  1. Accede a Google Play Console.
  2. Selecciona tu app y ve a Presencia en Google Play Store > Productos integrados en la aplicación > Suscripciones.
  3. Expande la sección Configuración de las suscripciones.
  4. Marca Activar la pausa.

La pausa de una suscripción solo surte efecto una vez finalizado el período de facturación actual. Mientras la suscripción se encuentra pausada, el usuario no tiene acceso a ella. Cuando finaliza el período de pausa, se reanuda la suscripción y Google intenta renovarla. Si se reanuda exitosamente, la suscripción vuelve a estar activa. Si, debido a un problema con la forma de pago, no es posible reanudar la suscripción, se suspenderá la cuenta del usuario, como se muestra en la Figura 1.

Un usuario pausa su suscripción y se suspende la cuenta
Figura 1: Un usuario pausa su suscripción y se suspende la cuenta.

Durante el período de pausa, el usuario también puede decidir si desea reanudar la suscripción manualmente en cualquier momento, como se muestra en la Figura 2. En este caso, la fecha de facturación cambia a la fecha de reanudación manual.

Un usuario pausa la suscripción y, luego, la reanuda
Figura 2: Un usuario pausa la suscripción y, luego, la reanuda

Cuando se suspende la suscripción de un usuario, queryPurchasesAsync() no la muestra. Si se reanuda la suscripción, queryPurchasesAsync() la mostrará.

Si la app sincroniza el estado de la suscripción con un servidor de backend seguro, deberías recibir notificaciones para desarrolladores en tiempo real a fin de mantener el estado. Estas notificaciones también te permiten informarles a los usuarios en tu app cuando pausaron su suscripción y no tienen acceso a ella. También deberías proporcionarles un vínculo directo a Google Play para que puedan reanudar la suscripción manualmente.

Se envía una SubscriptionNotification con el tipo SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED cuando el usuario pausa su suscripción. En este momento, el usuario debe seguir teniendo acceso a su suscripción, y el recurso de suscripción contiene autoRenewing = true, paymentState = 1 (Pago recibido), y valores futuros para expiryTime y autoResumeTimeMillis.

Se envía una SubscriptionNotification con el tipo SUBSCRIPTION_PAUSED cuando la pausa entra en vigor. En este momento, el usuario debería perder acceso a su suscripción, y el recurso de suscripción contiene autoRenewing = true y paymentState = 0 (pendiente), un valor de futuro para autoResumeTimeMillis y un valor de pasado para expiryTime.

Se envía una SubscriptionNotification con el tipo SUBSCRIPTION_RENEWED si se reanuda la suscripción automáticamente al final del período de pausa o si el usuario decidió reanudar la suscripción manualmente. Esto se debe controlar según se describe en Renovaciones.

Se envía una SubscriptionNotification con el tipo SUBSCRIPTION_ON_HOLD si se produjo un error de pago mientras se intentaba reanudar la suscripción. Esto se debe controlar según se describe en la sección de suspensión de la cuenta.

Restablecimientos

Una suscripción cancelada seguirá visible en la app de Play Store hasta la fecha de vencimiento. En la sección Suscripciones de la app de Google Play Store, el usuario puede hacer clic en Volver a suscribirse (antes llamada Restablecer) para restablecer la suscripción cancelada antes de su vencimiento.

sección de suscripciones en la app de Google Play Store, en la que aparece una suscripción cancelada con un botón para volver a suscribirse
Figura 3: En la sección Cuenta > Suscripciones, en la app de Google Play Store, se muestra una suscripción cancelada y el botón Volver a suscribirse.

Si tu app depende únicamente de queryPurchasesAsync() para determinar si un usuario tiene derecho a una suscripción, debería controlar automáticamente los restablecimientos, ya que queryPurchasesAsync() continúa mostrando compras canceladas antes de sus fechas de vencimiento. Una suscripción restablecida se renueva como si no se hubiera cancelado.

Si tu app sincroniza el estado de la suscripción con un backend, debes detectar la SubscriptionNotification con el tipo SUBSCRIPTION_RESTARTED. Una vez recibida, tu app puede responder a la notificación, registrar que la suscripción está lista para renovarse y dejar de mostrar mensajes de restablecimiento. El recurso de suscripción es similar al siguiente:

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

Actualizaciones, cambios a versiones anteriores y registros de usuarios suscritos anteriormente

Cuando un usuario realiza una actualización, cambia a una versión inferior o vuelve a registrarse desde tu app antes del vencimiento de la suscripción, la suscripción anterior se invalida y se crea una suscripción nueva con un token de compra nuevo.

Además, el recurso de suscripción que muestra la API de Google Play Developer contendrá un linkedPurchaseToken que indicará la compra anterior desde la que el usuario realizó la actualización, cambió a una versión inferior o volvió a suscribirse. Puedes usar el linkedPurchaseToken para buscar la suscripción anterior y, luego, identificar la cuenta de usuario existente a fin de asociar la compra nueva con la misma cuenta.

Antes de ofrecer opciones de actualización, cambio a una versión inferior o registro nuevo en la app, debes confirmar la suscripción existente. Cualquier cambio de plan o registro nuevo se bloquea si la suscripción anterior está pendiente de confirmación.

Después de cambiar el plan o volver a registrarte, también se te solicitará que aceptes la compra de la suscripción nueva. La forma recomendada es usar la API de Google Play Developer para confirmar la compra y evitar su cancelación. El recurso de suscripción es similar al siguiente:

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

Integración de los planes prepagados

Los planes prepagados no se renuevan automáticamente después de su vencimiento. Para extender el derecho de suscripción sin interrupciones, el usuario debe recargar un plan prepagado de la misma suscripción.

Para las recargas, inicia el flujo de facturación como lo harías con la compra original. No es necesario que indiques que una compra es una recarga.

Las recargas de planes prepagados siempre usan el modo de prorrateo IMMEDIATE_AND_CHARGE_FULL_PRICE, y no necesitas configurar este modo de forma explícita. Al usuario se le cobra de inmediato por un período de facturación completo, y su derecho se extiende por el tiempo especificado en la recarga.

Después de una recarga, se actualizan los siguientes campos del objeto de resultado Purchase para reflejar la compra de recarga más reciente:

  • ID de pedido
  • Hora de la compra
  • Firma
  • Token de compra
  • Aceptado

Los siguientes campos Purchase siempre contienen los mismos datos que se encuentran en la compra original:

  • Nombre de paquete
  • Estado de la compra
  • Productos
  • Renovación automática

Confirmación de compra prepaga

Al igual que con las suscripciones de renovación automática, debes confirmar los planes prepagados después de la compra. Se deben confirmar tanto la compra inicial como las recargas de dinero. Para obtener más información, consulta Cómo procesar las compras.

Debido a las posibles duraciones breves del plan prepagado, es importante que confirmes la compra lo antes posible.

Los planes prepagados con una duración de una semana o más deben confirmarse en un plazo de tres días.

Los planes prepagados con una duración menor a una semana deben confirmarse en la mitad de la duración del plan. Por ejemplo, los desarrolladores tienen 1.5 días para confirmar un plan prepagado de tres días.

Como desarrollador, debes facilitarles a los clientes la tarea de administrar sus suscripciones. Tu app debe incluir un vínculo a una pantalla de configuración o preferencias que les permita a los usuarios administrar sus suscripciones. En la Figura 4, se muestra un ejemplo de este vínculo.

El botón Suscripciones de Google Play que se muestra en esta imagen es un ejemplo de vínculo para administrar suscripciones.
Figura 4: El botón Suscripciones de Google Play es un ejemplo de vínculo para administrar suscripciones.

En el controlador de clics de este vínculo, agrega lógica para determinar si el usuario tiene suscripciones sin vencer de tu app, donde expiryTime tiene valor de futuro, o se establece autoRenewing en true.

Cada productId de la suscripción coincide con el ID del producto que le asignaste al crearlo en Play Console. A fin de determinar de manera programática el productId de una suscripción existente, realiza una búsqueda en el backend de tu app para obtener una lista de suscripciones asociadas con un usuario en particular.

Si el usuario tiene una suscripción sin vencimiento, puedes dirigirlo a una URL similar a la siguiente, en la que se reemplace "your-sub-product-id" y "your-app-package" por el ID de suscripción y la información del paquete de la app:

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

Si un usuario no tiene suscripciones sin vencer dentro de la app, usa la siguiente URL para dirigirlo a la página que muestra todas las demás suscripciones, como se muestra en la Figura 5 y la 6.

https://play.google.com/store/account/subscriptions
La pantalla de suscripciones de Play Store muestra el estado de todas las suscripciones de un usuario.
Figura 5: La pantalla de suscripciones de Play Store muestra el estado de todas las suscripciones de un usuario.
Presiona una suscripción para ver detalles adicionales.
Figura 6: Presiona una suscripción para ver detalles adicionales

Puedes encontrar un código de ejemplo para la lógica de vínculos de suscripción en la app de ejemplo Classy Taxi.

Permite que los usuarios actualicen su suscripción, la cambien o regresen a una versión inferior

Puedes ofrecer diferentes niveles de suscripción a los usuarios, por ejemplo, un nivel básico y un nivel premium. En la Figura 7, se muestra una pantalla que ofrece dos niveles de suscripción:

esta app contiene dos niveles de suscripción
Figura 7: Esta app tiene dos niveles de suscripción.

Los usuarios deberían poder acceder a una pantalla similar a la de la Figura 7 para actualizar su suscripción o cambiarla a una versión inferior. Cuando actualizas una suscripción o la cambias a una versión inferior, puedes configurar el modo de prorrateo o cómo afecta el cambio a tus suscriptores.

En la siguiente tabla, se enumeran los modos de prorrateo disponibles:

Modo de prorrateoDescripción
IMMEDIATE_WITH_TIME_PRORATION La suscripción se actualiza o se cambia a una versión inferior de inmediato. El tiempo restante se ajusta en función de la diferencia de precio y se atrasa la siguiente fecha de facturación para acreditarla a la nueva suscripción. Este es el comportamiento predeterminado.
IMMEDIATE_AND_CHARGE_PRORATED_PRICE La suscripción se actualiza de inmediato, y el ciclo de facturación sigue siendo el mismo. Luego se le cobra al usuario la diferencia de precio del período restante.
IMMEDIATE_WITHOUT_PRORATION Se actualiza la suscripción o cambia a una versión inferior de inmediato, y se cobra el precio nuevo cuando esta se renueva. El ciclo de facturación no cambia.
DEFERRED Se actualiza la suscripción o se cambia a una versión inferior solo cuando se renueva.
IMMEDIATE_AND_CHARGE_FULL_PRICE Se actualiza la suscripción o cambia a una versión inferior, y al usuario se le cobra el precio total por el nuevo derecho de inmediato. El valor restante de la suscripción anterior se transfiere al mismo derecho o se prorratea para cuando se cambie a un derecho diferente.

Si el usuario cambia los derechos de suscripción, debes especificar la tasa de prorrateo en el tiempo de ejecución. En el caso de los cambios de derechos, no puedes especificar un modo de prorrateo predeterminado a través de Google Play Console.

Si el usuario no cambia los derechos de suscripción, puedes usar el modo de prorrateo predeterminado que se configuró a través de Play Console. También puedes anular este comportamiento si especificas un modo de prorrateo en SubscriptionUpdateParams. Ten en cuenta las siguientes restricciones:

  • Cuando actualizas, cambias a una versión inferior o cambias de suscripción a un plan prepagado desde un plan prepagado o de renovación automática, el único modo de prorrateo permitido es IMMEDIATE_AND_CHARGE_FULL_PRICE. Si especificas cualquier otro modo de prorrateo, la compra falla y se muestra un error al usuario.
  • Cuando cambies de plan dentro de la misma suscripción a un plan con renovación automática de un plan prepagado, los modos de prorrateo válidos son IMMEDIATE_AND_CHARGE_FULL_PRICE y IMMEDIATE_WITHOUT_PRORATION, Si especificas cualquier otro modo de prorrateo, la compra falla y se muestra un error al usuario.

Ejemplos de prorrateo

Para comprender cómo funciona cada modo de prorrateo, considera la siguiente situación:

Pedro tiene una suscripción al contenido en línea de la app de Country Gardener. Actualmente, tiene una suscripción mensual a la versión de Nivel 1 del contenido, que es solo de texto. Esta suscripción le cuesta USD 2 por mes y se renueva el primer día del mes.

El 15 de abril, Pedro eligió actualizar a la versión anual de la suscripción de Nivel 2, que incluye actualizaciones de video y tiene un costo de USD 36 por año.

Al actualizar la suscripción, el desarrollador selecciona un modo de prorrateo. En la siguiente lista, se describe cómo cada modo de prorrateo modifica la suscripción de Pedro:

IMMEDIATE_WITH_TIME_PRORATION
La suscripción de Pedro al Nivel 1 finaliza de inmediato. Dado que pagó un mes completo (del 1 al 30 de abril), pero realizó la actualización a mitad del período de suscripción, se aplica la mitad de la suscripción mensual (USD 1) a su nueva suscripción. Sin embargo, como la nueva suscripción tiene un costo de USD 36 por año, se paga el saldo de crédito de USD 1 solo por 10 días (del 16 al 25 de abril); por lo tanto, se le cobran USD 36 el 26 de abril por una nueva suscripción y otros USD 36 el 26 de abril de cada año siguiente.
IMMEDIATE_AND_CHARGE_PRORATED_PRICE
Se puede usar este modo porque el precio de suscripción al Nivel 2 por unidad de tiempo (USD 36 por año = USD 3 por mes) es mayor que el precio de suscripción al Nivel 1 por unidad de tiempo (USD 2 por mes). La suscripción de Pedro al Nivel 1 finaliza de inmediato. Dado que pagó un mes completo, pero utilizó solamente la mitad, se aplica la mitad de la suscripción mensual (USD 1) a su nueva suscripción. Sin embargo, como la nueva suscripción tiene un costo de USD 36 por año, los 15 días restantes cuestan USD 1.50, por lo que se le cobra la diferencia de USD 0.50 por su suscripción nueva. El 1 de mayo, se le cobran a Pedro USD 36 por el nuevo nivel de suscripción y otros USD 36 el 1 de mayo de cada año siguiente.
IMMEDIATE_WITHOUT_PRORATION
La suscripción al Nivel 1 de Pedro se actualiza inmediatamente al Nivel 2 sin cargo adicional, y se le cobran USD 36 el 1 de mayo por su nuevo nivel de suscripción y USD 36 el 1 de mayo de cada año siguiente.
DEFERRED
La suscripción de Pedro al Nivel 1 continúa hasta su vencimiento el 30 de abril. El 1 de mayo, entra en vigencia la suscripción al Nivel 2, y se le cobran USD 36 a Pedro por su nuevo nivel de suscripción.
IMMEDIATE_AND_CHARGE_FULL_PRICE
La suscripción de Pedro al Nivel 1 finaliza de inmediato. Su suscripción al Nivel 2 comienza hoy, y se le cobran USD 36. Dado que pagó un mes completo, pero utilizó solamente la mitad, se aplica la mitad de la suscripción mensual (USD 1) a su nueva suscripción. Como la nueva suscripción tiene un costo de USD 36 por año, se agrega a la 1/36 del año adicional a su período de suscripción (aproximadamente 10 días). Por lo tanto, el próximo cargo de Pedro sería de 1 año y 10 días a partir de hoy por USD 36. Luego, se le cobrarán USD 36 cada año.

Cuando elijas un modo de prorrateo, asegúrate de revisar nuestras recomendaciones de prorrateo.

Tu app puede usar los mismos pasos que para iniciar un flujo de compra a fin de ofrecerles a los usuarios que actualicen su suscripción o que la cambien a una versión inferior. Sin embargo, cuando actualices o cambies a una versión inferior, deberás proporcionar los detalles de la suscripción actual, la suscripción futura (actualizada o de una versión inferior) y el modo de prorrateo que se usará, como se muestra en el siguiente ejemplo:

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 los modos de prorrateo de reemplazo inmediato, tu app recibe la nueva compra en tu PurchasesUpdatedListener. La compra también está disponible en BillingClient.queryPurchasesAsync(). Cuando recibas el token de compra, sigue el mismo proceso de verificación que con la verificación de un nuevo token de compra. Asegúrate de procesar estas compras con BillingClient.acknowledgePurchase() de la Biblioteca de Facturación Google Play o con Purchases.subscriptions:acknowledge de la API de Google Play Developer.

La API de Google Play Developer muestra un linkedPurchaseToken en el recurso de suscripción. Asegúrate de invalidar el token proporcionado en linkedPurchaseToken a fin de garantizar que no se use el anterior al acceder a tus servicios. Para descubrir cómo administrar las compras de actualizaciones o cambios a versiones inferiores, consulta Actualizaciones, cambios a versiones inferiores y registros de usuarios suscritos anteriormente.

Para el modo de reemplazo diferido, tu app recibe una llamada a tu PurchasesUpdatedListener con la compra del plan de suscripción original y un estado que indica si se realizó correctamente la actualización o el cambio a una versión inferior. Hasta que el reemplazo entre en vigencia, BillingClient.queryPurchasesAsync() seguirá mostrando la compra del plan de suscripción original. Una vez que el nuevo plan entre en vigencia, queryPurchasesAsync() mostrará los datos de compra de la nueva suscripción, y se enviará una notificación SUBSCRIPTION_RENEWED a tu servidor de backend seguro. Para los reemplazos diferidos, se recomienda enfáticamente escuchar esta notificación y confirmar la compra mediante Purchases.subscriptions:acknowledge. Se puede usar el linkedPurchaseToken en el recurso de suscripción con el objetivo de determinar qué usuario de tu backend de suscripción, si corresponde, debe actualizarse con la nueva autorización. Tu app no debe depender de que el usuario abra la app y la confirme mediante BillingClient.acknowledgePurchase(), ya que es posible que no la abra en el plazo de los tres días posteriores al cambio de plan.

Actualizaciones con pruebas gratuitas o con ofertas de precios de lanzamiento

Se aplica la configuración de elegibilidad de la prueba gratuita cuando un usuario actualiza una suscripción o cambia a una versión inferior. Puedes ajustar la configuración de elegibilidad de la prueba gratuita en Google Play Console.

Ten en cuenta lo siguiente:

  • Si los usuarios pueden recibir una sola prueba gratuita en todas las suscripciones disponibles en tu app, el plan al que cambiará no tendrá una prueba gratuita ni un precio de lanzamiento.
  • Si proporcionas una prueba gratuita por producto de suscripción, el plan al que cambiará el usuario puede tener una prueba gratuita o un precio de lanzamiento.

En la siguiente tabla, se describe el comportamiento de cada modo de prorrateo si tanto el plan nuevo como el anterior tienen una prueba gratuita y el usuario realiza la actualización durante una prueba gratuita:

Una prueba gratuita por app Una prueba gratuita por producto de suscripción
IMMEDIATE_WITH_TIME_PRORATION El usuario pierde la prueba gratuita de inmediato. El período de prueba gratuita restante se convierte en un período gratuito equivalente del nuevo nivel según la diferencia de precio. El usuario pierde la prueba gratuita anterior, pero inmediatamente comienza la nueva. Además, el período de prueba gratuito restante del nivel anterior se convierte en un período gratuito equivalente del nuevo nivel y se agrega a la nueva prueba gratuita.
IMMEDIATE_AND_CHARGE_PRORATED_PRICE

El usuario pierde la prueba gratuita de inmediato. Luego, se le cobra al usuario la diferencia de precio del período restante. La próxima fecha de facturación no se modifica.

Nota: Esta opción solo está disponible para una actualización de suscripción, en la que el precio por unidad de tiempo aumenta.

IMMEDIATE_WITHOUT_PRORATION Se actualiza al usuario de inmediato al nuevo nivel. El usuario mantiene el acceso de prueba gratuita al nuevo nivel hasta que finalice el período de facturación anterior.
DEFERRED El usuario mantiene el acceso de prueba gratuita a la suscripción anterior hasta la próxima fecha de facturación.
IMMEDIATE_AND_CHARGE_FULL_PRICE El usuario pierde la prueba gratuita de inmediato. Luego, se le cobra el precio de esta nueva suscripción. La próxima fecha de facturación corresponde al nuevo período de suscripción, además del tiempo restante de la prueba gratuita.

Para comprender cómo funcionan las transiciones de prueba gratuita en el caso predeterminado de una prueba gratuita por aplicación, considera la siguiente situación:

María tiene una suscripción a contenido en línea de la app de Country Gardener. Actualmente, tiene una suscripción mensual a la versión de Nivel 1 del contenido, que es de solo texto. Esta suscripción cuesta USD 10 por mes, y ella se suscribió el 1 de abril. Está disfrutando de una prueba gratuita de 30 días como suscriptora por primera vez, lo que significa que su primer pago vence el 1 de mayo.

El 15 de abril, María decide actualizar a la suscripción de Nivel 2, que incluye actualizaciones de video y tiene un costo de USD 20 por mes. Esta segunda suscripción también tiene una prueba de 30 días.

En la siguiente lista, se describe la transición de la prueba gratuita para cada modo de prorrateo:

  • IMMEDIATE_WITH_TIME_PRORATION: Se actualiza a María al Nivel 2 de inmediato. Como María se actualizó a mitad del período de suscripción, se aplica la mitad de la suscripción del mes (15 días por un valor de USD 10 por mes) a su nueva suscripción. Sin embargo, como esa suscripción nueva tiene un costo de USD 20 por mes, el saldo de 15 días solo cubre el pago de 7.5 días. María no es apta para otra prueba gratuita del Nivel 2, por lo que, a partir del 22 de abril, se le cobrarán USD 20 cada mes.
  • IMMEDIATE_AND_CHARGE_PRORATED_PRICE: Se puede usar este modo porque el precio de la suscripción al Nivel 2 por unidad de tiempo (USD 20 por mes) es mayor que el precio de la suscripción al Nivel 1 por unidad de tiempo (USD 10 por mes). La suscripción al Nivel 1 de María se actualiza inmediatamente al Nivel 2, y ella pierde su prueba gratuita. Dado que la próxima fecha de facturación de María era el 1 de mayo, se le cobran USD 10 hoy para cubrir la segunda mitad de abril y, luego, a partir del 1 de mayo, se le cobran USD 20 cada mes.
  • IMMEDIATE_WITHOUT_PRORATION: La suscripción al Nivel 1 de María se actualiza inmediatamente al Nivel 2. María conserva su prueba gratuita hasta el 30 de abril y ahora tiene acceso al contenido del Nivel 2. A partir del 1 de mayo, se le cobran USD 20 cada mes.
  • DEFERRED: La suscripción de María al Nivel 1 continúa hasta el vencimiento del próximo pago, el 1 de mayo. El 1 de mayo, entra en vigencia la suscripción al Nivel 2, y se le cobran USD 20 el primer día de cada mes.
  • IMMEDIATE_AND_CHARGE_FULL_PRICE: La suscripción al Nivel 1 de María se actualiza inmediatamente al Nivel 2, y ella pierde su prueba gratuita. Hoy, se le cobran USD 20. Debido a que a María le quedan 15 días de su prueba gratuita, su próxima fecha de facturación es en 1 mes + 15 días a partir de ahora, o el 1 de julio. A partir del 1 de julio, se le cobrarán USD 20 cada mes.

En la siguiente lista, se describe el comportamiento de transición si el desarrollador permite una prueba gratuita por suscripción:

  • IMMEDIATE_WITH_TIME_PRORATION: Se actualiza a María al Nivel 2 de inmediato. Como María se actualizó a mitad del período de suscripción, se aplica la mitad de la suscripción del mes (15 días por un valor de USD 10 por mes) a su nueva suscripción. Sin embargo, como la nueva suscripción tiene un costo de USD 20 por mes, el saldo de 15 días solo cubre el pago de 7.5 días. María es apta para otra prueba gratuita del Nivel 2, por lo que no se le cobrarán los siguientes 37.5 días. A partir del 22 de mayo, se le cobran USD 20 cada mes.
  • IMMEDIATE_AND_CHARGE_PRORATED_PRICE: Se puede usar este modo porque el precio de la suscripción al Nivel 2 por unidad de tiempo (USD 20 por mes) es mayor que el precio de la suscripción al Nivel 1 por unidad de tiempo (USD 10 por mes). La suscripción al Nivel 1 de María se actualiza inmediatamente al Nivel 2, y ella pierde su prueba gratuita. Dado que la próxima fecha de facturación de María era el 1 de mayo, se le cobran USD 10 hoy para cubrir la segunda mitad de abril y, luego, a partir del 1 de mayo, se le cobran USD 20 cada mes.
  • IMMEDIATE_WITHOUT_PRORATION: La suscripción al Nivel 1 de María se actualiza inmediatamente al Nivel 2. María conserva su prueba gratuita hasta el 30 de abril y ahora tiene acceso al contenido del Nivel 2.
  • DEFERRED: La suscripción de María al Nivel 1 continúa hasta el vencimiento del próximo pago, el 1 de mayo. El 1 de mayo, entra en vigencia la suscripción al Nivel 2, y se le cobran USD 20 el primer día de cada mes.
  • IMMEDIATE_AND_CHARGE_FULL_PRICE: La suscripción al Nivel 1 de María se actualiza inmediatamente al Nivel 2, y ella pierde su prueba gratuita. Hoy, se le cobran USD 20. Debido a que a María le quedan 15 días de su prueba gratuita, su próxima fecha de facturación es en 1 mes + 15 días a partir de ahora, o el 1 de julio. A partir del 1 de julio, se le cobrarán USD 20 cada mes.

Recomendaciones de prorrateo

En la siguiente tabla, se muestran diferentes situaciones de prorrateo junto con lo que recomendamos para cada situación:

Situación Modo de prorrateo recomendado Resultado
Actualización a un nivel más costoso IMMEDIATE_AND_CHARGE_PRORATED_PRICE El usuario recibe acceso de inmediato y mantiene el mismo período de facturación.
Cambio a una versión inferior con un nivel menos costoso DEFERRED El usuario ya pagó el nivel más costoso, por lo que seguirá teniendo acceso hasta la próxima fecha de facturación.
Cambio del período recurrente en el mismo nivel (por ejemplo, mensual o anual) DEFERRED El usuario pagará el nuevo precio recurrente en la próxima fecha de facturación.
Actualización durante una prueba gratuita (se mantiene la prueba) IMMEDIATE_WITHOUT_PRORATION El usuario mantiene el acceso a la prueba gratuita, pero se actualiza a un nivel superior durante el resto de la prueba.
Actualización durante una prueba gratuita (finaliza el acceso a la prueba gratuita) IMMEDIATE_AND_CHARGE_PRORATED_PRICE El usuario recibe acceso al nuevo nivel de inmediato, pero ya no tiene una prueba gratuita.

Administra a tus clientes

Con las notificaciones para desarrolladores en tiempo real, puedes detectar en tiempo real cuando un usuario decide cancelar. Cuando un usuario cancela una suscripción, pero lo hace antes de que venza, puedes enviarle notificaciones push o mensajes desde la app para pedirle que se vuelva a suscribir.

Cuando un usuario cancela la suscripción, puedes intentar recuperarlo en tu app o a través de Play Store. En la siguiente tabla, se describen varias situaciones de suscripción, junto con las acciones de recuperación asociadas y los requisitos de la app:

Antes del vencimiento de la suscripción Después del vencimiento de la suscripción
En la app En Play Store En la app En Play Store
Función de recuperación Suscripción integrada en la app Restablecer Suscripción integrada en la app Volver a suscribirse
El usuario pasa por el flujo de confirmación de la compra No
La suscripción de usuario sigue asociada al mismo SKU El usuario puede registrarse en el mismo SKU o en uno distinto El usuario puede registrarse en el mismo SKU o en uno distinto
Se crea un token de compra nuevo No
Se habilita de forma predeterminada No Sí, todos los desarrolladores deben habilitar esta función No

En apps que no cuentan con la Biblioteca de Facturación 2.0 o versiones posteriores: No

En apps que cuentan con la Biblioteca de Facturación 2.0 o versiones posteriores: Sí. Los desarrolladores pueden inhabilitar la función en Play Console.

Cuándo se le cobra al usuario

Si se usa el mismo SKU: al final del período de facturación actual

Si se usa un SKU distinto: en función del modo de prorrateo

Al final del período de facturación actual De inmediato De inmediato
Implementaciones requeridas Proporcionar una IU para registrarse de nuevo en tu app

Detectar cambios en el estado de la suscripción

Vínculo directo a Play Store

Proporcionar una IU para registrarse de nuevo en tu app Administrar las compras realizadas fuera de la app

Antes del vencimiento de la suscripción (en la app)

En el caso de las suscripciones canceladas que aún no se vencieron, puedes permitir que los suscriptores las restablezcan dentro de tu app usando el mismo flujo de compra de productos integrados en la aplicación que utilizas para suscriptores nuevos. Asegúrate de que la IU indique que el usuario ya tiene una suscripción. Por ejemplo, podrías mostrar la fecha de vencimiento y el precio recurrente actuales del usuario junto al botón Reactivar.

La mayoría de las veces, lo recomendable es ofrecerle al usuario el mismo precio y SKU que los de la suscripción actual, como se muestra a continuación:

  • Inicia una compra de suscripción nueva con el mismo SKU.
  • La nueva suscripción reemplaza a la anterior y se renueva en la misma fecha de vencimiento. La suscripción anterior se marca inmediatamente como vencida.
  • Por ejemplo, Aquiles tiene una suscripción a App de Música de Ejemplo, que vence el 1 de agosto. El 10 de julio, vuelve a suscribirse a la opción de un mes por el mismo precio mensual. La nueva suscripción se prorratea con el crédito restante, se activa inmediatamente y se renueva el 1 de agosto.

Si deseas ofrecer un precio diferente (como otra prueba gratuita o un descuento de recuperación), puedes brindarle al usuario un SKU distinto de la siguiente manera:

  • Inicia una actualización o el cambio a una versión inferior con un SKU diferente mediante el modo de prorrateo IMMEDIATE_WITHOUT_PRORATION.
  • La nueva suscripción reemplaza a la anterior y se renueva en la misma fecha de vencimiento. En esta fecha, se le cobra al usuario el precio del nuevo SKU, que incluye el precio de lanzamiento. Si la suscripción anterior se creó con un ID de cuenta ofuscado, ese mismo ID se debe pasar a BillingFlowParams para actualizaciones y cambios a versiones inferiores.
  • Por ejemplo, Aquiles tiene una suscripción a App de Música de Ejemplo, que vence el 1 de agosto. El 10 de julio, vuelve a suscribirse a un plan anual a un precio de lanzamiento. La nueva suscripción se activa de inmediato y se le cobra al usuario el precio de lanzamiento el 1 de agosto.
  • Si decides incluir una prueba gratuita o un precio de lanzamiento en tu SKU de recuperación, asegúrate de que el usuario sea apto. Para ello, desmarca la casilla Permitir una prueba gratuita por app en Google Play Console, que evita que el usuario obtenga más de una prueba gratuita por app.

Cuando recibas el token de compra, procesa la compra como lo harías con una suscripción nueva. Además, la API de Google Play Developer muestra un linkedPurchaseToken en el recurso de suscripción. Asegúrate de invalidar el token proporcionado en linkedPurchaseToken a fin de garantizar que no se use el anterior al acceder a tus servicios.

Antes del vencimiento de la suscripción (en Play Store)

Mientras la suscripción cancelada siga activa, los usuarios pueden hacer clic en Volver a suscribirse (que antes era Restablecer) para restablecerla en el centro de suscripciones de Google Play. Esto mantiene el mismo token de suscripción y compra.

sección de suscripciones en la app de Google Play Store, en la que aparece una suscripción cancelada con un botón para volver a suscribirse
Figura 8: En la sección Cuenta > Suscripciones, en la app de Google Play Store, se muestra una suscripción cancelada y el botón Volver a suscribirse.

A fin de obtener más información para restablecer suscripciones, consulta Restablecimientos.

Después del vencimiento de la suscripción (en la app)

A fin de permitir que los usuarios con suscripciones vencidas se vuelvan a suscribir dentro de tu app, puedes usar el mismo flujo de compra de productos integrados en la aplicación que utilizas para los suscriptores nuevos. Ten en cuenta lo siguiente:

  • A fin de ofrecer un descuento, es posible que quieras proporcionar un ID de producto con precios especiales para tu suscripción, también llamado SKU de recuperación. Puedes proporcionar la oferta en tu app o notificar al usuario sobre ella fuera de la app, como también por correo electrónico.
  • Para iniciar una suscripción de recuperación, inicia el flujo de compra en tu app para Android con la Biblioteca de Facturación Google Play. Este es el mismo proceso que con una suscripción nueva, pero puedes determinar el SKU que está disponible para el usuario.
  • Si decides incluir una prueba gratuita o un precio de lanzamiento en tu SKU de recuperación, asegúrate de que el usuario sea apto. Para ello, desmarca la casilla para permitir una prueba gratuita por app en Google Play Console, que evita que el usuario obtenga más de una prueba gratuita por app.
  • Si el usuario vuelve a suscribirse al mismo SKU, ya no será apto para obtener pruebas gratuitas ni precios de lanzamiento. Asegúrate de que esto figure en la IU.

Cuando recibas el token de compra, procesa la compra como lo harías con una suscripción nueva. No recibirás un linkedPurchaseToken en el recurso de suscripción.

Después del vencimiento de la suscripción (en Play Store)

Si se habilita esta opción, los usuarios pueden volver a suscribirse al mismo SKU durante un año después del vencimiento haciendo clic en Volver a suscribirse en el centro de suscripciones de Google Play. Esto genera un nuevo token de compra y suscripción.

sección de suscripciones en la app de Google Play Store, en la que aparece una suscripción cancelada y vencida junto a los botones quitar y volver a suscribirse.
Figura 9: En la sección Cuenta > Suscripciones de la app de Google Play Store, se muestra una suscripción cancelada y vencida con los botones Volver a suscribirse y Quitar.

La nueva suscripción no se considera una compra realizada dentro de la app, por lo que debes asegurarte de seguir las prácticas recomendadas para manejar las compras que se realizan fuera de la app.

Promociona tu suscripción

Puedes crear códigos promocionales a fin de otorgarles a determinados usuarios una prueba gratuita extendida para una suscripción existente. Para obtener más información, consulta Códigos promocionales.

En el caso de las pruebas gratuitas, Google Play verifica que el usuario tenga una forma de pago válida antes de comenzar una. Es posible que algunos usuarios vean esta verificación como una retención o cargo en su forma de pago. Esta retención o cargo es temporal y luego se revierte o reembolsa.

Cuando finaliza el período de prueba, se cobra el importe total de la suscripción mediante la forma de pago del usuario.

Si un usuario cancela una suscripción en cualquier momento durante la prueba gratuita, la suscripción permanece activa hasta el final de la prueba y no se le cobra cuando finaliza el período de prueba gratuito.

Cancela, reembolsa o revoca suscripciones

Puedes usar la API de Google Play Developer para cancelar, reembolsar o revocar una suscripción. Esta funcionalidad también está disponible en Google Play Console.

  • Cancelar: Los usuarios pueden cancelar una suscripción en Google Play. También puedes proporcionar una opción para que los usuarios la cancelen en tu app o en tu sitio web. Tu app debe controlar estas cancelaciones como se describe en Revocaciones.
  • Reembolsar: Cuando realizas un reembolso, el usuario puede seguir usando la suscripción. Los reembolsos se pueden usar si, por ejemplo, se produjo un error técnico que impidió que el usuario accediera a su producto, pero se resolvió. Ten en cuenta que, para recibir un reembolso superior al pago más reciente, o si quieres emitir un reembolso parcial, debes usar Google Play Console.
  • Revocar: Cuando llevas a cabo una revocación, el usuario pierde el acceso a la suscripción de inmediato. Se puede usar si, por ejemplo, se produjo un error técnico que impidió que el usuario accediera a su producto, y no desea seguir usando el producto. Tu app debe controlar estas cancelaciones como se describe en Revocaciones.

En la siguiente tabla, se muestran las diferencias entre cancelar, reembolsar y revocar.

Detiene la renovación Reembolsa dinero Revoca el acceso
Cancelar No No
Reembolsar No No
Revocar

Aplaza la facturación para un suscriptor

Puedes aplazar la próxima fecha de facturación de un suscriptor con renovación automática mediante Purchases.subscriptions:defer de la API de Google Play Developer. Durante el período de diferimiento, el usuario está suscrito a tu contenido con acceso completo, pero no se le cobra. Se actualiza la fecha de renovación de la suscripción para reflejar la nueva fecha.

La facturación diferida te permite hacer lo siguiente:

  • Ofrecer a los usuarios acceso gratuito como una oferta especial, por ejemplo, dar una semana gratis para comprar una película.
  • Puedes dar acceso gratuito a los clientes como gesto de buena voluntad.

La facturación puede diferirse de tan solo un día y hasta un año por llamada a la API. Para posponer aún más la facturación, puedes volver a llamar a la API antes de que llegue la nueva fecha de facturación.

Como ejemplo, Darcy tiene una suscripción mensual a contenido en línea para la app de Fishing Quarterly. Por lo general, se le factura GBP 1.25 el primer día de cada mes. En marzo, participó en una encuesta en línea para el publicador de la aplicación. El publicador la recompensa con seis semanas gratis y pospone el próximo pago hasta el 15 de mayo, que son seis semanas después de la fecha de facturación programada para el 1 de abril. A Darcy no se le cobra abril ni el comienzo de mayo, y sigue teniendo acceso al contenido. El 15 de mayo, se le cobra la tarifa habitual de suscripción mensual de GBP 1.25. Su próxima fecha de renovación es el 15 de junio.

Es posible que desees notificar al usuario por correo electrónico o en la app que se cambió la fecha de facturación.

Cambia los precios de las suscripciones

Si quieres obtener información para cambiar los precios de las suscripciones mediante Play Console, consulta la documentación del Centro de ayuda de Play Console.

Advertencia: No debes cambiar el precio de una suscripción de tipo Suscríbete con Google.

Google Play te permite vender tus productos digitales en todo el mundo a muchos usuarios en diferentes configuraciones regionales y con diferentes monedas y consideraciones de precios. A veces, debido a los costos regionales o las fluctuaciones de la moneda, es posible que decidas cambiar el precio de tu suscripción.

Puedes cambiar el precio de cualquier oferta o plan básico, y el precio nuevo se aplicará en una hora para todas las compras nuevas.

Los usuarios de los planes prepagados siempre pagan el precio actual de las recargas y los cambios de plan.

Los usuarios que actualmente están suscritos a planes con renovación automática no se ven afectados de forma predeterminada. En su lugar, se crea una cohorte de precios heredada. Si lo deseas, puedes cambiar el precio del plan básico al precio actual si finalizas la cohorte. No puedes cambiar el precio de las fases de precios de ofertas sin costo o de lanzamiento de un suscriptor existente.

Para obtener más información sobre el uso de las cohortes de precios heredadas, consulta el Centro de ayuda de Play Console.

Comunica un cambio de precio al usuario

Debes notificar a tus suscriptores existentes cada vez que cambies el precio de su plan básico, en especial si el precio aumenta.

Cuando aumentas el precio de una suscripción, tienes al menos siete días para notificar a tus suscriptores existentes sobre el cambio de precio antes de que Google Play comience a notificarlos.

Los suscriptores existentes tienen al menos 30 días para revisar el aumento del precio y decidir si aceptarlo o no. Si no aceptan el aumento de precio, la suscripción se cancela automáticamente antes de que paguen el precio más alto.

Los usuarios pueden revisar un aumento de precio en la pantalla de suscripción de Play Store, donde se muestra un diálogo similar al de la figura 13.

Cuadro de diálogo genérico que notifica al usuario sobre un cambio en el precio de la suscripción
Figura 13. En este cuadro de diálogo de ejemplo, se notifica al usuario sobre un cambio en el precio de la suscripción.

Google Play notifica directamente a los suscriptores existentes sobre todos los próximos cambios de precio.

Dentro de la app, también te recomendamos que notifiques a los usuarios afectados y proporciones un vínculo directo a la pantalla de suscripción de Play Store.

Cuando reduces el precio de una suscripción, no es necesario que los usuarios acepten el cambio. Además, no se les mostrará el diálogo de cambio de precio. Se les cobrará el precio más bajo a partir de su próxima fecha de facturación.

Controla la confirmación del cambio de precio por parte del usuario

Si el usuario acepta el aumento de precio de la suscripción o si lo bajaste, la suscripción se renovará y se podrá procesar como cualquier otra renovación. Además, recibes una SubscriptionNotification de tipo SUBSCRIPTION_PRICE_CHANGE_CONFIRMED.

Controla si no se acepta un aumento de precio

Si un usuario no aceptó tu aumento de precio antes de pagar el precio más alto, se anula la suscripción automáticamente y recibes una SubscriptionNotification de tipo SUBSCRIPTION_CANCELED: Este evento se puede manejar según se describe en Cancelaciones.

Cambio de precio accidental

Si cambiaste accidentalmente el precio de una suscripción, revierte el cambio de inmediato. Si el precio se revierte en un plazo de siete días, los suscriptores existentes no recibirán una notificación sobre el cambio de precio accidental. Ten en cuenta que los suscriptores nuevos pueden recibir el precio accidental durante el tiempo que transcurre entre el primer cambio de precio y la reversión.

Dos cambios de precio seguidos

Si finalizas una cohorte de precios heredada con un aumento de precio y, luego, vuelves a cambiar el precio, los usuarios aptos ya no tendrán que responder al primer cambio de precio, ya que solo se aplicará el segundo.

Debes asegurarte de hacer un solo cambio de precio cada vez. No se recomiendan los cambios de precios para realizar pruebas.

Si cambias el precio de una suscripción dos veces en un período de siete días, los usuarios afectados solo deberán aceptar el cambio de precio más reciente.

Controla los rechazos de pagos

Si hay problemas con el pago al final de un ciclo de facturación, Google intentará renovar la suscripción periódicamente durante un tiempo antes de cancelarla. Este período de reintento puede durar hasta 30 días, además de la duración de cualquier período de gracia especificado. Durante este período, Google también envía correos electrónicos y notificaciones al usuario para pedirle que actualice su forma de pago.

Cuando se rechace el pago, la suscripción ingresará primero al período de gracia, si está habilitado. Durante ese período, el usuario debería seguir teniendo acceso a la suscripción.

Una vez finalizado el período de gracia, la suscripción entra en suspensión de la cuenta por un máximo de 30 días. Durante esta etapa, puedes bloquear el acceso a la suscripción.

Para maximizar la probabilidad de recuperación de una suscripción durante el rechazo de un pago, puedes informar al usuario la situación y solicitarle que resuelva el problema.

Puedes hacerlo por tu cuenta, como se describe en las secciones sobre período de gracia y suspensión de la cuenta, o puedes implementar la API de mensajes desde la app. Google mostrará un mensaje a los usuarios en tu app.

Mensajes desde la app

Si habilitaste los mensajes desde la app con InAppMessageCategoryId.TRANSACTIONAL, Google Play les mostrará a los usuarios la mensajería durante el período de gracia y la suspensión de la cuenta una vez al día, y les proporcionará una de corregir su pago sin salir de la app.

Barra de notificaciones que notifica al usuario para que resuelva su problema de pago
Figura 14: Barra de notificaciones que notifica al usuario para que resuelva su problema de pago

Te recomendamos que llames a esta API cada vez que el usuario abra la app para determinar si el mensaje debe mostrarse.

Si el usuario recuperó su suscripción correctamente, recibirás un código de respuesta SUBSCRIPTION_STATUS_UPDATED junto con un token de compra. Luego, debes usar este token de compra para llamar a la API de Google Play Developer y actualizar el estado de la suscripción en tu app.

Cómo integrar los mensajes desde la app

Para mostrar mensajes desde la app al usuario, usa BillingClient.showInAppMessages().

El siguiente es un ejemplo de cómo activar el flujo de mensajes desde la 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.
                }
            }
        });