What are custom parameters?
These are additional query string parameters added to tracking URLs, for example:
utm_source
utm_campaign
CID
These will help you organise and analyse performance at a granular level.
How do they work?
Custom parameters can be static or dynamic. A static parameter uses a hardcoded value, whereas a dynamic parameter uses search specific values, populated by a macro. For example:
Static 
utm_campaign=summer2025
Dynamic
utm_content=LHR-JFK (populated using a route code macro) 
Parameters are split into names and values. In the XML you’ll see a ‘param_pname’, followed by a ‘pvalue’ (utm_campaign and summer2025 respectively).
When you’re using a dynamic value, you’ll have a ‘query_param pname' followed by 'pvalue’. The value will be a macro rather than a static value. Macros values can be found below.
How to append custom parameters in Skyscanner Ad Manager
We use XML to build tracking strings in SAM. See an example below:
Static Values
<tracking> <add_params action="UPDATE"><original_request/> <param pname="partner" pvalue="XXXXX"/> <param pname="utm_source" pvalue="Skyscanner"/> <param pname="utm_medium" pvalue="ItineraryInlinead"/> <param pname="utm_campaign" pvalue="alwayson"/> </add_params> </tracking> 
Dynamic Values
<tracking> <add_params action="UPDATE"><original_request/> <param pname="partner" pvalue="XXXXX"/> <param pname="utm_source" pvalue="Skyscanner"/> <param pname="utm_medium" pvalue="ItineraryInlinead"/> <param pname="utm_campaign" pvalue="alwayson"/> <query_param pname="utm_content" pvalue="from_place.iata_city_id-to_place.iata_city_id"/> </add_params> </tracking> 
These macros are only used in the construction of dynamic XML strings. For example, passing route information in something like 'utm_content'. Please note that you need use "" on all values / names. For example:
Dynamic Route Tracking
<query_param pname="utm_content" pvalue="from_place.iata_id-to_place.iata_id"/>
| Purpose | Value | Description | 
| Origin | from_place.iata_id | 3 letter IATA code of an origin airport | 
| Destination | to_place.iata_id | 3 letter IATA code of a destination airport | 
| Origin Country | from_place.country_id | 2 letter IATA code of an origin country | 
| Destination Country | to_place.country_id | 2 letter IATA code of a destination country | 
| Start Date | date_out.day | Departure date day | 
| Start Month | date_out.month | Departure date month | 
| Start Year | date_out.year | Departure date year | 
| User Market | user.country_id | 2 letter code of a user market, as selected on Skyscanner website | 
| User Language | user.language_id | Code of a user language, as selected on Skyscanner website | 
| Origin Skyscanner City | from_place.iata_city_id | 3 letter IATA code of an origin city | 
| Destination Skyscanner City | to_place.iata_city_id | 3 letter IATA code of a destination city | 
| Return Date | date_back.day | Return date day | 
| Return Month | date_back.month | Return date month | 
| Return Year | date_back.year | Return date year | 
How to verify the tracking links and parameters are appended correctly
First we need to check if the ad deeplinks to the landing page correctly. Open a preview of your ad.
Click on the ad and check that the redirect functions as expected.
Now we want to make 100% sure we’re appending the UTMs.
- Click the CTA of the ad 
- Hit ESC to stop the redirect when you see this URL structure 
https://www.skyscanner.co.in/transport_deeplink/4.0/IN/en-GB/INR/........- Amend the URL to look like this (adding ‘g/redirect_api/’) 
https://www.skyscanner.co.in/g/redirect_api/transport_deeplink/4.0/IN/en-GB/INR/........- You will now see the deeplink in a debug view. This should show you the UTMs or other custom parameters appended to the end of the URL. Check that any macros are passing the expected values.