MessyDocs
← Back to all posts

Factura española a Excel y a Holded: el tiquet que te dio el cliente no es una factura, y un buen OCR debería decirlo

Cualquier asesor fiscal de Madrid ha tenido este mismo trozo de papel entre las manos. Un tiquet térmico fino de El Corte Inglés, con la tinta ya desvaída, dos bebidas y un aperitivo, 9,20 € en total, las palabras NO VALIDO COMO FACTURA impresas abajo en un cuerpo que hay que entornar los ojos para leer. El cliente te entrega una carpeta llena al cierre del trimestre y te pregunta cuánto de eso cuenta.

La respuesta honesta es que la mayoría no cuenta, y la parte lenta de tu semana es separar cuál de cincuenta tiquets es en realidad una factura simplificada bien hecha y cuál es un recibo de caja sin más, que no puedes deducir. Esa separación es el problema de OCR que merece la pena resolver en contabilidad española, no «leer el texto». Cualquier lector con cinco años en el mercado ya lee escritura latina.

El tiquet que probamos

Un tiquet real de El Corte Inglés en Plaza Puerta del Sol 10, 28013 Madrid. Tres líneas: DOBLE CON LIMON ×1 a 4,20 €, SOLO MARTINI ROSSO ×1 a 5,00 € y APERITIVO ×1 sin precio (la convención del bar español: el aperitivo va incluido cuando pides una consumición). Base imponible 8,36 €, IVA al 10 % que son 0,84 €, total 9,20 €. Atendido por Keyti Oviedo, terminal T001/121878, fecha 27/05/2018.

El recibo en sí es una impresión térmica sobre una tira más estrecha que una moneda de un euro. Entrada real, no una muestra de marketing.

Lo que devolvió nuestra pipeline

Todos los campos con alta confianza, en menos de dos segundos. Comercio, dirección, fecha, identificador de terminal, las tres líneas incluida la del aperitivo con su precio en null correctamente, el desglose de IVA con base, tipo e importe como campos separados, el total con moneda EUR, y el nombre del personal de sala.

La conciliación cuadra por dos vías. Por líneas: 4,20 + 5,00 + 0 = 9,20. Por matemática fiscal: 8,36 + 0,84 = 9,20. Ambas suman al total impreso, que es el único control de sanidad que de verdad importa cuando alguien está cerrando el trimestre.

La pieza que se gana el sitio en tu flujo de trabajo es el campo de metadatos que vino como is_valid_invoice: false. La pipeline detectó el NO VALIDO COMO FACTURA y el TIQUET INFORMATIVO impresos y marcó este recibo como tiquet no deducible sin que nadie se lo pidiera. Esa decisión pesa en el IVA español de una manera que un OCR global genérico no va a sacar a la luz.

Por qué «lo leemos» es el titular equivocado

Cualquier OCR construido en los últimos cinco años lee escritura latina. Leer DOBLE CON LIMON no es el valor. El valor está en la media reflexión que sigue a la lectura, y que tiene que responder a cuatro preguntas antes de que la fila aterrice en Holded como gasto deducible:

  1. ¿Es una factura completa, una factura simplificada que cumple el Real Decreto 1619/2012, o un tiquet de caja sin más?
  2. ¿Aparece el NIF del cliente en el documento? Sin él, el IVA no se recupera aunque el resto esté en orden.
  3. ¿El tipo de IVA del recibo (4 %, 10 % o 21 %) es el que Hacienda espera para esa categoría de gasto?
  4. ¿La base más la cuota cuadran con el total, o el OCR confundió un decimal?

El OCR genérico responde a la primera pregunta por defecto con «sí, aquí tienes el texto». Ese es el modo de fallo. Una extracción consciente del marco español tiene que mirar la leyenda impresa, la presencia o ausencia de un bloque con NIF del cliente y la fraseología del tipo de documento, y devolver una respuesta estructurada. La nuestra lo hizo. La marca es el titular.

Hostelería al 10 %, libros al 4 %, el resto al 21 %

El tiquet que probamos es de hostelería, así que el tipo es el 10 %. Hay tres tipos de IVA en España peninsular, y cualquier pipeline que no capture el tipo como campo propio te va a obligar a fijarlo a mano antes de cada importación a Holded:

  • 4 % superreducido: pan, leche, libros, periódicos, medicamentos.
  • 10 % reducido: hostelería y restauración, transporte de viajeros, vivienda nueva.
  • 21 % general: el resto.

En Canarias el impuesto aplicable es el IGIC, no el IVA, con sus propios tipos (0 %, 3 %, 7 %, 9,5 %, 15 %, 20 %). La pipeline captura el tipo que viene impreso, no asume el general. Un tiquet de bar tinerfeño con IGIC al 7 % entra en el CSV con la etiqueta correcta, y el asesor no tiene que acordarse de reconfigurar la columna cada vez que abre la carpeta de un cliente canario.

La forma de exportación que Holded espera

Holded importa gastos por CSV. Las columnas que pide (fecha, proveedor, NIF, base, IVA, total, categoría, número de documento) son las que la pipeline emite, en ese orden. No transformas un blob de JSON en una fila, no pegas desde un muro de texto peleando la alineación de columnas. La salida es una fila por documento, con una columna por campo, lista para Compras y Gastos > Importar en Holded.

La misma forma de CSV sube a Aspel-COI, Alegra, Contabilium y QuickBooks. Los nombres de campo cambian un poco (RFC vs NIF vs RUC) y la pipeline etiqueta el identificador por país, pero la estructura es la misma. Una carpeta con tiquets españoles, mexicanos y argentinos mezclados sale como un único CSV que tu herramienta de contabilidad va a leer.

Dónde se rompe esto, y qué revisar de todas formas

Hay dos sitios donde conviene frenar incluso si todos los campos vinieron con alta confianza.

El primero es el NIF en un tiquet de bar. Un recibo de caja estándar no lleva el NIF del cliente, lo que significa que no es deducible por muy limpia que sea la lectura de los números. La marca de la pipeline cubre ese caso, pero un revisor debería darle un ojo al montón de no deducibles porque algunos clientes piden y reciben una factura simplificada en la barra, y esa sí es deducible si lleva el NIF y los datos fiscales del establecimiento. Pasa el ojo por el montón antes de decidir que nada de ahí cuenta.

El segundo son las fechas en papel térmico desvaído. Un recibo térmico de hace tres meses ha perdido tinta en el centro de la fecha. La pipeline va a devolver una fecha con confianza, pero en una muestra desvaída el año es el campo más propenso a salir mal por un dígito. Repasa fechas en cualquier cosa anterior al trimestre en curso.

Las dos cosas son la revisión manual que ya vimos en el mismo enfoque de evaluación aplicado a una factura india con recibos térmicos de gasolinera, y el instinto vale aquí: la máquina lee la parte que odiarías teclear, el humano comprueba los tres números que cuestan dinero si están mal.

La comparación honesta con pegar el tiquet en ChatGPT

El atajo que muchas asesorías pequeñas usan en silencio es soltar la foto del móvil de un tiquet en una conversación con ChatGPT o Gemini y pedirle que extraiga los campos. Funciona con una factura impresa limpia. Falla de la misma manera que falla con bills indios, por las mismas razones: el mismo modo de fallo aparece cuando alguien pega un tiquet en ChatGPT. Sin conciencia del tipo de documento, sin salida CSV estructurada, sin garantía de privacidad para los datos del cliente, y con una tendencia silenciosa a inventarse un número cuando la impresión está desvaída. Pegar funciona una vez. No sobrevive a una carpeta de cincuenta tiquets con una fecha límite encima.

Una pipeline diseñada específicamente para el trabajo de recibos y facturas sabe qué es un tiquet, sabe qué necesita una factura simplificada para serlo, devuelve CSV con la forma que Holded espera, y no memoriza los datos del cliente dentro de un conjunto de entrenamiento. La lectura es la mitad fácil. La otra mitad es donde se va el tiempo en realidad.

Una nota sobre LatAm y clientes hispanos en EE. UU.

La misma pipeline lee una representación impresa del CFDI mexicano, una factura A o B argentina, una factura electrónica colombiana, una boleta chilena. El campo de identificador del proveedor vuelve como RFC, CUIT, NIT o RUT según corresponda, etiquetado para que la importación a Aspel, Alegra o Contabilium lo asigne a la columna correcta. La separación entre coma decimal y punto decimal, distinta entre España, México y la mayor parte de LatAm, se resuelve en el parseo, así que el CSV está siempre listo para importar.

Para las pymes hispanohablantes en EE. UU. con QuickBooks en español, el flujo es el mismo. Los recibos que un restaurante o una tienda con dueño hispano le pasa a su contable son los mismos tiquets térmicos, solo que con totales en dólares y una línea de impuesto estatal sobre ventas en lugar del IVA. La extracción devuelve la línea fiscal como sales_tax en vez de iva, y QuickBooks la importa como gasto fiscal.

Una sola pipeline, una sola forma de CSV, seis herramientas de contabilidad río abajo. El ahorro no está en cada documento aislado, está en no tener un proceso distinto por cliente. Si llevas un porfolio de veinte asesoramientos repartidos entre Holded, Aspel y Contabilium, el coste real es el cambio de contexto, no la lectura.

El equivalente francés, para quien tiene clientes a ambos lados de los Pirineos

Si tu cartera incluye facturas francesas (tiendas de Perpiñán que venden a clientes en Girona, freelancers de Toulouse facturando a una SARL barcelonesa), la lógica del NIF español tiene su gemelo exacto en el número de TVA intracomunitario francés. Ver la página equivalente en francés cubre el caso de la factura TVA con dos números intracomunitarios y la conciliación HT + TVA = TTC, que es el mismo músculo que cuadrar base + cuota = total aquí.

El punto de todo esto

La lectura no es la ventaja competitiva en 2026. Cualquier móvil lee un tiquet. La ventaja está en el juicio que viene después de leer: este es un tiquet y no una factura, a este le falta el NIF del cliente, este lleva una fecha fuera del plazo deducible, este tipo de IVA no encaja con la categoría del gasto. Ese es el trabajo al que los asesores fiscales dedican los sábados por la tarde, y es el trabajo que una pipeline o se lleva de la mesa o no.

La nuestra se llevó el tiquet de El Corte Inglés en menos de dos segundos, con una marca clara de que no debería contabilizarse como factura deducible. Esa es la línea que merece la pena citar.