Ir al contenido

TalentBricksAI usa Stripe como procesador principal. Los planes de precios se gestionan desde el Admin Panel — no hay que tocar código ni variables de entorno para cambiar precios.

Plan IDTipoPrecioPeríodo
monthly-subscriptionSuscripción$19/mesMensual
annual-subscriptionSuscripción$190/añoAnual
credits-10Créditos$10 (único)One-time
Plan IDSeats máxPrecio ref.Estado
team-1010$99/mesACTIVE
team-5050$399/mesACTIVE
team-100100$699/mesACTIVE
enterpriseilimitadoPrecio customACTIVE
team-10-annual10~$950/añoDRAFT
team-50-annual50~$3820/añoDRAFT
team-100-annual100~$6700/añoDRAFT

Solo estas dos variables son obligatorias para que Stripe funcione:

app/.env.server
STRIPE_API_KEY=sk_test_51...
STRIPE_WEBHOOK_SECRET=whsec_...

Los Price IDs de Stripe ya no son variables de entorno requeridas — se gestionan desde el Admin Panel. Si los tienes en .env.server, el seed los migra automáticamente a la base de datos la primera vez.

Ventana de terminal
# Opcionales — solo necesarios durante la migración inicial
PAYMENTS_MONTHLY_SUBSCRIPTION_PLAN_ID=price_xxx
PAYMENTS_ANNUAL_SUBSCRIPTION_PLAN_ID=price_xxx
PAYMENTS_CREDITS_10_PLAN_ID=price_xxx

En el Dashboard de Stripe (Product catalog > Products) o con el CLI, crea un producto por plan con su precio correspondiente. Copia el price_xxx de cada uno.

Ventana de terminal
# Ejemplo con Stripe CLI
stripe 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
stripe 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
stripe products create --name="10 Credits" --description="Pack de 10 créditos"
stripe prices create --product=prod_ZZZ --unit-amount=1000 --currency=usd

Opción A — Seed automático desde env vars (recomendado para primera vez):

  1. Agrega los Price IDs al .env.server (temporalmente)
  2. Ejecuta: wasp db seed seedPricingPlans
  3. El seed detecta que stripePriceId está vacío en DB y lo migra desde el env var
  4. Puedes quitar las vars del .env.server — ya no son necesarias

Opción B — Desde el Admin Panel (cualquier momento):

  1. Ve a /admin/pricing
  2. Edita el plan (monthly-subscription, etc.)
  3. Pega el price_xxx en el campo Stripe Price ID
  4. Guarda

Opción C — Botón Sync en el Admin Panel:

  1. Ve a /admin/pricing → edita un plan
  2. Haz clic en Sync con Stripe
  3. El sistema crea el producto y precio en Stripe automáticamente y guarda el ID en DB

Desarrollo local:

Ventana de terminal
stripe listen --forward-to localhost:3001/payments/stripe-webhook
# Copia el whsec_... a STRIPE_WEBHOOK_SECRET en .env.server

Producción:

  1. Stripe Dashboard → Developers → Webhooks → Add endpoint
  2. URL: https://tu-dominio.com/payments/stripe-webhook
  3. Eventos requeridos:
    • checkout.session.completed
    • customer.subscription.created
    • customer.subscription.updated
    • customer.subscription.deleted
    • invoice.payment_succeeded
    • invoice.payment_failed

Ve a /admin/pricing. Hay tres tabs: Todos / Personal / Equipos.

La columna Stripe muestra:

  • ✅ verde con price_xxx → plan sincronizado con Stripe, listo para checkout
  • ⚠️ amarillo “No configurado” → falta el Stripe Price ID, el checkout fallará
  1. Clic en Editar en cualquier plan
  2. Campos disponibles:
    • Precio — actualiza el precio en la DB (no afecta Stripe automáticamente)
    • Stripe Price ID — pega aquí el price_xxx de Stripe
    • Stripe Product ID — se rellena automáticamente al hacer Sync
    • EstadoDRAFT (oculto), ACTIVE (visible), ARCHIVED, HIDDEN
    • Es mejor oferta — muestra badge destacado en la página de precios

Los planes team-10-annual, team-50-annual y team-100-annual están en estado DRAFT. Para activarlos:

  1. Crea los productos y precios en Stripe Dashboard (con facturación anual)
  2. En /admin/pricing, edita cada plan anual
  3. Pega el price_xxx en Stripe Price ID
  4. Cambia estado de DRAFT a ACTIVE
Usuario compra un plan →
1. Busca el plan en DB por planId
2. Si existe y tiene stripePriceId → usa ese Price ID para el checkout ✅
3. Si existe pero stripePriceId es null → fallback al env var
4. Si el env var también está vacío → error 500 claro para el admin
5. Si el plan no existe en DB → error 404

Esta arquitectura permite cambiar los Price IDs desde el Admin Panel sin reiniciar el servidor.

Un usuario no puede tener una suscripción personal y de equipo al mismo tiempo. Si intenta comprar, recibe un error claro en la página de precios.

payment/plans.ts
export enum SubscriptionStatus {
Active = "active", // Suscripción activa — badge verde
CancelAtPeriodEnd = "cancel_at_period_end", // Cancela al vencimiento — badge amarillo
PastDue = "past_due", // Pago fallido — badge rojo
Deleted = "deleted", // Suscripción terminada — badge gris
}

/account → sección de plan actual. Permite al usuario:

  • Ver estado de su suscripción
  • Acceder al Stripe Customer Portal para cancelar, actualizar pago o ver facturas

Habilitar el Customer Portal en Stripe Dashboard: Settings → Billing → Customer portal.