Release Notes: February 25, 2021

Show promoted listings within proximity of your customer


Want to show promotions within your customers’ range or specified location? You can build this kind of distance targeting with Kevel’s new User-Specified Radius.

Here’s how it works:

  • Contact us to get added to the private beta test.
  • Via the Kevel UI or Management API, add one or more locations to flights using Distance Targeting. Leave “Distance” blank.
  • In your ad decision request, include your customer’s location and the distance they specify as a radius parameter.

This feature is currently in a private beta. If you’re interested in joining, please contact your Account Manager or email [email protected]!

Finer-grained filtering for sponsored listings

If you use Kevel for sponsored listings, and allow customers to filter the results they see, AdQuery will enables you to filter the ads returned in a decision request using those criteria — resulting in more user-first ad experiences.

This feature allows you to specify eligible creative template field values that should be considered when making a decision to serve ads. The criteria can include exact matching of a text string, a value within a numeric range, or a value in a set of alternatives.

For example, if you specify size and price data in creative template fields on your ads, you can request ads with sizes "small" or "medium" with a maximum price of 200:

  "placements": [
      "adQuery": {
        "ctSize": {
          "in": ["small", "medium"]
        "ctPrice": {
          "max": 200
      "divName": "div1",
      "networkId": 12345,
      "siteId": 1234567,
      "adTypes": [5]

Previously, this kind of matching required complex use of keywords and custom targeting to implement.

AdQuery supports eq, in, and min/max operators.

Learn more in our knowledge base here.

Ignore targeting categories in ad decisions

Want to make an ad decision request that ignores some targeting criteria on ads? You can now skip over geo-targeting, distance, or keyword filters when making an ad decision, so an ad flight can be used in multiple contexts.

For example, suppose you can have a flight configured with both geo-targeting and distance requirements. With SkipFiltering, you can make a request that focuses on geo-targeting — and that ignores distance requirements — on a request-by-request basis.

  "placements": [
      "skipFilters": {
        "geodistance": true
      "divName": "div1",
      "networkId": 12345,
      "siteId": 1234567,
      "adTypes": [5]

Using SkipFiltering simplifies campaign configuration and can reduce the number of flights you need to maintain. This feature will soon be extended to support skipping for all targeting criteria, which will also make it a valuable troubleshooting tool.

Learn more about SkipFiltering here.

iOS Mobile SDK 2.0

We’ve completely rewritten our iOS Software Development Kit from the ground up using Swift 5 and newer features like Codable.

Using decision requests and responses in Apple apps is now even easier — with fewer lines of code and with standard Swift data structures. Even better, iOS SDK 2.0 now fully supports multi-winner placements!

import AdzerkSDK

// Demo network, site, & ad type IDs; find your own via the Kevel UI!
DecisionSDK.defaultNetworkId = 23
DecisionSDK.defaultSiteId = 667480

let client = DecisionSDK()

var p = Placements.custom(divName: "div0", adTypes: [5]) = [ "previouslyPurchased": .boolean(true) ]

var reqOpts = PlacementRequest<StandardPlacement>.Options()
reqOpts.userKey = "abc"
reqOpts.keywords = ["keyword1", "keyword2"]

client.request(placements: [p], options: reqOpts) {response in

New entity IDs in CSV reports


You can now generate new reports with the following Group-Bys and have those Entity IDs added to CSV reports:

  • CampaignId
  • FlightId
  • AdvertiserId
  • CreativeId
  • ChannelId
  • PriorityId
  • AdTypeId
  • SiteId
  • ZoneId

Adding new columns to CSV reports could be a breaking change to your workflow, so it’s not enabled by default. If you would like this feature for your network, let us know at [email protected]!

Click bucketing

We recently upgraded our Click Bucketing system to allow you to calculate revenue and CTR for clicks bucketed as Unique Clicks — and see these calculations in data shipping.

Security improvement: session timeout

If it’s been a while since you were last active or logged in, the Kevel UI will now log you out automatically. You’ll now see a status notification in the lower right corner of your screen.

After being inactive for 6 hours, you’ll see:


Automatic logouts are just one of several upcoming changes that reinforce our commitment to your security. If you have feedback on automatic logout, we’d love to hear from you! Email us at [email protected].

Faster, more reliable management API endpoints

The following GET endpoints have been rebuilt to reduce error rates and improve speed:

Improved logging in JavaScript Decision SDK

It’s now easier to get deep logging messages from our JavaScript Decision Software Development Kit by passing in your own custom logger.

You can use the logging library of your choice or roll your own! As with our Python, Ruby, and Java Decision SDKs, these log messages show you exactly what’s being sent and returned over the wire.

const Adzerk = require('@adzerk/decision-sdk');
const logger = (lvl, msg, meta) => {
  console.log("[" + lvl + "] " + msg, meta);
const client = new Adzerk.Client({logger});

Phasing out UI 1.0

If you are using UI 1.0, please keep familiarizing yourself with UI 2.0 in preparation for a full changeover by March 31, 2021. Remember, our support team is available to help!

Bug fixes

  • Some Kevel users were unable to activate or deactivate other users in the UI. This is now resolved, and we apologize for the inconvenience!
  • We’ve resolved an issue that made password reset emails look suspicious. Thanks to all who alerted us.