TAREA-001: Estandarización de épicas al formato SIMCO 4.0.1 Cambios aplicados a las 12 épicas: - Frontmatter: simco_version="4.0.1", story_points, updated_at=2026-01-17 - Metadata: Agregado **Story Points:** N - Nueva sección "## Historias de Usuario" antes de Entregables - Cada HU: Como/Quiero/Para, Story Points, Criterios [CA-XXX-N], Tareas [MCH-TT-XXX-NN] - Tabla resumen de Story Points al final de cada épica Épicas estandarizadas: - MCH-016: Entregas a Domicilio (5 HUs, 34 SP) - MCH-017: Notificaciones (6 HUs, 34 SP) - MCH-018: Planes y Suscripciones (6 HUs, 21 SP) - MCH-019: Tienda de Tokens (6 HUs, 21 SP) - MCH-020: Pagos de Suscripción (6 HUs, 34 SP) - MCH-021: Dashboard Web (6 HUs, 21 SP) - MCH-022: Modo Offline (6 HUs, 21 SP) - MCH-023: Programa de Referidos (6 HUs, 21 SP) - MCH-024: CoDi y SPEI (5 HUs, 21 SP) - MCH-025: Widgets y Atajos (6 HUs, 21 SP) - MCH-026: Multi-idioma LATAM (7 HUs, 34 SP) - MCH-027: Integración SAT (8 HUs, 55 SP) Rango de IDs utilizados: MCH-US-150 a MCH-US-269 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
12 KiB
| id | type | title | code | status | phase | priority | story_points | created_at | updated_at | simco_version | dependencies | ||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| EPIC-MCH-020 | Epic | MCH-020: Pagos de Suscripcion | MCH-020 | Completado | 5 | P0 | 34 | 2026-01-10 | 2026-01-17 | 4.0.1 |
|
MCH-020: Pagos de Suscripcion
Metadata
- Codigo: MCH-020
- Fase: 5 - Monetizacion
- Prioridad: P0
- Estado: Completado
- Story Points: 34
- Fecha completado: 2026-01-10
Descripcion
Sistema completo de pagos para suscripciones y tokens: Stripe para tarjetas y OXXO, In-App Purchase para iOS/Android, y manejo de pagos fallidos.
Objetivos
- Pagos con tarjeta (Stripe)
- Pagos en OXXO (Stripe)
- In-App Purchase iOS
- In-App Purchase Android
- Manejo de pagos fallidos
Alcance
Incluido
- Stripe Checkout
- OXXO Pay (via Stripe)
- Apple In-App Purchase
- Google Play Billing
- Reintentos automaticos
- Recibos por email
Excluido
- PayPal
- Transferencia bancaria manual
- Criptomonedas
Metodos de Pago
Stripe - Tarjeta
Comision: ~3.6% + $3 MXN
Confirmacion: Inmediata
Uso: Web y App (via Stripe SDK)
Stripe - OXXO
Comision: ~$10-15 MXN fijo
Confirmacion: 24-72 horas
Uso: Cliente paga en OXXO
Vencimiento: 3 dias
Apple In-App Purchase
Comision: 15-30%
Confirmacion: Inmediata
Uso: App iOS
Nota: Obligatorio para apps iOS
Google Play Billing
Comision: 15%
Confirmacion: Inmediata
Uso: App Android
Flujos de Pago
Pago con Tarjeta
1. Usuario selecciona plan/tokens
2. Elige "Pagar con tarjeta"
3. Stripe Checkout se abre
4. Ingresa datos de tarjeta
5. Pago procesado
6. Redirige a app con confirmacion
7. Suscripcion/tokens activados
Pago en OXXO
1. Usuario selecciona plan/tokens
2. Elige "Pagar en OXXO"
3. Se genera referencia OXXO
4. Se muestra:
- Monto a pagar
- Referencia/codigo de barras
- Fecha limite
5. Usuario va a OXXO y paga
6. Webhook confirma pago (horas despues)
7. Suscripcion/tokens activados
8. Notificacion al usuario
In-App Purchase (iOS)
1. Usuario abre tienda en app
2. Selecciona producto
3. StoreKit muestra sheet de Apple
4. Usuario confirma con Face ID
5. Apple procesa pago
6. App recibe notificacion
7. Backend valida con Apple
8. Suscripcion/tokens activados
Modelo de Datos
Tablas Adicionales
payment_methods
- id, tenant_id, type (card/oxxo/iap)
- provider, last4, brand
- is_default, stripe_pm_id
payments
- id, tenant_id, type (subscription/tokens)
- amount, currency, status
- provider, provider_id
- metadata (JSONB)
oxxo_vouchers
- id, payment_id, reference
- barcode_url, expires_at
- status
Endpoints API
| Metodo | Endpoint | Descripcion |
|---|---|---|
| POST | /payments/create-checkout | Crear sesion Stripe |
| POST | /payments/create-oxxo | Generar voucher OXXO |
| POST | /payments/verify-iap | Verificar IAP |
| GET | /payments/methods | Metodos guardados |
| POST | /payments/methods | Agregar metodo |
| DELETE | /payments/methods/:id | Eliminar metodo |
| POST | /payments/webhook/stripe | Webhook Stripe |
| POST | /payments/webhook/apple | Webhook Apple |
| POST | /payments/webhook/google | Webhook Google |
Manejo de Pagos Fallidos
Reintentos Automaticos
Dia 1: Primer intento fallido
Dia 3: Segundo intento
Dia 5: Tercer intento
Dia 7: Cuarto intento + alerta
Dia 10: Suspension de servicio
Notificaciones
[Pago fallido - Dia 1]
"No pudimos procesar tu pago de $99.
Actualiza tu metodo de pago para
continuar usando MiChangarrito.
[Actualizar pago]"
[Ultimo aviso - Dia 7]
"⚠️ Tu suscripcion sera cancelada
en 3 dias si no actualizas tu pago.
[Actualizar pago ahora]"
UI Components
PaymentMethodSelector
- Radio buttons de metodos
- Tarjeta, OXXO, o guardados
- Agregar nueva tarjeta
OXXOVoucher
- Codigo de barras
- Monto y referencia
- Instrucciones
- Boton compartir
PaymentHistory
- Lista de pagos
- Estado y fecha
- Descargar recibo
Historias de Usuario
MCH-US-190: Pagos con Tarjeta via Stripe Checkout
Story Points: 8
Como propietario de negocio Quiero pagar mi suscripcion o tokens con tarjeta de credito/debito Para activar mi plan de manera inmediata y segura
Criterios de Aceptacion
- [CA-190-1] El sistema redirige a Stripe Checkout al seleccionar pago con tarjeta
- [CA-190-2] Se soportan tarjetas Visa, Mastercard y American Express
- [CA-190-3] La confirmacion del pago es inmediata tras procesamiento exitoso
- [CA-190-4] El usuario recibe recibo por email automaticamente
- [CA-190-5] La suscripcion/tokens se activan inmediatamente tras pago exitoso
Tareas
| ID | Tarea | Estimacion |
|---|---|---|
| MCH-TT-190-01 | Configurar Stripe Checkout Session en backend | 4h |
| MCH-TT-190-02 | Implementar stripe-checkout.service.ts | 6h |
| MCH-TT-190-03 | Crear endpoint POST /payments/create-checkout | 3h |
| MCH-TT-190-04 | Integrar Stripe.js en frontend | 4h |
| MCH-TT-190-05 | Implementar flujo de redireccion y confirmacion | 3h |
| MCH-TT-190-06 | Configurar webhook para eventos de pago | 4h |
MCH-US-191: Pagos en OXXO con Voucher
Story Points: 5
Como propietario de negocio sin tarjeta bancaria Quiero generar un voucher para pagar en OXXO Para poder adquirir mi suscripcion usando efectivo
Criterios de Aceptacion
- [CA-191-1] Se genera referencia OXXO con codigo de barras valido
- [CA-191-2] El voucher muestra monto, referencia y fecha de vencimiento (3 dias)
- [CA-191-3] El usuario puede compartir el voucher via imagen o PDF
- [CA-191-4] El sistema procesa webhook de confirmacion de OXXO (24-72h)
- [CA-191-5] La suscripcion/tokens se activan automaticamente tras confirmacion
Tareas
| ID | Tarea | Estimacion |
|---|---|---|
| MCH-TT-191-01 | Implementar oxxo.service.ts con Stripe OXXO Pay | 4h |
| MCH-TT-191-02 | Crear endpoint POST /payments/create-oxxo | 2h |
| MCH-TT-191-03 | Disenar componente OXXOVoucher con codigo de barras | 4h |
| MCH-TT-191-04 | Implementar funcionalidad de compartir voucher | 2h |
| MCH-TT-191-05 | Configurar webhook para confirmacion OXXO | 3h |
| MCH-TT-191-06 | Implementar notificacion push al confirmar pago | 2h |
MCH-US-192: In-App Purchase para iOS
Story Points: 8
Como usuario de la app iOS Quiero comprar suscripciones o tokens desde la app Para no tener que salir de la aplicacion para pagar
Criterios de Aceptacion
- [CA-192-1] Los productos estan configurados en App Store Connect
- [CA-192-2] StoreKit muestra la hoja de compra nativa de Apple
- [CA-192-3] El usuario puede confirmar con Face ID/Touch ID
- [CA-192-4] El backend valida el receipt con Apple Server
- [CA-192-5] Las suscripciones se renuevan automaticamente via Apple
Tareas
| ID | Tarea | Estimacion |
|---|---|---|
| MCH-TT-192-01 | Configurar productos en App Store Connect | 2h |
| MCH-TT-192-02 | Implementar StoreKit 2 en app iOS (React Native) | 6h |
| MCH-TT-192-03 | Implementar apple-iap.service.ts en backend | 5h |
| MCH-TT-192-04 | Crear endpoint POST /payments/verify-iap | 3h |
| MCH-TT-192-05 | Configurar Server Notifications de Apple | 3h |
| MCH-TT-192-06 | Implementar validacion de receipts con Apple API | 4h |
MCH-US-193: In-App Purchase para Android
Story Points: 6
Como usuario de la app Android Quiero comprar suscripciones o tokens desde la app Para usar el metodo de pago configurado en Google Play
Criterios de Aceptacion
- [CA-193-1] Los productos estan configurados en Google Play Console
- [CA-193-2] Google Play Billing muestra la UI nativa de compra
- [CA-193-3] El backend valida la compra con Google Play API
- [CA-193-4] Las suscripciones se renuevan automaticamente via Google
- [CA-193-5] Se manejan correctamente los estados de compra pendiente
Tareas
| ID | Tarea | Estimacion |
|---|---|---|
| MCH-TT-193-01 | Configurar productos en Google Play Console | 2h |
| MCH-TT-193-02 | Implementar Google Play Billing Library en app | 5h |
| MCH-TT-193-03 | Implementar google-billing.service.ts en backend | 4h |
| MCH-TT-193-04 | Crear endpoint para validacion de compras Google | 3h |
| MCH-TT-193-05 | Configurar Real-time Developer Notifications | 3h |
| MCH-TT-193-06 | Manejar estados de compra pendiente (PENDING) | 2h |
MCH-US-194: Manejo de Pagos Fallidos con Reintentos
Story Points: 5
Como sistema Quiero reintentar automaticamente pagos fallidos Para maximizar la retencion de suscriptores y reducir churn involuntario
Criterios de Aceptacion
- [CA-194-1] Se ejecutan reintentos en dias 1, 3, 5 y 7 tras fallo inicial
- [CA-194-2] Se envia notificacion push y email en cada intento fallido
- [CA-194-3] El dia 7 se envia alerta de suspension inminente
- [CA-194-4] El dia 10 se suspende el servicio si no hay pago exitoso
- [CA-194-5] El usuario puede actualizar metodo de pago en cualquier momento
Tareas
| ID | Tarea | Estimacion |
|---|---|---|
| MCH-TT-194-01 | Implementar job de reintentos programados (cron) | 4h |
| MCH-TT-194-02 | Crear templates de notificaciones de pago fallido | 2h |
| MCH-TT-194-03 | Implementar logica de suspension de servicio | 3h |
| MCH-TT-194-04 | Crear pantalla de actualizacion de metodo de pago | 4h |
| MCH-TT-194-05 | Implementar webhook para invoice.payment_failed | 2h |
| MCH-TT-194-06 | Agregar metricas de dunning para analytics | 2h |
MCH-US-195: Gestion de Metodos de Pago Guardados
Story Points: 3
Como propietario de negocio Quiero guardar y gestionar mis metodos de pago Para facilitar pagos futuros sin reingresar datos
Criterios de Aceptacion
- [CA-195-1] El usuario puede guardar tarjetas de forma segura (tokenizadas)
- [CA-195-2] Se muestra lista de metodos guardados con ultimos 4 digitos
- [CA-195-3] El usuario puede seleccionar un metodo de pago por defecto
- [CA-195-4] El usuario puede eliminar metodos de pago guardados
- [CA-195-5] Los datos de tarjeta nunca se almacenan en nuestros servidores
Tareas
| ID | Tarea | Estimacion |
|---|---|---|
| MCH-TT-195-01 | Implementar tabla payment_methods en base de datos | 2h |
| MCH-TT-195-02 | Crear endpoints CRUD para metodos de pago | 3h |
| MCH-TT-195-03 | Integrar Stripe SetupIntent para guardar tarjetas | 3h |
| MCH-TT-195-04 | Disenar componente PaymentMethodSelector | 3h |
| MCH-TT-195-05 | Implementar pantalla de gestion de metodos de pago | 3h |
Resumen de Historias de Usuario
| ID | Historia | SP | Prioridad |
|---|---|---|---|
| MCH-US-190 | Pagos con Tarjeta via Stripe Checkout | 8 | P0 |
| MCH-US-191 | Pagos en OXXO con Voucher | 5 | P0 |
| MCH-US-192 | In-App Purchase para iOS | 8 | P0 |
| MCH-US-193 | In-App Purchase para Android | 6 | P0 |
| MCH-US-194 | Manejo de Pagos Fallidos con Reintentos | 5 | P1 |
| MCH-US-195 | Gestion de Metodos de Pago Guardados | 3 | P1 |
| Total | 34 |
Entregables
| Entregable | Estado | Archivo |
|---|---|---|
| Stripe Checkout | En progreso | services/stripe-checkout.service.ts |
| OXXO Pay | Pendiente | services/oxxo.service.ts |
| Apple IAP | Pendiente | services/apple-iap.service.ts |
| Google Billing | Pendiente | services/google-billing.service.ts |
| Payment UI | Pendiente | components/payments/ |
Dependencias
Depende de
- MCH-005 (Stripe base)
- MCH-018 (Suscripciones)
- MCH-019 (Tokens)
Bloquea a
- Ninguno
Criterios de Aceptacion
- Pago con tarjeta funciona
- OXXO genera voucher correcto
- IAP iOS funciona
- IAP Android funciona
- Pagos fallidos se reintentan
- Notificaciones se envian
Configuracion Stripe
{
stripe: {
secretKey: process.env.STRIPE_SECRET_KEY,
webhookSecret: process.env.STRIPE_WEBHOOK_SECRET,
oxxo: {
enabled: true,
expires_after_days: 3
},
retry: {
max_attempts: 4,
days_between: [0, 3, 5, 7]
}
}
}
Ultima actualizacion: 2026-01-17