Directriz 3.1.1 (In-App Purchase): qué hacer cuando Apple rechaza tu checkout de Stripe
Tu app web cobra a través de Stripe, y eso está bien en la web. Dentro de la app de iOS, Apple exige In-App Purchase para cualquier bien digital que se use en la app. La solución no es arrancar Stripe; es dejar que la compilación de iOS use StoreKit a través de RevenueCat mientras la web conserva Stripe.
Desde $109 de pago único por plataforma, o deja que nuestro equipo lo haga todo desde $698.
Garantía de aprobación – o te devolvemos el dinero en 14 días
Sin programar
Pago único, actualizaciones gratuitas
Soporte humano 24/7
Hecho en Alemania desde 2014 · ISO 27001
9:41
Tu app
Tu appYa en tu bolsillo
App Store · Google Play Aprobada
Qué dice la 3.1.1, en palabras sencillas
Si tu app desbloquea funciones, contenido o servicios que se consumen dentro de la app (suscripciones, niveles premium, créditos de IA, plantillas, cursos), esa compra debe pasar por In-App Purchase. La directriz también prohíbe botones, enlaces y textos dentro de la app que dirijan a la gente a otra forma de pagar por esos artículos digitales. Apple la aplica por tienda regional, y existen excepciones por región (más abajo), pero para una app pequeña la regla práctica es: los bienes digitales dentro de la app de iOS usan IAP.
Las plantillas de Lovable, Bolt y v0 conectan Stripe Checkout por defecto, y la IA coloca encantada un botón de "Upgrade for $9/month" en la página de precios. El revisor lo pulsa, ve un formulario de Stripe y escribe el rechazo 3.1.1. No hay nada malo en tu modelo de negocio; lo que falla es el canal dentro de la app.
¿Tu compra necesita In-App Purchase?
Qué vendes
Dentro de la app de iOS
Directriz
Suscripción a funciones de la app, nivel premium
IAP obligatorio
3.1.1
Créditos de IA, tokens, generaciones
IAP obligatorio (consumible)
3.1.1
Plantillas, libros electrónicos, cursos usados en la app
IAP obligatorio
3.1.1
Bienes físicos y servicios usados fuera de la app (productos enviados, comida a domicilio, una visita de limpieza)
Stripe o cualquier procesador permitido; el IAP no debe usarse
3.1.3(e)
Servicios en tiempo real de persona a persona (tutorías, consultas)
Otros métodos de pago permitidos; de uno a muchos debe usar IAP
3.1.3(d)
Contenido comprado en la web y consumido solo en la app (apps de lectura: libros, audio, video, noticias)
Puede desbloquearse sin IAP; sin botones de compra en la app ni enlaces para comprar en otro sitio
3.1.3(a)
Cambia la compilación de iOS a In-App Purchase con RevenueCat
Stripe se queda en la web; la app llama a un solo esquema de URL.
Crea los productos en App Store Connect
Firma el contrato de Paid Apps (titular de la cuenta) y luego añade la suscripción o el consumible con un identificador como pro_monthly. Añade un tester de sandbox en Users and Access para las pruebas.
Haz que la app web sepa que se ejecuta dentro de la app
Pon useragent_iphone en Config.swift con el user agent por defecto más un marcador como MyAppiOS y luego comprueba navigator.userAgent en tu app web. Dentro de la app, sustituye el botón de Stripe por un enlace a revenuecat://purchase?external_id=USER_ID&product=pro_monthly, o abre un paywall nativo con revenuecat://launchPaywall?external_id=USER_ID&offering=default (iOS 15 o posterior).
Sincroniza el entitlement con tu backend
Usa los webhooks de RevenueCat (o las variables inyectadas planID y transactionIdentifier) para fijar el plan en el registro del usuario en Supabase o Firebase, de modo que la misma cuenta sea premium en la web y en la app.
Añade los enlaces de restaurar y gestionar
Un enlace visible de "Restaurar compras" a restoreinapppurchases:// y un enlace de "Gestionar suscripción" a cancelinapppurchase://, que abre la gestión de suscripciones de Apple. Los revisores esperan ambos.
Elimina cualquier pista de pago externo de la app
Nada de "más barato en nuestra web", nada de portal de facturación de Stripe, ningún correo que diga "mejora tu plan en tudominio.com" disparado desde la app, ninguna página de precios que compare ambos. Después sube una nueva compilación y responde en el Centro de resolución con los IDs de producto.
Mi WebView de iOS finalmente está aprobada. ¡Gracias!
La web conserva Stripe; la compilación de iOS redirige a RevenueCat. Detecta la app mediante el marcador personalizado del user agent.
javascript
// Config.swift: useragent_iphone = default UA + " MyAppiOS"
var isIosApp = navigator.userAgent.indexOf("MyAppiOS") !== -1;
function buy(productId, userId) {
if (isIosApp) {
// StoreKit via RevenueCat inside the WebViewGold app
window.location.href = "revenuecat://purchase?external_id=" + encodeURIComponent(userId) + "&product=" + productId;
} else {
// Stripe Checkout on the web
window.location.href = "/checkout?plan=" + productId;
}
}
Enlaces de pago externos: las reglas varían según la región
Las reglas varían según la región. En Estados Unidos, tras una orden judicial de 2025, las apps de la tienda estadounidense pueden enlazar a opciones de compra externas; la Unión Europea tiene condiciones alternativas bajo la Ley de Mercados Digitales; en el resto se aplica la regla clásica. Estas reglas cambian y conllevan sus propias obligaciones de información, así que consulta el texto vigente de Apple antes de confiar en ellas. Para una app de una sola persona, el IAP a través de RevenueCat pasa la revisión en todas las tiendas con el mínimo papeleo; consulta la guía de decisión Stripe frente a In-App Purchase para la parte de negocio.
Preguntas frecuentes
¿Puedo mantener Stripe para la versión web y usar IAP solo en la app?
Sí, esa es la configuración normal. La misma cuenta recibe el entitlement por cualquiera de los dos canales; tu backend trata igual un webhook de RevenueCat y un webhook de Stripe.
¿Puedo simplemente ocultar la página de precios en la app y pedir a los usuarios que se suscriban en la web?
Ocultar la compra está permitido para contenido de tipo lectura, pero decir a los usuarios dentro de la app que vayan a la web no lo está. Si la app en sí no tiene nada que comprar y nunca señala a otro sitio, los revisores suelen aceptarlo; a la mayoría de las apps les va mejor añadiendo IAP.
¿Los consumibles como los créditos de IA de verdad necesitan IAP?
Sí. Los créditos que se gastan dentro de la app son contenido digital. Créalos como compras consumibles dentro de la app y abona el saldo en tu backend cuando llegue el webhook de RevenueCat.
Tres formas de llevar tu app a las tiendas
El mismo resultado, con distinta cantidad de trabajo por tu parte. Las tres incluyen la garantía de aprobación y soporte humano 24/7.
Hazlo tú mismo
$109 por plataforma, pago único
La licencia de WebViewGold: un proyecto de Xcode o Android Studio listo para usar. Pega tu URL, define nombre e icono, activa funciones, compila y envía. Actualizaciones gratuitas para siempre.
Sin Mac, sin Xcode, sin Android Studio: configura en el navegador, compilamos ambas apps en la nube y las entregamos a App Store Connect y a Play Console.
Envíanos tu URL y tu icono. Nuestro equipo configura, compila y entrega tu app en 72 horas, en marca blanca y con los proyectos fuente. Ambas plataformas por $1,158.
Los reembolsos se conceden bajo las condiciones indicadas en nuestras FAQ: un rechazo por motivos ajenos al contenido por parte de Apple y/o Google, reclamado dentro de los 14 días posteriores a la compra.