Docs

Flujo de Pagos

Integración con Stripe para pagos de paquetes y mesa de regalos

PublicadoMarzo 2026Equipo de desarrollo, arquitectos, stakeholders

1. Visión General

Nvito integra Stripe como procesador de pagos para dos casos de uso principales:

Caso de usoDescripciónFlujo
Sobre de Regalo (Cash Fund)Los invitados contribuyen dinero al organizador via Stripe ConnectApp móvil → PaymentIntent con transfer_data → Webhook → Registro
Cobro de serviciosPagos de paquetes del evento via links de pagoPaymentLink interno → Stripe Checkout → Webhook → Activación

Stripe Connect Express

Desde marzo 2026, las contribuciones del Cash Fund usan Stripe Connect Express. El dinero va directo al organizador (1 cuenta Connect por evento), con Nvito cobrando application_fee automática. Nvito nunca recibe dinero de contribuciones en su cuenta.

1.1 Modelo de Pagos Cash Fund

Invitado → PaymentIntent (Stripe Connect) → Organizador (directo) + application_fee → Nvito
ActorRol
InvitadoPagador — contribuye desde la app móvil
OrganizadorBeneficiario — recibe el dinero en su cuenta Connect
NvitoPlataforma — cobra comisión via application_fee
StripeProcesador — maneja PCI, transferencias, disputes

2. Arquitectura de Pagos


El organizador crea un PaymentLink desde el panel de administración.

3.1 Flujo de Creación

CampoTipoDescripción
idUUIDIdentificador interno
tokenstring (32)Token público para la URL
eventIdUUIDEvento asociado
typeenumCASH_FUND, PACKAGE
amountnumberMonto en centavos (o null si es abierto)
currencystringMXN, USD
descriptionstringDescripción visible al pagador
stripeProductIdstring?ID del producto en Stripe
stripePriceIdstring?ID del precio en Stripe
isActivebooleanSi acepta pagos
expiresAtDateTime?Fecha de expiración opcional
createdByUUIDUsuario que lo creo

4. Flujo de Checkout

4.1 Mesa de Regalos (Cash Fund)

4.2 Metodos de Pago Soportados

MetodoPaisesTipo
Tarjeta de crédito/débitoGlobalInmediato
OXXOMexicoDiferido (hasta 3 dias)
SPEIMexicoDiferido (minutos a horas)
Apple PayGlobalInmediato
Google PayGlobalInmediato

5. Webhooks de Stripe

5.1 Flujo de Webhook

5.2 Eventos de Webhook Procesados

Evento StripeAcción en Nvito
checkout.session.completedMarcar sesion como completada
payment_intent.succeededRegistrar pago exitoso, enviar recibo
payment_intent.payment_failedRegistrar fallo, notificar si corresponde
charge.refundedRegistrar reembolso
charge.dispute.createdAlertar al organizador

5.3 Seguridad del Webhook

MedidaDescripción
FirmaValidación con stripe.webhooks.constructEvent() usando el webhook secret
IdempotenciaCada evento tiene un ID unico; se ignoran duplicados
TimeoutRespuestá en menos de 5 segundos (procesamiento asincrono via colas)
IP whitelistSolo IPs de Stripe permitidas (configurado en infraestructura)

6. Estados del Pago

EstadoDescripciónFinal?
PENDINGCheckout creado, esperando pagoNo
PROCESSINGStripe procesando el pago (OXXO, SPEI)No
SUCCEEDEDPago completado exitosamenteSi (salvo reembolso)
FAILEDPago rechazado por el banco o procesadorSi
REFUNDEDReembolso completo procesadoSi
PARTIALLY_REFUNDEDReembolso parcial procesadoSi
CANCELLEDCheckout abandonado (timeout de 30 minutos)Si
EXPIREDPaymentLink expiro antes del pagoSi

7. Mesa de Regalos (Gift Registry)

7.1 Tipos de Items

TipoDescripciónPago
Producto fisicoItem con precio fijo (ej. licuadora)Monto fijo
Cash FundFondo abierto (ej. luna de miel)Monto libre o sugerido
ExperienceExperiencia (ej. cena romantica)Monto fijo o libre

7.2 Contribuciones

Cada contribucion se registra como un Payment asociado a un GiftRegistryItem:

CampoTipoDescripción
paymentIdUUIDReferencia al pago
giftRegistryItemIdUUIDItem de la mesa de regalos
guestIdUUID?Invitado que contribuyo (si identificado)
amountnumberMonto contribuido
messagestring?Mensaje del contribuyente

7.3 Progreso del Fondo

Para Cash Funds, se calcula el progreso:

progress = (sum of contributions) / targetAmount * 100

El frontend muestra una barra de progreso con el porcentaje alcanzado.


8. Reembolsos

8.1 Flujo de Reembolso

8.2 Reglas de Reembolso

ReglaDescripción
Solo SUCCEEDEDSolo se pueden reembolsar pagos exitosos
Max montoNo se puede reembolsar más del monto pagado
Multiples parcialesSe permiten múltiples reembolsos parciales (sum no excede total)
RolesSolo OWNER y ADMIN pueden procesar reembolsos
AuditoriaSe registra quien proceso el reembolso y cuando

9. Seguridad

AspectoImplementación
PCI ComplianceStripe maneja todos los datos sensibles de tarjeta (nivel 1 PCI DSS)
Webhook signaturestripe.webhooks.constructEvent() valida firma HMAC
IdempotenciaIdempotency keys en creación de PaymentIntents
Token no predeciblePaymentLink tokens generados con nanoid (32 chars, cripto-random)
ExpiracionPaymentLinks expiran automáticamente si se configura expiresAt
Rate limitingEndpoints de checkout limitados (10 req/IP/min)
MontosValidación server-side de rangos permitidos (min/max por organización)
MonedaSolo monedas habilitadas para la organización (MXN, USD)

10. Metricas y Reportes

El organizador puede ver metricas de pagos en el dashboard:

MetricaDescripción
Total recaudadoSuma de pagos SUCCEEDED
Numero de contribucionesTotal de pagos exitosos
Monto promedioTotal recaudado / número de contribuciones
Tasa de exitoSUCCEEDED / (SUCCEEDED + FAILED) * 100
Progreso por itemContribuciones vs meta para cada item de regalo
Top contribuyentesInvitados que más han contribuido

11. Stripe Connect — Cuentas por Evento

11.1 Modelo 1:1 Evento-Cuenta

Cada evento con Sobre de Regalo tiene su propia cuenta Stripe Connect Express. La cuenta pertenece al cliente/beneficiario del evento, no a la organización.

CampoDescripción
stripeAccountIdID de la cuenta en Stripe (acct_xxx)
statusNOT_STARTED, ONBOARDING_PENDING, RESTRICTED, VERIFIED, DISABLED, COMPLETED, ARCHIVED
chargesEnabledSi puede recibir pagos (true cuando verificada)
legalName, email, rfcDatos del beneficiario (anonimizados 6 meses post-evento)

11.2 Ciclo de Vida de la Cuenta

FaseEstadoAcción
CreaciónONBOARDING_PENDINGEquipo Nvito crea cuenta desde admin
VerificaciónVERIFIEDCliente completa onboarding en Stripe
Evento activoVERIFIEDRecibe contribuciones via transfer_data
Evento completadoCOMPLETEDNo acepta nuevos pagos, disputes activos
6+ mesesARCHIVEDPII anonimizado, stripeAccountId se mantiene

11.3 Comisiones (application_fee)

ConceptoValor
Stripe México (tarjeta)~3.6% + $3 MXN
Comisión Nvito (configurable)10-15% (default 15%)
Organizador recibe~82-87%

La comisión se calcula en el backend: application_fee = amount * (cashFundFeePercent / 100)

11.4 Límites de Seguridad

LímiteValor defaultConfigurable
Máximo por contribución$50,000 MXNSí, por evento
Máximo del fondo$500,000 MXNSí, por evento
Mínimo por contribución$1 MXN (100 centavos)No

12. Archivos Clave

ArchivoUbicaciónResponsabilidad
payments.service.tssrc/modules/payments/Cash Fund con Stripe Connect (createCashFundIntent)
payments.controller.tssrc/modules/payments/Endpoints REST de pagos
payments-webhook.controller.tssrc/modules/payments/Webhooks de Stripe y Stripe Connect
stripe.provider.tssrc/modules/payments/Wrapper del SDK de Stripe (incluye métodos Connect)
stripe-connect.service.tssrc/modules/payments/services/Gestión de cuentas Connect
stripe-connect.controller.tssrc/modules/payments/Endpoints admin para Connect
contract-balance.service.tssrc/modules/payments/services/Cálculo compartido de balance de contratos

12. Relación con Otros Flujos

Flujo relacionadoRelación
Ciclo de Vida del EventoLos PaymentLinks solo funcionan para eventos ACTIVE
Flujo del InvitadoLos invitados acceden a la mesa de regalos desde la invitación o la app
Flujo de ComunicacionesLos recibos de pago se envian via el sistema de comunicaciones
Ciclo de Vida de la InvitaciónLa sección GiftRegistry de la invitación incluye links de pago
Esta pagina fue util?