Documento técnico · Equipo de desarrollo

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.

Versión: 1.0 Estado: Diseño (pre-desarrollo) Relacionado: ESPECIFICACION_MVP · INVENTARIO_APIS_BANCARIAS
Idea central: hay una decisión que condiciona todo —¿el dinero llega directo a la cuenta del comercio, o pasa primero por una cuenta nuestra?— porque cambia tanto la integración del cobro como la conciliación. Se explica primero (§1).

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.

Modelo A

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.

Cliente
débito C2P
Banco
abono
Cuenta del comercio

✔ 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.

Modelo B

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.

Cliente
débito
Cuenta Caudal
payout
Comercio

✔ Ventaja: onboarding instantáneo, comisión automática, split para marketplaces.
✘ Desventaja: custodia de fondos → alta carga regulatoria (PSP, KYC/PLAFT, float).

Recomendación: arrancar el MVP en Modelo A (sin custodia, menor riesgo) y habilitar Modelo B (split/marketplace) en fase posterior, tras el dictamen legal de la Fase 0. La capa de adaptadores soporta ambos sin reescribir el núcleo.

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).

Crear cobro. POST /v1/cobros con monto y método. Caudal convierte USD→Bs según la tasa configurada y devuelve cob_xxx (estado creado).
Datos del cliente. Aporta cédula, teléfono y banco, y genera su clave C2P desde su app / banca en línea / SMS.
Confirmar. POST /v1/cobros/cob_xxx/confirmar con banco, cédula, teléfono y token.
Caudal → Banco. El adaptador del banco traduce la petición a su formato y llama su API C2P con las credenciales correctas (del comercio en Modelo A, nuestras en Modelo B).
Respuesta. El banco debita y responde aprobado/rechazado + referencia. Caudal actualiza el estado, emite webhook firmado y muestra el resultado.
Abono. Los fondos se abonan (en línea o por lote) a la cuenta destino según el modelo.

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.

BancoAutenticación (ejemplo real)Particularidad
BancaribeAuthorization: Bearer (suscripción en su portal Open Banking)Swagger + SDK + sandbox. El más developer-friendly.
MercantilCredenciales del Portal API + tokenSandbox documentado; Botón de Pagos Móviles.
BNCClientGUID + MasterKeyC2P, 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[]>;
}
Regla de oro: añadir un banco nuevo = implementar un adaptador. Nunca tocar el Servicio de Cobros ni el de Conciliación.

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

creado pendiente autorizado pagado fallido / expirado

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.

A · Nuestro ledger
Cobros que creemos pagados
B · Liquidación del banco
Lo que el banco dice que abonó
C · Movimientos reales
Extracto de la cuenta destino
SituaciónSignificadoAcción
Coincide en A, B y CPago real y abonadoMarcar conciliado / liquidado ✅
En A pero no en B/CCreímos pagado, el banco no abonóRevertir / investigar (falso positivo)
En B/C pero no en APago "huérfano" (ej. P2C manual)Asociar al cobro o al comercio
Monto distintoDiferencia de montosExcepció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":

Modelo A

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 ConsultaSaldo y ConsultarOperaciones) para confirmar el abono real.
Modelo B

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.
Pendiente de Fase 0: credenciales sandbox por banco, costos interbancarios reales, y el dictamen legal sobre custodia de fondos (Modelo B) y el tope de comisión C2P (Gaceta 43.231). Estos definen qué modelo y qué spread son viables.

Caudal · Documento técnico interno · "Caudal" es nombre provisional · Cifras y endpoints preliminares sujetos a Fase 0.