- Published on
Crédito Colombia — libro editable y clasificador de intención
- Authors

- Name
- Mateo Londoño Toro
Continúa de 5 hubs y billetera de plásticos. Parte del proyecto Crédito Colombia.
Home de Gastos ya no es “revisar correos”. El libro es la fuente; Gmail es el sensor. El 23 de agosto publiqué el libro editable y el clasificador de intención (8aa9fc9, +3.2k / −384 en 59 archivos).
Prod: credito.mateolondono.dev. Auth: AuthPortal.
Cadena que ya corre
Avisos Nequi / Bancolombia (Gmail Push)
│
▼
Parseo + clasificación (QR, llaves, fallidos; bancos no se mezclan)
│
▼
JSON clasificado → import al libro (lotes, sin timeout de Vercel)
│
▼
Libro: tabla, periodo, cuenta, edición en lote
│
▼
Intención: hábito / comercio (reglas, mapa, aprendizaje)
Gmail no es el sistema de registro. Si el movimiento ya está en el libro, el aviso pendiente se cierra. Transferencias que no son del usuario se pueden buscar y sacar del libro.
Push + catálogo de remitentes (dominio real de alertas Bancolombia). Cron de catch-up una vez al día por el límite Hobby de Vercel. Confirmar no debe volver a mostrar el mismo aviso; al clasificar se pueden crear hábitos.

Imagen de ejemplo (mockup). Sin correos reales ni datos personales.
Parseo: no mezclar bancos ni HTML colapsado
Avisos de QR Bancolombia y avance Bogotá no se juntan. QR, llaves y fallidos tienen tipo propio. No tomar PSE del HTML colapsado del correo: el collapse miente.
Export “Por clasificar” lleva correos, parseo e ids de Gmail. Mapas de comerciantes van versionados. Deduplicación y revisión salen a JSON aparte para no mezclar “ya está en el libro” con “el parser falló”.
Import al libro: inserta en lote y parte la carga para no pegarle el timeout de Vercel. Si la tarjeta no existe, se crea al importar.
Ver el correo completo: HTML en iframe, body plano, scroll del menú. Toasts arriba; remitentes en modal.
Libro (UI)
En /inbox (pestaña Clasificar gastos del hub Billetera):
- Tabla con periodo y cuenta en dos selectores.
- Filtros, paginación y edición en lote (tipo, hábito, instrumento).
- Merge de fichas de instrumento duplicadas (
/api/instruments/merge). - Detalle de fila sin perder el contexto de la tabla.
KPIs por mes en cada instrumento. Gastos es bandeja de hábitos; Avance dejó de ser “instrumento”.
Intención (motor)
src/domain/gmail/intent-classify.ts + migración 0010_intent_classify.sql.
No es un LLM en el request. Fuentes explícitas:
| Fuente | Qué hace |
|---|---|
hard_rule | Intereses, mora, comisión de avance, cuota de manejo. Avance/envío/pago → transfer. |
merchant_map | Comercio conocido → slug de presupuesto. |
regex / score | Señales ponderadas. |
learned | Confirmaciones en DB; candidato hasta umbral (LEARNED_MIN = 3). |
Gates (decideFromScores): A auto (top ≥ 20 y margen ≥ 10 vs segundo); B revisar (margen corto); C no asignar (top bajo o vacío). Inbound no se categoriza como gasto. Si el texto es solo el procesador (PSE / Mercado Pago / Bold / dLocal), needsReview: no clasificar el rail como comercio.
Un aviso “PSE · Rappi” no debería quedar como “PSE”. splitMerchantEntities recorta el procesador y deja el comercio.
Aprendizaje: merchant-learn-repository + estados candidate | learned | conflict. El usuario corrige en lote; el motor acumula.
Fixture: fixtures/gmail/intent-gold.json + scripts/eval-intent-classify.ts.
Corte de git que alimenta esto (22–23 ago)
- Exportar transacciones Gmail → JSON (paginación, deduplicación, mapas versionados).
- Clasificar al sincronizar; separar bancos; no PSE desde HTML collapse.
- Import JSON + crear tarjetas; lotes por Hobby Vercel.
- Libro tabla + quitar transferencias ajenas + cerrar avisos ya en libro.
- Publicar libro editable + intención (
8aa9fc9).
Qué no es este post
No es un changelog de cada hotfix de extractos PDF o del cron. El punto de producto: el escenario de crédito se ancla a instrumentos reconciliados y a un libro que se puede corregir, no a un feed de notificaciones.
Sin checkpoint, “llevas 8M” es falsa precisión. El clasificador reduce trabajo; no certifica el saldo del banco.
Si quieres probar el flujo: módulo credito en AuthPortal y el runtime Next en CreditoColombia-FinancialOS-git.