Skip to content

Tracking Pixels

Tracking pixels fire on an artist's smart link pages so ad platforms can attribute traffic and build retargeting audiences. Pixels are attached to an artist and apply across that artist's links.

Unlike opt-ins, pixels are fully read/write through the API.

Supported providers

The provider value is validated on insert. These are the accepted values:

providerPlatform
FacebookMeta (Facebook / Instagram)
TikTokTikTok
GoogleGoogle
AdWordsGoogle Ads
TwitterX / Twitter
SnapchatSnapchat

Values are case-sensitive. Anything else is rejected with permission-error.

Listing pixels

graphql
query Pixels($artist_id: uuid!) {
  pixels(where: { artist_id: { _eq: $artist_id } }) {
    id
    provider
    pixel
    conversion_tag
    artist_id
    agency_id
  }
}

Fields

FieldTypeDescription
iduuid!Pixel ID.
artist_iduuidArtist whose links fire this pixel.
providerStringOne of the supported values above.
pixelStringThe pixel/tag ID from the ad platform.
conversion_tagStringConversion label or event tag, where the platform uses one.
access_tokenStringAPI token for server-side conversion reporting, e.g. Meta's Conversions API.
agency_iduuidSet when an agency, rather than the artist's own account, owns the pixel.

WARNING

access_token is a live credential for the ad platform. It is readable through this field, so treat any response containing it as a secret: do not log it, do not cache it in a browser, and do not expose it to client-side code.

Adding a pixel

graphql
mutation AddPixel($pixel: pixels_insert_input!) {
  insert_pixels_one(object: $pixel) {
    id
    provider
    pixel
    artist_id
  }
}

Variables:

json
{
  "pixel": {
    "artist_id": "3aad8009-a307-4429-a586-8b3dbe39cdda",
    "provider": "Facebook",
    "pixel": "1234567890123456"
  }
}

Insertable columns: artist_id, agency_id, provider, pixel, conversion_tag, access_token.

Two conditions must hold or the insert is rejected: the artist must be one you manage (or agency_id must be your own user ID), and provider must be a supported value.

With a server-side conversions token

json
{
  "pixel": {
    "artist_id": "3aad8009-...",
    "provider": "Facebook",
    "pixel": "1234567890123456",
    "access_token": "EAAG...",
    "conversion_tag": "Lead"
  }
}

Updating a pixel

graphql
mutation UpdatePixel($id: uuid!, $changes: pixels_set_input!) {
  update_pixels_by_pk(pk_columns: { id: $id }, _set: $changes) {
    id
    provider
    pixel
    conversion_tag
  }
}

Updatable columns: pixel, conversion_tag, access_token.

provider and artist_id cannot be changed after creation — delete the pixel and create a new one instead.

Removing a pixel

graphql
mutation DeletePixel($id: uuid!) {
  delete_pixels_by_pk(id: $id) {
    id
    provider
  }
}

The pixel stops firing immediately. Data already collected by the ad platform is unaffected — it lives on the platform side.

Agency pixels

An agency managing several artists can own a pixel directly by setting agency_id to its own user ID. Agency-owned pixels are visible to the agency across every artist it manages:

graphql
query AgencyPixels($agency_id: uuid!) {
  pixels(where: { agency_id: { _eq: $agency_id } }) {
    id
    provider
    pixel
    artist { id name }
  }
}

Your visibility rule is: pixels for artists you manage, or pixels whose agency_id is you.

Domain verification

Meta and Google require the domain serving your links to be verified before conversion events are attributed. Set the verification tokens on the domain record first — see Domain verification — then attach the pixel.

Pixels on vibe.to and listen.to work without this, since those domains are already verified by ArtistHub.

Auditing coverage

Find artists with no pixel configured:

graphql
query Coverage {
  artists {
    id
    name
    pixels { id provider }
  }
}

An empty pixels array means that artist's links are not reporting to any ad platform.

ArtistHub developer documentation