Skip to main content

Migrating audiences

AdCP 3.0 rc.1 promotes external_id from a value in the uid-type enum to a required top-level field on AudienceMember. Every audience member must now have a buyer-assigned stable identifier plus at least one matchable identifier.

What changed

AudienceMember schema

Two requirements enforced by the schema:
  1. external_id is required — buyer-assigned stable identifier (CRM record ID, loyalty ID)
  2. At least one matchable identifier — hashed_email, hashed_phone, or uids array

Before and after

beta.3 — external_id as a uid-type entry:
test=false
rc.1 — external_id as required top-level field:
test=false

uid-type enum

The uid-type enum no longer includes external_id. Current values:

Why the change

Separating external_id from the uid-type enum makes the buyer’s stable identifier explicit. It enables:
  • Deduplication — Remove duplicate members across syncs by external_id
  • Targeted removal — Remove specific members without re-uploading the full list
  • Cross-referencing — Correlate audience membership with buyer CRM systems
CDPs that don’t natively assign IDs can derive one (e.g., hash of the member’s identifiers).

Sync audiences

sync_audiences uses delta operations (add/remove) per audience. Members are identified by external_id for removal:
test=false

Migration steps

1

Extract external_id from uids

Move any { "type": "external_id", "value": "..." } entry from the uids array to the top-level external_id field.
2

Ensure every member has external_id

If members don’t have a buyer-assigned ID, derive one (e.g., hash of identifiers). The schema requires external_id on every member.
3

Keep at least one matchable identifier

Every member must also have at least one of hashed_email, hashed_phone, or uids. This is enforced by the schema’s anyOf constraint.
4

Update removal logic

When removing members via sync_audiences, use external_id as the stable key. The member still needs a matchable identifier in the remove array.
5

Validate against schema

Run member objects against audience-member.json schema. It enforces both external_id (required) and the matchable identifier constraint.

Signals Protocol

Full reference for signal discovery, activation, and pricing models.

Related: Brand identity | Optimization goals | AdCP 3.0 overview