Integración de Stripe
Sección titulada «Integración de Stripe»¿Por qué Stripe?
Sección titulada «¿Por qué Stripe?»- Cobertura global con soporte para 135+ monedas
- APIs bien documentadas con excelente DX
- Facturación automática, gestión de impuestos y prevención de fraude
- Herramientas de prueba robustas (Stripe CLI)
Requisitos previos
Sección titulada «Requisitos previos»- Cuenta de Stripe en stripe.com
- TalentBricksAI configurado localmente → Setup local
Paso 1: Obtener claves API
Sección titulada «Paso 1: Obtener claves API»- Inicia sesión en Dashboard de Stripe
- Activa Modo de Prueba (toggle superior derecho)
- Ve a Developers → API keys
- Copia:
- Secret key (
sk_test_...) → va al backend - Publishable key (
pk_test_...) → va al frontend (si aplica)
- Secret key (
Paso 2: Configurar variables de entorno
Sección titulada «Paso 2: Configurar variables de entorno»Solo estas dos son obligatorias:
STRIPE_API_KEY=sk_test_51...STRIPE_WEBHOOK_SECRET=whsec_... # Lo obtienes en el Paso 4Los Price IDs de los planes ya no son variables de entorno requeridas — se gestionan desde el
Admin Panel en /admin/pricing. Si los tienes del setup anterior, el seed los migra
automáticamente.
# Opcionales — solo para migración inicial desde .env a la DBPAYMENTS_MONTHLY_SUBSCRIPTION_PLAN_ID=price_xxxPAYMENTS_ANNUAL_SUBSCRIPTION_PLAN_ID=price_xxxPAYMENTS_CREDITS_10_PLAN_ID=price_xxxPaso 3: Crear productos en Stripe
Sección titulada «Paso 3: Crear productos en Stripe»Crea un producto por cada plan en Product catalog → Products. Copia el price_xxx de cada uno.
Planes personales
Sección titulada «Planes personales»| Producto | Tipo | Monto | Intervalo |
|---|---|---|---|
| Monthly Subscription | Recurring | $19.00 | month |
| Annual Subscription | Recurring | $190.00 | year |
| 10 Credits | One time | $10.00 | — |
Planes de equipos (crear cuando vayas a activarlos)
Sección titulada «Planes de equipos (crear cuando vayas a activarlos)»| Producto | Tipo | Monto | Intervalo |
|---|---|---|---|
| Team 10 | Recurring | $99.00 | month |
| Team 50 | Recurring | $399.00 | month |
| Team 100 | Recurring | $699.00 | month |
| Team 10 Annual | Recurring | $950.40 | year |
| Team 50 Annual | Recurring | $3820.80 | year |
| Team 100 Annual | Recurring | $6700.80 | year |
Opción CLI (más rápido)
Sección titulada «Opción CLI (más rápido)»# Instalar Stripe CLIbrew install stripe/stripe-cli/stripestripe login
# Suscripción mensualstripe products create --name="Monthly Subscription" --description="Acceso mensual a todos los cursos"stripe prices create --product=prod_XXX --unit-amount=1900 --currency=usd --recurring[interval]=month
# Suscripción anualstripe products create --name="Annual Subscription" --description="Acceso anual a todos los cursos"stripe prices create --product=prod_YYY --unit-amount=19000 --currency=usd --recurring[interval]=year
# Pack de créditos (pago único)stripe products create --name="10 Credits" --description="Pack de 10 créditos"stripe prices create --product=prod_ZZZ --unit-amount=1000 --currency=usd
# Team 10 mensualstripe products create --name="Team 10" --description="Hasta 10 usuarios"stripe prices create --product=prod_AAA --unit-amount=9900 --currency=usd --recurring[interval]=monthPaso 4: Configurar webhooks
Sección titulada «Paso 4: Configurar webhooks»Desarrollo local
Sección titulada «Desarrollo local»# En una terminal separada, mientras desarrollasstripe listen --forward-to localhost:3001/payments/stripe-webhook# Copia el whsec_... que imprime → STRIPE_WEBHOOK_SECRET en .env.serverProducción
Sección titulada «Producción»- Stripe Dashboard → Developers → Webhooks → Add endpoint
- URL:
https://tu-dominio.com/payments/stripe-webhook - Eventos requeridos:
checkout.session.completedcustomer.subscription.createdcustomer.subscription.updatedcustomer.subscription.deletedinvoice.payment_succeededinvoice.payment_failed
- Copia el Signing secret (
whsec_...) → variable de entorno de producción
Paso 5: Vincular Price IDs al Admin Panel
Sección titulada «Paso 5: Vincular Price IDs al Admin Panel»Una vez creados los productos en Stripe, tienes tres opciones para vincularlos:
Opción A — Botón “Sync con Stripe” (recomendado)
Sección titulada «Opción A — Botón “Sync con Stripe” (recomendado)»- Ve a
/admin/pricing - Clic en Editar en un plan (p.ej.
monthly-subscription) - Clic en Sync con Stripe
- El sistema crea el producto + precio en Stripe automáticamente y guarda el ID
Opción B — Pegar el Price ID manualmente
Sección titulada «Opción B — Pegar el Price ID manualmente»- Ve a
/admin/pricing→ Editar el plan - Pega el
price_xxxen el campo Stripe Price ID - Guarda
Opción C — Seed automático desde env vars
Sección titulada «Opción C — Seed automático desde env vars»- Agrega los Price IDs en
.env.server - Ejecuta
wasp db seed seedPricingPlans - El seed migra los IDs del env a la base de datos
Paso 6: Activar Stripe en el código
Sección titulada «Paso 6: Activar Stripe en el código»Abre app/src/payment/paymentProcessor.ts y asegúrate de que Stripe esté activo:
// Stripe activo (por defecto en TalentBricksAI)export { stripePaymentProcessor as paymentProcessor } from "./stripe/paymentProcessor";
// Alternativas (comentadas por defecto)// export { lemonSqueezyPaymentProcessor as paymentProcessor } from './lemonSqueezy/paymentProcessor';// export { polarPaymentProcessor as paymentProcessor } from './polar/paymentProcessor';Paso 7: Probar la integración
Sección titulada «Paso 7: Probar la integración»Tarjetas de prueba
Sección titulada «Tarjetas de prueba»| Escenario | Número de tarjeta |
|---|---|
| Pago exitoso | 4242 4242 4242 4242 |
| Pago rechazado | 4000 0000 0000 0002 |
| Requiere 3D Secure | 4000 0025 0000 3155 |
| Fondos insuficientes | 4000 0000 0000 9995 |
Fecha: cualquier fecha futura · CVC: cualquier 3 dígitos · ZIP: cualquier 5 dígitos
Más tarjetas: stripe.com/docs/testing
Flujo de prueba completo
Sección titulada «Flujo de prueba completo»wasp db start(terminal 1)wasp start(terminal 2)stripe listen --forward-to localhost:3001/payments/stripe-webhook(terminal 3)- Ir a
http://localhost:3000/pricing - Comprar un plan con tarjeta de prueba
4242 4242 4242 4242 - Verificar en terminal 3 que el webhook
checkout.session.completedse activó - Verificar en
/admin/usersque el usuario tiene suscripción activa
Verificar estado de la integración
Sección titulada «Verificar estado de la integración»En /admin/pricing, la columna Stripe muestra:
- ✅
price_xxxen verde → plan listo para checkout - ⚠️ “No configurado” en amarillo → falta el Price ID, el checkout fallará
Funciones avanzadas
Sección titulada «Funciones avanzadas»Impuestos automáticos (Stripe Tax)
Sección titulada «Impuestos automáticos (Stripe Tax)»Ya está habilitado en el checkout (app/src/payment/stripe/checkoutUtils.ts):
automatic_tax: { enabled: true;}Actívalo en tu cuenta: Stripe Dashboard → Settings → Tax.
Códigos de promoción
Sección titulada «Códigos de promoción»También habilitados por defecto:
allow_promotion_codes: true;Para crear códigos: Stripe Dashboard → Product catalog → Coupons → Promotion codes.
Portal del cliente
Sección titulada «Portal del cliente»Permite a los usuarios gestionar su suscripción (cancelar, actualizar pago, ver facturas). Actívalo en: Stripe Dashboard → Settings → Billing → Customer portal.
El enlace ya está integrado en la página /account.
Período de prueba
Sección titulada «Período de prueba»Configúralo al crear el precio en Stripe Dashboard o con CLI:
stripe prices create \ --product=prod_XXX \ --unit-amount=1900 \ --currency=usd \ --recurring[interval]=month \ --recurring[trial_period_days]=14Solución de problemas
Sección titulada «Solución de problemas»Los webhooks no se reciben
Sección titulada «Los webhooks no se reciben»- Verifica que
stripe listenesté corriendo en una terminal - Confirma que
STRIPE_WEBHOOK_SECRETen.env.serversea elwhsec_...que imprimió el CLI - Revisa los logs del servidor:
wasp startmuestra los webhooks recibidos
El checkout falla con error 500 o 404
Sección titulada «El checkout falla con error 500 o 404»- Ve a
/admin/pricingy verifica que el plan tienestripePriceIdconfigurado (columna Stripe verde) - Si está en amarillo → usa el botón Sync o pega el Price ID manualmente
Error: “No API key provided”
Sección titulada «Error: “No API key provided”»- Verifica que
STRIPE_API_KEYesté en.env.server - Reinicia
wasp startdespués de agregar la variable
Error de webhook inválido
Sección titulada «Error de webhook inválido»- El
STRIPE_WEBHOOK_SECRETdebe coincidir con el secret mostrado porstripe listen - Reinicia la app después de actualizar el secret
Modo producción
Sección titulada «Modo producción»- Activa tu cuenta de Stripe — completa información del negocio y verificación de identidad
- Cambia a claves en vivo — Stripe Dashboard → Live Mode → Developers → API keys
- Actualiza
STRIPE_API_KEY=sk_live_...en producción
- Actualiza
- Recrea los productos en Live Mode — los productos de test no existen en Live
- Actualiza los Price IDs — desde el Admin Panel en producción (
/admin/pricing) - Configura webhook de producción — apuntando a tu dominio real
- Prueba con una tarjeta real — haz un pago pequeño, verifica y reembolsa