En la mayoría del software un bug es un incidente. En fintech un bug es un pasivo que puede haber costado dinero que nadie ha notado todavía.
La arquitectura fintech tiene un número pequeño de decisiones genuinamente no negociables. Si las equivocas, ninguna cantidad de ingeniería posterior lo recupera del todo — heredas un sistema donde el dinero puede estar silenciosamente mal, que es el único modo de fallo que un producto financiero no puede absorber.
1. Los saldos se derivan, nunca se almacenan como verdad
El error más común y más dañino es una columna de saldo mutable que el código actualiza directamente. Es cómoda, rápida e irrecuperable: cuando se desvía, no hay forma de determinar cuál debería haber sido.
El modelo correcto es un diario de asientos append-only. Nada se actualiza ni se borra nunca; las correcciones son nuevos asientos compensatorios. El saldo es la suma de los asientos, cacheado por rendimiento pero siempre reconstruible desde el diario.
| Saldo mutable | Libro mayor append-only |
|---|---|
| UPDATE accounts SET balance = balance - 100 | INSERT asiento (debe 100), INSERT asiento (haber 100) |
| Historial perdido en cada escritura | Historial completo por construcción |
| La desviación es indetectable e inarreglable | Cualquier estado reproducible en cualquier momento |
| Los bugs de concurrencia corrompen el estado para siempre | La invariante de partida doble atrapa los errores |
| Auditar significa leer logs de aplicación | Auditar significa leer el libro mayor |
2. Toda ruta de dinero es idempotente
Las redes reintentan. Los usuarios hacen doble clic. Los proveedores de pago entregan webhooks más de una vez — es comportamiento documentado, no un caso límite. Cualquier operación que mueva dinero debe ser segura de ejecutar repetidamente.
- Cada operación de dinero lleva una clave de idempotencia suministrada por quien llama, única por intención lógica
- La clave se guarda con restricción de unicidad antes de los efectos secundarios, no después
- Una clave repetida devuelve el resultado original en vez de rehacer el trabajo
- Los manejadores de webhook guardan el payload crudo indexado por el id de evento del proveedor y luego procesan — así una reentrega se reconoce incluso a mitad de procesamiento
3. El dinero son enteros en unidades menores
El coma flotante no puede representar fracciones decimales de forma exacta, así que la aritmética sobre dinero en float acumula error. Guarda unidades menores como enteros (o un tipo decimal de precisión fija) y haz la divisa explícita en cada importe — un importe sin divisa es un bug esperando a un cliente internacional.
4. La conciliación es una funcionalidad, no una ocurrencia tardía
Asume divergencia entre tu libro mayor y el proveedor de pago — ocurrirá, por timeouts, fallos parciales y correcciones del lado del proveedor. La pregunta es si la detectas.
- Un job programado que compara el estado interno con los datos de liquidación del proveedor
- Alertas ante discrepancia, con responsable definido y runbook
- Una vía de resolución definida — asientos compensatorios, nunca ajuste silencioso
- Barridos de estados atascados: transacciones pendientes más tiempo del que deberían
5. Aislamiento, en los dos sentidos
- Aislamiento de tenants — impuesto en la capa de datos, no confiando en que cada consulta incluya el filtro correcto
- Aislamiento de fallos — un proveedor lento no debe agotar el pool de peticiones y tumbar funcionalidad sin relación
- Aislamiento de entornos — jamás transacciones de prueba en libros mayores de producción
6. Construye para la auditoría que acabarás enfrentando
No. Aporta hallazgos técnicos dentro del alcance acordado. La interpretación jurídica y certificación formal requieren profesionales cualificados para esas funciones.
- Rastro de auditoría inmutable de quién hizo qué y cuándo — incluidas las acciones de administración internas
- Datos de tarjeta que nunca tocan tus servidores salvo que realmente pretendas ser PCI-compliant (usa campos alojados o página alojada)
- Retención y borrado de datos que se puedan ejecutar de verdad a petición
- Control de acceso revisable — quién puede mover dinero, quién lo aprobó
En software ordinario optimizas para velocidad de cambio. En fintech optimizas para poder demostrar, después, exactamente qué pasó y por qué.
Las cinco preguntas para tu propio sistema
- Si este webhook llega dos veces, ¿cambia algo la segunda vez?
- ¿Puedo reconstruir el saldo de cualquier cliente en cualquier momento pasado solo desde el libro mayor?
- ¿Detectaríamos una discrepancia con el proveedor, o nos lo diría un cliente?
- ¿Puede una petición manipulada leer o mover el dinero de otro tenant?
- Si un regulador preguntara quién aprobó un ajuste manual en marzo pasado, ¿podríamos responder en minutos?
Separar aceptación y liquidación de transacciones
Los estados de pago deben permitir conciliar eventos tardíos y repetidos. Verifica registros financieros y proceso de corrección.
- Usar decimales exactos o unidades enteras con reglas monetarias.
- Correlacionar eventos y apuntes sin contabilizar dos veces los reintentos.
- Conservar originales y registrar correcciones autorizadas.
Preguntas frecuentes
¿Necesitamos un libro mayor de partida doble para un producto fintech sencillo?
Si mantienes saldos o mueves dinero por cuenta de usuarios, sí. El diario append-only no es una formalidad contable — es lo que hace el estado reconstruible y los errores detectables. Añadirlo después de que los saldos se hayan desviado es mucho más difícil que empezar con él.
¿Cuál es el fallo grave más común en sistemas fintech tempranos?
Saldos mutables sin diario, seguido de cerca por la falta de idempotencia en las rutas de pago y webhook. Ambos permiten que el dinero se vuelva silenciosamente incorrecto, el modo de fallo más difícil de detectar y de remediar después.
¿Deberíamos almacenar nosotros los datos de tarjeta?
Casi con seguridad no. Usa los campos alojados o la página de pago alojada de un proveedor para que los datos de tarjeta nunca lleguen a tus servidores. Manejarlos tú mete toda tu infraestructura en el alcance de PCI DSS, lo que supone una carga de cumplimiento y auditoría continua y considerable.
¿Cuándo debe una startup fintech hacer una auditoría de arquitectura?
Antes del primer aumento significativo de volumen, y antes de cualquier ronda donde se espere due diligence técnica. Las decisiones estructurales anteriores son baratas de verificar pronto y caras de corregir una vez que ha pasado dinero real por el sistema.
¿Todas las monedas tienen dos decimales?
No. Define precisión y redondeo según moneda y operación y revisa requisitos del proveedor. Evita coma flotante binaria cuando sea necesaria aritmética decimal exacta.
¿Quieres comprobar esto contra tu sistema?
Auditamos arquitectura fintech exactamente contra esta lista — integridad del libro mayor, idempotencia, conciliación, aislamiento.
Para seguir leyendo
Due diligence técnica para inversores: la guía completa
La due diligence técnica no es una revisión de código. Es la respuesta a una pregunta: ¿cuánto costará llevar esta tecnología hasta donde la tesis de inversión la necesita?
Auditoría de arquitectura de sistemas: cuándo hace falta y qué encuentra
Una auditoría de arquitectura no es una opinión sobre tu stack. Es un mapa de dónde se rompe el sistema bajo el plan que realmente tienes.