ravn
Guide

Hashed email audiences, without the mystery.

A hashed audience is a list of your customers' email addresses turned into SHA-256 fingerprints, which ad platforms match against their own users. Hashing hides the raw addresses in transit, but it is pseudonymisation, not anonymisation, so you still need consent and a lawful basis.

By Ravn · 3 November 2026

Start free: 1,000 lookups Read the docs

The basics

What is a hashed customer list?

Ad platforms let you upload a list of people you already have a relationship with, so you can show them ads, exclude them, or find similar people. Meta calls these custom audiences; Google calls the feature Customer Match. Instead of uploading plain addresses, you upload a hash of each one.

A hash is a fixed-length fingerprint produced by a one-way function. SHA-256, the function these platforms use, always turns the same input into the same 64-character hex string, and a tiny change in the input produces a completely different output. The platform hashes its own users' addresses the same way and looks for matching fingerprints.

Getting it right

Why do normalisation rules matter so much?

Because the hash only matches if the input is exactly the same, character for character. Jane@Acme.com and jane@acme.com are the same mailbox but produce different hashes. So both sides agree to normalise addresses before hashing:

  • Trim leading and trailing spaces.
  • Lowercase the whole address.
  • Google only: for gmail.com and googlemail.com addresses, remove the dots in the part before the @, because Gmail ignores them. jane.doe@gmail.com becomes janedoe@gmail.com before hashing.

Get one rule wrong and those rows simply do not match. Nothing errors; your audience is just smaller than it should be. Check each platform's current documentation before an upload, since the rules are theirs to change.

Keep the hashes in a consistent form too: SHA-256 output written as lowercase hex. Do not hash an address twice, and do not hash a column that has already been hashed by another tool. A double-hashed row looks fine and matches nothing.

It also pays to clean the list first. Hashing a typo produces a perfectly valid hash that matches nobody. Running the list through an email verification API removes dead and mistyped addresses before they waste rows.

Privacy

Is a hashed email anonymous?

No. This is the most common misunderstanding. A hash of an email address is pseudonymised data: it no longer shows the address, but anyone with a list of addresses can hash them and see which ones match. That is exactly what the ad platform does. Email addresses are not random enough to be protected by hashing alone, so a determined party can often reverse common ones by guessing.

Under laws like the GDPR, pseudonymised data is still personal data. All the usual rules apply: you need a lawful basis to process it, you need to have told people how their data is used, and you must honour objections and deletion requests. Hashing reduces risk in transit and storage. It does not change what you are allowed to do.

Consent

What consent do you need to upload a customer list?

The platforms' own terms require that you have the right to share the data for advertising, which usually means the people on the list are your customers or subscribers and your privacy notice covers ad matching. In many places, including the EU and UK, using personal data for targeted advertising needs consent. In US states with privacy laws, sharing data for cross-context behavioural advertising can trigger opt-out rights.

In practice: only upload people who gave you their address directly, whose consent or notice covers this use, and who have not opted out. Remove unsubscribes and deletion requests before every upload. Never upload bought or scraped lists. The compliance page covers how Ravn handles opt-outs, and the compliance guide explains the main laws.

Build one

How do you build a hashed audience file?

The Ravn CLI normalises and hashes the column on your own machine. Nothing is uploaded to Ravn.

# Optional: verify first, then keep only valid addresses
npx ravn enrich leads.csv --tool validate_email --column Email
npx ravn audience leads.enriched.csv --column Email --format meta --only-valid

# Meta custom audience file
npx ravn audience leads.csv --column Email --format meta

# Google Customer Match file
npx ravn audience leads.csv --column Email --format google
Routine

What is a safe end-to-end routine?

  1. / 01

    Start from first-party data

    Export customers or subscribers who gave you their address and whose consent or notice covers advertising.

  2. / 02

    Remove opt-outs

    Drop unsubscribes, objections and deletion requests before anything else.

  3. / 03

    Verify

    Optionally run validate_email over the list so typos and dead mailboxes do not take up rows.

  4. / 04

    Hash locally

    Run npx ravn audience with the format for your platform. The plain addresses never leave your machine.

  5. / 05

    Upload and delete

    Upload the hashed file to the ad platform, then delete local copies you no longer need.

What it is not

Does Ravn sell or supply ad audiences?

Not as ready-made lists. Ravn doesn't sell bulk lists of people, and mobile advertising ID audiences aren't available yet. The audience command only reshapes and hashes a file you already have, on your own computer. Your list is your data, and the consent behind it is yours to manage.

FAQ

Common questions.

All questions →

Which hash function do Meta and Google use for customer lists?

SHA-256, applied to the normalised address and written as a lowercase hex string.

Why did only part of my customer list match?

Many people use a different email for the ad platform than the one they gave you. Normalisation mistakes, such as uppercase letters or stray spaces, also stop rows from matching.

Does hashing make an email list GDPR-exempt?

No. Hashed emails are pseudonymised personal data. You still need a lawful basis, a clear notice, and a way to honour objections and deletions.

Does the audience command send my list to Ravn?

No. It normalises and hashes the column on your machine and writes a file for you to upload to the ad platform yourself.