Discovery queue open Typical turnaround: one working day The register Method Talk to a reviewer
subprocessor.org
Six sources. One reviewed list. Re-checked daily.See how the work flows →
Same engine, different job to be done.Compare the tiers →
We publish observations and dated records, never legal conclusions.Read the method →
Free to read. No account.Open the register →
the method, in full

Detection is arithmetic.
Judgement is a person.

Nothing about whether your list changed is decided by a model. We fetch, strip, hash and compare — and where that produces something ambiguous, a named reviewer resolves it before it reaches you. This page explains exactly how, because a compliance record you cannot check is worth very little.

every check, every day, in the same order

Four steps, and none of them guess.

The same sequence runs against your own stack and against every vendor in the register. It is deliberately boring, because boring is what makes a record defensible a year later.

step 01
Fetch

The page is retrieved politely, with the response code, byte count and timestamp recorded whether it succeeds or not.

step 02
Normalise

Everything that is not the list is removed by a versioned normaliser, so presentation churn can never look like a change.

step 03
Hash

Two hashes per check — one for the page, one for the set of named entities. Only the second one can raise an alarm.

step 04
Compare and classify

Added, removed, relocated, renamed, repurposed — or held for review. Every outcome is dated and written to the ledger.

step 02, in detail

Most of a page is noise.

A vendor edits their sub-processor page constantly without touching the list: a new cookie banner, a rebuilt template, a refreshed “last updated” date, rows reordered alphabetically. All of it is discarded before anything is compared.

This is why the alert you get means something. A watcher that fires on every edit gets muted inside a week, and then it protects nobody.

Removed before comparison normaliser 1.3.0
  • Navigation, headers and footers
  • Cookie and consent banners
  • Class names, inline styles, markup churn
  • “Last updated” stamps and CSRF nonces
  • Whitespace, non-breaking spaces, punctuation
  • Row order — the entity set is sorted before hashing
  • Duplicate rows for the same entity
What survives is a sorted set of named entities, their stated purpose and their stated country. That is the only thing we compare.
step 03, in detail

Two hashes, and only one of them can wake you up.

Page hash

never alerts

Covers the whole cleaned document. It moves whenever anything on the page moves, which is often and usually meaningless.

a91f77c3d1e8 → 77b0e4cc2a19
page changed · list did not

Kept because it tells us the vendor is still maintaining the page at all. Used for nothing else.

Entity hash

the only trigger

Covers the sorted set of named entities and their stated values. Order-independent by construction, so reshuffling rows changes nothing.

427b2945ef → 8e12721fbc
list changed · 28 → 29 entities

If this hash is unchanged, nothing is published, no matter how much of the page was rewritten.

how we know it works

We attack our own detector, on real pages.

Twenty real vendor pages, eight kinds of harmless edit applied to each, and a rule that none of them may produce a published change. Then five kinds of real movement, which all must be caught with the correct class.

0.6%of harmless edits produced an alert1 in 160
40%of a list moving sends it to reviewnever straight to publish
0models anywhere in the decisionfetch, strip, hash, compare

Our own measurements, run against live vendor pages. The harness and its numbers are re-run on every change to the detector.

Harmless edits we test with
  • Whitespace and indentation changes
  • A cookie banner injected
  • Class and style attribute churn
  • The “last updated” date refreshed
  • An analytics tag added
  • A CSRF nonce rotated
  • Rows reordered
  • Non-breaking space padding
Real movements we must catch
  • An entity added
  • An entity removed
  • A country changed
  • An entity renamed — matched, not reported as one in and one out
  • A mass removal — quarantined rather than published
where a person is required

Four things the arithmetic cannot settle.

These are the cases that make an automated feed untrustworthy, and they are the reason a named reviewer sits between the detector and you.

the same company, three names

“Amazon Web Services, Inc.”, “AWS” and “Amazon Web Services EMEA SARL” are one relationship or three, depending on the contract. A machine cannot tell which.

the page rebuild

A vendor moves to a new template and eighteen entities appear at once. That is not eighteen new sub-processors, and publishing it as such would be the most damaging thing we could do.

scope

A marketing tag on a website is not a sub-processor under your DPA. Deciding what actually touches customer data inside a product is a judgement, and we record who made it.

the acquisition

A vendor is bought and every entity is renamed on the same day. Rename matching catches most of it; a person confirms the rest before anyone is told their supply chain changed.

the record

Verify us rather than trust us.

Every check, change and decision is appended to a hash-chained ledger as it happens. Each row carries the hash of the row before it, so an entry cannot be altered or back-dated without breaking every row that follows.

The verification endpoint is public and unauthenticated. Anyone — you, your auditor, a customer of yours — can check a record without an account.

A single ledger row

public
row 0f31c8ad9e42
prev c7a4e1b09d33
at 2026-08-17T06:12:04Z
kind change.published
subject atlassian.com
payload sha256:8e12721fbc…

row_hash = sha256(prev_hash || timestamp || kind || subject || payload)

including what we cannot reach

We publish our own gaps.

A register that only reports its wins is not a register. Every page states how we read that business, and where we cannot, it says so rather than showing you something stale.

How the list is publishedShareWhat we doStatus
HTML table72%Read and compared entity by entity, dailyfull coverage
HTML list or prose12%Read with a confidence score shown on the pagefull coverage
PDF document9%Parsed on the same pipelinerolling out
Trust centre needing a browser5%Flagged on the page; forward the vendor’s notice and the record stays completein progress
Behind a customer login2%Marked no longer public, with the last public capture kept and datedby design
the line we do not cross

What we will never tell you.

This product could be built as an accusation engine. It is deliberately not.

  • That you are compliantWe publish observations and dated records. Whether they satisfy your obligations is a question for you and your counsel.
  • That a vendor is in breachWe do not write “undisclosed” and we do not infer intent. A page changed, on a date, and here is the evidence.
  • That a deadline is runningUnless it comes from a contract you gave us. Anything else is labelled as a standard-clause illustration.
  • Anything a model decidedModels may suggest a candidate page or draft a summary, both labelled. None can create, alter or suppress a record.

Now let us run it against your stack.

Free discovery, a named reviewer, and nothing published until you approve it.