---
title: "DSP partner analytics: bids, wins and revenue"
description: "Read a DSP partner's bid funnel — Requests, Bids, Wins, Impressions, Clicks, Revenue, eCPM — per partner, placement, country and day; tell \"the DSP is not bidding\" from \"it is losing the auction\"; understand why Revenue follows the pricing model and why Wins sit above Impressions; and export the grid."
type: "howto"
audience: [admin, network-manager]
keywords: [DSP analytics, bid funnel, requests bids wins, win rate, no bid, lost auction, DSP revenue, eCPM, CSV export, RTB tab, DSP partners analytics, invoicing a DSP, CPC partner revenue, CPI]
ui_path: "Admin → Demand partners (DSP) → DSP partners analytics"
---

Fetch the complete documentation index at: https://epom.com/ad-server/docs/llms.txt. Use this file to discover all available pages before exploring further. Append .md to any documentation page URL to get its markdown version.

# DSP partner analytics: bids, wins and revenue

**DSP partners analytics** shows, per partner, how many bid requests went out, how many came
back with a valid bid, how many of those won, and what the partner was billed for the delivery
it won. The first three are a funnel the ad servers count; the last three — Impressions, Clicks,
Revenue — come from the delivery log. Read together they answer the two questions every DSP
integration raises: *is the partner bidding at all?* and *is what it won what we invoice?*

**Example.** "Northwind Exchange" received 1,200,000 requests yesterday, answered 48,000 bids
(4 %), won 9,600 of them and delivered 9,100 impressions for $38.20 of revenue — an eCPM of
$4.20. The 500 wins with no impression are creatives the page never rendered, not lost money;
the 96 % of requests with no bid are what to ask the partner about, after checking your floors.

## Typical scenarios

| You want to know | Group by | Read |
|---|---|---|
| Whether a new partner bids at all | **DSP partner** | Requests high, Bids near zero → not bidding, or every bid rejected before the auction |
| Why it wins so little | **DSP partner** | Bids high, Wins low → it loses to another partner or to direct demand; compare bid prices |
| Which placements it never bids on | **DSP partner** + **Placement ID** | Rows with Requests and no Bids — a floor or a format problem on that placement |
| What to invoice a CPC partner this month | **Date** + **DSP partner**, last month | **Revenue** against **Clicks**: Revenue ÷ Clicks is the agreed CPC |
| Where the money comes from by market | **DSP partner** + **Country code** | Revenue and eCPM per country |

## Step by step

1. Go to **Admin → Demand partners (DSP) → DSP partners analytics** (account users: **RTB → DSP
   partners analytics**). Pick the date range.
2. Pick any mix of **Date**, **DSP partner**, **Placement ID** and **Country code** in the
   **Group by** multi-select. Ungrouped, the grid is a single total row.

   ![DSP partners analytics grid grouped by partner, showing Requests, Bids, Wins, Impressions, Clicks, Revenue and eCPM per endpoint, with Export CSV](https://epom.com/docs-images/ad-server/dsp-partner-analytics/partner-analytics.webp)

3. Read **Requests / Bids / Wins / Impressions / Clicks / Revenue / eCPM**. eCPM is each row's own
   revenue per thousand of its own impressions, not an average of the rows underneath it, and
   reads 0 until the partner has served. Use the funnel table below to place the drop.
4. **Export CSV**, next to the refresh button, downloads the same result set.

### Did the DSP not bid, or did it lose the auction? Requests, Bids and Wins per partner

The three counters are a funnel per partner (and per placement, country and date, if you group
by them), so the step where the numbers fall off tells you what happened:

| Column | Counts | Not counted |
|---|---|---|
| **Requests** | Bid requests the ad server sent to the endpoint — counted as the request goes out | Header-bidding quotes |
| **Bids** | Responses carrying one valid bid: parsed, priced in USD (see [Currency in full](https://epom.com/ad-server/docs/guides/admin/dsp-partners-reference.md#currency-in-full)), one seat with one bid, price at or above the floor (deal bids are exempt from the floor) | No-bid (`204` or empty), timeouts, errors, unparsable responses, bids in a currency that could not be priced, bids below the floor or with several seats/bids |
| **Wins** | Auctions the partner's bid won with a price and non-empty markup | Bids that lost to another bid or to direct demand |

How to read it:

- **Requests high, Bids near zero** — the partner is **not bidding**, or every bid is rejected
  before the auction (below your floor, wrong currency, malformed). Check floors first (see
  [Which floors to use](https://epom.com/ad-server/docs/guides/admin/dsp-partners.md#which-floors-to-use-when-starting-with-new-rtb-demand));
  a [troubleshooting log task](https://epom.com/ad-server/docs/guides/admin/system-ops.md#capture-ad-requests-with-a-troubleshooting-log-task)
  names the rejection reason per bid. The partner's own logs show whether they answered no-bid.
- **Bids high, Wins low** — the partner bids but **loses the auction**: another partner or your
  direct campaigns paid more. Compare its bid prices with the winners' before raising floors.
- **Wins above Impressions** — the auction was won but the creative did not render (see
  [What Revenue counts](#what-revenue-counts)). A bid that is counted and then dropped later — a
  creative blocked by [creative scanning](https://epom.com/ad-server/docs/use-cases/creative-policy-protection.md), markup
  missing — is still a **Bid**.

### What Revenue counts

The six metrics come from two different places, unioned per (date, partner, placement,
country). **Requests / Bids / Wins** are the auction funnel, counted by the ad servers.
**Impressions / Clicks / Revenue** come from the delivery log, joined to the endpoint through the
banner that served.

That split is why **Revenue** is what the partner was billed for delivery its endpoint won, not
what it won at auction: an auction the partner won but whose creative never rendered adds a
**Win** and nothing else. Wins above impressions is normal — the gap is creatives that lost the
render, not lost money.

**Which event was billed depends on the partner's pricing model**, and Revenue follows it
without you having to say so:

| Pricing model | Billed on | Read the rate as |
|---|---|---|
| CPM | Impressions | Revenue ÷ Impressions × 1000 |
| CPC | Clicks | Revenue ÷ Clicks |
| CPI | Impressions | Revenue ÷ Impressions — the win price is booked **per impression**, not per thousand |

**Impressions** and **Clicks** are there so the rate can be checked against the deal. A CPC
partner will show Revenue against a low click count and a large impression count — that is the
model working, not a discrepancy.

Revenue for a partner is the sum over every OpenRTB creative pointing at it, so it equals the
**Gross** the standard report shows for those creatives, and the two reconcile line for line.
Creatives deleted since still count: the link that attributes an impression to an endpoint
survives the deletion, so historical invoices do not shrink when someone tidies up a campaign.

To pull the same figures for invoicing rather than reading them off the screen, see
[DSP endpoint traffic and spend](https://epom.com/ad-server/docs/api/analytics-api.md#dsp-endpoint-traffic-and-spend).

### Export the analytics grid

**Export CSV**, next to the refresh button, downloads the current result as a CSV file. The
export carries the date range, the group-by selection and the sort you have on screen, but
**not** the page window — the file holds every matching row, not just the visible page.

The columns follow the grid: only the dimensions you grouped by become columns, while Requests,
Bids, Wins, Impressions, Clicks, Revenue and eCPM are always present. So a grid grouped by date
and partner exports nine columns; ungrouping partner drops that column from the file too. Both
the admin page and the account **RTB** tab export through the same endpoint, so the file is
identical for either login.

## Caveats and exceptions

- **Who can see it.** Admin users need the **DSP Partners Analytics** admin permission — a role
  holding only **DSP Partners** does not see it, and opening its URL shows *Record not found.*
  Account users see it as the **RTB → DSP Partners Analytics** sub-tab, and the REST endpoint
  `GET /rest-api/rtb/dsp-analytics/search.do` answers, once their role has the **DSP Partners
  Analytics** permission set to *Enabled* (Read-only opens nothing). On its own it is read-only —
  it does not let the person change a partner.
- **Deleting a partner breaks the revenue link.** Deletion clears the endpoint reference from
  every creative that pointed at it, so the partner's past Impressions and Revenue fall out of
  this grid while its Requests, Bids and Wins stay behind under *`id` (Deleted)*. Invoice a
  partner before you delete it, or deactivate instead — **Active** off stops delivery and keeps
  the whole history ([Retire or delete a partner](https://epom.com/ad-server/docs/guides/admin/dsp-partners.md#retire-or-delete-a-partner)).
- **A CPC or CPI partner's Revenue follows its model.** A partner set to **CPC** is billed on
  clicks, so its impressions carry no gross; check the model matches how the partner actually
  pays before comparing gross with the partner's figures. A CPC partner without **Wrap
  click-through** records no clicks at all — see the [partner caveats](https://epom.com/ad-server/docs/guides/admin/dsp-partners.md#caveats-and-exceptions).
- **Header-bidding quotes are not Requests.** A partner asked for a header-bidding slot is
  quoting a price; those calls are not in this funnel.
- **Analytics sync (Epom WL DSP) rewrites the day.** With **Money** synced, the sync matches a
  day's gross to the total the partner's report gives for the whole day, not to the sum of its
  per-country rows; rows it cannot attach to one of your placements and creatives are never
  written, so the day can stay below the partner's total — details in the
  [reference](https://epom.com/ad-server/docs/guides/admin/dsp-partners-reference.md#corner-cases-and-gotchas).
- **QPS in the partners grid is measured, not this page.** The partners list's **QPS** column is
  the observed requests-per-second the ad servers write back about once a minute; this page
  counts requests per day.

## Not working?

| Symptom | Likely cause | Check |
|---|---|---|
| The page is missing, or the URL shows *Record not found.* | Your admin role lacks **DSP Partners Analytics**; an account role has it unset or Read-only | [Users and roles](https://epom.com/ad-server/docs/guides/admin/users-and-roles.md) |
| Requests are 0 for a partner | It is inactive, blocked by **Max QPS = 0**, or no OpenRTB banner points at it on a placement with traffic; or SSP bidding optimization suppresses it on that placement/country | Partner form → Active, Max QPS; the banner's placements; [SSP bidding optimization](https://epom.com/ad-server/docs/guides/admin/dsp-partners.md#tune-ssp-bidding-optimization) |
| Requests high, Bids 0 | Not bidding, or every bid rejected: below floor, unpriceable currency, several seats, malformed | Floors; a troubleshooting log task; the partner's logs |
| Bids high, Wins low | Losing the auction to other demand | Compare bid prices with the winners' |
| Wins above Impressions | Creatives that did not render, or were dropped after the auction (scan, empty markup) | Expected; see the creative-scan console |
| Revenue is 0 with Impressions | The partner's **Pricing model** is CPC and no clicks are counted — **Wrap click-through** off, or native/video creatives | Partner form → Pricing model, Wrap click-through |
| Revenue is far below the partner's figure | Pricing model mismatch, or a deleted partner lost its creative links | Partner form; invoice before deleting |
| eCPM reads 0 | No impressions yet for that row | Wait for delivery |
| The CSV has fewer columns than expected | Only grouped dimensions become columns | Group by them before exporting |
| A deleted partner shows as *id (Deleted)* with no revenue | The deletion cleared the creative links | Nothing to recover from this page; use the standard report's Gross for those creatives |

## Reference

| Column | Meaning |
|---|---|
| **Requests** | Bid requests sent to the endpoint (header-bidding quotes excluded). |
| **Bids** | Responses with one valid, priced bid at or above the floor (deal bids exempt). |
| **Wins** | Auctions won with a price and non-empty markup. |
| **Impressions** / **Clicks** | From the delivery log, through the banner that served. |
| **Revenue** | What the partner was billed for delivery it won, by its pricing model. |
| **eCPM** | The row's Revenue ÷ its Impressions × 1000; 0 until it has served. |

| Permission | Where | Lets you |
|---|---|---|
| **DSP Partners Analytics** (Admin UI) | Admin role | Open **Admin → Demand partners (DSP) → DSP partners analytics**. |
| **DSP Partners Analytics** (RTB Management), *Enabled* | Network role | See the **RTB → DSP partners analytics** sub-tab and call `GET /rest-api/rtb/dsp-analytics/search.do`. |

Over the API, `GET /rest-api/rtb/dsp-analytics/search.do` answers the same rows; for invoicing
pulls see [DSP endpoint traffic and spend](https://epom.com/ad-server/docs/api/analytics-api.md#dsp-endpoint-traffic-and-spend).

## Related

- [Configure DSP partners](https://epom.com/ad-server/docs/guides/admin/dsp-partners.md)
- [DSP partners: fields, parameters and currency reference](https://epom.com/ad-server/docs/guides/admin/dsp-partners-reference.md)
- [Metrics reference](https://epom.com/ad-server/docs/reference/metrics.md)
- [Programmatic DSP demand](https://epom.com/ad-server/docs/use-cases/programmatic-dsp-demand.md)