ImagLend — Productos de Credito
Proposito
Los productos de credito son plantillas configurables que definen las condiciones bajo las cuales un tenant otorga creditos. Cada tenant puede tener multiples productos activos simultaneamente, cada uno con sus propias reglas de montos, plazos, tasas y requisitos.
Categorias de Producto
ImagLend soporta las siguientes categorias de producto:
| Categoria | Descripcion | Plazo tipico | Monto tipico |
|---|---|---|---|
microcredito | Creditos de bajo monto y corto plazo | 15-90 dias | 50,000 - 1,000,000 COP |
consumo | Creditos personales de libre destinacion | 90-720 dias | 1,000,000 - 50,000,000 COP |
linea_rotativa | Linea de credito reutilizable con cupo aprobado | Indefinido | Hasta 20,000,000 COP |
libre_inversion | Creditos sin restriccion de uso con garantia | 180-1800 dias | 5,000,000 - 200,000,000 COP |
Configuracion de un Producto
Estructura Completa
Un producto se configura mediante bloques JSON que definen cada aspecto del credito:
{
"code": "microcredito-30d",
"name": "Microcredito 30 dias",
"description": "Credito rapido de bajo monto para necesidades inmediatas",
"category": "microcredito",
"amount_config": {
"min": 100000,
"max": 750000,
"default": 300000,
"step": 50000,
"currency": "COP"
},
"term_config": {
"min_days": 15,
"max_days": 90,
"options": [15, 30, 60, 90]
},
"rate_config": {
"type": "fixed",
"rate": 0.076,
"reference_rate": null
},
"fee_config": {
"items": [
{ "code": "origination", "label": "Originacion", "type": "percentage", "value": 0.02, "taxable": false },
{ "code": "platform", "label": "Plataforma", "type": "percentage", "value": 0.005, "taxable": false },
{ "code": "insurance", "label": "Seguro", "type": "percentage", "value": 0.01, "taxable": false }
],
"tax_rate": 0.19,
"tax_applies_to": "interest"
},
"requirements": {
"min_age": 18,
"max_age": 70,
"documents": ["cc", "selfie"],
"validations": ["identity_verification", "bureau_check"]
},
"validation_flow_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"signature_required": true,
"signature_type": "electronic",
"disbursement_method": "bank_transfer",
"disbursement_delay_hours": 0,
"is_active": true,
"requires_approval": true
}Bloque amount_config
Define los rangos de monto permitidos para el producto:
{
"min": 100000,
"max": 750000,
"default": 300000,
"step": 50000,
"currency": "COP"
}| Campo | Tipo | Descripcion |
|---|---|---|
min | number | Monto minimo permitido |
max | number | Monto maximo permitido |
default | number | Monto por defecto en el simulador |
step | number | Incremento del slider en el simulador |
currency | string | Codigo ISO 4217 de la moneda |
Bloque term_config
Define los plazos disponibles:
{
"min_days": 15,
"max_days": 360,
"options": [15, 30, 60, 90, 180, 360]
}Si options esta presente, el usuario solo puede seleccionar esos plazos. Si esta vacio o ausente, cualquier valor entre min_days y max_days es valido.
Bloque rate_config
Define la tasa de interes:
{
"type": "fixed",
"rate": 0.076,
"reference_rate": null
}| Campo | Tipo | Descripcion |
|---|---|---|
type | string | fixed o variable |
rate | number | Tasa efectiva mensual (para fixed) o spread (para variable) |
reference_rate | string | Tasa de referencia para variable: DTF, IBR, SOFR |
Para tasas variables, la tasa final es: reference_rate_value + rate (spread).
Bloque fee_config
Define los costos asociados al credito como un array flexible de items. Cada tenant puede agregar o quitar fees segun su modelo de negocio:
{
"items": [
{ "code": "origination", "label": "Originacion", "type": "percentage", "value": 0.02, "taxable": false },
{ "code": "platform", "label": "Plataforma", "type": "percentage", "value": 0.005, "taxable": false },
{ "code": "insurance", "label": "Seguro", "type": "percentage", "value": 0.01, "taxable": false },
{ "code": "study", "label": "Estudio de credito", "type": "fixed", "value": 15000, "taxable": true },
{ "code": "notary", "label": "Gastos notariales", "type": "fixed", "value": 50000, "taxable": false }
],
"tax_rate": 0.19,
"tax_applies_to": "interest"
}| Campo del item | Tipo | Descripcion |
|---|---|---|
code | string | Identificador unico del fee (snake_case) |
label | string | Nombre visible al usuario en el desglose |
type | string | percentage (sobre el monto) o fixed (valor absoluto en la moneda del producto) |
value | number | Porcentaje (0.02 = 2%) si type es percentage, o monto fijo si type es fixed |
taxable | boolean | Si este fee genera impuesto adicional |
| Campo global | Tipo | Descripcion |
|---|---|---|
tax_rate | number | Tasa impositiva (0.19 = 19%) |
tax_applies_to | string | Sobre que se calcula el impuesto: interest, fees, all |
Valores de tax_applies_to:
interest— Impuesto solo sobre los intereses generadosfees— Impuesto solo sobre los fees marcados como taxableall— Impuesto sobre intereses + fees taxable
Bloque requirements
Define los requisitos del solicitante:
{
"min_age": 18,
"max_age": 70,
"documents": ["cc", "selfie", "income_proof"],
"validations": ["identity_verification", "bureau_check", "phone_verification"]
}Relacion con ImagFlow
El campo validation_flow_id vincula un producto con un flujo de validacion en ImagFlow. Cuando un usuario solicita un credito de este producto, el sistema invoca automaticamente el flujo configurado para validar la identidad del solicitante.
Si validation_flow_id es null, el producto no requiere validacion externa y la solicitud avanza directamente.
Soporte Multi-Moneda
ImagLend soporta multiples monedas configurables por producto:
| Moneda | Codigo | Paises |
|---|---|---|
| Peso colombiano | COP | Colombia |
| Dolar estadounidense | USD | Ecuador, Panama, global |
| Sol peruano | PEN | Peru |
| Peso mexicano | MXN | Mexico |
| Quetzal guatemalteco | GTQ | Guatemala |
La moneda se define en amount_config.currency y aplica a todos los montos del producto. Un tenant puede tener productos en diferentes monedas.
Consideraciones
- Los calculos financieros se realizan en la moneda del producto
- No hay conversion automatica entre monedas
- El formato de visualizacion se adapta segun la moneda (decimales, separadores)
- Los reportes pueden consolidar en una moneda base configurada por tenant
Ciclo de Vida del Producto
Un producto de credito pasa por los siguientes estados:
| Estado | Descripcion |
|---|---|
draft | Producto en borrador. No visible para usuarios finales |
pending_approval | Creacion enviada para aprobacion maker-checker |
active | Producto activo. Disponible para nuevas solicitudes |
inactive | Producto desactivado. No acepta nuevas solicitudes pero creditos existentes continuan |
pending_change | Producto activo con un cambio pendiente de aprobacion |
Versionamiento de Productos
Los productos de credito siguen un modelo de versionamiento inmutable similar al de ImagFlow. Cada cambio aprobado crea una nueva version del producto. Las solicitudes de credito referencian la version especifica del producto con la que fueron creadas, garantizando trazabilidad total.
Modelo de Versionamiento
Reglas de Versionamiento
| Regla | Descripcion |
|---|---|
| Inmutabilidad | Una version publicada nunca se modifica |
| Version activa unica | Solo una version puede estar activa por producto |
| Solicitudes no migran | Solicitudes creadas con v1 permanecen con v1 |
| Referencia por version | credit_application.product_version_id referencia la version exacta |
| Snapshot completo | Cada version almacena la configuracion completa (amount, term, rate, fees) |
| Auditoria | Cada version registra quien la creo, quien la aprobo y cuando |
Estructura de Datos
{
"product_id": "prod-uuid-001",
"version_number": 3,
"status": "active",
"config_snapshot": {
"amount_config": { "min": 100000, "max": 750000, "currency": "COP" },
"term_config": { "min_days": 15, "max_days": 90, "options": [15, 30, 60, 90] },
"rate_config": { "type": "fixed", "rate": 0.082 },
"fee_config": {
"items": [
{ "code": "origination", "label": "Originacion", "type": "percentage", "value": 0.02, "taxable": false },
{ "code": "platform", "label": "Plataforma", "type": "percentage", "value": 0.005, "taxable": false }
],
"tax_rate": 0.19,
"tax_applies_to": "interest"
},
"requirements": { "min_age": 18, "max_age": 70 }
},
"created_by": "admin-uuid",
"approved_by": "approver-uuid",
"created_at": "2026-05-18T10:00:00Z",
"published_at": "2026-05-18T10:05:00Z",
"change_request_id": "cr-uuid-001",
"change_summary": "Tasa ajustada de 0.076 a 0.082"
}Flujo de Cambio con Versionamiento
Impacto en Solicitudes
- Al crear una solicitud, se registra
product_version_id(no soloproduct_id) - La solicitud "congela" las condiciones del momento de creacion
- Si el producto cambia despues, la solicitud no se ve afectada
- El credito resultante hereda las condiciones de la version de la solicitud
- En el desglose del credito siempre se puede ver con que version se creo
{
"credit_application": {
"id": "app-uuid-001",
"product_id": "prod-uuid-001",
"product_version_id": "pv-uuid-002",
"product_version_number": 2,
"product_config_at_creation": {
"rate": 0.076,
"fee_config": { "..." }
}
}
}Flujo de Creacion
Flujo de Modificacion
Reglas del Maker-Checker
| Regla | Descripcion |
|---|---|
| El solicitante no puede aprobar su propio cambio | requested_by != reviewed_by |
| Solo un cambio pendiente por entidad | No se permite crear otro si ya hay uno pending |
| Expiracion automatica | Cambios no revisados expiran en 72 horas |
| Auditoria completa | Se registra payload_before y payload_after |
| Notificacion | Se notifica a los aprobadores cuando hay cambios pendientes |
Ejemplos de Configuracion por Categoria
Microcredito
{
"code": "micro-express-30d",
"name": "Microcredito Express 30 dias",
"category": "microcredito",
"amount_config": {
"min": 50000,
"max": 500000,
"default": 200000,
"step": 25000,
"currency": "COP"
},
"term_config": {
"min_days": 15,
"max_days": 30,
"options": [15, 30]
},
"rate_config": {
"type": "fixed",
"rate": 0.076
},
"fee_config": {
"origination": 0.03,
"platform": 0.005,
"insurance": 0.0,
"tax": 0.19
},
"requirements": {
"min_age": 18,
"max_age": 65,
"documents": ["cc", "selfie"],
"validations": ["identity_verification"]
},
"validation_flow_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"signature_required": true,
"signature_type": "electronic",
"disbursement_method": "wallet",
"disbursement_delay_hours": 0,
"is_active": true,
"requires_approval": true
}Credito de Consumo
{
"code": "consumo-personal-360d",
"name": "Credito Personal hasta 360 dias",
"category": "consumo",
"amount_config": {
"min": 1000000,
"max": 20000000,
"default": 5000000,
"step": 500000,
"currency": "COP"
},
"term_config": {
"min_days": 90,
"max_days": 360,
"options": [90, 180, 270, 360]
},
"rate_config": {
"type": "fixed",
"rate": 0.018
},
"fee_config": {
"origination": 0.015,
"platform": 0.005,
"insurance": 0.008,
"tax": 0.19
},
"requirements": {
"min_age": 21,
"max_age": 70,
"documents": ["cc", "selfie", "income_proof", "bank_statements"],
"validations": ["identity_verification", "bureau_check", "phone_verification"]
},
"validation_flow_id": "b2c3d4e5-f6a7-8901-bcde-f23456789012",
"signature_required": true,
"signature_type": "digital",
"disbursement_method": "bank_transfer",
"disbursement_delay_hours": 24,
"is_active": true,
"requires_approval": true
}Linea Rotativa
{
"code": "linea-rotativa-cupo",
"name": "Linea de Credito Rotativa",
"category": "linea_rotativa",
"amount_config": {
"min": 500000,
"max": 20000000,
"default": 3000000,
"step": 500000,
"currency": "COP"
},
"term_config": {
"min_days": 30,
"max_days": 360,
"options": [30, 60, 90, 180, 360]
},
"rate_config": {
"type": "variable",
"rate": 0.005,
"reference_rate": "DTF"
},
"fee_config": {
"origination": 0.0,
"platform": 0.008,
"insurance": 0.005,
"tax": 0.19
},
"requirements": {
"min_age": 25,
"max_age": 65,
"documents": ["cc", "selfie", "income_proof", "bank_statements", "tax_return"],
"validations": ["identity_verification", "bureau_check", "income_verification"]
},
"validation_flow_id": "c3d4e5f6-a7b8-9012-cdef-345678901234",
"signature_required": true,
"signature_type": "digital",
"disbursement_method": "bank_transfer",
"disbursement_delay_hours": 48,
"is_active": true,
"requires_approval": true
}Libre Inversion
{
"code": "libre-inversion-premium",
"name": "Credito Libre Inversion Premium",
"category": "libre_inversion",
"amount_config": {
"min": 5000000,
"max": 200000000,
"default": 20000000,
"step": 5000000,
"currency": "COP"
},
"term_config": {
"min_days": 180,
"max_days": 1800,
"options": [180, 360, 720, 1080, 1440, 1800]
},
"rate_config": {
"type": "variable",
"rate": 0.003,
"reference_rate": "IBR"
},
"fee_config": {
"origination": 0.01,
"platform": 0.003,
"insurance": 0.012,
"tax": 0.19
},
"requirements": {
"min_age": 25,
"max_age": 70,
"documents": ["cc", "selfie", "income_proof", "bank_statements", "tax_return", "property_cert"],
"validations": ["identity_verification", "bureau_check", "income_verification", "asset_verification"]
},
"validation_flow_id": "d4e5f6a7-b8c9-0123-defa-456789012345",
"signature_required": true,
"signature_type": "digital",
"disbursement_method": "bank_transfer",
"disbursement_delay_hours": 72,
"is_active": true,
"requires_approval": true
}Producto en USD (Ejemplo Multi-Moneda)
{
"code": "personal-loan-usd",
"name": "Personal Loan USD",
"category": "consumo",
"amount_config": {
"min": 500,
"max": 10000,
"default": 2000,
"step": 100,
"currency": "USD"
},
"term_config": {
"min_days": 30,
"max_days": 360,
"options": [30, 90, 180, 360]
},
"rate_config": {
"type": "fixed",
"rate": 0.045
},
"fee_config": {
"origination": 0.02,
"platform": 0.005,
"insurance": 0.005,
"tax": 0.0
},
"requirements": {
"min_age": 18,
"max_age": 65,
"documents": ["passport", "selfie"],
"validations": ["identity_verification"]
},
"validation_flow_id": "e5f6a7b8-c9d0-1234-efab-567890123456",
"signature_required": true,
"signature_type": "electronic",
"disbursement_method": "bank_transfer",
"disbursement_delay_hours": 24,
"is_active": true,
"requires_approval": true
}Validaciones de Producto
Al crear o modificar un producto, el sistema valida:
| Regla | Validacion |
|---|---|
| Codigo unico | code debe ser unico dentro del tenant |
| Rango de montos | min debe ser menor que max |
| Default en rango | default debe estar entre min y max |
| Step valido | step debe dividir exactamente el rango |
| Tasa positiva | rate debe ser mayor a 0 y menor a 1 |
| Plazo coherente | min_days menor que max_days |
| Options en rango | Cada valor en options debe estar entre min_days y max_days |
| Flow existente | Si validation_flow_id no es null, debe existir en ImagFlow |
| Fees no negativos | Todos los fees deben ser >= 0 |
| Categoria valida | Debe ser una de las categorias soportadas |
Notas Tecnicas
- Los productos se almacenan en la tabla
credit_productscon RLS portenant_id - El campo
row_versionse usa para concurrencia optimista (ETags) - Los cambios en productos activos generan eventos
lending.product.updated - La configuracion del simulador publico se deriva del producto activo
- Un producto inactivo no aparece en el simulador pero sus creditos existentes siguen operando