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:
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
| Dimension | Values | Description |
|---|---|---|
| Geo | Country code (ISO 2-letter) / region | Serve only when the visitor's IP country/region matches |
| Postal code | Comma-separated codes (prefixes) | Prefix matching, e.g. 90 matches 90210 |
| Device | PC / MOBILE / TABLET | Detected from the visitor's User-Agent |
| OS | WINDOWS / MACOS / IOS / ANDROID / LINUX / OTHER | Detected from UA |
| Browser | CHROME / EDGE / FIREFOX / SAFARI / IE / OTHER | Detected from UA |
| Daypart | List of hours 0–23 | Matched against the current hour in server time |
| Weekday | 1–7 (1 = Monday, 7 = Sunday) | Matched against the current weekday |
| Tags | Media type / content tags / audience tags | Intersection of ad and zone tags (ANY logic) |
In the console these dimensions live in Step 2 (Audience) of the campaign wizard. Each one starts at No Limit; unchecking it reveals the individual values you can pick:

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:
| Type | Field/mechanism | Effect |
|---|---|---|
| Target geo | target_countries / target_regions | Serve only in these countries/regions |
| Target postal codes | target_postal_codes | Serve only in these postal codes (prefixes) |
| Exclude content tags | exclude_content_tags | Never serve on zones hitting the excluded tags |
| Site/zone blacklist | Campaign blacklist | Specified 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 (±%)
Bid adjustments let you pay more for traffic that converts and less for traffic that doesn't, without running a separate campaign for each segment. You set them in Step 4 (Schedule & Budget) of the campaign wizard, under Bid adjustments (optional), right below the budget and frequency-cap fields.

There are three groups, each a percentage input:
| Group | Rows available | Notes |
|---|---|---|
| Device | Mobile, Desktop, Tablet | Always shown |
| OS | Android, iOS, Windows, macOS | Always shown |
| Region | One row per country you selected in Step 2 | Empty until you pick target countries in Audience |
Each input accepts -90% to +500%, in steps of 5. Leave a field blank (or 0) for no adjustment on that value — blanks are dropped on save, so an untouched form stores nothing at all.
Region rows come from your targeting
The Region group only lists countries you already selected under Audience targeting in Step 2. If you haven't picked any countries, the group shows a hint instead of inputs — pick your target countries first, then come back to bid per country.
How the adjustment is applied
The engine reads three keys off the incoming request — device, country, and OS — and sums every percentage that matches:
effective bid = base bid × (1 + Σ matched percentages / 100)With a base bid of $0.50 and adjustments of Mobile +20, US +15, Android -5, a request from a US Android phone matches all three: +20 + 15 - 5 = +30%, so the effective bid is $0.50 × 1.30 = $0.65.
Things worth knowing
- Matched percentages are summed, not multiplied dimension by dimension.
- The factor is floored at zero, so a heavily negative stack can drive the effective bid to
0but never negative. - The effective bid is what enters the auction (after conversion to eCPM), so an adjustment changes how often you win, not just what you pay.
- Values are clamped server-side to the same
[-90, +500]range, so an out-of-range value sent over the API is trimmed rather than rejected.
Setting adjustments over the API
The console writes these into a bid_adjustments object on the campaign. If you're integrating directly rather than using the console, see bid_adjustments in the Advertiser API for the JSON shape — including the ad-group-level override, which the console doesn't expose.
Auction ranking and clearing price
A CPC bid and a CPM bid aren't comparable as raw numbers — $2.00 per thousand impressions and $1.00 per click are different units. So before ranking, every candidate is converted into eCPM (expected revenue per thousand impressions), which is the only currency the auction speaks:
| Model | eCPM conversion |
|---|---|
| CPC | bid × pCTR × 1000 |
| CPM | bid (already an eCPM) |
| CPA | bid × pCVR × 1000 |
| CPV | bid × 1000 |
| CPS | AOV × bid% / 100 × pCVR × 1000 |
Ranking then works like this:
- Floor first. A zone's floor (
floor_ecpm) is a hard filter: candidates below it are dropped before selection, not just repriced at clearing time. If nobody clears the floor, the zone serves no ad on that request. - Weighted roulette. Among survivors, a creative's chance of being picked is proportional to its eCPM — high eCPM usually wins, but a lower one still gets impressions, so no single ad monopolizes a zone forever.
- Second price. The winner pays
second-highest eCPM + $0.01, clamped to the floor below and to its own bid above. With no competitor it simply pays its own bid. - Converted back to your unit. The clearing eCPM is converted back into the winner's billing unit — a per-click price for a CPC winner, a per-thousand price for a CPM winner — and that's what you're actually charged. It can never exceed your bid.
Bid adjustments feed into this
The effective bid from the section above is what gets converted to eCPM. Raising a bid for mobile doesn't just raise your price — it raises the eCPM you enter the auction with, and so how often you win.
Pricing models
The pricing model is set per campaign, in Step 4 (Schedule & Budget) of the wizard. All ads in the campaign bill the same way.

| Model | Billed on | Bid means | Range | Default |
|---|---|---|---|---|
| CPC | Each click | $ per click | $0.005 – $50 | $0.05 |
| CPM | Per 1,000 impressions | $ per 1,000 impressions | $0.05 – $50 | $1.00 |
| CPA | Each conversion | $ per conversion | $0.10 – $1,000 | $5.00 |
| CPV | Each view | $ per view | $0.00005 – $0.05 | $0.001 |
| CPS | Each sale | % of order value | 1% – 90% | 10% |
CPS is a percentage, not an amount
A CPS bid of 10 means 10% of the order value, not $10. Entering 0.01 here doesn't mean one cent — it means one-hundredth of a percent, which is effectively no bid at all. The console switches the input's unit and range when you change model, and resets the bid to that model's default, precisely because carrying a number across models is always wrong.
Ranges come from the platform, not this page
The console fetches the allowed range for each model from the server, and the server validates against the same source. If a range here ever disagrees with what the console shows you, trust the console.
CPA and CPS additionally require a bound conversion tracker before the campaign will save — see Conversion Tracking.
The bid resolution chain
An ad's base bid prefers the ad's own bid price; when the ad has none, it falls back to the parent campaign's bid. The per-dimension adjustments above are then layered on to produce the effective bid.