2 · Datos y ERP·6 min de lectura

El dato que ya tenías

8 sep 2026Datos y ERPAutomatizaciónMétodo

Yo dije que ese dato no existía. Estaba equivocado, y el error costó dos días.

El caso: en una empresa, tres personas se turnan un archivo de Excel para capturar los movimientos bancarios. Unos 250 renglones al mes por cuenta. Fecha, descripción, importe, referencia, concepto y —el que cuesta— quién es la contraparte.

Mi hipótesis fue que el nombre del cliente no estaba en ningún lado del banco y había que deducirlo cruzando montos y fechas contra los cobros que ya conocíamos. Lo medí sobre una rebanada y dio 88% de acierto. Lo afirmé.

Sobre los 1,641 renglones completos, cayó a 16%.

Lo que había que hacer y no hice#

Abrir el documento original.

Cada movimiento SPEI del estado de cuenta de Santander arrastra siete líneas de detalle debajo. \pdftotext -layout\ las devuelve tal cual:

salida
02-JUL-2026 1950908 ABONO TRANSFERENCIA SPEI      691,641.25
                    RECIBIDO DE CITI MEXICO
                    DEL CLIENTE AGN AVIATION SERVICES SA DE CV
                    CLAVE DE RASTREO 42A10D7936A9D908
                    REF 38660
                    CONCEPTO AGN AVIATION SERVICES SA DE CV
                    RFC AAS0402265G7
Un solo movimiento del estado de cuenta, tal como lo entrega el banco. Debajo del renglón del monto vienen las líneas de detalle: quién lo mandó, con qué referencia y por qué concepto. Ese dato ya estaba ahí; nadie lo estaba leyendo.

Ahí está la contraparte, su RFC y la clave de rastreo. En las salidas, el campo \CONCEPTO\ trae además el número de orden de compra — otro dato que también teclean a mano.

Estaban transcribiendo un campo que el banco ya les entrega.

Cuánto es "el 90%"#

Contamos por caracteres tecleados, no por renglones — un renglón no cuesta lo mismo que otro. Sobre 1,376 movimientos de siete meses:

columna% del tecleo¿viene en el PDF?
Concepto27.5%99.5% de sus piezas
Descripción23.2%100% (1,372 de 1,372)
Comentarios (contraparte)12.4%70.2%
Fecha, saldo, referencia, importes30.6%100%
Factura y complemento fiscal5.6%no

81% se llena solo. Otro 12% llega propuesto. Queda 6% a mano.

Y el número de orden de compra: 115 de 115 coincidieron. Cero diferencias.

El diccionario no lo escribimos nosotros#

El banco dice \SERGIO EDUARDO VEGA DE LA TORRE\ y ellas escriben el nombre de la financiera. Ninguna de las dos está mal — son dos formas de nombrar lo mismo.

Mi primera versión imponía mi vocabulario: IVA, COMISIÓN, TARJETA. Las "diferencias" que medía eran solo eso, mi palabra contra la suya. Imponerle a alguien un vocabulario nuevo no es automatizar su trabajo: es cambiárselo.

El diccionario se entrena con lo que ellas ya capturaron, y con un backtest mes-adelante: cada mes se predice usando solo los meses anteriores. Entrenar con el mes que se mide da un número bonito y falso.

Resultado sobre seis meses que el sistema nunca había visto: 70.2% sale solo y correcto, 82.2% de precisión sobre lo que propone.

Lo que descartamos, que vale tanto como lo que funcionó#

Cruzar contra el ERP no sirve. Solo el 15% de los movimientos bancarios tiene monto exacto en compras o facturas, y los que coinciden lo hacen por casualidad — tres cosas distintas con $15,000. Una transferencia no es un documento: agrupa facturas o paga en partes. Lo probamos contra 1,583 documentos y no aportó un solo cruce válido.

Y el folio de factura tampoco sale del banco. Solo el 19% aparece; el cliente escribe "FACTURAS" y ya. Probamos deducirlo por combinación de facturas abiertas que sumaran el depósito: solución única en 13% de los casos, y de esas solo dos tercios coincidían con lo que habían escrito. Ahí la máquina se detiene, y está bien que se detenga.

Qué hicimos#

Un servicio aparte para leer los PDF. \pdftotext\ es un binario nativo: no cabe en un Worker de Cloudflare ni dentro de un nodo Code de n8n. Vive en su propio contenedor, publicado en la puerta del puente de Docker —los contenedores lo alcanzan, internet no—, con secreto compartido.

Y falla ruidoso. Si extrae texto pero ningún renglón encaja con el formato, devuelve 422, no \ok: true\ con lista vacía. Un lector que contesta "no hubo movimientos" cuando en realidad no supo leer es peor que uno caído.

Una pantalla, no un llenado a ciegas. Los renglones llegan con la propuesta precargada y lo que dice el banco al lado. Confirmar es un clic; sin ver la evidencia sería creerle a una caja negra.

Y un vigilante que también avisa de lo que NO llegó. Corre diario y, a partir del día 5, si falta el estado de cuenta del mes anterior lo dice. La primera vez que corrió avisó que faltaba el de agosto — llevaba tres días de retraso y nadie se había enterado.

Lo que nos llevamos#

Antes de concluir que un dato no existe, hay que abrir el documento original. Yo tenía una hipótesis razonable, la medí sobre una muestra que la favorecía, y la afirmé. El dato llevaba ahí todo el tiempo, siete líneas debajo de cada movimiento.

Y de paso: el 90% de un trabajo manual puede ser transcripción de algo que ya se recibe. La pregunta no es cómo teclear más rápido — es de dónde viene ese papel y qué más trae escrito.