Skip to content

Targeting & Bidding

On every ad request, ADBNK's ad engine evaluates the targeting rules of each candidate campaign, then ranks the creatives that pass by effective bid in a probabilistic auction. This page covers the supported targeting dimensions, include vs. exclude zones, per-dimension bid adjustments (±%), and pricing models.

Targeting overview

Targeting uses short-circuit evaluation: if any dimension doesn't match, the campaign is eliminated immediately and no further dimensions are evaluated. The overall order is:

Ad request
  → balance / budget check
  → geo (country / region)
  → postal code
  → device
  → OS
  → browser
  → daypart (hour)
  → weekday
  → site / zone blacklist
  → tag matching (media type / content / audience)
  → auction ranking

Empty targeting = no restriction

Leaving any dimension empty means no restriction on that dimension — everything passes. Filtering only happens when a value is explicitly configured.

Supported targeting dimensions

DimensionValuesDescription
GeoCountry code (ISO 2-letter) / regionServe only when the visitor's IP country/region matches
Postal codeComma-separated codes (prefixes)Prefix matching, e.g. 90 matches 90210
DevicePC / MOBILE / TABLETDetected from the visitor's User-Agent
OSWINDOWS / MACOS / IOS / ANDROID / LINUX / OTHERDetected from UA
BrowserCHROME / EDGE / FIREFOX / SAFARI / IE / OTHERDetected from UA
DaypartList of hours 0–23Matched against the current hour in server time
Weekday1–7 (1 = Monday, 7 = Sunday)Matched against the current weekday
TagsMedia type / content tags / audience tagsIntersection of ad and zone tags (ANY logic)

Geo/postal code depend on the IP database

Geo and postal-code targeting are based on GeoIP resolution of the visitor's IP. When the country or postal code can't be resolved, the engine lets it pass (it doesn't kill traffic just because it "can't tell"). Postal-code resolution currently covers US, CA, GB, BR, IE, JP, NL, PT, SG, and more.

Tag targeting

Beyond the basic dimensions, a campaign can target by media type (website/app/mini-program), content tags (gaming/esports, tech/gadgets, etc.), and audience tags (age, interest, behavior, etc.); publishers tag their zones accordingly. Matching takes the intersection of ad and zone tags (passing on any hit). See the platform's targeting-tag design for the full taxonomy.

Include zones vs. exclude zones

Targeting supports both "include" (serve only) and "exclude" (never serve) configs:

TypeField/mechanismEffect
Target geotarget_countries / target_regionsServe only in these countries/regions
Target postal codestarget_postal_codesServe only in these postal codes (prefixes)
Exclude content tagsexclude_content_tagsNever serve on zones hitting the excluded tags
Site/zone blacklistCampaign blacklistSpecified sites or zones never participate in this campaign

Include vs. exclude priority

Exclusion rules (excluded tags, blacklist) take priority over inclusion rules: as long as any exclusion is hit, the zone is dropped even if it meets all serving conditions.

Per-dimension bid adjustments (±%)

At the ad-group level you can configure bid_adjustments to add or subtract a percentage from the base bid by device / geo / OS, raising bids for high-value traffic and lowering them for low-value traffic.

Data structure

bid_adjustments is a JSON organized by dimension, with percentage values (positive or negative):

json
{
  "device": { "MOBILE": 20, "PC": -10 },
  "geo":    { "US": 15, "JP": -20 },
  "os":     { "ANDROID": -5 }
}

Meaning: mobile +20%, PC -10%, US traffic +15%, Japan traffic -20%, Android -5%.

Calculation rules

The engine resolves three dimension keys from the current request — device (PC/MOBILE/TABLET), geo (uppercase ISO country code), and os (WINDOWS/MACOS/IOS/ANDROID/LINUX/OTHER) — and sums the matched percentages before applying them to the base bid:

effective bid = base bid × (1 + Σ matched percentages / 100)

For example, with a base bid of 0.50, a request from the US on Android mobile hits +15% + (-5%) + 20% = +30%, so the effective bid is 0.50 × 1.30 = 0.65.

Key implementation details

  • Matched percentages are summed and applied together, not multiplied dimension by dimension.
  • The adjustment factor is clamped to [0, +∞): if the cumulative reduction exceeds -100%, the effective bid goes to zero — there is never a negative bid.
  • The effective source prefers the ad group's own bid_adjustments; when the ad group has none (null/empty), it falls back to the parent campaign's bid_adjustments as the default.
  • The adjusted "effective bid" directly participates in the subsequent auction ranking and decides which ad represents a creative that's linked to multiple ads.

Auction ranking and clearing price

Creatives that pass targeting enter roulette-wheel selection by effective bid:

  • Each creative's chance of being picked is proportional to its effective bid — high bids are likely to win, low bids still have a chance, avoiding one ad monopolizing forever.
  • On winning, the clearing price follows a second-price approach: clearing price = max(floor, second-highest bid + minimum increment), and never exceeds the winner's own bid.
  • A zone can set CPC/CPM floors (floor_price_cpc / floor_price_cpm), and the platform can also set minimum CPC/CPM bid thresholds; bids below the threshold are filtered out.

Pricing models

Billing is configured at the ad-group level (a single campaign can have ad groups with different billing methods):

ModelFull nameBilled onBest for
CPCCost Per ClickEach clickPerformance traffic, paying per visit
CPMCost Per MillePer thousand impressionsBrand exposure, paying for visibility
CPACost Per ActionEach conversionPerformance conversion, paying for results

The bid resolution chain

The ad's actual base bid prefers the ad's own bid_price; when the ad has no separate price, it falls back to the parent campaign's price. The per-dimension bid adjustments above are then layered on to get the effective bid.

Documentation released under the MIT License.