BuyerClear
Write to us

Security and data handling

What BuyerClear stores, how it is protected, who can reach it, and what leaves your shop.

Updated 7 September 2026. This page describes the latest pilot version. Report a security issue to security@buyerclear.com.

Where everything runs

BuyerClear’s application and separate Registry service run on Cloudflare Workers. D1 holds application records, R2 holds uploaded documents, Workers AI reads documents and Cloudflare Email sends messages. Buyer-facing pages load no analytics or third-party scripts. The Registry Worker alone calls enabled official-source endpoints.

What is stored, and how

Buyer names, contact details, credential numbers, uploaded files and full evidence payloads are encrypted in application storage, with AES-256-GCM under a key held as a Worker secret. Each field is sealed to its own scope, so a ciphertext lifted from one shop’s business name cannot be opened as another shop’s email: the scope is bound into the encryption itself, and a mismatch fails rather than returning something plausible.

DataHow it is held
Business name, contact name, contact emailEncrypted per field and per shop.
Credential number, holder name and professional licence detailsEncrypted. The number is never stored in the clear.
The uploaded documentEncrypted object in R2, deleted on the shop’s retention schedule.
Reading and registry resultsFull payloads are encrypted. Source identifiers, query times, status and expiry used for scheduling are stored separately without application-level encryption.
Shopify access tokensEncrypted, never logged, never returned by any page.
Lookup and operational metadataKeyed hashes for email and credential lookups; shop and record identifiers, jurisdiction, status, expiry and processing times are not field-encrypted. This metadata may still relate to a person.
Decisions and the audit trailKept after the document is deleted, because the record of who decided what has to outlive the evidence.

The audit trail

Audited actions are recorded as events, and each event carries the hash of the one before it. A missing or altered event breaks the chain, and the page that renders the history refuses to show a broken one rather than quietly skipping the gap. The database enforces that an event can have only one successor, so two things happening at once cannot fork the record.

Who can see what

What we ask Shopify for

Of Shopify’s protected customer data, BuyerClear requests a single field: the customer email, used to attach an existing store customer to the company it creates. Name, phone and address are not requested. The scopes it holds are listed in the documentation, each with what it is used for.

What we send to registries

The application sends the Registry Worker the credential number, kind and jurisdiction, plus the licence class and issuing authority for scoped professional checks. The Worker receives no name, email, document, shop identity or application identifier. It has no database or object-store binding, does not persist lookup bodies or results, returns Cache-Control: no-store and keeps credential values out of logs. An enabled official endpoint receives only the fields needed for that lookup.

Logs

Nothing that identifies a buyer is logged: not the document, not what was read out of it, not a credential number, not a token. Unexpected server failures log a route with private references removed and bounded error classifications. Raw exception messages and provider response bodies are omitted.

Retention and erasure

Abuse and availability

The pages a buyer reaches without signing in are rate limited by address: five submissions and thirty status views a minute. Uploads are capped at 10 MB and the file type is decided by the file’s own signature, not by what the browser claims. A registry that is slow or unreachable never blocks a decision; it becomes a flag for a person.

What we do not do

Reporting a problem

Write to security@buyerclear.com. Describe what you found and how to reproduce it. We answer, and we say what we changed.