Data warehouse integration

Documents to ClickHouse, at any volume

Holofin reads PDFs and scans and inserts every field into ClickHouse, so you can follow review rates and confidence across millions of documents.

Eléctrica del Turia S.A.
FACTURA DE ELECTRICIDAD
Nº factura: ET26-0981144
TitularLucía Navarro Gil
Dirección de suministroC/ de Sueca 41, 3º, 46006 Valencia
Periodo de facturación02/09/2026 a 01/10/2026
Fecha de emisión06/10/2026
Total a pagar84,37 €

✓7 fields loaded

!1 flagged for review

A utility bill read by Holofin and loaded into ClickHouse. Sample document; every name and number on it is invented.

How it works

  1. 1

    Connect ClickHouse once

    Create a role with insert rights on one schema and paste its credentials into Holofin. Holofin creates the table on the first load; nothing else in ClickHouse is visible to it.

  2. 2

    Send documents the way you already do

    Upload in the app, forward by email, or post to the API. Holofin classifies each file, splits bundles into documents and reads the fields of each type.

  3. 3

    Query the rows

    Each field lands as one row with its confidence, the page it came from and a needs_review flag. Join it to your own tables in ClickHouse like any other source.

How the ClickHouse connector writes

Holofin inserts over the ClickHouse HTTP interface in batches, with TLS, into a ReplacingMergeTree table keyed on document and field, so a correction replaces the previous value. It works with ClickHouse Cloud and with self-hosted servers reachable over HTTPS.

The only grant Holofin needs:

CREATE USER holofin_loader IDENTIFIED WITH sha256_password BY '...';
GRANT INSERT, SELECT ON extracted.document_fields TO holofin_loader;

The table Holofin writes

One row per field, so a new document type never changes the table. The same columns exist in every warehouse; types follow ClickHouse's own names.

extracted.document_fields
document_idSTRINGHolofin's identifier for the document, stable across reloads.
document_typeSTRINGThe class Holofin gave the document: supplier_invoice, payslip, bank_statement, and so on.
fieldSTRINGThe field name, in snake_case, as defined in your extraction schema.
valueSTRINGThe value as normalized text: ISO dates, dot decimals, IBANs without spaces.
confidenceFLOATBetween 0 and 1. How sure Holofin is of the value.
pageINTEGERThe page of the source file the value was read on.
bboxARRAY<FLOAT>Where on that page: x, y, width, height, as fractions of the page.
needs_reviewBOOLEANTrue when the confidence is low or a rule failed, such as a balance that does not add up.
reviewed_bySTRINGWho confirmed or corrected the value in Holofin, once someone has.
loaded_atTIMESTAMPWhen the row was written. Corrections write a new row; the latest wins.

Query it in ClickHouse

Review rate and median confidence per document type over 30 days, with countIf and quantile:

-- Review rate per document type over the last 30 days
SELECT
    document_type,
    uniqExact(document_id) AS documents,
    round(countIf(needs_review) / count(), 3) AS review_rate,
    quantile(0.5)(confidence) AS median_confidence
FROM extracted.document_fields FINAL
WHERE loaded_at >= now() - INTERVAL 30 DAY
GROUP BY document_type
ORDER BY documents DESC

Security

  • Documents are processed in Europe, on OVHcloud servers in France certified ISO 27001.
  • Holofin only ever writes to the schema you grant. It cannot read your other tables.
  • Retention of the source files in Holofin is set per organization, from zero data retention to indefinite. Rows in your warehouse follow your own policies.
  • GDPR: Holofin acts as your processor. No document leaves the European Union.

Frequently asked questions

Why FINAL in the queries?

The table is a ReplacingMergeTree: a corrected value replaces the old one when parts merge. FINAL applies the replacement at query time, so you always read the latest value.

Does it work with a self-hosted ClickHouse?

Yes, as long as the server is reachable over HTTPS from Holofin. Give it a user with INSERT and SELECT on the one table.

How quickly do fields appear in ClickHouse?

Within seconds of the document being read. Most documents are read in under a minute, so a file sent by email is usually queryable in ClickHouse a minute later.

What happens when a reviewer corrects a value?

Holofin writes a new row for that field with the corrected value, needs_review set to false and reviewed_by filled in. Keep the latest row per document and field to get the current state, or keep every row for a full audit trail.

Can I choose which fields are loaded?

Yes. Each document type has an extraction schema in Holofin. Add, rename or remove fields there and the next documents load with the new names. Nothing in the table structure changes.

Which documents does Holofin read?

Any business document sent as a PDF, a scan or a photo: invoices, payslips, bank statements, tax notices, company extracts, IDs, certificates. Holofin also checks each file for tampering and can flag a suspicious document before its fields are trusted.

Put Holofin on your own documents.

Every value linked to the page it came from, every PDF checked for tampering, rules checked across the whole file.

Holofin