Guías

Cómo añadir pagos a tu app: checkout, suscripciones y webhooks

La forma más sencilla de añadir pagos a tu app es Stripe: usa un Payment Link si solo necesitas un botón de «Comprar» y puedes gestionar los pedidos a mano; Stripe Checkout si tu app necesita saber quién ha pagado y reaccionar automáticamente; y Checkout en modo suscripción más el portal de cliente de Stripe para los cobros recurrentes. En todos los casos salvo el más simple, también necesitas un webhook, un endpoint de tu servidor al que Stripe llama cuando un pago se completa, y conviene probarlo todo con las claves de prueba y las tarjetas de prueba de Stripe antes de pasar a las claves reales.

Esta guía explica cada opción, la parte de los webhooks que la mayoría de tutoriales omiten y lo que hay que revisar antes de cobrar dinero real. Los detalles de Stripe proceden de su propia documentación a septiembre de 2026.

Por qué usar un proveedor de pagos

Nunca recojas números de tarjeta en tus propios formularios. Manejar datos de tarjeta en bruto te somete al alcance de PCI DSS (el estándar de seguridad del sector de tarjetas) y es una responsabilidad seria. Un proveedor de pagos como Stripe aloja el formulario de pago, guarda la tarjeta, gestiona la autenticación bancaria y le dice a tu app el resultado. Tu app solo ve «el cliente X ha pagado por Y».

Esta guía usa Stripe porque es muy utilizado, tiene buena documentación y lo admite la mayoría de constructores de apps con IA. Existen otros proveedores, y algunos actúan como «comerciante de registro» y asumen la gestión del impuesto sobre ventas por ti; si la cumplimentación fiscal te preocupa, ese modelo merece la comparación.

Las tres formas de cobrar con Stripe

OpciónCódigo necesario¿Tu app sabe quién ha pagado?Ideal para
Payment LinksNingunoSolo si añades un webhookVender unos pocos productos fijos, donaciones, probar la demanda
Checkout (pago único)Código de servidor para crear una sesiónSí, mediante webhookTiendas, descargas de pago, compras puntuales
Checkout (suscripción)Código de servidor más gestión de webhooksSí, mediante webhookSaaS, membresías, cualquier cobro recurrente

Payment Links

Un Payment Link es una página de pago alojada en Stripe que creas en el panel de Stripe sin código. Obtienes una URL que puedes poner detrás de un botón de tu app, compartir en un correo o mostrar como código QR. Según la documentación de Stripe, los Payment Links pueden vender un producto, una suscripción o aceptar una donación, y puedes dejar que el cliente elija cuánto pagar o limitar el número de compras.

La trampa: tu app no sabe automáticamente que un usuario concreto con sesión iniciada ha pagado. Para una página de donaciones o una tienda pequeña en la que cumples los pedidos a mano a partir de las notificaciones por correo de Stripe, es suficiente. Para «paga para desbloquear las funciones Pro», no lo es.

Stripe Checkout

Checkout es una página de pago que tu servidor crea bajo demanda para una compra concreta. Tu servidor le indica a Stripe qué se compra (y, opcionalmente, qué cliente compra), Stripe devuelve una URL y tú envías al cliente allí. Según la documentación de Stripe, admite pagos únicos y de suscripción, en forma de página completa alojada por Stripe, página incrustada en tu sitio o formulario incrustado.

El flujo:

  1. El cliente hace clic en Comprar en tu app.
  2. Tu servidor crea una Checkout Session con tu clave secreta, incluyendo un ID que la vincula a tu usuario o pedido.
  3. El cliente es redirigido a Stripe y paga.
  4. Stripe lo devuelve a tu página de éxito.
  5. Stripe envía un evento checkout.session.completed a tu webhook, y tu servidor marca el pedido como pagado o desbloquea el acceso.

El paso 2 debe hacerse en el servidor, porque usa tu clave secreta. Esa es la principal razón por la que Checkout necesita un backend.

Suscripciones

Las suscripciones usan Checkout en modo suscripción con un precio recurrente que configuras en Stripe. El primer pago funciona como el flujo anterior. Después, las renovaciones, las tarjetas fallidas, las mejoras a mitad de ciclo y las cancelaciones ocurren con el tiempo —a menudo cuando el cliente ya no está en tu app—, así que tu app se entera solo a través de los webhooks.

Para que los clientes gestionen su propia suscripción, Stripe ofrece un portal de cliente alojado. Según la documentación de Stripe, los clientes pueden actualizar los métodos de pago y los datos de facturación, cambiar o cancelar suscripciones, y ver y descargar facturas allí. Lo configuras en el panel de Stripe y añades un botón de «Gestionar facturación» que lleva al cliente hasta él. Así te ahorras construir esas pantallas tú mismo.

Webhooks: la parte que no puedes saltarte

Un webhook es una petición HTTP que Stripe envía a tu servidor cuando pasa algo. (Consulta qué es un webhook para la idea general). La guía de cumplimiento de Stripe es explícita: no puedes fiarte solo de la página de éxito para completar los pedidos, porque un cliente puede pagar y perder la conexión antes de que cargue esa página. En las suscripciones y los métodos de pago diferidos, los webhooks son obligatorios.

Eventos que merece la pena gestionar

EventoQué significaQué hace tu app
checkout.session.completedCheckout ha terminadoMarcar el pedido como pagado o iniciar el acceso
checkout.session.async_payment_succeededUn método diferido (como un cargo bancario) se ha confirmado más tardeCumplir ahora
checkout.session.async_payment_failedEse pago diferido ha falladoAvisar al cliente; no cumplir
invoice.paidUn pago de suscripción se ha completado, incluidas las renovacionesAmpliar el acceso
invoice.payment_failedUna renovación ha falladoAvisar al usuario; Stripe puede reintentar
customer.subscription.updatedHa cambiado el plan, o hay una cancelación programadaActualizar el plan del usuario
customer.subscription.deletedLa suscripción ha terminadoQuitar el acceso de pago

Reglas para un manejador de webhooks correcto

Vienen directamente de la documentación de webhooks de Stripe, y los manejadores generados con IA a veces pasan por alto alguna:

  • Verifica la firma. Cada evento incluye una cabecera Stripe-Signature. Tu manejador la comprueba con el secreto de firma del endpoint (empieza por whsec_). Sin esto, cualquiera podría enviar a tu servidor un falso «pago completado».
  • Usa el cuerpo original de la petición. Las comprobaciones de firma fallan si tu framework analiza o modifica el cuerpo antes.
  • Devuelve una respuesta 2xx rápidamente y haz el trabajo más lento después. Los tiempos de espera cuentan como fallos.
  • Gestiona los duplicados. Stripe puede entregar el mismo evento más de una vez. Registra los ID de evento procesados, o haz que el cumplimiento sea seguro aunque se ejecute dos veces.
  • No asumas el orden. Stripe no garantiza que los eventos lleguen en el orden en que ocurrieron.
  • Espera reintentos. En modo real, Stripe reintenta las entregas fallidas durante hasta tres días, así que una caída breve no pierde pagos, pero tu manejador debe asumir eventos tardíos.

Los webhooks necesitan una dirección HTTPS pública, así que normalmente solo funcionan una vez publicada tu app (la CLI de Stripe puede reenviar eventos a una máquina local para los desarrolladores).

Un prompt que cubre todo el flujo

Añade una compra única con Stripe Checkout para el «Pack Pro» (ID de precio en STRIPE_PRICE_ID). Crea la Checkout Session en el servidor usando STRIPE_SECRET_KEY de los secretos, e incluye el ID del usuario con sesión iniciada en la sesión. Añade un endpoint POST /api/stripe/webhook que verifique la firma de Stripe con STRIPE_WEBHOOK_SECRET usando el cuerpo original de la petición, gestione checkout.session.completed y marque a ese usuario como que tiene el Pack Pro. Que sea seguro si el mismo evento llega dos veces. Páginas de éxito y de cancelación. Nunca expongas la clave secreta al navegador.

Para suscripciones, añade: «Usa el modo suscripción con STRIPE_PRICE_ID. Gestiona invoice.paid, invoice.payment_failed, customer.subscription.updated y customer.subscription.deleted. Añade un botón de Gestionar facturación que abra el portal de cliente de Stripe.»

Modo de prueba

Stripe tiene entornos separados de sandbox (prueba) y de producción, con claves distintas. Las claves de prueba empiezan por pk_test_, sk_test_ o rk_test_; las de producción, por pk_live_, sk_live_ o rk_live_. Las transacciones de prueba no mueven dinero.

Tarjetas de prueba útiles de la documentación de pruebas de Stripe (cualquier fecha de caducidad futura, cualquier CVC de tres dígitos):

Número de tarjetaResultado
4242 4242 4242 4242El pago se completa
4000 0000 0000 0002La tarjeta es rechazada
4000 0000 0000 3220Requiere autenticación 3D Secure y luego se completa

Prueba al menos:

  • Un pago correcto desbloquea lo correcto para el usuario correcto
  • Una tarjeta rechazada muestra un mensaje claro y no desbloquea nada
  • Cerrar la pestaña del navegador justo después de pagar sigue dando acceso (esto demuestra que funciona el webhook, no solo la página de éxito)
  • Cancelar en la página de Stripe devuelve al usuario a tu app sin ningún cargo
  • En suscripciones: cancela en el portal de cliente y comprueba que el acceso termina cuando debe

Puesta en producción

  1. Activa tu cuenta de Stripe con los datos de tu empresa y de tu banco.
  2. Cambia a las claves reales en los secretos de tu app. Stripe recomienda claves restringidas con solo los permisos que necesita tu integración, en lugar de una clave secreta sin restricciones.
  3. Crea un endpoint de webhook en modo real que apunte a tu app publicada. Tiene su propio secreto de firma, distinto del de prueba; actualízalo.
  4. Vuelve a crear los productos y precios en modo real; los ID de los entornos de prueba no existen allí.
  5. Haz una compra real pequeña y reembólsala.

Guarda todas las claves en los secretos de tu proyecto, nunca en el código ni en el chat. Nuestra lista de seguridad trata las claves y la verificación de webhooks con más detalle.

Impuestos, reembolsos y papeleo

Los pagos traen obligaciones que el código no resuelve. Esto no es asesoramiento fiscal; consulta a un contable.

  • Impuesto sobre ventas, IVA e impuestos equivalentes. Según dónde estés tú y tus clientes, quizá tengas que registrarte, cobrar y presentar impuestos. Stripe Tax puede calcular y recaudar el impuesto en el checkout, vigilar dónde tus ventas pueden generar una obligación y ayudarte con registros y presentaciones, pero la responsabilidad sigue siendo tuya. Los proveedores que actúan como comerciante de registro son una alternativa que asume más de esto.
  • Reembolsos y disputas. Decide tu política de reembolsos antes del lanzamiento y ponla en tu sitio. Las disputas (contracargos) ocurren; guarda registros de lo que se compró y se entregó.
  • Recibos y facturas. Stripe puede enviar recibos por correo; las empresas pueden necesitar facturas en regla.
  • Comisiones. Todo proveedor cobra por transacción. Consulta la página de precios actual del proveedor en lugar de fiarte de cifras de artículos.

Qué configuración encaja con tu app

  • Donaciones o unos pocos productos: Payment Links. Consulta cómo crear un sitio web de donaciones para una ONG.
  • Una tienda con carrito: Checkout con líneas de producto y un webhook. Consulta cómo crear una tienda online.
  • SaaS o membresías: Checkout en modo suscripción, webhooks y el portal de cliente. Consulta cómo crear un MVP de SaaS y cómo fijar el precio de un producto SaaS.
  • Un marketplace que paga a vendedores: una configuración distinta y más regulada (Stripe Connect o similar). Planifícala por separado.

Añadir pagos en Mythex

Los pagos en las apps que construyes en Mythex usan tu propia cuenta y tus claves de Stripe; no hay una conexión de «Conectar Stripe» con un clic para tu app. El flujo habitual:

  1. Obtén las claves de prueba de Stripe.
  2. Añade STRIPE_SECRET_KEY (y más adelante el secreto del webhook) a los secretos del proyecto: desde /secrets, desde la configuración del proyecto o desde la tarjeta de secretos que muestra el agente cuando necesita una clave.
  3. Pide al agente Checkout con un prompt como el de arriba.
  4. Prueba en la vista previa con tarjetas de prueba. Publica antes de registrar el webhook, ya que necesita tu URL pública.
  5. Tras cambiar a las claves reales, vuelve a publicar para que la app en producción las cargue.

Consulta Aceptar pagos con Stripe y Gestionar webhooks en tu backend en la documentación.

Preguntas

¿Cuál es la forma más fácil de aceptar pagos en una app?

Un Payment Link de Stripe no necesita código: lo creas en el panel de Stripe y lo enlazas desde tu app. Si tu app necesita saber quién ha pagado y desbloquear algo automáticamente, usa Stripe Checkout con un webhook.

¿Necesito un webhook para cobrar?

Si tu app tiene que reaccionar a un pago —desbloquear una cuenta, marcar un pedido como pagado, gestionar una renovación—, sí. La documentación de Stripe indica que no puedes fiarte solo de la página de éxito, porque un cliente puede pagar y nunca llegar a ella. Además, los webhooks son obligatorios para las suscripciones.

¿Cómo pruebo los pagos sin dinero real?

Usa las claves de API de sandbox (prueba) de Stripe y sus números de tarjeta de prueba, como 4242 4242 4242 4242 con cualquier fecha de caducidad futura y cualquier CVC de tres dígitos. Las transacciones de prueba no mueven dinero real.

¿Stripe se encarga del IVA y de los impuestos sobre ventas por mí?

Stripe Tax puede calcular y recaudar el impuesto en el checkout y vigilar en qué lugares podrías tener que registrarte, pero tú sigues siendo responsable de tus obligaciones fiscales. Consulta a un contable para tu situación.

Mythex · Pricing · Crea lo que quieras con IA · Plantillas de sitios web y apps · Mythex comparado · Glosario para crear apps con IA · Herramientas gratis para crear apps con IA · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)