Realizar compras en la aplicación móvil con el SDK de Capacitor

Mostrar paywalls en tu aplicación móvil es un paso esencial para ofrecer a los usuarios acceso a contenido o servicios premium. Sin embargo, presentar un paywall solo gestiona las compras por sí solo cuando Adapty renderiza la pantalla, es decir, en un flow o en un paywall del antiguo Paywall Builder.

Si renderizas la pantalla en tu propio código, debes usar un método separado llamado .makePurchase() para completar una compra y desbloquear el contenido deseado. Este método es la puerta de entrada para que los usuarios interactúen con los paywalls y procedan con sus transacciones.

Si tu paywall tiene una oferta promocional activa para el producto que el usuario quiere comprar, Adapty la aplicará automáticamente en el momento de la compra.

Asegúrate de haber completado la configuración inicial sin saltarte ningún paso. Sin ella, no podemos validar las compras.

Realizar una compra

Note

¿Adapty renderiza tu pantalla? Para un flow o un paywall de Paywall Builder, las compras se procesan automáticamente; puedes saltarte este paso.

¿Buscas una guía paso a paso? Consulta la guía de inicio rápido para instrucciones de implementación completas con todo el contexto.


try {
  const result = await adapty.makePurchase({ product });
  
  if (result.type === 'success') {
    const isSubscribed = result.profile?.accessLevels?.['YOUR_ACCESS_LEVEL']?.isActive;
    
    if (isSubscribed) {
      // Grant access to the paid features
      console.log('User is now subscribed!');
    }
  } else if (result.type === 'user_cancelled') {
    console.log('Purchase cancelled by user');
  } else if (result.type === 'pending') {
    console.log('Purchase is pending');
  }
} catch (error) {
  console.error('Purchase failed:', error);
}
ParámetroPresenciaDescripción
productobligatorioUn objeto AdaptyPaywallProduct obtenido del flow mediante getPaywallProducts.

Parámetros de respuesta:

ParámetroDescripción
resultUn objeto AdaptyPurchaseResult con un campo type que indica el resultado de la compra ('success', 'user_cancelled' o 'pending') y un campo profile que contiene el AdaptyProfile actualizado en las compras exitosas.

Cambiar de suscripción al realizar una compra

Cuando un usuario elige una nueva suscripción en lugar de renovar la actual, el funcionamiento depende del store:

  • En el App Store, la suscripción se actualiza automáticamente dentro del grupo de suscripciones. Si un usuario compra una suscripción de un grupo mientras ya tiene una suscripción de otro, ambas suscripciones estarán activas al mismo tiempo.
  • En Google Play, la suscripción no se actualiza automáticamente. Deberás gestionar el cambio en el código de tu aplicación tal como se describe a continuación.

Para reemplazar una suscripción por otra en Android, llama al método .makePurchase() con el parámetro adicional:


try {
  const result = await adapty.makePurchase({ 
    product,
    params: {
      android: {
        subscriptionUpdateParams: {
          oldSubVendorProductId: 'old_product_id',
          prorationMode: 'charge_prorated_price'
        },
        isOfferPersonalized: true
      }
    }
  });
  
  if (result.type === 'success') {
    const isSubscribed = result.profile?.accessLevels?.['YOUR_ACCESS_LEVEL']?.isActive;
    
    if (isSubscribed) {
      // Grant access to the paid features
      console.log('Subscription updated successfully!');
    }
  } else if (result.type === 'user_cancelled') {
    console.log('Purchase cancelled by user');
  } else if (result.type === 'pending') {
    console.log('Purchase is pending');
  }
} catch (error) {
  console.error('Purchase failed:', error);
}

Parámetro de solicitud adicional:

ParámetroPresenciaDescripción
paramsopcionalUn objeto de tipo MakePurchaseParamsInput que contiene parámetros de compra específicos de la plataforma.

La estructura MakePurchaseParamsInput incluye:

{
  android: {
    subscriptionUpdateParams: {
      oldSubVendorProductId: 'old_product_id',
      prorationMode: 'charge_prorated_price'
    },
    isOfferPersonalized: true
  }
}

Puedes leer más sobre suscripciones y modos de reemplazo en la documentación para desarrolladores de Google:

Gestionar planes prepagos (Android)

Si los usuarios de tu app pueden adquirir planes prepagos (por ejemplo, comprar una suscripción no renovable por varios meses), puedes habilitar las transacciones pendientes para dichos planes.

await adapty.activate({
  apiKey: 'YOUR_PUBLIC_SDK_KEY',
  params: {
    android: {
        pendingPrepaidPlansEnabled: true,
    },
  }
});

Canjear códigos de oferta en iOS

Acerca de los códigos de oferta

Los códigos de oferta te permiten dar descuentos o períodos de prueba gratuitos a usuarios específicos. A diferencia de las ofertas regulares que se aplican automáticamente, los códigos de oferta se distribuyen fuera de la app — a través de campañas de correo electrónico, redes sociales o materiales impresos. Los usuarios los canjean introduciendo el código en el App Store, siguiendo una URL de canje o a través de un diálogo dentro de la app.

Para configurar códigos de oferta, abre una suscripción en App Store Connect y ve a su sección Offer Codes. Puedes crear tres tipos de códigos de oferta:

  • Free — la suscripción es gratuita durante un período determinado, y la siguiente renovación se realiza al precio completo.
  • Pay as you go — el usuario paga un precio con descuento en cada ciclo de facturación durante un período determinado, luego la suscripción se renueva al precio completo.
  • Pay up front — el usuario paga un precio único con descuento por toda la duración de la oferta, luego la suscripción se renueva al precio completo.

No es necesario añadir los códigos de oferta a Adapty. Apple etiqueta cada transacción durante el período de la oferta con la categoría del código de oferta. Esto incluye el canje inicial y todas las renovaciones con descuento posteriores. Adapty detecta la etiqueta y registra cada transacción con la categoría de oferta offer_code. Una vez que el período de oferta termina y la suscripción se renueva al precio completo, la etiqueta ya no está presente. Puedes filtrar los análisis por el tipo de oferta Offer Code en el Adapty Dashboard.

Solución de problemas de discrepancias en ingresos

Si observas que una transacción con código de oferta aparece en Adapty al precio completo del producto en lugar del precio con descuento de la oferta, verifica lo siguiente en App Store Connect:

  • El código de oferta tiene el precio correcto configurado para todas las regiones donde los usuarios pueden canjearlo.
  • El precio de la oferta está establecido para el país o región específico del usuario. Apple envía el precio regional en la transacción. Si no hay ningún precio regional configurado para la oferta, Apple puede enviar el precio completo del producto en su lugar.

Puedes filtrar y verificar las transacciones con códigos de oferta en el Adapty Dashboard mediante los filtros de tipo de oferta Offer Code y Offer Discount Type.

Códigos promocionales heredados (obsoletos)

Warning

Apple dejó obsoletos los códigos promocionales para compras in-app en marzo de 2026. Los códigos de oferta los reemplazan con más funcionalidades: elegibilidad configurable, fechas de vencimiento y hasta 1 millón de códigos por trimestre. Si anteriormente usabas códigos promocionales para compras in-app, haz la transición a los códigos de oferta en App Store Connect.

Los códigos promocionales heredados (limitados a 100 por app por versión) otorgaban acceso gratuito a una suscripción. A diferencia de los códigos de oferta, Apple no incluía información de descuento en las transacciones con códigos promocionales — enviaba el precio completo del producto en el recibo. Como resultado, Adapty registraba estas transacciones al precio completo, lo que causaba discrepancias de ingresos entre los análisis de Adapty y App Store Connect.

Si ves transacciones históricas al precio completo que deberían haber sido gratuitas, es probable que provengan de códigos promocionales heredados. Dado que estos códigos están ahora obsoletos, haz la transición a los códigos de oferta para un seguimiento preciso de los ingresos.

Para mostrar la hoja de canje de códigos en tu app:


try {
  await adapty.presentCodeRedemptionSheet();
} catch (error) {
  console.error('Failed to present code redemption sheet:', error);
}
Danger

Según nuestras observaciones, la hoja de canje de códigos de oferta en algunas apps puede no funcionar de forma fiable. Recomendamos redirigir al usuario directamente al App Store.

Para hacer esto, debes abrir la URL con el siguiente formato: https://apps.apple.com/redeem?ctx=offercodes&id={apple_app_id}&code={code}

Compras in-app promocionadas desde el App Store

Info

Tu app puede gestionar las compras in-app promocionadas desde la versión 4.1.1 del SDK, en iOS 16.4 o posterior. En versiones inferiores a iOS 16.4, el evento nunca se activa y las compras promocionadas se completan por sí solas. El evento tampoco se activa en Android.

Cuando un usuario inicia una compra desde la página de tu producto en App Store y la transacción se transfiere a tu app, el SDK la completa automáticamente: la pantalla del sistema de compras de Apple aparece de inmediato y Adapty procesa la transacción como cualquier otra compra. Esto no requiere ningún código de tu parte.

Si el producto promocionado incluye una oferta de suscripción, el SDK la aplica automáticamente en el momento de la compra. La oferta se lee desde el intent de compra de App Store, que la expone en iOS 18.0 y versiones posteriores. En iOS 16.4–17.x, la compra se realiza al precio base.

Para gestionar tú mismo el proceso de compra —por ejemplo, para mostrar primero tu propia pantalla— escucha el evento 'onPromotedPurchaseReceived' y pasa el producto a makePromotedPurchase:


const listener = await adapty.addListener('onPromotedPurchaseReceived', async ({ product }) => {
  const result = await adapty.makePromotedPurchase({ product });
  // process the purchase result
});
Warning

Mientras tu listener esté registrado, el SDK deja de completar las compras promocionadas por ti. Si tu handler nunca llama a makePromotedPurchase, la compra nunca se realiza: el App Store entrega el producto a tu app y espera.

makePromotedPurchase no recibe parámetros de compra — un producto promocionado proviene del App Store en lugar de un paywall, por lo que no tiene contexto de paywall. Devuelve el mismo AdaptyPurchaseResult que makePurchase.

Llamar a adapty.removeAllListeners() elimina el listener de compras promocionadas junto con el resto, y la finalización automática del SDK retoma su lugar. Vuelve a registrar el listener si tu aplicación sigue siendo responsable de la finalización.