Un pago tiene varios relojes y autoridades
Pix funciona continuamente, pero la aplicación observa creación del cobro, consentimiento, autorización, instrucción, liquidación, crédito, notificación, asiento interno, liberación del pedido, devolución y cierre. Open Finance añade recursos de consentimiento y pago con estados propios.
No reduzcas todo a un booleano pagado. Cada transición necesita fuente, ID, event time, receive time, importe, estado, razón y confianza. El negocio define qué evidencia libera inventario, activa servicio, habilita retiro, devuelve o reconoce ingreso.
IDs de negocioCliente, carrito, pedido, factura, cuenta por cobrar, tenant, merchant, devolución, disputa y lote contable.
IDs de Pixtxid del cobro, identificador end-to-end, cuenta receptora, importe, creación, liquidación y devolución.
Open FinanceConsentimiento, payment ID, client, participante, sesión de autorización, request, evento y versión API.
Ledger y traceJournal, líneas débito/crédito, evento fuente, idempotency key, conciliación, caso y trace distribuido.
Separa instrucción, autorización, liquidación y disponibilidad
Crear un cobro o recurso registra una oportunidad, no movimiento de dinero. La autorización confirma intención bajo un consentimiento. La liquidación completa la transferencia. El crédito y la disponibilidad se observan por API, extracto o archivo del PSP.
El webhook reduce latencia, pero es solo un canal de evidencia. Autentícalo, almacénalo inmutable y confirma outcomes críticos con status autoritativo o movimiento de cuenta. Un webhook perdido no debe ocultar un pago; uno falso o duplicado no debe liberar valor.
Construye un pipeline de evidencia
Pipeline de pago y conciliación01 ObligarCrea la obligaciónPersiste pedido, receivable, importe, moneda, expiración, contexto, cuenta y policy de riesgo.
02 IniciarCrea cobro o consentimientoGenera idempotencia, txid/payment ID, evidencia del request y journey.
03 AutorizarRegistra la decisiónVincula consentimiento, client, cuenta, importe, device/sesión, tiempos y razones.
04 ObservarIngesta eventosAutentica, deduplica, conserva payload, normaliza estado y responde rápido.
05 VerificarConfirma estado autoritativoConsulta recurso y valida end-to-end ID, importe, receptor, liquidación y devolución.
06 AsentarEscribe partidas balanceadasDébito/crédito inmutables, fuente, reserva/liberación y correcciones separadas.
07 AplicarAvanza el negocioLibera pedido idempotentemente, emite recibo, actualiza ERP y publica evento.
08 ConciliarCompara registros independientesAPI, extracto, reporte, ledger, pedido, devolución, fees y export contable.
La idempotencia pertenece a la operación de negocio
Un timeout puede ocurrir después del acceptance. Reintentar con otro ID puede crear un segundo cobro. Genera la clave antes del primer intento y vincula merchant, tipo, importe, destino y hash; conserva respuesta y estado.
Los eventos entrantes también requieren dedupe. Usa event ID y unicidad sobre PSP, txid, end-to-end ID, tipo y versión. Una notificación repetida devuelve el mismo journal y transición.
El ledger no es una tabla mutable de payments
La tabla payment proyecta el estado actual. La integridad requiere ledger append-only de partida doble donde cada journal balancea y referencia su fuente. Separa receivable, clearing, cash disponible, saldo cliente, payable, fee, liability de devolución, pérdida y suspense.
No edites historia para corregir. Publica reversal o ajuste con razón y autorización. Verifica débitos igual a créditos, moneda, reglas de cuenta y vínculo entre liberación y journal committed.
La conciliación necesita capas independientes
La operacional compara webhooks con API. La de caja compara PSP/banco con cash y clearing internos. La de negocio compara pagos con pedidos, facturas y suscripciones. La contable compara saldos y exports con el libro mayor.
Near real-time encuentra pedidos pagos atascados; intraday detecta postings faltantes o duplicados; el cierre diario captura fees, devoluciones, límites de fecha y archivos fallidos.
Matching determinista antes que heurístico
Primero end-to-end ID, txid, payment ID, transacción, cuenta, importe y moneda. Después claves secundarias acotadas. Un fuzzy match no debe mover dinero ni cerrar facturas automáticamente sin policy de confianza.
Dinero sin match va a suspense con owner y aging. Pagos parciales o agregados necesitan reglas explícitas y evidencia del motivo del match.
Modela las divergencias
| Divergencia | Causa probable | Check | Acción segura | Evidencia |
|---|
| PSP liquidó; pedido pendiente | Webhook perdido, worker, lock o schema. | Consultar pago y buscar journal/transición. | Asentar/aplicar idempotentemente si pasan invariantes. | Evento, API, journal, trace y versión. |
| Pedido pagado sin cash | Evento falso, mapping prematuro, ambiente o override. | Comprobar PSP, extracto, receptor, importe y credenciales. | Congelar liberación/payout e investigar. | Actor, policy, payload, extracto y auth. |
| Pago duplicado | Retry con nueva key, dos cobros o replay. | Agrupar por pedido, importe, payer, tiempo e IDs. | No fusionar; usar policy de devolución/crédito. | Ambas pruebas e intención. |
| Importe distinto | Cobro stale, descuento, fee, parcial o factura errónea. | Comparar gross, net, fees, esperado y quote. | Suspense o asignación parcial. | Cobro, factura, tarifa, extracto y policy. |
| Devolución distinta | Pendiente, parcial, original erróneo o duplicada. | Vincular original, return ID, importe, estado y journal. | Asentar solo estado verificado; mantener liability. | Original, devolución, razón y aprobación. |
| Consentimiento autorizado; pago ausente | Journey interrumpida, rechazo, expiración o participante. | Leer consent y payment por separado. | Mostrar estado exacto e iniciar journey nueva. | IDs, tiempos, client, participante e historial. |
Reembolso, devolución Pix y MED son distintos
El reembolso comercial nace de la relación con el cliente. La devolución Pix usa mecanismos del rail. MED cubre escenarios específicos de fraude y no sustituye devolución común ni prevención.
Modela solicitado, aprobado, enviado, procesando, completo, rechazado, cancelado, parcial y fallido. Reserva liability al comprometerte, pero marca cash devuelto solo con evidencia. El total no puede superar el original elegible.
El consentimiento Open Finance debe seguir visible
La iniciación incluye consent, autorización, client, participante, resource status y journeys redirigidas o desacopladas. Conserva historia completa. El pago no puede superar scope, importe, acreedor, agenda o validez.
Aplica FAPI, autenticación fuerte, sender-constrained access cuando corresponda, validación exacta, autoridad breve, rotación, firmas requeridas, replay prevention y conformance. Registra versión y participante.
El fraude opera antes y después
Evalúa antigüedad, device, sesión, beneficiario, importe, velocidad, hora, ubicación, canal, conducta, señales de estafa y límites. Conserva lo autorizado. Después monitorea cuentas relacionadas, devoluciones, disputas, indicadores mule y recovery.
Los modelos necesitan reason codes calibrados. Mide pérdida evitada junto con falso positivo, abandono, accesibilidad, revisión, queja y recuperación.
Observa edad de evidencia y deuda de conciliación
Correlaciona pedido, consent, cobro, payment, webhook, consulta, end-to-end ID, extracto, journal, transición, devolución y caso. Mide lag, dedupe, valor unmatched, edad de suspense, intentos de romper invariantes, cierre y backlog.
Alerta por valor y edad, no solo cantidad.
Prueba fallas y cierre
Simula timeout post-aceptación, duplicados, webhook perdido/desordenado, PSP caído, liquidación tardía, API versus extracto, cambio de día, devolución parcial, refund duplicado, precisión, rotación, consent expirado y resume tras deploy.
Ejecuta cierre diario simulado y prueba que rerun no duplica.
Qué construiría
Construiría un payment control plane con adapters, outbox, inbox inmutable, state machines, risk gateway, verifier, ledger de partida doble, transiciones, motor de conciliación, suspense, consola de excepciones y export contable.
Cada adapter conservaría código externo y mapping versionado. Correcciones serían idempotentes, explicables y reversibles mediante nuevo journal.
El principio de diseño
La liquidación rápida no elimina complejidad contable; comprime el tiempo. Sistemas confiables separan estados, conservan IDs, publican partidas inmutables, verifican evidencia independiente y asignan owner a cada divergencia.