Integración C2P y Conciliación
Diseño de cómo Caudal procesa cobros por Pago Móvil C2P y cómo concilia que el dinero efectivamente llegó a la cuenta destino, según el modelo de negocio.
1 Modelos de liquidación (la decisión madre)
El "tipo de negocio establecido" se reduce a dónde aterriza el dinero. De esto depende el riesgo regulatorio, el onboarding y el método de conciliación.
Liquidación directa (sin custodia)
Cada comercio tiene su propia afiliación C2P. El dinero va directo de la cuenta del cliente a la cuenta del comercio. Caudal solo orquesta y concilia; nunca toca el dinero.
✔ Ventaja: riesgo regulatorio bajísimo (sin custodia de fondos de terceros).
✘ Desventaja: cada comercio debe afiliarse al C2P de su banco; onboarding más lento.
Cuenta recaudadora / puente (con custodia)
Caudal tiene la afiliación C2P. Los cobros abonan a nuestra cuenta y luego liquidamos al comercio descontando la comisión.
✔ Ventaja: onboarding instantáneo, comisión automática, split para marketplaces.
✘ Desventaja: custodia de fondos → alta carga regulatoria (PSP, KYC/PLAFT, float).
2 Flujo de cobro C2P
C2P permite que el comercio inicie el cobro debitando la cuenta del cliente, quien lo autoriza con una clave/OTP de un solo uso generada desde su banco (vigencia 3–6 h).
POST /v1/cobros con monto y método. Caudal convierte USD→Bs según la tasa configurada y devuelve cob_xxx (estado creado).POST /v1/cobros/cob_xxx/confirmar con banco, cédula, teléfono y token.Ejemplo de API
# 1) Crear el cobro POST /v1/cobros { "monto": 2000, "moneda": "USD", "metodo": "c2p", "descripcion": "Pedido #1042" } # 2) Confirmar con los datos C2P + clave del cliente POST /v1/cobros/cob_3Nk8x/confirmar { "banco_cliente": "0105", "cedula": "V12345678", "telefono": "04141234567", "token": "8842" } # Respuesta { "id": "cob_3Nk8x", "estado": "pagado", "monto_bs": 730000, "tasa": 36.50, "id_bancario": "REF-99812" }
3 Capa de adaptadores
Cada banco expone su API distinto, pero el resto del sistema ve un solo contrato. El adaptador encapsula autenticación, formato y particularidades de cada banco.
| Banco | Autenticación (ejemplo real) | Particularidad |
|---|---|---|
| Bancaribe | Authorization: Bearer (suscripción en su portal Open Banking) | Swagger + SDK + sandbox. El más developer-friendly. |
| Mercantil | Credenciales del Portal API + token | Sandbox documentado; Botón de Pagos Móviles. |
| BNC | ClientGUID + MasterKey | C2P, P2C y tarjetas (Terminal/Afiliación). |
Contrato común
interface AdaptadorBancario { codigo: string; // "mercantil" | "bancaribe" | ... iniciarCobroC2P(input: CobroC2PInput): Promise<ResultadoCobro>; consultarEstado(idBancario: string): Promise<EstadoCobro>; obtenerConciliacion(fecha: string): Promise<RegistroConciliacion[]>; }
4 Idempotencia y estados
- Idempotencia obligatoria (header
Idempotency-Key) en la confirmación. La clave C2P es de un solo uso: un reintento ciego podría fallar o generar doble débito. Garantiza "exactamente una vez". - Montos en centavos y conversión USD→Bs registrada con la tasa exacta del momento (auditable).
- Rechazos/reversos: la Gaceta fija Bs. 2 por operación rechazada o reversada; modelarlo como costo.
Máquina de estados del cobro
El estado pendiente existe para no perder cobros ante timeouts: se resuelven en la capa de conciliación.
5 Conciliación en 3 capas
Conciliar = verificar que lo que creemos cobrado coincide con lo que el banco realmente movió. No nos fiamos de una sola fuente: tres capas, de la más rápida a la más confiable.
Capa 1 · En línea
La respuesta síncrona del banco al confirmar ("aprobado + referencia"). Primera señal; si falla (timeout) → queda pendiente.
Capa 2 · Reconsulta
Un worker consulta consultarEstado con reintentos, o espera la notificación del banco. Resuelve los casos ambiguos.
Capa 3 · Lote diario
Descarga del archivo de liquidación del banco (Bancaribe lo ofrece explícitamente) y cruce contable. La verdad final.
6 Cruce de 3 vías (Capa 3)
Cada día cruzamos tres fuentes usando como llaves: referencia bancaria + monto + fecha + cédula/teléfono.
| Situación | Significado | Acción |
|---|---|---|
| Coincide en A, B y C | Pago real y abonado | Marcar conciliado / liquidado ✅ |
| En A pero no en B/C | Creímos pagado, el banco no abonó | Revertir / investigar (falso positivo) |
| En B/C pero no en A | Pago "huérfano" (ej. P2C manual) | Asociar al cobro o al comercio |
| Monto distinto | Diferencia de montos | Excepción → revisión manual |
7 Validación según el modelo
Aquí se responde "validar que el dinero llegue a nuestras cuentas o la del cliente":
Dinero a la cuenta del comercio
- La vía C del cruce es la cuenta del comercio.
- Se valida contra el reporte de liquidación que el banco asocia a la afiliación C2P del comercio.
- Validación "dura": acceso de solo lectura a sus movimientos/saldo (Bancaribe expone
ConsultaSaldoyConsultarOperaciones) para confirmar el abono real.
Dinero a la cuenta recaudadora
- La vía C es nuestro propio extracto: conciliamos abonos C2P contra los movimientos de la cuenta de Caudal.
- Se agrega un segundo libro de payouts: cada liquidación al comercio (cobro − comisión) también se concilia.
- Pista de auditoría completa: entró X de los clientes → pagamos Y a los comercios → retuvimos comisión Z.
8 Excepciones y operación
- Worker de conciliación programado (cron): corre el cruce diario y genera un reporte por comercio.
- Bandeja de excepciones en el dashboard para desajustes que requieren intervención humana (huérfanos, montos distintos, no abonados).
- Timing / float: distinguir abono en línea vs. por lote (al cierre del día); afecta cuándo un pago es firme y, en Modelo B, cuándo se puede liquidar al comercio.
- Reversos: registrar y conciliar reversos/devoluciones; reflejar el costo de Bs. 2.
- Alertas: notificar si el % de desajustes supera un umbral (posible incidencia en la API del banco).
9 Checklist de desarrollo
- Definir el modelo de liquidación inicial (recomendado: A) y el manejo de credenciales por comercio.
- Implementar el contrato
AdaptadorBancario+ primer adaptador (Bancaribe o Mercantil) en sandbox. - Servicio de Cobros con máquina de estados e idempotencia.
- Conversión USD→Bs con tasa configurable y registro auditable.
- Webhooks firmados (HMAC) con reintentos exponenciales.
- Worker de conciliación: ingestión del archivo de liquidación + cruce de 3 vías.
- Integración de consulta de movimientos/saldo para validación "dura" (donde el banco lo permita).
- Bandeja de excepciones y reporte de conciliación por comercio en el dashboard.
- (Modelo B) Módulo de payouts + segundo libro conciliado + lógica de comisión/float.
Caudal · Documento técnico interno · "Caudal" es nombre provisional · Cifras y endpoints preliminares sujetos a Fase 0.