---
title: "Read the Traffic Quality report"
description: "Find the placements whose traffic is invalid — one figure per placement per day, what was paid for it, an Act / Watch / OK status, the reasons in plain words, a Details panel and a PDF report with AI analyst notes — and know what each status asks of you."
type: "howto"
audience: [admin, network-manager]
keywords: [traffic quality, invalid traffic, IVT, Act, Watch, OK, Not enough data, invalid share, paid for invalid, refused before counting, main reasons, Details, confidence, likely range, Suspicious, Routine bots, Counted twice, IP screening, PDF report, analyst notes, Add AI notes, Generate report, scan date, network median, traffic_quality, traffic_quality_analyze]
ui_path: "Account → Traffic Quality"
---

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.

# Read the Traffic Quality report

Traffic Quality gives each placement one figure per day — the share of its impressions that are
invalid — with what was paid for them, a status that says whether to act, and the reasons in plain
words. It is evidence, not enforcement: nothing in ad serving reads the status, so a placement
marked *Act* keeps serving until you pause it, unlink it, add a Traffic Risk Score rule or talk to
the publisher. How the figure is built:
[Invalid traffic (IVT) and how Epom flags it](https://epom.com/ad-server/docs/concepts/invalid-traffic-and-risk-scoring.md).

**Example.** Yesterday the *Sports Daily › sidebar › 300×250* placement received 41,000
impressions; 34 % of them carry a strong invalid signal (*likely 31 %–37 %*, *High confidence*),
far above the 10 % *Act* line for web placements, so the row reads **Act**. *Paid for invalid*
says $41.20 of the day's $132.80 gross went to invalid impressions; **Main reasons** are *Counted
twice* 19 %, *Data-centre servers* 11 % and *Declared bots and crawlers* 6 %. **What to do**
suggests setting *Impression deduplication* to *Enforce* and asking the publisher why the pixel
fires twice.

## Typical scenarios

| You want | Do | Where |
|---|---|---|
| See which placements need attention today | Open the page: the **Status** filter is on *Act + Watch* and the list comes worst first | **Account → Traffic Quality** |
| Know whether a publisher's 34 % is unusual | Read *network median* on the row and *Your network today* in **Details** | The row; **Details** |
| Decide whether a placement's bad day is a trend | Read the arrow on the row (*up from 14 %*) and *Last 7 days* in **Details** | The row; **Details** |
| Get something you can send the publisher | **Generate report** on the row, then **Download PDF**: page one is the verdict, the analyst notes end with a neutral message for the publisher | The **Report** column |
| Cut what you pay for repeats on every placement | Set **Impression deduplication** to *Enforce* | [Validation settings](https://epom.com/ad-server/docs/guides/admin/validation-settings.md) |
| Check a week that looks clean after the publisher said they fixed it | Pick each **Date**; a scored day keeps its figures | The **Date** filter |

## Step by step

Traffic Quality is computed once a day, for yesterday; the page reads what that run saved. The
walk-through of the screen and of the report are on two pages:

1. Open **Account → Traffic Quality**, read the six summary cards, set the **Date** and **Status**
   filters and read the rows, worst first —
   [Read the Traffic Quality cards, rows and Details](https://epom.com/ad-server/docs/guides/admin/traffic-quality-report-cards-and-details.md).
2. Open **Details** on a placement for the whole picture of the placement-day: confidence, likely
   range, the **Suspicious** / **Routine bots** / **Counted twice** split, the facts, **Why** and
   **What to do** — [the same page, step 5](https://epom.com/ad-server/docs/guides/admin/traffic-quality-report-cards-and-details.md#step-by-step).
3. For evidence to send the publisher, generate the PDF report on the row and, once a key and
   allowance are at hand, add the analyst notes —
   [Generate the Traffic Quality PDF report](https://epom.com/ad-server/docs/guides/admin/traffic-quality-report-pdf.md).
4. To fill a gap, ask Epom support or your account manager to run a backfill. It covers only
   recent days that have no Traffic Quality data at all; it cannot rescan a date you choose.

## Caveats and exceptions

- **Evidence, not enforcement.** No part of ad serving reads the status, so a placement marked
  *Act* keeps serving exactly as before. Acting on it — pausing or unlinking the placement,
  adding a Traffic Risk Score rule, talking to the publisher — is a manual step.
- **One day at a time, and only placements with enough traffic.** Traffic Quality is computed
  once a day, for **yesterday**, and later retries fill days that were missed. A quiet placement
  is never judged and never appears.
- **The invalid share is taken over everything the placement sent, refused impressions
  included** — what a publisher sends does not change when the network switches a check from
  *Monitor* to *Enforce*. *Paid for invalid* counts only what was billed, so enforcing a check
  lowers the money but not the share, and *Refused before counting* grows instead.
- **A repeat counts once.** The copies of one ad view (same ad request and creative) are grouped:
  one clean copy is the original, and every other copy is invalid — in *Counted twice* when it
  carries no other strong signal, in *Suspicious* or *Routine bots* when it does. Repeats
  impression deduplication refused are included. The *Counted twice* reason under **Why** counts
  every repeat, whatever else it carries, so it can be larger than the *Counted twice* part of
  the split.
- **A day that is scored again refreshes its rows** — except rows that already have a PDF
  report, which keep the numbers the report was built from. A backfill only ever scores days with
  **no** scores at all, though, so in practice a day that already has scores is not rescanned.
- **The report's own caveats** — a report made without notes, and generation that gives up
  silently — are on [Generate the Traffic Quality PDF report](https://epom.com/ad-server/docs/guides/admin/traffic-quality-report-pdf.md#caveats-and-exceptions).
- **Reconciling with the Advanced report.** Run the report for the same placement and the same
  day in the time zone the ad server's logs are cut in (the server's own): a report in another
  time zone starts its day at a different hour. In **Details**, *Impressions* under **All
  signals** then matches the report's *Impressions*, *Refused before counting* its *Rejected
  impressions*, *Counted* the difference, and the gross after *of* in *Paid for invalid traffic*
  its *Gross*. Two cases still differ: where the network's reports leave out events not matched
  to an ad request, Traffic Quality keeps judging them, so its *Impressions* is larger by that
  much (*Counted* and *Refused before counting* still match); and where the server is set not to
  store refused events at all, nothing is refused in either place.
- **The legacy page opens without the grants.** A role without both Traffic Quality grants can
  still open the legacy Traffic Quality page by its address. It shows no figures and *No
  placements match this date and status* — the data request is refused silently. An empty grid
  there is not evidence of clean traffic; check the role first.
- **Roles.** Network managers and administrators who switch into a network user see the tab with
  both permissions. Rows of placements on sites your role has no view access to are left out of
  both the cards and the grid.

## Not working?

Traffic Quality is computed once a day, for yesterday, and the page only reads what that run
saved. Zeros or an empty grid mean one of:

| Symptom | Check | Where |
|---|---|---|
| Every day is empty | The feature is not switched on for your network — it is a server-side setting, off by default. | Epom support or your account manager |
| Today, or yesterday early in the day, is empty | Today has no data by design; yesterday's appears only after the nightly run. Pick an earlier **Scan date**. | The **Date** filter |
| Cards show numbers above an empty grid | Every placement was *OK* or *Not enough data*; the grid shows only *Act + Watch* by default. Tick the other two statuses. That is the good outcome, not a broken page. | The **Status** filter |
| A placement you expect is missing | Its site is not visible to your role, or the placement had too little traffic that day to be judged — a quiet placement never appears. | The site's shares; the placement's traffic |
| **Checked by IP screening** is 0 % on every placement | The risk-scoring service is not switched on for the network. The reasons that come from IP screening never fire; everything else is computed without it. | Epom support or your account manager |
| The *Invalid traffic* card shows a dash | The day was scored before release 155 and has no exact share; its rows show the old estimate (*≈ 37.6% (estimate)*). | The **Date** filter |
| The legacy page shows *No placements match this date and status* | Your role lacks one of the two Traffic Quality grants; the data request was refused silently. | **Admin → Users & access → User roles & permissions** |
| A day's numbers changed after a backfill, but one row did not | Rows with a PDF report keep the numbers the report was built from. | The **Report** column |
| **Generate report** never turns ready, or the report has no analyst notes | See the report page. | [Generate the Traffic Quality PDF report](https://epom.com/ad-server/docs/guides/admin/traffic-quality-report-pdf.md#not-working) |

## Reference

### Traffic Quality statuses

**Act is decided on the day; OK and Watch on the last 7 days.** A bad day reaches *Act* at once,
while the choice between *OK* and *Watch* is made on the placement's invalid share over the seven
days before the day — the *Last 7 days* figure in **Details** — so one noisy day does not flip a
placement from *OK* to *Watch* and back. The day's own share is decided on the **low end of its
likely range**, not on the figure itself, so a placement with few people behind its impressions
has to be clearly over the *Act* line to reach it. A placement without such a week — a new one, or
one whose earlier days were scored before release 155 — is judged on the day alone, the same way.

| Status | When | What it asks of you |
|---|---|---|
| **Act** (red) | The day's whole likely range is at or above the *Act* line for the placement's format, and confidence is not *Low* | Worth acting on now. The nightly run prepares the deep analysis only for these placements; it never writes a report — that is made when someone asks for it. |
| **Watch** (amber) | Not *Act*, and over the last 7 days the invalid share is at or above the *Watch* line, or suspicious traffic alone is at least 5% of the impressions — or the day itself is over the *Act* line with *Low* confidence, whatever the week | Keep an eye on it; act if it persists. A *Low confidence* day over the *Act* line stops here: a clean week never turns it *OK*. |
| **OK** (green) | Not *Act*, the day itself is not over the *Act* line, and over the last 7 days the invalid share is below the *Watch* line | Nothing. |
| **Not enough data** (grey) | Too few people stand behind the day's impressions to judge it, and the last 7 days do not hold enough either | Judge the placement over several days. A small day with a week of enough data behind it gets *OK* or *Watch* from the week instead. |

So a placement can read *Watch* on a clean day after a bad week, or *OK* on a bad day that is
still under the *Act* line: the status says how it has been doing, the share says how the day
went.

The lines depend on the placement's format:

| Lines for | Placement types | Watch from | Act from |
|---|---|---|---|
| Web and display | Site, Mobile Site, Non-standard, Native, Click-through and Email placements | 3% | 10% |
| In-app | Application placements | 5% | 10% |
| Video | Video placements | 8% | 15% |

These lines are provisional: they start at the invalid-traffic bands the IP screening service
publishes for each channel and may move once they are calibrated on Epom's own traffic.
**Details** always shows the lines that applied to the placement.

A day scored before release 155 has no exact share. Its status is read from the level it was given
then — *Clean* as *OK*, *Suspicious* as *Watch*, *Fraudulent* and *Critical* as *Act* — and the
page shows the old estimate as *≈ 37.6% (estimate)*, with the note *Scored before release 155*.
*Paid for invalid* on such a day is the old estimate too, and it has no reasons, actions, likely
range or split. The *Critical* level (called *Blocked* before release 153) is retired.

### Traffic Quality — what to do

**What to do** in **Details** and on page one of the PDF is a fixed list, not AI text, so every
user sees the same advice in their own language. It is shown on *Watch* and *Act* placements, for
the largest reasons first, at most three:

| Action | Shown for |
|---|---|
| Set **Impression deduplication** to *Enforce* (Admin → Validation settings) so repeats stop being paid | Counted twice |
| Ask the publisher why the impression pixel fires more than once: a doubled tag, a cached page or a script | Counted twice |
| Set **Impression signature check** to *Enforce* so tampered pixels are refused | Tampered or unsigned impression pixels |
| Ask the publisher whether their tag or a script rewrites or strips the impression pixel | Tampered or unsigned impression pixels |
| Filter bots and data-centre traffic on this placement with **Traffic Risk Score** targeting | Declared bots and crawlers, Automated browsers, Data-centre servers, Bots (IP screening), Bots detected by the ad server |
| Keep **IP blacklist check** and **Impressions validation** in *Enforce*: refused addresses cost nothing | Addresses on your blocklist, Addresses the ad server auto-banned |
| Review where this supply comes from with the publisher | Bots detected by the ad server, Known fraud (IP screening) |
| Set **Clicks validation** to *Enforce* so invalid clicks stay out of your reports | Invalid clicks at 10% or more of at least 50 clicks — on any status; on *Watch* and *Act* it takes the last of the three places |

What each reason means:
[Traffic Quality reasons](https://epom.com/ad-server/docs/reference/statuses-and-indicators.md#traffic-quality-reasons).
The checks named above are set on [Validation settings](https://epom.com/ad-server/docs/guides/admin/validation-settings.md).

### Permissions

| Permission | Lets you |
|---|---|
| **Traffic Quality Tab Visible** + **Traffic Quality Reports** (both) | See the tab, the cards, the grid, **Details**, and generate or download reports |
| View access on the site | Have that site's placements in the cards and the grid |
| An AI key (own / network / platform with the plan's AI switched on) + monthly AI allowance | Have the PDF's analyst notes written, and **Add AI notes** |

## Over the API

The same verdicts, a placement's deep analysis and its report (the AI findings as text, and the
PDF) are available over the
[Traffic Quality endpoints](https://epom.com/ad-server/docs/api/traffic-quality.md) of the REST API, and to
an AI assistant through the [MCP](https://epom.com/ad-server/docs/api/mcp.md) tools `traffic_quality` and
`traffic_quality_analyze`. Over the API the deep analysis can also be run on its own, without the
AI findings and the PDF — quicker when the assistant draws its own conclusions.
`traffic_quality_analyze` with `report: true` writes the analyst notes onto a report that has none.

## Related

- [Moderate banners, sites and traffic quality](https://epom.com/ad-server/docs/guides/admin/moderation-and-quality.md)
- [Tune the validation settings](https://epom.com/ad-server/docs/guides/admin/validation-settings.md)
- [Invalid traffic (IVT) and how Epom flags it](https://epom.com/ad-server/docs/concepts/invalid-traffic-and-risk-scoring.md)
- [Statuses & indicators reference](https://epom.com/ad-server/docs/reference/statuses-and-indicators.md)
- [AI assistant](https://epom.com/ad-server/docs/guides/collaboration/ai-assistant.md) — which key the analyst notes run on
- [Video placements — serving behind server-side ad insertion](https://epom.com/ad-server/docs/guides/inventory/placement-video.md#serving-behind-server-side-ad-insertion-ssai)