Impression/Click Tracking

Overview

Below explains how we track the impressions and clicks you see in the Reporting UI and API.

Impression Tracking - API Requests

When Kevel's Ad Decision Engine provides a Response to your Decision API Request, it'll include a field called impressionUrl, as shown below:

{
  "adId": 111,
  "creativeId": 222,
  "flightId": 333,
  "campaignId": 444,
  "clickUrl": "https://e-1234.adzerk.net/r?...",
  "impressionUrl": "https://e-1234.adzerk.net/i.gif?..."
  ...
}

This URL is unique to the ad, so if fired, it'll record that an impression happened for that particular ad.

In order to make it fire, you'll have to GET this URL endpoint. Alternatively, you could place this impressionUrl directly on the page, but we recommend GETting it to help combat reporting discrepancies that could happen because of ad blockers. More info here.

Impression Tracking - JS Ad Code

If using JavaScript ad code, Kevel serves a tracking pixel called Veripixel at time of impression. It looks like this: <img width="0" height="0" src="http://e-<networkId>.adzerk.net/v/v.gif?i=eyJVc2VyI..."

The random string of letters and numbers at the end prevents a user's browser from caching Veripixel.

Click Tracking

Kevel tracks clicks with a click tracking URL. When a user clicks on an ad, this link records a click in our reporting server, and then redirects the user's browser to the creative's destination page. The URL looks like:

http://e-1234.adzerk.net/r?e=eyJ0cyI6MTM2Mjc3MT...In0&s=K9N90sUT247it9GXOEmh49HPmBY

If you use the click tracking macro %URL% when setting up a JavaScript/HTML type creative, Kevel automatically generates our tracking URL wherever the macro is placed in the creative.

In the Decision API Response, you'll see the click URL under the clickURL parameter.

{
  "adId": 111,
  "creativeId": 222,
  "flightId": 333,
  "campaignId": 444,
  "clickUrl": "https://e-1234.adzerk.net/r?...",
  "impressionUrl": "https://e-1234.adzerk.net/i.gif?..."
  ...
}

You'll want to grab this URL and redirect the user to it if they click on the ad.

📘

Kevel registers a click whenever a user clicks on an ad with a unique impression. If a user clicks on the same ad multiple times without refreshing the page, we will not register new impressions, and therefore will not count the clicks after the initial click.

Pulling Impression Pixel

There are times when you may need to figure out what ad from your account is serving into a given placement. This information is stored in the impression pixel that is served along with your ads. You can use the developer console of your browser to access this information.

  1. First, right-click on the page with the ad, and then left-click "Inspect" or "Inspect Element" in the context menu.
  1. Next, click the element selector on the top left of the dev console, then click on the ad placement you want to identify.
  1. This will bring you to the div for this placement. Look at the bottom of the div in the code for an image source calling for e-.adzerk.net. This is your impression pixel.
  1. Right-click on this pixel, then select "Edit as HTML" to copy and paste the pixel into a text editor. Then copy the impression shim by selecting everything between the "=" and the "&" signs in the impression pixel. This will leave you with a block of text encoded in base-64.

For most users, you can simply email this to Kevel Support, and we can identify the flight for you.

For API users, you can decode the shim by using a base 64 decoder. This will generate a JSON object with various information about the impression that served. "fl" is the flight ID, which can be looked up in the API.

Modifying Revenue

Kevel records revenue data for each click, but by default events do not have revenue associated with them.

To add or modify revenue for clicks or events, you can pass parameters to the end of the Kevel's click tracking URLs or event tracking URLs:

  • override: replaces the revenue value of the click/event (e.g. appending &override=1.23 would set the revenue to $1.23)
  • additional: adds the specified value to the original revenue value of the click/event (e.g. appending &additional=1.23 would add $1.23 to the original revenue for the click/event)

👍

Overridden or additional revenue will count towards budget caps and goals.

Modifying Revenue for Clicks

Append the query parameters from above to the click tracking URL from the Decision API response (clickUrl). For example:

https://e-1234.adzerk.net/r?e=eyJhdiI6NjIwNzcsImF0Ijo1L...&override=0.50

Sets a new value of $0.50 for the click.

https://e-1234.adzerk.net/r?e=eyJhdiI6NjIwNzcsImF0Ijo1L...&additional=1

Adds $1.00 to the revenue already stored on the click.

Modifying Revenue for Events

Since events have no revenue by default, overriding revenue on events adds new revenue.

Append the query parameters from above to the event tracking URL from the Decision API response (the url associated with the event id). For example:

https://e-1234.adzerk.net/e.gif?e=eyJhdiI6ODU2N...&override=0.50

Sets a new value of $0.50 for the event.

https://e-1234.adzerk.net/e.gif?e=eyJhdiI6ODU2N...&additional=1

Sets a value of $1.00 for the event, or adds an additional $1.00 if the event has already had revenue set.

Adding Gross Merchandise Value

In addition to revenue, you can record Gross Merchandise Value (GMV) on impressions, clicks, conversions, and custom events.

To do this, append the query parameter gmv to the event URL with the event's GMV as the value. For instance, ?gmv=1.64 sets a GMV of $1.64 for the event.

The GMV will then be recorded in the data shipping log for that event. GMV will also be returned via the Real Time Reporting API and in reports.

Bot Filtering

Bot filtering refers to the automatic filtering-out of impressions from bots and spiders. A request from a detected bot or spider will be fulfilled, but the impression or subsequent clicks will not be logged in our reporting system.

Scenario

Action

Using ados.js ad requests

Nothing. Kevel automatically filters impressions for bots

Making requests to the Decision API

Must set "enableBotFiltering": true in the Decision API Request after placements

Note: if firing impressions/clicks/events server to server, be sure to send the user-agent header in requests.