Flightcast
Sign in →

Flightcast Pixel Tracking

Pixel Tracking URL Macros

This document describes the available macros for pixel tracking URLs in the Flightcast podcast hosting platform.

The same request-time macro set listed below is also available in audio campaign VAST URL templates when Flightcast resolves the tag on delivery. VAST tracking and device-ID behavior for resolved tags is described separately in this guide.

Overview

Pixel tracking URLs are hit with HTTP GET requests when a listener reaches the part of a file or playlist that contains an ad.

These pixels are not placed on the public website or in the RSS document itself.

They fire from Flightcast after the delivery trigger on byte-stream downloads and streams, and on HLS (audio and video). They are not limited to the stream of an mp3 file.

We support all standard podcast hosting company pixels (Podscribe, Magellan, etc).

As well as DCM/website tracking pixels (1x1 image files).

Please ensure that you are using precisely one of these two, and that no additional fields are required, as this document details the maximum supported macros from Flightcast.

When the pixel url is hit, Flightcast supports dynamic macro replacement at request time.

All supported macros are listed below.

Please remove any macros we do not support from your Pixel URL before submitting to Flightcast.

This includes any GDPR_CONSENT_STRING replacements or otherwise - as these are not currently supported.

The standard fields below are for advertiser / host-read pixels. Device advertising-ID macros use the same names and also apply to VAST tracking and HLS pixels. They are not added automatically to every upstream VAST request URL. The same field names are accepted as {name}, %%name%%, and [NAME]. Names are case-insensitive. ${GAID}, ${IFA}, and ${IFATYPE} stay intact: dollar-brace is TCF-style, not an advertising macro.

{rss_url} is curly-only on RSS and DAI today. Aliases of the identity set ({showId} = {podcastId}, {contentguid} = {episodeId}, {cachebuster} = {random}, {listenerId} = {hash} on RSS / DAI) are not additional fields.

A device advertising ID (GAID or IDFA) is not Flightcast's listener ID ({hash} / {listenerId}) and is not an advertiser or campaign ID ({campaignId}).


Standard Format: {variable}

MacroReplacementDescription
{episodeId}Episode GUIDUnique identifier for the episode
{podcastId}Podcast IDUnique identifier for the podcast
{ip}IP addressRaw IP address of the listener
{hash}User hashUnique IAB-compliant identifier for the listener. This is Flightcast's listener ID, not a device advertising ID. {listenerId} is the same field on RSS / DAI.
{timestamp}ISO timestampRequest time in ISO format (e.g., 2026-01-27T15:30:00.000Z)
{random}ULIDRandom ULID for cache-busting/deduplication
{epoch}Unix timestampUnix timestamp in seconds
{userAgent}User agentURL-encoded user agent string
{ua}User agentURL-encoded user agent string (alias for {userAgent})
{campaignId}Campaign IDUnique identifier for the campaign
{campaignName}Campaign nameCampaign name, URL-encoded. Falls back to the campaign id when the name is missing.
{episodeName}Episode titleEpisode title, URL-encoded. {episodeTitle} is the same field.
{podcastName}Podcast titlePodcast title, URL-encoded. {showName} is the same field.
{rss_url}RSS URLPodcast RSS feed URL, URL-encoded. Curly form only on RSS and DAI today.
{podcastGenre}Podcast categoriesPodcast categories, comma-joined and URL-encoded. {showGenre} is the same field.

Device advertising ID macros

A player or upstream host must supply a usable typed device ID. Ordinary RSS requests do not universally expose GAID or IDFA. Opaque LiSTNR fields have not been verified as GAID or IDFA.

These outgoing macros use the same {name}, %%name%%, and [NAME] formats. Incoming query names from players are documented separately below. They are not the same as these outgoing macros.

A supplied GAID or IDFA is optional metadata. It does not replace Flightcast's listener ID ({hash} / {listenerId}) and it does not change download counts, ad eligibility, or frequency budgets.

VAST tracking macros use the advertising context captured with the winning ad decision. A later request with a different ID, or with no ID, reuses that decision. It does not create a new personalized decision and it does not replace the captured context. A cached decision that never captured a context leaves those VAST advertising macros unavailable.

Host-read pixels and standalone callbacks use the request that fires them.

IDs are substituted only where the pixel or tracker template already contains a supported macro. They are not appended to every provider URL.

MacroReplacementDescription
{GAID}Android advertising IDThe UUID when the context type is Android (gaid). Empty when the type is iOS or when no ID is present.
{IDFA}Apple advertising IDThe UUID when the context type is Apple (idfa). Empty when the type is Android or when no ID is present.
{advertisingId}Either supported device IDThe UUID when a supported device ID is present. Empty otherwise.
{IFA}Device ID, or -1 / -2The ID when present. -1 when unavailable (no ID and not withheld). -2 when withheld (limitAdTracking is true). Restriction wins even if an ID is present.
{IFATYPE}dpid, or -1 / -2dpid when a device-provided ID is present. -1 when unavailable. -2 when withheld. Same restriction-wins rule as {IFA}.
{LIMITADTRACKING}1 / 0, or empty1 when tracking is restricted, 0 when it is explicitly not restricted. Empty when the restriction is unknown. Empty is not an assertion of permission.

Incoming query conventions

Players and upstream hosts send device IDs as request query parameters. Those incoming names are not outgoing pixel macros. Flightcast never invents a device ID from IP, user agent, the Flightcast listener ID, or a generated UUID.

Incoming nameMeaning
gaid, aaidAndroid advertising ID. Must be a nonzero UUID.
idfaApple advertising ID. Must be a nonzero UUID.
lsidTyped listener ID: gaid:<UUID> or idfa:<UUID> (also aaid: / adid:). An untyped lsid is not a mobile advertising ID.
rdidResettable device ID. Requires a recognized idtype or advertisingIdType (gaid, aaid, adid, or idfa).
ifa, advertising_idGeneric device ID. Accepted only with an explicit recognized idtype or advertisingIdType. CamelCase advertisingId is the same incoming field.
uidsJSON array of objects. An entry is used only when source is gaid, aaid, adid, or idfa and id is a valid UUID. Domain-based sources and atype alone do not establish a mobile platform.
lmt, is_lat, limitAdTrackingTracking restriction. Accepts true / false and 1 / 0. An explicit restrict wins. Bare lat is not a tracking-permission flag (it is used with longitude).
id, cra_id, device_id, listenerId, advertiserIdNot treated as mobile advertising IDs.

Where advertising-ID macros fire

  • Byte-stream: host-read / baked-in advertiser pixels, and VAST tracking pixels from the ad decision.
  • HLS: video, audio, audio-split, and zone pixels.
  • Upstream VAST request templates: only macros already present in the configured template are replaced. Flightcast does not automatically append advertising IDs to SoundStack URLs or every provider URL.
  • Megaphone and Spotify callbacks: the impression callback URL Flightcast generates does not include device-ID placeholders. If an upstream host later hits the campaign pixel and forwards typed query params, advertiser pixels receive those IDs.

Encoded macros

Slack, email, and some ticketing tools encode braces. {name} becomes %7Bname%7D, [NAME] becomes %5Bname%5D, and %%name%% becomes %25%25name%25%25. A second encoding pass turns those into %257Bname%257D and the matching twins.

Fire-time substitution only matches the literal forms {name}, %%name%%, and [NAME]. Encoded tokens are sent as-is, so partners see leftover macros.

In the campaign pixel URL field, use Decode braces. That action is explicit and does not run when you save. It rewrites complete unwrapped encoded tokens back to the literal forms. Wrapped or mixed tokens ({{name}}, ${name}, %7Bname}, {%7Bname%7D}) stay as-is so leftover delimiters are not hidden.


Examples

Basic tracking pixel

https://tracker.com/pixel?ep={episodeId}&ip={ip}&cb={random}

Full attribution tracking

https://attribution.example.com/pixel?podcast={podcastId}&episode={episodeId}&ip={ip}&hash={hash}&ts={epoch}&ua={userAgent}&cb={random}

Android advertising ID

When the player supplies an Android ID 11111111-2222-4333-a444-555555555555 and no tracking restriction:

https://tracker.example/pixel?gaid={GAID}&idfa={IDFA}&device={advertisingId}&ifa={IFA}&ifatype={IFATYPE}&lmt={LIMITADTRACKING}
https://tracker.example/pixel?gaid=11111111-2222-4333-a444-555555555555&idfa=&device=11111111-2222-4333-a444-555555555555&ifa=11111111-2222-4333-a444-555555555555&ifatype=dpid&lmt=

{IDFA} is empty because the context type is Android. {LIMITADTRACKING} is empty because the restriction is unknown.

iOS advertising ID

When the player supplies an Apple ID aaaaaaaa-bbbb-4ccc-8ddd-eeeeeeeeeeee and limitAdTracking=false:

https://tracker.example/pixel?gaid={GAID}&idfa={IDFA}&device={advertisingId}&ifa={IFA}&ifatype={IFATYPE}&lmt={LIMITADTRACKING}
https://tracker.example/pixel?gaid=&idfa=aaaaaaaa-bbbb-4ccc-8ddd-eeeeeeeeeeee&device=aaaaaaaa-bbbb-4ccc-8ddd-eeeeeeeeeeee&ifa=aaaaaaaa-bbbb-4ccc-8ddd-eeeeeeeeeeee&ifatype=dpid&lmt=0

{GAID} is empty because the context type is Apple.

Missing and withheld values

No device ID and no restriction: {IFA} and {IFATYPE} are -1. {GAID}, {IDFA}, {advertisingId}, and {LIMITADTRACKING} are empty.

https://tracker.example/pixel?gaid=&idfa=&device=&ifa=-1&ifatype=-1&lmt=

Tracking withheld (limitAdTracking=true) with no ID: {IFA} and {IFATYPE} are -2. {LIMITADTRACKING} is 1.

https://tracker.example/pixel?gaid=&idfa=&device=&ifa=-2&ifatype=-2&lmt=1

Tracking withheld while an Android ID is still present: {GAID} and {advertisingId} keep the UUID. {IFA} and {IFATYPE} are still -2 (restriction wins).

https://tracker.example/pixel?gaid=11111111-2222-4333-a444-555555555555&idfa=&device=11111111-2222-4333-a444-555555555555&ifa=-2&ifatype=-2&lmt=1

Technical Notes

  • HTTP Method: Pixel tracking uses GET requests (industry standard for services like Magellan, Chartable, Podtrac, etc.)
  • URL Encoding: Host-read macros such as user agent and titles are automatically URL-encoded. Advertising ID UUIDs are substituted as lowercase UUIDs without extra encoding.
  • Validation: Invalid URLs after macro replacement are filtered out and logged
  • Headers: Requests include User-Agent, X-Forwarded-For, and X-Device-Ip headers with listener information
  • Encoded macros: %7Bname%7D and the percent / bracket twins are not expanded at fire time. Use literal {name}, %%name%%, or [NAME], or the campaign Decode braces action. Decode does not run on save.
  • Dollar-brace: ${GAID}, ${IFA}, and ${IFATYPE} stay intact. They are TCF-style tokens, not advertising macros.

© 2024 Flightcast. All rights reserved.