Adform is a global advertising technology platform that provides tools for ad serving, campaign management, audience building, and conversion tracking across web and in-app environments. Its Site Tracking product records visitor activity on advertiser websites through tracking points, which Adform uses for conversion attribution, audience building, and retargeting. The Server-Side Tracking API lets advertisers send conversion, page, and custom events directly to Adform server-to-server, without loading a tracking script in the user's browser. Events are attributed and added to audiences based on the identifiers passed with each request, such as Adform's cookie ID and extended IDs.
Product Type: Advertising
Integration Type: Starter Kit & ID Sync
Event Source Type: Web
Event Scope: Full-Funnel Events
- Sends identify, page, product, cart, checkout, and order lifecycle events to Adform as server-side tracking points.
- Attaches the Adform cookie ID collected by the Adform sync so conversions can be attributed to Adform campaigns.
- Sends the customer's user ID as an extended ID to support audience building and retargeting.
- Passes order details such as order ID, sales value, currency, basket size, and product-level data through Adform custom variables.
- Forwards user IP address and user agent so Adform can derive geo and device information, including Cookieless Insights reporting.
- Passes TCF and GPP consent signals when available.
- Batches up to 20 tracking points per request.
- Events without the Adform cookie ID are filtered out and not sent to Adform. The cookie ID is required for conversion attribution and retargeting.
- The Adform sync captures the cookie ID from the
adfcookieid landing page URL parameter. The advertiser must configure Adform's __ADFUID__ macro in their Adform campaign (URL Append Rules) so the cookie ID is added to the landing page URL on ad click.
- Adform cookie IDs are 19-digit values that can be negative. They must be passed as strings without rounding or truncation.
- Collection of first-party identifiers must be enabled on the advertiser's Adform account.
- When an event includes a
userId, it is sent as an extended ID with a person-based ID type (atype 3). Events without a userId do not send extended IDs.
- The extended ID source is a placeholder (
ADD_YOUR_EID_SOURCE_HERE) that must be replaced in the playbook for each deployment. The source identifies who issued the ID and is expressed as a domain. Because the kit sends the advertiser's own user ID, the source is typically the advertiser's website domain (e.g., advertiser.com). If the ID comes from a third-party ID provider, use that provider's source value from Prebid's list of ID providers. Confirm the source value with your Adform representative before deploying.
- Extended IDs are optional but recommended. They support audience building and retargeting but are not a standalone attribution identifier. Retargeting and scaling with an advertiser's own ID depends on ID Fusion being enabled in the buyer's DSP campaign.
- Identify events are sent to Adform as tracking points and carry gender, country, and the user ID extended ID.
- The tracking point name is derived from the event. Track events use the event name in lowercase with spaces replaced by underscores (e.g., Order Completed becomes
order_completed). Page and identify events use the event type. If no name can be derived, the page URL is used.
gdpr is set to 1 only when a TCF consent string is present, and the string is sent as gdprConsent. If no TCF string is present, gdpr is not sent.
- GPP consent values are read from
properties.gpp and properties.gpp_sid. These must be included on events for GPP signals to reach Adform.
- Send the end user's IP address and browser user agent to enable geo and device information and Cookieless Insights reporting.
- The page referrer is sent under the key
referer. Adform's documentation lists the field as refererUrl in its parameter table; confirm the expected key with your Adform representative.
- Adform has no publicly documented rate limits. Adform reports that integrations have sent several thousand requests per second to the Site Tracking endpoint without issues. Please test limits with your Adform representative.
- Additional custom fields can be added through Adform's supported custom site tracking variables using
variables (one value per field) and subVariables (multiple value sets, such as products in an order).
- Adform's API returned success for all requests during implementation, and its documentation describes no error responses. Delivery issues may not surface as errors, so verify data in Adform reports after setup.
- Adform's first-party ID (
firstPartyId) for hybrid client-side and server-side setups is not supported. This kit identifies users by cookie ID and optional extended IDs only.
- Sync Available: Yes
- Required for Starter Kit: Yes
- Prerequisites: Adform ADFUID macro configured in the advertiser’s Adform campaign URL Append Rules; first-party identifier collection enabled on the advertiser’s Adform account
- Documentation: See Adform Sync Documentation
- Captures the Adform cookie ID used for attribution and retargeting.
- Stores the cookie ID in first-party storage for the configured cookie lifetime (defaults to 60 days).
- Required to link conversion events to Adform ad clicks.
- Without this sync, events are filtered out and not sent to Adform.
- To collect the sync values (e.g.,
adfcookieid), you must implement an Adform ID sync. Refer to the following documentation to complete the setup: Adform - ID Sync Guide.
- Tracking Domain: The tracking domain set at the advertiser level in Adform. Ask your Adform representative if you are unsure which domain applies.
- Tracking Setup ID: The advertiser's tracking ID, found under Site Tracking in the Adform UI.
- From the integration library, add an Adform integration. Then, fill out the Connection Parameters:
| Connection Parameter | Description |
|---|
TRACKING_DOMAIN | Tracking domain set at the advertiser level in Adform. |
TRACKING_SETUP_ID | Advertiser tracking setup ID found under Site Tracking in the Adform UI. |
API_VERSION | Adform Server-Side Tracking API version. Defaults to v2. |
- MetaRouter provides all of the event mappings that Adform integrations typically require. You may add custom events, parameters, or mappings in accordance with Adform's API documentation.
- In the Pipelines tab, add your Adform integration.
- Select the correct integration revision.
- Click Add Integration and finalize deployment.
Global mappings will be applied to all events. If your parameter names do not match the Expected Inputs provided, you will need to overwrite the Inputs provided with your own.
| Output Key | Description | Expected Input |
|---|
name Required | String: Tracking point name. Track events use the lowercased event name with underscores; others use the event type or page URL. | Expression – derives from event, type, or context.page.url |
identity.cookieId Required | String: Adform cookie ID captured by the Adform sync. Events without it are filtered out. | context.providers.adform.adfcookieid |
identity.eids | Array: Extended ID built from the user ID with atype 3 . Replace the placeholder source, typically with your website domain; confirm with Adform. | Expression – builds from userId with source 'ADD_YOUR_EID_SOURCE_HERE' |
pageUrl | String: URL of the page where the event occurred. | context.page.url |
referer | String: URL of the referring page. | context.page.referrer |
userContext.userAgent | String: User's browser user agent. | context.userAgent |
userContext.userIp | String: User's IP address. | context.ip |
userContext.browserLanguage | String: User's browser language. | context.locale |
compliance.gdpr | Integer: Set to 1 when a TCF consent string is present; not sent otherwise. | Expression – returns 1 when context.consent.tcf.tcString exists |
compliance.gdprConsent | String: IAB TCF consent string. Required by Adform when gdpr is 1. | context.consent.tcf.tcString |
compliance.gpp | String: IAB GPP consent string. | properties.gpp |
compliance.gppSid | String: GPP section ID used for privacy resolution. | properties.gpp_sid |
variables.gender | String: User gender. | traits.gender |
variables.country | String: User country. | traits.address.country |
| Output Key | Description | Expected Input |
|---|
pageUrl | String: URL of the page, from page properties. | properties.url |
referer | String: URL of the referring page, from page properties. | properties.referrer |
| Output Key | Description | Expected Input |
|---|
variables.subVariables | Array: One object per listed product with productname, productsales, productid, categoryname, productcount. | Expression – maps properties.products (name, price, product_id, category, quantity) |
| Output Key | Description | Expected Input |
|---|
variables.currency | String: Currency code of the product. | properties.currency |
variables.subVariables | Array: Single object with productname, productsales, productid, categoryname, productcount. | Expression – maps properties.name, price, product_id, category, quantity |
| Output Key | Description | Expected Input |
|---|
variables.currency | String: Currency code of the product. | properties.currency |
variables.subVariables | Array: Single object with productname, productsales, productid, categoryname, productcount. | Expression – maps properties.name, price, product_id, category, quantity |
| Output Key | Description | Expected Input |
|---|
variables.currency | String: Currency code of the product. | properties.currency |
variables.subVariables | Array: Single object with productname, productsales, productid, categoryname, productcount. | Expression – maps properties.name, price, product_id, category, quantity |
| Output Key | Description | Expected Input |
|---|
variables.currency | String: Currency code of the product. | properties.currency |
variables.subVariables | Array: Single object with productname, productsales, productid, categoryname, productcount. | Expression – maps properties.name, price, product_id, category, quantity |
| Output Key | Description | Expected Input |
|---|
variables.currency | String: Currency code of the product. | properties.currency |
variables.subVariables | Array: Single object with productname, productsales, productid, categoryname, productcount. | Expression – maps properties.name, price, product_id, category, quantity |
| Output Key | Description | Expected Input |
|---|
variables.currency | String: Currency code of the cart. | properties.currency |
variables.basketsize | String: Total quantity of items in the cart; each product counts as 1 if quantity is missing. | Expression – sums properties.products quantities |
variables.subVariables | Array: One object per product with productname, productsales, productid, categoryname, productcount. | Expression – maps properties.products (name, price, product_id, category, quantity) |
| Output Key | Description | Expected Input |
|---|
variables.currency | String: Currency code of the order. | properties.currency |
variables.orderid | String: Order ID. | properties.order_id |
variables.sales | Float: Order revenue. | properties.revenue |
variables.basketsize | String: Total quantity of items in the order; each product counts as 1 if quantity is missing. | Expression – sums properties.products quantities |
variables.subVariables | Array: One object per product with productname, productsales, productid, categoryname, productcount. | Expression – maps properties.products (name, price, product_id, category, quantity) |
| Output Key | Description | Expected Input |
|---|
variables.orderid | String: Order ID. | properties.order_id |
| Output Key | Description | Expected Input |
|---|
variables.orderid | String: Order ID. | properties.order_id |
| Output Key | Description | Expected Input |
|---|
variables.currency | String: Currency code of the order. | properties.currency |
variables.orderid | String: Order ID. | properties.order_id |
variables.sales | Float: Order revenue. | properties.revenue |
variables.basketsize | String: Total quantity of items in the order; each product counts as 1 if quantity is missing. | Expression – sums properties.products quantities |
variables.subVariables | Array: One object per product with productname, productsales, productid, categoryname, productcount. | Expression – maps properties.products (name, price, product_id, category, quantity) |
| Output Key | Description | Expected Input |
|---|
variables.currency | String: Currency code of the order. | properties.currency |
variables.orderid | String: Order ID. | properties.order_id |
variables.sales | Float: Updated order revenue. | properties.revenue |
variables.basketsize | String: Total quantity of items in the order; each product counts as 1 if quantity is missing. | Expression – sums properties.products quantities |
variables.subVariables | Array: One object per product with productname, productsales, productid, categoryname, productcount. | Expression – maps properties.products (name, price, product_id, category, quantity) |
| Output Key | Description | Expected Input |
|---|
variables.currency | String: Currency code of the order. | properties.currency |
variables.orderid | String: Order ID. | properties.order_id |
variables.sales | Float: Refunded order revenue. | properties.revenue |
variables.basketsize | String: Total quantity of items in the order; each product counts as 1 if quantity is missing. | Expression – sums properties.products quantities |
variables.subVariables | Array: One object per product with productname, productsales, productid, categoryname, productcount. | Expression – maps properties.products (name, price, product_id, category, quantity) |
| Output Key | Description | Expected Input |
|---|
variables.currency | String: Currency code of the order. | properties.currency |
variables.orderid | String: Order ID. | properties.order_id |
variables.sales | Float: Canceled order revenue. | properties.revenue |
variables.basketsize | String: Total quantity of items in the order; each product counts as 1 if quantity is missing. | Expression – sums properties.products quantities |
variables.subVariables | Array: One object per product with productname, productsales, productid, categoryname, productcount. | Expression – maps properties.products (name, price, product_id, category, quantity) |
These identifiers must be mapped to Adform in order for successful user matching to occur. Without these IDs, any events sent to Adform may not be accurately reflected in reporting.
| Attribute | Example | Sync Injector Required? |
|---|
cookieId Required | 5561975860057581265 | Yes |
eids Recommended | user_12345 | No |
userIp Recommended | 111.111.111.111 | No |
userAgent Recommended | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 | No |
- In the Adform platform, go to Site Tracking and confirm that tracking points appear for the tracking setup ID configured in the integration.
- Confirm tracking point names match the expected event names (e.g.,
page, identify, order_completed).
- Verify that conversions are attributed to the correct Adform campaign for events that include the Adform cookie ID.
- Check that conversion details such as sales value, order ID, and product data appear in Adform reporting.
- Confirm that users from tracked events are added to audiences for retargeting.
- Adform's API returns success responses even when data may not be processed as expected, so a successful response alone does not confirm delivery. Always verify data in Adform reports.
- Ask your Adform representative to confirm that events are being received and processed on their backend.