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.
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}).
{variable}| Macro | Replacement | Description |
|---|---|---|
{episodeId} | Episode GUID | Unique identifier for the episode |
{podcastId} | Podcast ID | Unique identifier for the podcast |
{ip} | IP address | Raw IP address of the listener |
{hash} | User hash | Unique 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 timestamp | Request time in ISO format (e.g., 2026-01-27T15:30:00.000Z) |
{random} | ULID | Random ULID for cache-busting/deduplication |
{epoch} | Unix timestamp | Unix timestamp in seconds |
{userAgent} | User agent | URL-encoded user agent string |
{ua} | User agent | URL-encoded user agent string (alias for {userAgent}) |
{campaignId} | Campaign ID | Unique identifier for the campaign |
{campaignName} | Campaign name | Campaign name, URL-encoded. Falls back to the campaign id when the name is missing. |
{episodeName} | Episode title | Episode title, URL-encoded. {episodeTitle} is the same field. |
{podcastName} | Podcast title | Podcast title, URL-encoded. {showName} is the same field. |
{rss_url} | RSS URL | Podcast RSS feed URL, URL-encoded. Curly form only on RSS and DAI today. |
{podcastGenre} | Podcast categories | Podcast categories, comma-joined and URL-encoded. {showGenre} is the same field. |
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.
| Macro | Replacement | Description |
|---|---|---|
{GAID} | Android advertising ID | The UUID when the context type is Android (gaid). Empty when the type is iOS or when no ID is present. |
{IDFA} | Apple advertising ID | The UUID when the context type is Apple (idfa). Empty when the type is Android or when no ID is present. |
{advertisingId} | Either supported device ID | The UUID when a supported device ID is present. Empty otherwise. |
{IFA} | Device ID, or -1 / -2 | The 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 / -2 | dpid when a device-provided ID is present. -1 when unavailable. -2 when withheld. Same restriction-wins rule as {IFA}. |
{LIMITADTRACKING} | 1 / 0, or empty | 1 when tracking is restricted, 0 when it is explicitly not restricted. Empty when the restriction is unknown. Empty is not an assertion of permission. |
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 name | Meaning |
|---|---|
gaid, aaid | Android advertising ID. Must be a nonzero UUID. |
idfa | Apple advertising ID. Must be a nonzero UUID. |
lsid | Typed listener ID: gaid:<UUID> or idfa:<UUID> (also aaid: / adid:). An untyped lsid is not a mobile advertising ID. |
rdid | Resettable device ID. Requires a recognized idtype or advertisingIdType (gaid, aaid, adid, or idfa). |
ifa, advertising_id | Generic device ID. Accepted only with an explicit recognized idtype or advertisingIdType. CamelCase advertisingId is the same incoming field. |
uids | JSON 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, limitAdTracking | Tracking 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, advertiserId | Not treated as mobile advertising IDs. |
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.
https://tracker.com/pixel?ep={episodeId}&ip={ip}&cb={random}https://attribution.example.com/pixel?podcast={podcastId}&episode={episodeId}&ip={ip}&hash={hash}&ts={epoch}&ua={userAgent}&cb={random}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.
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.
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=1Tracking 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=1User-Agent, X-Forwarded-For, and X-Device-Ip headers with listener information%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.${GAID}, ${IFA}, and ${IFATYPE} stay intact. They are TCF-style tokens, not advertising macros.© 2024 Flightcast. All rights reserved.