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.

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.

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 de 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 serán 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.

En la sección de suscripciones en la app de Google Play Store, aparece una suscripción cancelada con un botón para volver a suscribirse.
Figura 8: En la sección Cuenta > Suscripciones de 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 de 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.

En el caso de los planes prepagados, puedes usar la API para aplazar la facturación para diferir la fecha de vencimiento.

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.

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 a través de la cual Google muestra 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 20: 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.
                }
            }
        });