← Back to projects

Adstack Activate

An advertiser uploads their customer list to Google and Meta so they can target the people they already know. The platforms hand back a match rate — say 58% — and the instinctive conclusion is that the platform's graph is thin.

Usually it isn't. Most of that gap is formatting. Both platforms want SHA-256 hashes of normalized identifiers, both publish what “normalized” means, and they don't agree with each other. Get it wrong and nothing errors — the number is just quietly lower, and the platform takes the blame.

This measures the difference. It's also the second half of a round trip: Adstack Sync pulls reporting data out of the platforms into a warehouse; this pushes an audience back into them. Same database, same tenant, opposite direction.

Everything on this page runs in your browser. Records are generated or parsed locally, normalized locally, hashed locally with Web Crypto, and matched locally. No identifier — raw or hashed — is transmitted. The server only ever receives counts. A SHA-256 of an email is still personal data under GDPR, so a public demo has no business storing one.

Onboard a customer list

Normalize it to a platform's documented rules, hash it, and see how much of it the platform can actually find.

Source

Target platform

Segment

LTV above $250 and no order in 90 days — the classic Customer Match use case.

0 records selected · 8 runs left today

Why normalization is not a detail

One customer, two hashes

Google's Customer Match spec requires stripping periods and +tags from Gmail addresses before hashing. Meta's documented normalization is trim and lowercase, and says nothing about either. Same person, same source row, different SHA-256.

Source record

The round trip

Ingestion and activation, same warehouse

Nothing in the warehouse yet. This page shares a tenant with Adstack Sync — run a sync there and come back, and the spend and conversions that paid for these customers will appear here alongside them.

Open Adstack Sync →