Recordatorio: A partir del 2 de agosto de 2021, todas las apps nuevas deben usar la Biblioteca de Facturación 3 o versiones posteriores. A partir del 1 de noviembre de 2021, todas las actualizaciones de las apps existentes deben usar la Biblioteca de Facturación 3 o versiones posteriores. Obtén más información.

Vende suscripciones

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 para obtener instrucciones generales sobre cómo 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.

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.queryPurchases(), en la Biblioteca de Facturación Google Play, o mediante Purchases.subscriptions:get, en la API de Google Play Developer.

BillingClient.queryPurchases() Purchases.subscriptions:get
Estado ¿Se muestra? isAutoRenewing ¿Se muestra? expiredTimeMillis paymentState autoRenewing
Activa Verdadero Futuro 1 (Pago recibido) Verdadero
Cancelada Falso Futuro 1 (Pago recibido) Falso
En período de gracia Verdadero Futuro 0 (Pago pendiente) Verdadero
Cuenta suspendida No N/A Pasado 0 (Pago pendiente) Verdadero
Pausada No N/A Pasado 1 (Pago recibido) Verdadero
Vencida No N/A Pasado 1 (Pago recibido) Falso

Si tu app almacena el estado de la suscripción en un servidor de backend seguro, debería 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. Después de recibir una notificación en tiempo real para desarrolladores, debes llamar a la API de desarrollador a fin de obtener el estado completo y actualizar tu propio estado de backend. Estas notificaciones solo indican que cambió el estado de la suscripción. No proporcionan información completa sobre el estado general de la suscripción.

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

Suscripciones nuevas

Asegúrate de seguir nuestras recomendaciones para controlar las compras nuevas. Cuando se compra una suscripción, BillingClient.queryPurchases() la muestra y se envía una notificación de SUBSCRIPTION_PURCHASED. Cuando recibes esta notificación, tu app debe 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#subscriptionPurchase",
  ...
  "expiryTimeMillis": next_renewal_date,
  "autoRenewing": true,
  ...
  "paymentState": 1  # Payment received
}

Renovaciones

Si una suscripción se renueva con éxito, BillingClient.queryPurchases() 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 expiryTimeMillis 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#subscriptionPurchase",
  ...
  "expiryTimeMillis": updated_expiration_time,
  "autoRenewing": true,
  ...
  "paymentState": 1  # Payment received
}

Vencimientos

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

Cuando vence una suscripción, también se envía una notificación de SUBSCRIPTION_EXPIRED. Cuando recibas esta notificación, tu app deberá 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#subscriptionPurchase",
  ...
  "expiryTimeMillis": expiry_time_in_past,
  "autoRenewing": false,
  ...
  "paymentState": 1  # Payment received
}

Cancelaciones

Un usuario puede cancelar una suscripción voluntariamente desde Play Store o hacer que se cancele de forma automática 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.queryPurchases(). La cancelación de una suscripción activa una notificación de SUBSCRIPTION_CANCELLED. Cuando recibes esta notificación, el recurso de suscripción que muestra la API de Google Play Developer contiene autoRenewing = false, y expiryTimeMillis contiene la fecha en la que el usuario debería perder el acceso a la suscripción. Si expiryTimeMillis 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#subscriptionPurchase",
  ...
  "expiryTimeMillis": expiry_time,
  "autoRenewing": false,
  ...
  "paymentState": 1  # Payment received
  "cancelReason": integer # Reason the subscription was cancelled: user, billing issue, etc.
}

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, tu app puede consultar el campo cancelSurveyResult para saber por qué el usuario canceló la suscripció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 _somedate". 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.queryPurchases() ya no muestra una suscripción revocada. Cuando esto ocurre, también se envía una notificación de SUBSCRIPTION_REVOKED. Cuando recibes esta notificación, el recurso de suscripción que muestra la API de Google Play Developer contiene autoRenewing = false, y expiryTimeMillis 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#subscriptionPurchase",
  ...
  "expiryTimeMillis": expiry_time_in_past,
  "autoRenewing": false,
  ...
  "paymentState": 1  # Payment received
}

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.queryPurchases() 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, recibes una notificación de SUBSCRIPTION_ON_HOLD cuando se suspende 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 expiryTimeMillis del recurso de suscripción se establece en una marca de tiempo de pasado, y paymentState se establece en 0:

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_past,
  "autoRenewing": true,
  ...
  "paymentState": 0  # Payment pending
}

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 queryPurchases() para determinar si un usuario tiene derecho a una suscripción, debería controlar automáticamente que se recupere la suscripción cuando se suspende la cuenta.

Si tu app sincroniza el estado de la suscripción con un backend, debería escuchar la notificación SUBSCRIPTION_RECOVERED 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, se establece expiryTimeMillis en una marca de tiempo en el futuro, y el paymentState tiene un valor de 1:

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_future,
  "autoRenewing": true,
  ...
  "paymentState": 1  # Payment received
}

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_CANCELLED como notificación para desarrolladores en tiempo real. A fin de obtener instrucciones para controlar una cancelación, consulta la sección Cancelaciones sobre suscripciones. Cuando consultas la suscripción que se canceló de esta manera, se establece el expiryTimeMillis que se muestra en una marca de tiempo de pasado, y el cancelReason tiene un valor de 1:

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_past,
  "autoRenewing": false,
  ...
  "cancelReason": 1  # The system cancelled the subscription
}

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 aplicación de Google Play Console.

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

Si tu app sincroniza el estado de suscripción con un backend, debería recibir SUBSCRIPTION_IN_GRACE_PERIOD como notificación para desarrolladores en tiempo real cuando el usuario entre en un período de gracia. Mientras el usuario se encuentra en un período de gracia, el recurso de suscripción contiene autoRenewing = true y paymentState = 0 (es decir, pendientes).

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_future,
  "autoRenewing": true,
  ...
  "paymentState": 0  # Payment pending
}

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.

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, queryPurchases() no la muestra. Si se reanuda la suscripción, queryPurchases() la mostrará.

Si la app sincroniza el estado de la suscripción con un servidor de backend seguro, debería 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 SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED como notificación para desarrolladores en tiempo real cuando tu 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 expiryTimeMillis y autoResumeTimeMillis.

Se envía SUBSCRIPTION_PAUSED como notificación en tiempo real para desarrolladores cuando la pausa entra en vigor. En este momento, el usuario debe conservar el acceso a su suscripción, y el recurso de suscripción contiene autoRenewing = true y paymentState = 0 (pendiente), un valor futuro para autoResumeTimeMillis y un valor de pasado para expiryTimeMillis.

Se envía SUBSCRIPTION_RENEWED como notificación de desarrollador en tiempo real si la suscripción se reanuda automáticamente al final del período de pausa o si el usuario decidió reanudarla manualmente. Esto se debe controlar como se describe en Renovaciones.

Si se produjo un error de pago cuando se intentó reanudar la suscripción, se envía SUBSCRIPTION_ON_HOLD como notificación para desarrolladores en tiempo real. Esto se debe controlar como 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 (Subscriptions), en la app de Google Play Store, se muestra una suscripción cancelada y el botón Volver a suscribirse (Resubscribe).

Si tu app depende únicamente de queryPurchases() para determinar si un usuario tiene derecho a una suscripción, debería controlar automáticamente los restablecimientos, ya que queryPurchases() 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, debería recibir SUBSCRIPTION_RESTARTED como notificación para desarrolladores en tiempo real. 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#subscriptionPurchase",
  ...
  "expiryTimeMillis": expiry_time_in_future,
  "autoRenewing": true,
  ...
  "paymentState": 1  # Payment received
}

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

Cuando un usuario realiza una actualización, cambia a una versión anterior o vuelve a suscribirse, se anula la suscripción que estaba vigente y se crea una nueva suscripción con un nuevo token de compra.

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 anterior 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. También te recomendamos que uses la API de Google Play Developer a fin de procesar la compra y reducir las dificultades de los usuarios. El recurso de suscripción es similar al siguiente:

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": next_renewal_date,
  "autoRenewing": true,
  "linkedPurchaseToken": old_purchase_token
  ...
  "paymentState": 1  # Payment received
}

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 (Google Play Subscriptions) que se muestra en esta imagen es un ejemplo de vínculo para administrar suscripciones.
Figura 4: El botón Suscripciones de Google Play (Google Play Subscriptions) 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 expiryTimeMillis tiene valor futuro, o se establece autoRenewing en true.

Cada SKU de la suscripción coincide con el ID de producto que le asignaste al crearlo en Play Console. A fin de determinar de manera programática el SKU de una suscripción existente, consulta 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 aplicación:

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 las figuras 5 y 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 anterior

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 aplicación 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 anterior. Cuando actualizas una suscripción o la cambias a una versión anterior, 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 anterior de inmediato. El tiempo restante se ajusta en función de la diferencia de precio y se adelanta 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 anterior 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 anterior solo cuando se renueva.

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 cobran USD 0.50 por su suscripción nueva y USD 35.50 el 1 de mayo. Luego se le cobran USD 36 cada año.
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.

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 anterior. Sin embargo, cuando actualices o cambies a una versión anterior, deberás proporcionar los detalles de la suscripción actual, la suscripción futura (actualizada o de una versión anterior) y el modo de prorrateo que se usará, como se muestra en el siguiente ejemplo:

Kotlin

// Retrieve a value for "skuDetails" by calling querySkuDetailsAsync()
val flowParams = BillingFlowParams.newBuilder()
        .setOldSku(previousSku, purchaseTokenOfOriginalSubscription)
        .setReplaceSkusProrationMode(desiredProrationMode)
        .setSkuDetails(upgradeOrDowngradeSkuDetails)
        .build();
val responseCode = billingClient.launchBillingFlow(activity, flowParams)

Java

// Retrieve a value for "skuDetails" by calling querySkuDetailsAsync()
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
        .setOldSku(previousSku, purchaseTokenOfOriginalSubscription)
        .setReplaceSkusProrationMode(desiredProrationMode)
        .setSkuDetails(upgradeOrDowngradeSkuDetails)
        .build();
int responseCode = billingClient.launchBillingFlow(billingFlowParams);

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.queryPurchases(). 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 obtener información a fin de administrar las compras de actualizaciones o cambios a versiones anteriores, consulta la sección sobre cómo usar linkedPurchaseToken para controlar las actualizaciones de suscripciones, los cambios a versiones anteriores y los registros de usuarios suscritos anteriormente.

Para el modo de reemplazo diferido, tu app recibe una llamada a tu PurchasesUpdatedListener con una lista de compras vacía y un estado que indica si se realizó correctamente la actualización o el cambio a una versión anterior. Hasta que el reemplazo entre en vigencia, BillingClient.queryPurchases() seguirá mostrando la compra del plan de suscripción original. Una vez que el nuevo plan entre en vigencia, queryPurchases() 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 anterior. 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.

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 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 fue 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.

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 fue 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 a *.
  • 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.

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 anterior 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.

Recupera usuarios que hayan desertado

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.

Cuando 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 anterior 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.
  • 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 para permitir una prueba gratuita por app en Google Play Console, que evita que el usuario obtenga 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 (Subscriptions), en la app de Google Play Store, se muestra una suscripción cancelada y el botón Volver a suscribirse (Resubscribe).

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 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 (Subscriptions) de la app de Google Play Store, se muestra una suscripción cancelada y vencida con los botones Volver a suscribirse (Resubscribe) y Quitar (Remove).

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.

Administra a tus clientes

Con las notificaciones para desarrolladores en tiempo real, puedes detectar en tiempo real cuándo 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. Para obtener más información, consulta Cómo recuperar usuarios que hayan desertado.

Pruebas gratuitas y precios de lanzamiento

Tu app puede ofrecer pruebas gratuitas y precios de lanzamiento para alentar a los clientes a probarla.

Pruebas gratuitas

Puedes permitir que los usuarios prueben una suscripción antes de realizar un pago. Las pruebas gratuitas se pueden utilizar durante el período que especifiques y se convierten en suscripciones completas automáticamente una vez que finaliza el período de prueba gratuita. Estas suscripciones convertidas usan el mismo período y precio que las suscripciones normales. Puedes configurar una prueba gratuita para cualquier tipo de suscripción.

A fin de iniciar una prueba gratuita, los usuarios deben completar el proceso estándar para la compra de una suscripción en Google Play. Si un usuario es apto para una prueba gratuita, no se le cobrará nada por la duración de la prueba gratuita y se le notificará por correo electrónico que la suscripción incluye un período de prueba gratuito. Google Play registra una transacción de USD 0.00, y la suscripción se marca como comprada para el período de prueba gratuito o hasta su cancelación.

Google Play verifica que el usuario tenga una forma de pago válida antes de comenzar la prueba gratuita. 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.

De forma predeterminada, los usuarios solo pueden recibir una prueba gratuita para todas las suscripciones disponibles en tu app. Si quieres proporcionar una prueba gratuita por producto de suscripción, puedes cambiar la configuración correspondiente en Google Play Console.

A fin de agregar una prueba gratuita a una suscripción, consulta las instrucciones para pruebas gratuitas en el Centro de ayuda de Google Play.

Los eventos del ciclo de vida de las suscripciones para una suscripción con una prueba gratuita funcionan de la misma manera que una suscripción sin prueba gratuita. La única diferencia es que el período de renovación puede diferir del intervalo normal de renovación de suscripciones.

Cuando muestres a los usuarios los productos disponibles para la venta, puedes usar el método SkuDetails.getFreeTrialPeriod() a fin de mostrar que hay una prueba gratuita disponible para un producto.

Si se compró una suscripción con una prueba gratuita, la suscripción que se muestra de la API de Google Play Developer tiene paymentState = 2 (prueba gratuita). Si se renueva correctamente la suscripción, el paymentState cambia a 1 (pago recibido).

Precios de lanzamiento

Al igual que las pruebas gratuitas, tu app puede ofrecer precios de lanzamiento a fin de alentar a los usuarios a probarla. Para obtener más información sobre los precios de lanzamiento y cómo habilitarlos, consulta Crea una suscripción.

Los eventos de ciclo de vida de la suscripción para una suscripción con precios de lanzamiento funcionan de la misma manera que una suscripción sin precios de lanzamiento. La única diferencia es que el período de renovación puede diferir del intervalo normal de renovación de suscripciones.

Cuando muestres a los usuarios los productos disponibles para la venta, puedes usar SkuDetails.getIntroductoryPrice() y métodos relacionados a fin de mostrarle al usuario que la suscripción tiene un precio de lanzamiento disponible.

Promociona tu suscripción

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

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 adelantar la próxima fecha de facturación de un suscriptor con el recurso 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 en 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 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.

Cómo cambiar los precios de las suscripciones

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. Si deseas mantener a los suscriptores existentes con el precio actual, puedes crear un SKU nuevo con el precio actualizado y ofrecerlo a los suscriptores nuevos.

Si no puedes seguir ofreciendo a los suscriptores el precio original del momento en que se registraron y estás dispuesto a cancelar todas las suscripciones de usuarios que decidieron no aceptar el precio nuevo, puedes aplicar un cambio de precio obligatorio. Si el usuario no acepta el precio nuevo, se cancelará la suscripción. Para maximizar los índices de participación y alentar a los usuarios a actuar, tu app debe mostrar mensajes sobre el próximo cambio de precio. Para obtener más información sobre los mensajes de cambio de precio, consulta Comunica un cambio de precio al usuario.

Para cambiar el precio de una suscripción, haz lo siguiente:

  1. Accede a Google Play Console.
  2. Busca la app que contiene la suscripción cuyo precio quieres cambiar.
  3. Selecciona Presencia en Play Store > Productos integrados en la aplicación y luego abre la pestaña Suscripciones.
  4. Selecciona el vínculo Editar (Edit) que aparece junto al precio que quieras cambiar, como se muestra en la figura 10.

    Edición del campo de precio de la suscripción
    Figura 10: Edita el campo de precio de la suscripción.
  5. Ingresa el nuevo precio de la suscripción.

  6. Cuando cambias el precio, aparece un cuadro de diálogo de confirmación, como se muestra en la figura 11.

    cuando editas el precio de la suscripción, aparece una advertencia
    Figura 11: Cuando editas el precio de la suscripción, aparece una advertencia.

    Este diálogo explica cómo afecta el cambio de precio a los suscriptores nuevos y existentes. Ten en cuenta lo siguiente:

    • Una vez que lo confirmes, no podrás revertir el cambio de precio.
    • Google Play comienza a notificar a los usuarios sobre el cambio de precio a partir de los siete días posteriores a la confirmación.
    • Cuando aumentas el precio de la suscripción, los usuarios deben aprobar el cambio de precio en un plazo de 30 días, o su suscripción se cancelará automáticamente.
    • Los descuentos en los precios de suscripción se aplican automáticamente a los suscriptores existentes en la próxima fecha de renovación. Cualquier persona que se suscriba después de una disminución de precio recibirá el precio automáticamente.

    Para continuar, haz clic en Aplicar (Apply).

  7. Aparecerá un cuadro de diálogo de confirmación que describe de nuevo cuándo entrarán en vigencia los nuevos precios de suscripción.

    cuadro de diálogo de confirmación que muestra cuándo entra en vigencia el cambio de precio de la suscripción
    Figura 12: En este cuadro de diálogo de confirmación, se muestra cuándo entra en vigencia el cambio de precio de la suscripción.

Comunica un cambio de precio al usuario

Si haces un cambio de precio, debes notificar a los suscriptores existentes, 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. Cuando Google Play notifica a los usuarios, muestra un diálogo similar al que aparece en la figura 13. En este diálogo, se muestra el precio anterior, el nuevo precio y la fecha en la que entrará en vigencia este último.

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 genérico, se notifica al usuario sobre un cambio en el precio de la suscripción.

Dentro de tu app, puedes mostrar ese diálogo de las siguientes maneras:

Tu app puede determinar si un usuario tiene un cambio de precio pendiente si verifica el campo priceChange en el recurso de suscripción. Si está presente, este campo indica que la suscripción tiene un cambio de precio, y el campo priceChange.state indica si se aceptó el cambio de precio o si aún está pendiente.

Inicia un flujo de confirmación de cambio de precio

Para mostrar el diálogo de cambio de precio de Google Play cuando se inicia tu app, usa BillingClient.launchPriceChangeConfirmationFlow().

Antes de mostrar el diálogo de cambio de precio, puedes presentar tu propio mensaje o diálogo donde se explique el motivo del cambio de precio. Si creas este tipo de mensaje personalizado y lo muestras, es más probable que tus usuarios elijan renovar la suscripción con el nuevo precio.

El siguiente es un ejemplo de lanzamiento del flujo de confirmación de cambio de precio:

Kotlin

val priceChangeFlowParams = PriceChangeFlowParams.newBuilder()
        .setSkuDetails(changedPriceSubscriptionSkuDetails)
        .build()

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        object : PriceChangeConfirmationListener() {
            override fun onPriceChangeConfirmationResult(responseCode: Int) {
                if (responseCode == BillingResponseCode.OK) {
                    // User has confirmed the price change.
                } else if (responseCode == BillingResponseCode.USER_CANCELED) {
                    // User hasn't confirmed the price change and should retain
                    // access until the end of the current billing cycle.
                }
            }
        })

Java

PriceChangeFlowParams priceChangeFlowParams = PriceChangeFlowParams.newBuilder()
        .setSkuDetails(changedPriceSubscriptionSkuDetails)
        .build();

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        new PriceChangeConfirmationListener() {
            @Override
            public void onPriceChangeConfirmationResult(int responseCode) {
                if (responseCode == BillingResponseCode.OK) {
                    // User has confirmed the price change.
                } else if (responseCode == BillingResponseCode.USER_CANCELED) {
                    // User hasn't confirmed the price change and should retain
                    // access until the end of the current billing cycle.
                }
            }
        });

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

Si el usuario acepta el nuevo precio de la suscripción, la suscripción se renueva y se puede procesar como cualquier otra renovación. Además, recibes SUBSCRIPTION_PRICE_CHANGE_CONFIRMED como notificación para desarrolladores en tiempo real.

Controla el rechazo de un cambio de precio

Si un usuario no aceptó tu cambio de precio cuando vence su suscripción anterior, se anula la suscripción y recibes una notificación de SUBSCRIPTION_CANCELED. Este evento se puede manejar tal como 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

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, el usuario solo debe aceptar el cambio de precio más reciente.

Si los cambios de precio tienen una diferencia de más de siete días, los cambios no se cancelan entre sí. En cambio, el usuario debe aceptar el primer cambio de precio y tener un ciclo de renovación al primer precio. Una vez finalizado el ciclo de renovación, puedes comenzar a cobrar el segundo precio. Las renovaciones se cobran al segundo precio cada mes.