Turning raw contact data into a usable custom audience without leaking it.
ERR_AUDIENCE_NOT_READY · 2026-10-06
A scraped or purchased list is not an audience yet. Between the list and a paid campaign sit a few steps that are easy to get wrong.
The steps
Import contacts from a CSV and reject rows that don’t parse.
Enrich missing fields from a data provider.
Normalize and hash emails before they leave your system.
Upload to the ad platform as a custom audience.
Poll until the platform reports the audience as ready.
Rules worth enforcing
Decode untrusted input once at the boundary, then use the validated value.
Keep personal data out of analytics tables and logs.
Treat a platform as ready only after reading its state back.
Why code beats a spreadsheet here
Each step can fail on its own and be retried without redoing the others. When an upload is rejected, you want the failing row and the reason, not a vague error on a final screen.