---
title: "Analytics metrics reference"
description: "Every report metric column — display name, exact formula, and which report types and views carry it."
type: "reference"
audience: [network-manager, publisher, advertiser]
keywords: [metrics, report columns, CTR, eCPM, I2C, CCR, fill rate, impressions, clicks, conversions, post-click, post-view, net, gross, revenue, charges, profit, AP profit, rounding, reconciliation, unique visitors, risk score, fill source]
ui_path: "Account → Analytics → report grid"
---

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.

# Analytics metrics reference

Exhaustive reference for every numeric column (metric) an analytics report can show. For the
group-by and filter dimensions see [Analytics dimensions](https://epom.com/ad-server/docs/reference/analytics-dimensions.md); for how the
report types differ see [Report types](https://epom.com/ad-server/docs/guides/analytics/report-types.md).

Read [Money columns](#money-columns-which-number-is-which) before reconciling any report against an
invoice. A publisher sees their earnings as **Revenue** and an advertiser their spend as
**Charges**; the network sees the same money as **Net** and **Gross**, and its own billing runs on
those.

## How a column is gated

A General-report metric shows only when your role holds both its **column family** (Basic, Publisher
or Advertiser) and the column's own *Analytics Report Column …* permission, named after the column.
A derived column such as CTR or Profit also needs the permissions of the columns it is computed
from. A column you lack is removed from every row, so it reaches neither the grid nor an export.

The **Columns settings** panel of the report form then decides which of your permitted columns are
actually shown; a column ticked off there is hidden the same way.

> **Corner case:** the **Advertiser** column family can be granted only by your network administrator.
> A network manager editing roles will not find it in the permission matrix.

## Column families (General report)

The General report renders each counting metric up to three times, once per enabled family.

| Family | What the numbers mean |
|---|---|
| Basic | The network's own view |
| Publisher | The supply side's view; the money column is headed **Revenue** |
| Advertiser | The demand side's view; the money column is headed **Charges** |

The three copies share one display name — all three are just "Impressions", "CTR", … — so a user
with a single family enabled sees each metric once.

> **Note:** the shipped **Publisher** role sees only the Publisher family and the shipped
> **Advertiser** role only the Advertiser family, so each sees every counting metric once, with its
> money column headed **Revenue** or **Charges**.

> **Note:** the Advanced report has **no families**. Every publisher and advertiser column is dropped
> for it, so an Advanced report is always the Basic view whatever your role holds.

## Money columns: which number is which

The network sees **Net** and **Gross**. A publisher sees the same money as **Revenue**, an
advertiser as **Charges** — the same figures under the name each side uses.

| Report column | Family | What it is | Notes |
|---|---|---|---|
| **Net** | Basic | The publisher-side amount the network records | Floored at the row's minimal revenue |
| **Revenue** | Publisher | Net as the publisher sees it | Same floor; differs from Net only where the publisher's figures are adjusted |
| **Gross** | Basic | The advertiser-side amount the network records | |
| **Charges** | Advertiser | Gross as the advertiser sees it | Differs from Gross only where the advertiser's figures are adjusted |
| **Minimal net** | Basic | The minimal-revenue floor alone | The floor itself, as its own column |

All four are additionally clamped at zero unless the report explicitly allows negative impressions,
summed at six decimal places, and then rounded again for display — see
[Rounding](#rounding-and-reconciling-against-billing).

> **Note:** Revenue and Charges are stored as their own columns so that the network can adjust
> what a publisher or an advertiser sees without touching its own figures. Where the network
> adjusts them, Revenue differs from Net (or Charges from Gross) by exactly that adjustment;
> everywhere else they are equal.

> **Note for the network:** the network's own billing runs on its columns. Publisher payments are
> computed from **Net** (floored at minimal revenue) and advertiser billing totals **Gross**; the
> **referral commission** base is the publisher-side **Revenue**, with the same floor. Where the
> figures shown to a publisher or an advertiser are adjusted, reconcile your statements against Net
> and Gross, not against Revenue and Charges.

> **Note for publishers and advertisers:** your **Revenue** is what you are paid, and your
> **Charges** what you are billed, unless your network adjusts the figures shown to you. If a
> statement differs from your report, ask your network manager.

## Rounding and reconciling against billing

Analytics and billing round in a different **order**, and that is usually the whole of a small
discrepancy.

- **Billing** sums at full precision and rounds once, at the end.
- **Analytics** rounds **every result row** — Net, Revenue, Gross, Charges and Minimal net to the
  funds precision, the eCPM columns to the CPM precision, with banker's rounding (half-to-even) —
  and *then* recomputes the derived columns from the already-rounded values:

  | Derived column | Recomputed as |
  |---|---|
  | Profit | rounded Gross − rounded Net |
  | AP profit | rounded Charges − rounded Revenue |
  | eCPM Profit | rounded eCPM Gross − rounded eCPM Net |

So a report grouped into many rows accumulates one rounding step per row, and its Profit column is
the difference of two already-rounded numbers rather than the rounded difference. Over a few rows
this is invisible; over a few thousand it is cents to low units of currency, and it is *expected*
rather than a fault.

Funds precision defaults to **2** decimal places and is set per network by the white-label
*analytics decimal precision* property; CPM precision on screen is **3**.

> **Corner case:** an **export does not round the way the screen does**. The export path replaces both
> precisions: funds precision becomes the network's configured value or **8** if none is set, and CPM
> precision becomes **8** unconditionally. So an exported file can carry more decimal places than the
> report it came from, and its Profit column — recomputed from those longer values — will not always
> equal the on-screen Profit rounded. Reconcile from the export, not the screen.

> **Corner case:** the summary (roll-up) row is computed by its own query over the whole result set,
> not by adding up the displayed rows. It recomputes every ratio from summed numerators and
> denominators, so it is **not** an average of the per-row ratios and will not always equal the sum of
> a rounded column.

## Ratio formulas

All ratios are computed from the sibling columns of the same row and displayed as percentages, except
the eCPM family, which is money per 1000 impressions.

| Metric | Formula |
|---|---|
| CTR | clicks ÷ impressions |
| Fill rate | impressions ÷ (impressions + unfilled requests) |
| I2C | conversions ÷ impressions |
| CCR | conversions ÷ clicks |
| eCPM Net | Net × 1000 ÷ impressions |
| eCPM Gross | Gross × 1000 ÷ impressions |
| eCPM Profit | eCPM Gross − eCPM Net |
| Profit | Gross − Net |

Each ratio exists in all three families, computed from that family's own numerator and denominator —
the Publisher CTR is publisher clicks ÷ publisher impressions, not a copy of the Basic one.

## General report: counting metrics

| Column | Meaning / formula |
|---|---|
| Impressions | Counted ad impressions |
| Clicks | Counted clicks |
| CTR | clicks ÷ impressions, % |
| Requests | Impressions **plus** requests that returned no ad — not every request received (a returned ad that never rendered is in neither); for raw request counts use Advanced |
| Fill rate | impressions ÷ Requests, % |
| Unique visitors | Distinct visitors of the campaign |
| Status | Revenue confirmation status of the period (finalization) |

Unique visitors and Status appear only for a role that holds the Basic family.

> **Note:** **Requests counts every request, not just the unanswered ones.** Requests that produced an
> ad are counted as impressions and requests that did not are counted as no-ad answers; the
> displayed Requests column is their sum, which is why Fill rate divides by it and can never
> exceed 100%.

> **Corner case:** **Requests and Fill rate disappear** as soon as the report touches the demand side,
> because a request that never produced an ad has no banner, campaign or advertiser to attribute it
> to. Precisely, they are dropped when the report **groups by** Advertiser, Campaign, Banner (or any of
> their ID columns), Conversion Action, **Attribution Type**, Banner Label, Banner Template, ISCI / Ad-ID
> or Advertiser Owner; when it **filters** on Advertiser, Campaign, Banner, Banner Label, Banner
> Template or ISCI / Ad-ID; or when the columns are split by conversion action.

> **Corner case:** **Unique visitors is the most conditional column in the product.** It appears only
> when the Group by is *exactly* Campaign, or *exactly* Campaign + Country. Any filter on Site, Zone,
> Placement, Placement Type, Placement Size, Banner, Channel, Placement Label, Banner Label, Banner
> Template or ISCI / Ad-ID removes it as well — including the Placement Size filter, which is easy to leave set from
> a previous report.

## General report: conversion metrics

The whole block below appears only when conversions are visible to you — see the corner case after
the table.

| Column | Meaning / formula |
|---|---|
| Conversions | Counted conversions — **system** events (VAST playback quartiles, viewability) are not counted; see the corner case below |
| Conv. fraud | Rejected (invalid) conversions |
| I2C | conversions ÷ impressions, % |
| CCR | conversions ÷ clicks, % |
| Expired post-click conversions | Diagnostic: a click matched but was older than the post-click window |
| Expired post-view conversions | Diagnostic: only a view matched and it was older than the post-view window |

The two expired columns are switched on by the same permission as Conversions.

> **Corner case:** **Conv. fraud is not shown when the columns are split by action** — it reports
> rejected conversions as one figure, which a per-action column split has no place for. In every
> other General report, whatever the grouping, it is available to a role that holds its permission.

> **Corner case:** the conversion block also requires view access to at least one conversion action. A user whose role has only *shared* action access and who has had
> no actions shared to them sees **no** conversion columns at all — not Conversions, not the ratios,
> not the attribution or expired columns.

> **Corner case:** **system conversions are kept out of the Conversions column.** Playback and
> viewability events (attribution type *System*) outnumber real conversions on video inventory by
> orders of magnitude, so the counter that feeds Conversions, I2C and CCR skips them when a day's
> numbers are written; their money is still summed into Net, Gross and the other money columns, and
> the action log keeps every event, so grouping by Conversion Action or Attribution Type shows them
> with real counts. On the **General** report the exclusion is applied as each day's numbers are
> written, so days aggregated before it shipped keep what they had. The **Advanced** report applies
> it when the query runs on the full logs (the default); on a network whose Advanced report runs on
> compacted logs, the conversions figure is pre-aggregated and may still include system events.

> **Corner case:** **Expired post-click / post-view conversions** count matched-but-expired
> conversions — a click or view existed but was older than its attribution window. They are recorded
> with zero revenue, are excluded from *every* conversion and revenue total, and never trigger CPA
> pricing, capping, limits or piggybacks. Both columns exist **only in the Basic family**, and they are **not** an arm of
> the attribution split — they are offered whenever conversions are, on any report not grouped by
> Attribution Type. Turn them on with **Expired windows** in *Split columns by*, or directly in
> the **Columns settings** panel.

## General report: splitting columns by a dimension

A report spreads dimensions down the rows with **Group by**, and may additionally spread dimensions
across the columns with **Split columns by**. That control is a **multi-select**, not a single
choice: most of its entries combine.

| Option | Group in the picker | What it adds | Precondition |
|---|---|---|---|
| *each saved funnel, by name* | Your funnels | One column per action in that funnel, in funnel order | Conversion Action must **not** be in the Group by |
| Conversion action | Conversion actions | One column per selected action, in each enabled family | Same |
| VAST quartiles | Conversion actions | The VAST quartile actions as columns | Same |
| Viewability | Conversion actions | The viewability actions as columns | Same |
| Video player interactions | Conversion actions | The player-interaction actions as columns | Same |
| Attribution type | Attribution | Post-click and post-view arms of every conversion metric | Attribution Type must not be in the Group by |
| Expired windows | Attribution | The two expired-conversion columns | — |
| Custom parameter | Other dimension | Parameter / Value / Count | Conversion Action **must** be in the Group by, and nothing else may be picked |

> **Note:** the four **Conversion actions** entries and the funnels are not competing dimensions —
> they are different subsets of the one action dimension, so picking several simply **unions** their
> action lists into a longer set of columns. Picking VAST quartiles *and* Viewability is asking for
> both sets of columns, not a conflict.

> **Note:** **Custom parameter is the only exclusive option.** It is a genuinely different dimension,
> so it cannot share the columns: choosing it blocks everything else, and anything else already
> chosen blocks it. The picker says which, rather than silently dropping the option.

> **Corner case:** an option you lack the *permission* for is **hidden**; an option blocked by the
> current *state* stays listed with the reason on it — "Group by conversion action first",
> "Attribution type is already a row dimension", "Cannot share the columns with another split". So an
> absent entry means your role, and a greyed one means your current selection.

> **Corner case:** on the **Advanced** report only *Custom parameter* is offered. That report has no
> per-action or attribution columns, and an action split would hide its **No ads** column.

When **Attribution type** is picked *without* an action split, these columns appear. Each shows only
when you can also see Conversions and the column it splits:

| Column | Family |
|---|---|
| Post-click conversions / Post-view conversions | Basic, Publisher, Advertiser |
| Post-click I2C / Post-view I2C | Basic, Publisher, Advertiser |
| Post-click CCR / Post-view CCR | Basic, Publisher, Advertiser |
| Post-click net / Post-view net | Basic |
| Post-click revenue / Post-view revenue | Publisher |
| Post-click gross / Post-view gross | Basic |
| Post-click charges / Post-view charges | Advertiser |

> **Note:** the money arms are **not** symmetric across families. The Publisher family gets the Net
> side only (Post-click / Post-view revenue) and the Advertiser family the Gross side only (Post-click
> / Post-view charges) — matching the families' single money column each. Only the Basic family
> carries both.

> **Corner case:** **Attribution type combines with an action split rather than replacing it.** Pick
> both and the columns nest instead: each action column gains a *(post-click)* and a *(post-view)* arm
> beside its total, in every enabled family. The flat post-click/post-view columns above are what you
> get from attribution *alone* — you cannot have those and the action columns at the same time,
> because the nested shape is what that combination means.

> **Corner case:** grouping **rows** by Attribution Type suppresses the column split entirely, and
> blanks the expired columns too — the rows already carry that dimension, so the columns would repeat
> it.

> **Corner case:** **Expired windows is a column toggle, not really a split.** The two expired
> columns are available on every report where conversions are, whatever the split; picking *Expired
> windows* simply ticks them in the column list. You can equally tick them directly in Reports Layout
> Settings, and untick them there to hide them again. This is why they survive an action split, which
> the post-click/post-view columns do not.

## General report: money and derived metrics

| Column | Meaning / formula |
|---|---|
| Net | Publisher-side money, floored at minimal revenue |
| Revenue | Net as the publisher sees it |
| Minimal net | The minimal-revenue floor itself |
| Gross | Advertiser-side money |
| Charges | Gross as the advertiser sees it |
| Profit | Gross − Net, from the rounded values |
| AP profit | **Charges − Revenue**, from the rounded values |
| eCPM Net | Net × 1000 ÷ impressions |
| eCPM (Publisher family) | Revenue × 1000 ÷ publisher impressions |
| eCPM Gross | Gross × 1000 ÷ impressions |
| eCPM (Advertiser family) | Charges × 1000 ÷ advertiser impressions |
| eCPM Profit | eCPM Gross − eCPM Net, from the rounded values |
| Parameter / Value / Count | Custom-parameter breakdown triple |

Revenue is granted through the *Net* permission and Charges through the *Gross* one; the
family-specific eCPM columns follow *Net eCPM* and *Gross eCPM* the same way.

> **Note:** **AP profit is the cross-family margin, not an accounting-period adjustment.** It is the
> Advertiser family's Charges minus the Publisher family's Revenue — the two columns each side of the
> business actually sees — where plain Profit is the Basic family's Gross minus the Basic family's
> Net. On a network where the family columns are kept in step the two agree; where they drift, the
> gap between Profit and AP profit is that drift.

> **Note:** Minimal net and AP profit exist on the General report only; both are dropped for Advanced.

## Advanced (Hadoop) report

The Advanced report has three column views, and **which one you get is your own setting, not your
role's**: it is a saved user preference on the Preferences page. Your role only decides which options
that picker offers.

| View | Columns (maximum) |
|---|---|
| Simple | 21 |
| Extended | 38 |
| Unique | 62 (Extended + 24) |

> **Corner case:** any role that can run Advanced reports can switch between Simple and Extended;
> only Unique needs a permission of its own. The default view an administrator sets applies to
> **newly created** users only — changing it will not move an existing user's view.

Each column below is shown only when your role holds the matching *Analytics Report Column …*
permission. The one whose name differs from its label: **Impressions** is granted as *Deliveries*.

> **Corner case:** the **Simple view ignores the Columns settings panel** entirely. Its column set is
> fixed; ticking columns off there changes the Extended and Unique views only.

On top of the view, a **column preset** narrows what is actually rendered — the Extended and Unique
tables below are what each view *can* show, not what a default report does.

### Simple view

| Column | Meaning / formula |
|---|---|
| Requests | Direct + repeated requests when grouped by Site, Zone or Placement; deliveries otherwise |
| Wasted requests | Requests that consumed resources without producing an ad |
| Valid passbacks | Passbacks matched to an impression |
| Eligible impressions | See the Extended formulas |
| Eligible clicks | See the Extended formulas |
| Effective CTR | eligible clicks ÷ eligible impressions, % |
| Risk score | risk sum ÷ (eligible impressions + eligible clicks), shown as a % |
| Conversions block, money block | Same as Extended below |

> **Note:** the Simple view's headers say **Eligible impressions**, **Eligible clicks**,
> **Effective CTR** and **Valid passbacks** — not "Impressions", "Clicks", "CTR" and "Passbacks" —
> because the numbers are the eligible ones, as in the Extended view.

> **Corner case:** **Valid passbacks appears in the Simple view only when the network joins passbacks
> to impressions.** That is a server setting, not a permission.

### Extended view

| Column | Meaning / formula |
|---|---|
| Direct requests | Raw incoming ad requests |
| Repeated requests | Repeats of the same request (refreshes, retries) |
| Filled requests | direct requests − returned requests |
| Wasted requests | Requests that produced nothing billable |
| Returned requests | Requests answered without an ad |
| No ads | Explicit no-ad responses |
| Opportunities | Serving opportunities offered |
| Vpaid opportunities | VPAID-capable request opportunities |
| Impressions | All impression events, before eligibility filtering (the formulas below call it *deliveries*) |
| Rejected impressions | Impressions flagged invalid |
| Lost opportunities | max(0, opportunities − deliveries + rejected impressions) |
| Lost opportunities, % | lost opportunities ÷ opportunities |
| Valid passbacks | Passbacks matched to an impression |
| Rejected passbacks | Missed passbacks (plus fraud passbacks on compacted logs) |
| Rejected passbacks, % | rejected ÷ all passbacks |
| Eligible impressions | max(0, deliveries − valid passbacks − rejected impressions) |
| Fill rate, % | eligible impressions ÷ direct requests |
| Effective fill rate, % | eligible impressions ÷ deliveries |
| Eligible clicks | total clicks − rejected clicks |
| Clicks | All click events |
| Rejected clicks | Clicks flagged invalid |
| CTR | eligible clicks ÷ **filled** requests, % |
| Effective CTR | eligible clicks ÷ eligible impressions, % |
| Risk score | risk sum ÷ (eligible impressions + eligible clicks), shown as a % |
| Conversions | All conversion events except system ones (full logs; see the corner case under the General conversion metrics) |
| Rejected conversions | Conversions flagged invalid |
| Eligible conversions | max(0, conversions − rejected conversions) |
| CCR | eligible conversions ÷ eligible clicks, % |
| I2C | eligible conversions ÷ eligible impressions, % |
| Gross / Net | Money counters, with passback money removed |
| Profit | max(0, Gross − Net) |
| eCPM Gross / eCPM Net | money × 1000 ÷ eligible impressions |
| eCPM Profit | max(0, eCPM Gross − eCPM Net) |
| Parameter / Value / Count | Custom-parameter breakdown triple |

> **Note:** two headers do not match the numbers you might expect from their neighbours. **Clicks**
> here is *total* click events, sitting beside Eligible clicks and Rejected clicks; and
> **Conversions** is *total* conversion events, sitting beside Eligible conversions. Neither has
> "Total" in its header.

> **Note:** **CTR and Effective CTR have different denominators.** CTR divides by filled requests,
> Effective CTR by eligible impressions. On a report where deliveries and filled requests diverge the
> two columns differ substantially, and neither is wrong.

> **Corner case:** **the Advanced formulas differ slightly between the full logs (the default) and
> compacted logs.** On the full logs: Rejected passbacks does **not** include fraud passbacks, its
> percentage divides by the raw passback count rather than valid + rejected, Eligible clicks is not
> clamped at zero so it can go negative, and CCR and I2C divide *total* conversions rather than
> eligible ones. The table describes compacted logs. Ask Epom support or your account manager which your network runs
> before treating a small discrepancy as an error.

> **Corner case:** **Filled requests is not clamped at zero**, unlike every neighbouring "eligible"
> column. A negative value there is arithmetic, not corrupt data.

> **Corner case:** money on the Advanced report has passback money **removed**, and the arithmetic
> differs by case: where passbacks were matched or missed, matched-passback money is subtracted;
> otherwise all passback money is subtracted and missed-passback money added back. Both results are
> clamped at zero, as are Profit and eCPM Profit — an Advanced report can therefore never show a
> negative profit, where a General one can.

### Unique view

Everything in the Extended view, plus **24** columns — six for each of the four event families,
inserted after that family.

| Family | The six columns |
|---|---|
| Requests | Unique direct requests · Unique direct requests, % · Unique incoming users · Unique incoming users, % · Unique incoming IPs · Unique incoming IPs, % |
| Impressions | Unique impressions · Unique impressions, % · Unique impression users · Unique impression users, % · Unique impressions IPs · Unique impressions IPs, % |
| Clicks | Unique clicks · Unique clicks, % · Unique clicks users · Unique clicks users, % · Unique clicks IPs · Unique clicks IPs, % |
| Conversions | Unique conversions · Unique conversions, % · Unique conversions users · Unique conversions users, % · Unique conversions IPs · Unique conversions IPs, % |

A "unique" count is that family's events counted once per transaction identity; the *users* and *IPs*
variants count distinct users and distinct IP addresses producing them.

## No ads vs Wasted requests vs Lost opportunities

Three Advanced columns all look like "requests that did not become an ad", and they regularly
disagree by a million on a busy placement. They count different things:

| Column | Counted from | A request lands here when… |
|---|---|---|
| **Returned requests** | The ad server's own answer | No banner was chosen and the ad server returned something else instead — the placement's default (passback) code, or a direct-deal partner's markup or its "no ads" |
| **Wasted requests** | The ad server's own answer | No banner was chosen and **nothing** usable went back: an empty answer or a direct-deal error. VPAID answers are counted apart, as **Vpaid opportunities** |
| **No ads** | No-impression **events** | The ad server logged a no-ad answer, **or** the delivered code reported that the ad did not show — the no-impression beacon of an empty mobile/native response, a video player calling the VAST Error URL of an ad Epom returned |
| **Opportunities** | The ad server's own answer | A banner **was** chosen for the request (original or repeated) |
| **Lost opportunities** | Opportunities vs impressions | A banner was chosen but no valid impression followed: `max(0, opportunities − deliveries + rejected impressions)` |

What follows from that:

- **Wasted requests and No ads are not two views of one number.** Wasted is decided by the ad
  server at answer time; No ads also counts beacons fired later by browsers and players, and a
  request whose ad was returned but failed in the player is an Opportunity *and* a No ads.
- **Opportunities can exceed Direct requests**, because repeated requests (refreshes, retries,
  repeated VAST calls) create opportunities too while Direct requests counts only originals.
- **Which one to follow:** for "how much traffic is unfilled", follow **Wasted requests** (plus
  Returned requests if you count your passback as unfilled). For "how much did we lose after
  picking an ad" — slow pages, players that failed, third-party tags that came back empty —
  follow **Lost opportunities**. Use **No ads** to see what the browser or player reported back.

### Fill rate and effective fill rate: where to find them, what they mean

- **General:** **Requests** and **Fill Rate** show when the report is grouped by supply-side
  dimensions only (site, zone, placement, country, day). Grouping or filtering by advertiser,
  campaign or banner removes it — a request belongs to no advertiser. General's Fill Rate is
  impressions ÷ (impressions + no-ad answers).
- **Advanced:** **Fill rate, %** is eligible impressions ÷ direct requests — of the requests,
  how many became a valid impression. **Effective fill rate, %** is eligible impressions ÷
  deliveries — of the ads that actually went out, how many became a valid impression. A low
  effective fill rate means the ads were returned but rejected as invalid or matched as
  passbacks; a low fill rate with a normal effective fill rate means requests went unfilled. Both
  are in the Extended view.

> **Corner case:** **the percentage denominators are not uniform.** Requests percentages divide by
> *direct* requests; impressions percentages by *eligible* impressions; clicks percentages by
> *eligible* clicks; conversions percentages by *total* conversions. So "Unique clicks, %" and "Unique
> conversions, %" are not the same kind of ratio, and neither divides by the plain total of its column
> group.

> **Corner case:** the Unique columns are available on the **full logs only**. On a network whose
> Advanced report runs on compacted logs there are no distinct counts, so all 24 show zero. If your
> Unique view is a wall of zeroes, that is the reason, not your data.

## Header Bidding report columns

This report counts auction rounds on a header-bidding page, not ad-server events, so its columns
are not the ones above even where a name repeats. Only the two money columns need a column
permission of their own.

| Column | Meaning / formula |
|---|---|
| Fill Source | Who filled the round — only when grouped by it |
| Fills | Rounds somebody served: every fill source except *Unfilled* |
| Unfilled | Rounds nobody took |
| Fill Rate | Fills ÷ (Fills + Unfilled), shown as a percentage |
| Gross | Money booked on the rounds in the group |
| eCPM Gross | Gross ÷ **Fills** × 1000 — unfilled rounds earned nothing and do not dilute it |

Country, Site, Zone and Placement columns appear when those dimensions are in the Group by. Site,
Zone and Placement are shown with their id columns when *Show IDs* is on.

> **Note:** Header Bidding's eCPM divides by **fills only**, not by all rounds. So this eCPM is not
> comparable with the General report's, which divides by impressions.

> **Corner case:** Header Bidding's money columns do **not** need the Basic column family, so a role
> without it can see Gross here but not on the General report. The Targeting Cookie report works the
> same way.

## Targeting Cookie report columns

| Column | Meaning |
|---|---|
| Country | Only when the report is grouped by country |
| Name | Cookie name |
| Value | Cookie value |
| New | Cookies seen for the first time |
| Updated | Cookies whose value changed |

## DSP Partners Analytics columns (Requests, Bids, Wins)

**Bids** and **Wins** are not columns of the General or Advanced report — they exist only on
**DSP Partners Analytics**, per OpenRTB demand partner. **Requests** there are bid requests sent
to the partner, **Bids** are responses with one valid bid at or above the floor (a `204`, a
timeout or a below-floor bid is not a bid), and **Wins** are auctions that bid won. Full
definitions and how to read the funnel:
[Requests, Bids and Wins](https://epom.com/ad-server/docs/guides/admin/dsp-partners.md#did-the-dsp-not-bid-or-did-it-lose-the-auction-requests-bids-and-wins-per-partner).

## Log report columns: which columns do the Impressions, Clicks and Conversions logs have?

The Impressions, Clicks and Conversions Log types are **event lists, not aggregates** — their columns
are per-event attributes, so nothing on this page above applies to them. Every log carries:

Date · IP · Remote IP · X-Forwarded-For · Risk · Site · Domain · Placement · Advertiser · Campaign ·
Banner · Channel · Custom Parameter · Country · Browser · OS · UUID · Transaction Id · User Agent ·
Fraud · Response Code

**ISCI / Ad-ID** joins that list, after Banner, for roles that can see banner ISCI / Ad-ID codes.

There is **no separate click-ID or sub-ID column**. A sub ID you pass on the tag
(`cp.subid=…`, `sub1=…`) appears inside **Custom Parameter**, so that is where you match it — the
same value is also available to the click URL as `$$CUSTOM_PARAM(subid)$$` / `$$SUB1$$`.
**Transaction Id** is the number `$$TRANSACTION_ID_LONG$$` expands to, so a partner who received
that macro can be matched row by row.

The Impressions and Clicks Logs add: Location · Browser Version · OS Version · Mobile Carrier ·
Connection Type · Language · Accept-Language · Traffic Source · Device format · Proxy · Device
Release Year · Device RAM · Price Band · Is Web App · Incognito Mode · Browser Rank · Hardware Rank ·
Platform Rank · Device Vendor · Device Model · Device Model Code · Risk Score · Risk Level · Risk
Category

The Conversions Log adds instead: **Action** · **Attribution Type** (Post-click, Post-view, System or
Unattributed — see the [conversion attribution overview](https://epom.com/ad-server/docs/guides/conversions.md)) · **Time to
convert** · **Piggybacks**, plus **Sampling** for roles that can see piggyback sampling.

An entity ID column accompanies each name column when *Show IDs* is on. A **Request URL** column
appears only on networks that store the request URL with the raw log.

> **Corner case:** **Time Zone Name is deliberately absent from the logs.** The value is captured on
> the original ad request only and is not carried into impression or click tracking URLs, so a Time
> Zone Name column here would always be empty. Use the Advanced report, which reads it from the
> ad-request records.

**Time to convert** is the gap between the ad event a conversion is attributed to and the conversion
itself. For a pixel conversion that event is the click or view the cookie matched. For a
server-to-server conversion it is the moment the ad server expanded the sub-ID or action-data value
the postback replayed — the ad render, or the click redirect when the value was handed out while a
click was being processed. Values expanded before release 149 carry no such moment, so postbacks
replaying one leave the column empty until they age out of the partner's database.

## Abbreviations

These stay in English in **every** locale — they are industry-standard and are never translated:

**CTR** click-through rate · **eCPM** effective cost per mille · **I2C** impression-to-conversion ·
**CCR** click-to-conversion rate · **CPM** cost per mille · **CPC** cost per click · **DSP**
demand-side platform · **SSP** supply-side platform · **DMP** data-management platform · **VPAID**
video player ad-serving interface definition · **VAST** video ad serving template

> **Note:** there is **no plain "eCPM" column on a network-scoped report** — the Basic family spells
> it out as eCPM Net, eCPM Gross and eCPM Profit. A bare **eCPM** header means you are looking at the
> Publisher family (where it is Revenue-based) or the Advertiser family (where it is Charges-based).

## Display conventions

- Entity ID columns (Placement ID, Campaign ID, …) accompany their name columns only when *Show IDs*
  is enabled in the **Columns settings** panel.
- Users without view access to an entity see it masked as `TYPE_id` (for example `CAMPAIGN_123`)
  instead of its name.
- Metric labels are identical across the three families; only the money columns are renamed —
  **Revenue** in the Publisher family, **Charges** in the Advertiser family — and, as above, those are
  different figures rather than renamings.
- Percentage columns are rendered with per-column precision: Fill rate, Effective fill rate, Lost
  opportunities % and Rejected passbacks % to one decimal place; Effective CTR, Risk score and the
  Unique percentages to two; CTR, I2C and CCR to four.

## Related

- [Analytics dimensions](https://epom.com/ad-server/docs/reference/analytics-dimensions.md)
- [Report types](https://epom.com/ad-server/docs/guides/analytics/report-types.md)
- [Run a report](https://epom.com/ad-server/docs/guides/analytics/run-report.md)
- [Dashboards](https://epom.com/ad-server/docs/guides/analytics/dashboards.md)
- [Analytics reports via API](https://epom.com/ad-server/docs/api/analytics-api.md)