> ## Documentation Index
> Fetch the complete documentation index at: https://docs.adxensor.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Ad Receiving Strategy

> How AdXensor decides which ad fills your slot — the targeting funnel, the weighted-random revenue auction, frequency capping, and guaranteed fill.

When your slot requests an ad, the core server has milliseconds to answer a hard question: *out of every live campaign, which ones can serve **this** visitor, and which one should win?* It answers in two phases — **eligibility** (who qualifies) and **auction** (who wins).

<Info>
  **Why this matters to you.** Understanding the funnel tells you exactly what makes campaigns *skip* your slot — and every skipped campaign is a slot filled by a lower bid or a house ad. Most fill problems are an eligibility problem, not a demand problem.
</Info>

## Phase 1 — The eligibility funnel

Every campaign must clear **every** gate below to enter the auction. The first three are hard set-intersections resolved instantly from live in-memory pools; the rest are per-campaign checks.

```mermaid theme={null}
flowchart TD
    A[All live campaigns] --> B{Country matches?}
    B -->|no| X[Dropped]
    B -->|yes| C{Device matches?}
    C -->|no| X
    C -->|yes| D{Ad size matches?}
    D -->|no| X
    D -->|yes| E{Language OK?<br/>empty = matches all}
    E -->|no| X
    E -->|yes| F{Creative exists<br/>for this size?}
    F -->|no| X
    F -->|yes| G{Budget remaining > 0?}
    G -->|no| X
    G -->|yes| H{Inside flight window?<br/>start ≤ now ≤ end}
    H -->|no| X
    H -->|yes| I{Under frequency cap<br/>for this visitor?}
    I -->|no| X
    I -->|yes| J[Enters the auction]
```

<Note>
  Country, device, and ad size are **hard AND filters** — a campaign that doesn't target the visitor's country *and* device *and* your slot size can never serve, no matter how high it bids. This is why supporting more ad sizes directly increases how many campaigns compete for your inventory.
</Note>

### What each gate does

| Gate              | Rule                                                                                                                     | What makes a campaign drop out                                                                    |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------- |
| **Country**       | Visitor's country (from IP) must be in the campaign's target set                                                         | Visitor is outside the campaign's geo targeting                                                   |
| **Device**        | Visitor's device — **desktop, mobile, or tablet** — must match the campaign's device targeting                           | Campaign targets only desktop, visitor is on a tablet (or any device the campaign doesn't target) |
| **Ad size**       | Your slot's size must be one the campaign has creative for                                                               | Your slot size isn't targeted                                                                     |
| **Language**      | Agnostic-OR: a campaign with **no** language targeting matches everyone; otherwise the visitor's language tag must match | Narrow language targeting + no matching tag                                                       |
| **Creative**      | A creative must exist for the **exact** requested size                                                                   | Campaign targets the size but uploaded no matching creative                                       |
| **Budget**        | `budgetRemaining > 0`                                                                                                    | Budget exhausted                                                                                  |
| **Flight window** | `start ≤ now ≤ end`                                                                                                      | Campaign hasn't started or has ended                                                              |
| **Frequency cap** | This visitor hasn't already seen the campaign too many times                                                             | Visitor hit the per-campaign view cap in the current window                                       |

## Phase 2 — The revenue auction

Every campaign that clears the funnel competes in a **weighted-random revenue auction**. This is *not* a highest-bid-wins auction and *not* a pure random pick — it's deliberately in between.

Each campaign gets a **weight**, and the winner is drawn at random with probability proportional to its weight:

<Info>
  **weight  =  remaining budget  ×  expected value per impression**

  where *expected value per impression* is the campaign's effective CPM ÷ 1000. For click-goal (CPC) campaigns, the bid is converted to an equivalent CPM using an assumed click-through rate of **1%**. (A campaign with missing bid data still competes — its weight simply degrades to remaining-budget-only.)
</Info>

### Why weighted-random instead of top-bid?

<CardGroup cols={2}>
  <Card title="Higher value wins more — not always" icon="chart-line">
    A campaign with a richer bid has a proportionally higher chance to win, so valuable demand is favored. But it doesn't win *every* time, which keeps a single advertiser from monopolizing your inventory.
  </Card>

  <Card title="Budget pacing is built in" icon="gauge">
    Remaining budget is a direct multiplier. As a campaign spends down, its weight falls and it naturally yields to fresher demand — spreading spend across the whole day instead of front-loading it.
  </Card>
</CardGroup>

<Tip>
  The practical takeaway for you: **more competing campaigns = higher effective CPM.** The weighting rewards value, so the deeper the pool of eligible demand on your slot, the more the auction has to pick from — and the more your impression is worth. Everything in the [Optimization Playbook](/publishers/how-it-works/optimization) is ultimately about deepening that pool.
</Tip>

### After a winner is drawn

The winner's destination URL is validated (it must be a real `http`/`https` link). If it's malformed, that campaign is dropped and the auction **re-draws** among the rest — paid demand is never skipped in favor of a house ad just because one winner had a bad link. Only if *every* eligible campaign fails does the slot fall through to house fill.

## Frequency capping — why the same ad stops showing

To prevent ad fatigue, AdXensor caps how many times a single visitor sees the same campaign within a rolling window — a configurable platform limit. Once a visitor hits the cap for a campaign, that campaign is filtered out of *their* auctions (other visitors are unaffected).

<Note>
  Counts are tracked per visitor **per campaign**, incremented only on **real, rendered** impressions — never on bot traffic, and never on house ads. House and always-fill banners are exempt from frequency capping, which is part of why your slots stay filled.
</Note>

## Guaranteed fill — your slot is never blank

If no paid campaign qualifies (none matched, all frequency-capped, or all had invalid links), AdXensor walks a fallback chain so the slot still earns:

<Steps>
  <Step title="House creative" icon="house">
    If an admin has uploaded a house creative for your slot's size, it serves.
  </Step>

  <Step title="Always-fill banner" icon="fill-drip">
    Otherwise, for [standard IAB sizes](/publishers/reference/ad-formats) (`300x250`, `336x280`, `728x90`, `320x50`, `300x600`), a built-in AdXensor cross-promo banner fills the slot. It's an inline SVG — no external assets, no extra latency.
  </Step>

  <Step title="Empty (rare)" icon="ban">
    Only if the size is non-standard **and** no house creative exists does the slot return empty. Using standard IAB sizes avoids this entirely.
  </Step>
</Steps>

<Warning>
  Every path in the fallback chain still earns you money — house fills credit **50% of the house CPM**. But house fills pay less than a competitive paid auction, so the goal is to maximize *paid* fill. See the [Optimization Playbook](/publishers/how-it-works/optimization).
</Warning>

## The whole strategy in one picture

```mermaid theme={null}
flowchart LR
    R[Ad request] --> F[Eligibility funnel]
    F -->|survivors| A[Revenue auction]
    F -->|none survive| H[House fallback]
    A -->|valid winner| S[Serve paid ad 💰]
    A -->|all invalid URLs| H
    H --> HC{House creative?}
    HC -->|yes| S2[Serve house ad · 50% CPM]
    HC -->|no, standard size| S3[Always-fill banner · 50% CPM]
    HC -->|no, other size| E[Empty]
```

<Card title="Next: Traffic Quality & Scoring" icon="shield-check" href="/publishers/how-it-works/traffic-quality">
  Winning the auction is only half the story — the impression still has to be *valid* to be counted and paid. See how AdXensor's fraud shield and reputation system work.
</Card>
