← Selected work

Data foundation

Client Identity & Data Quality Layer

A reusable client directory that resolves inconsistent identities and gives downstream reporting a dependable foundation.

  • Python
  • Streamlit
  • PostgreSQL
  • Google Sheets
2026

How it resolves

Every system spells the client differently

Every system writes the client down in its own dialect. The layer takes each line as it arrives, applies the same ladder of checks, and either lands it on an existing record or stops and asks a person.

Pick a line as it arrives

What the layer checks

  1. 01Source identifier

    Tax ID, IBAN or the system’s own key, matched exactly against what the record already holds.

  2. 02Normalised name

    Case, punctuation, spacing and legal form are removed, then the remaining string is compared.

  3. 03Known alias

    Every spelling ever accepted stays on the record, so the same line matches instantly the next time.

  4. 04Human review

    Anything under the threshold stops here. Nothing is guessed, and the decision becomes a new alias.

The tax ID is already on the record, so the spelling never has to be argued about.

What comes out

CL-000148Meridian FoodsMatched automatically
Legal name
Meridian Foods LLC
Tax ID
35217049
Sources
3 systems
Owner
Finance
Known spellings
  • ТОВ «Меридіан Фудс»
  • меридіан фудс
  • MERIDIAN FOODS LLC
  • Meridian Foods

Why it sits underneath

Speed, automation and AI are multipliers

Applied to data nobody trusts, they only return the wrong answer faster. Every one of them is standing on the same thing, and it is never the tooling.

Fig. 1 — what is standing on what

Three versions of the same number.

Nothing above stops. The report still renders, the invoice still goes out, the assistant still answers in full sentences — each of them about a different number.

The business running on it

A price agreed, an invoice sent, a forecast signed off, a headcount planned. Each one is a number somebody trusted enough to act on.

AI & assistants

Only ever as right as the rows they read. On duplicates they do not hesitate — they answer wrongly, fluently, and in full sentences.

Automation

The invoice, the report and the reminder all have to reach the same client. One mismatch and they quietly stop doing so.

Reporting & decisions

One client should be one line. Three lines is not a formatting problem, it is a pricing decision made on the wrong number.

Data you can stand on

One record per thing, every spelling mapped onto it, every exception owned by a named person. Nothing above this can be better than this.

What one record gives back

  • Maintains itselfEvery accepted decision is written back as an alias, so the same spelling is never reviewed twice.
  • Correctable in minutesA wrong match is one click to undo, with the history kept — not a migration.
  • Reused, not rebuiltReporting, billing and automation read the same directory, not three private lists.

What it changed

The same client, with and without the layer

The source systems do not change. What changes is whether they are all talking about the same client — and whether anyone can prove it.

The same client, resolved without the identity layer and with it
What changesWithout the layerEvery flow resolves clients on its ownWith the layerOne directory, reused everywhere
Who the client isWithout the layerEach report rebuilds its own list of client names, and no two lists agreeWith the layerOne canonical record with one ID, read by every flow that needs it
A client renames or re-registersWithout the layerSilently becomes a second client, and the history splits in twoWith the layerBecomes one more alias on the record the history already sits on
Joining two systemsWithout the layerMatched on name — whatever fails to match is quietly droppedWith the layerMatched on identifiers, and every miss is queued rather than lost
A wrong matchWithout the layerFound months later, inside a number nobody can explainWith the layerStops in review before it ever reaches a report, and is undone in one click
Adding a new sourceWithout the layerAnother mapping table, maintained by whoever happened to build itWith the layerThe source registers its own identifiers against records that already exist
Automation and AI on topWithout the layerConfident answers assembled from duplicates, with no way to noticeWith the layerAnswers that trace back to a row with an owner and a decision behind it
If your systems disagree about who the client is, let’s talk.