---
title: "What each analytics counter counts and when"
description: "Why impressions land in the wrong country or city, why there are more impressions than page views, why pop and direct-link counts differ from the traffic source, what video \"No ads\" and Fill Rate count, and why conversions drop or expire after an attribution window or a server-to-server setting changes."
type: "reference"
audience: [network-manager, publisher, advertiser]
keywords: [wrong country, wrong city, geo database, IP data provider, auto-refresh impressions, refresh after, several slots, page views, single-page app, pop impressions, direct link, no ads, fill rate per advertiser, conversion window, expired conversions, expired post-click, expired post-view, attribution type, default attribution type, server-to-server, S2S, cache reload]
ui_path: "Account → 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.

# What each analytics counter counts and when

A detail page of [Analytics discrepancies](https://epom.com/ad-server/docs/troubleshooting/analytics-discrepancies.md), which has the 60-second
check, the cause table and what to send support. This page holds the checks where the question is
what a counter counts, or when — the country and city of an impression, impressions against page
views, pop and direct-link counts, video *No ads* and Fill Rate, and conversions that drop or
expire after an attribution window or a server-to-server setting changes. Gaps against a
partner's own numbers are on
[Analytics discrepancies against a partner's numbers](https://epom.com/ad-server/docs/troubleshooting/analytics-discrepancies-third-party.md);
reports that disagree with each other or come back empty are on
[Reports that disagree or come back empty](https://epom.com/ad-server/docs/troubleshooting/analytics-discrepancies-reports.md).

## Symptom: impressions in the wrong country or city (VAST, geo database, outside targeting)

- **The country is decided at the ad request.** Targeting and the country of the impression come
  from the IP that called the ad tag. When that caller is a server — a video player's or SSP's
  server, a server-side ad insertion stitcher, a proxy — the country is the server's, unless the
  caller forwards the viewer's IP (`clientIp`, `X-Device-IP`, `X-Forwarded-For`), see
  [Serving behind server-side ad insertion](https://epom.com/ad-server/docs/guides/inventory/placement-video.md#serving-behind-server-side-ad-insertion-ssai).
- **Location (city) and IP are read from each hit.** The impression and click rows take the
  region, city and IP of the pixel or click request itself; a pixel fired from a server reports
  the server's city even when the request's country was right.
- **Two IP data providers differ.** Epom resolves IPs with the IP data provider set for your
  network (ask Epom support or your account manager which one). A partner on another provider
  puts a share of IPs — mobile carriers, VPN exits, new ranges — in
  a different country or city. Country-level differences of a few percent are normal; city level
  differs much more.
- **Targeting was not where you think.** Another campaign linked to the same placement with wider
  geo targeting fills those countries — group by **Country** and **Campaign** to see which one.

## Symptom: pop or direct-link numbers differ from the traffic source

A traffic source that sends visitors to your **direct URL** counts the visits it sent; Epom
counts the redirects it served. Expect a larger gap than for banners:

- **No-ad answers.** A request that no banner can serve — capped, out of targeting, over a
  limit — gets a `404` and a *no ad*, not an impression. Remove caps and targeting temporarily
  to measure the raw gap.
- **Impressions only for counting templates.** A redirect counts an impression only when the
  template has *Template impressions record* ticked (or the banner is an OpenRTB pop) — see
  [what counts](https://epom.com/ad-server/docs/guides/inventory/pop-under-direct-link.md#what-counts-as-an-impression-and-a-click).
- **Filtered traffic.** Bots and invalid traffic are excluded from standard metrics; pop
  traffic carries more of both.
- **Find the bad sources.** Ask the source to append its sub-source ID as a custom parameter
  (`&cp.source={source_id}`) or as the channel (`&ch=…`), then group by **Channel**, or break an Advanced report down by that
  custom parameter, and compare per source. A per-impression comparison is possible when the source
  passes its transaction or click ID as a custom parameter and you export the raw
  **Impressions Log**.

## Symptom: video — many "No ads" or fill rate differs per advertiser

- In an **Advanced** report, **No ads** counts every time the ad server answered without an ad
  **and** every time a video player fired the **Error** URL of an ad Epom returned. A
  third-party VAST tag that turned out empty in the player therefore lands in *No ads* even
  though Epom returned an ad for that request.
- **Fill Rate** in General is per placement: a request is filled when **any** banner served.
  Requests cannot be split by advertiser (the request happens before an advertiser is chosen),
  so there is no per-advertiser Fill Rate in General — see
  [My fill rate is low](https://epom.com/ad-server/docs/troubleshooting/low-fill-rate.md#what-epom-actually-measures). For a per-network
  picture of a VAST setup, compare each banner's impressions with the requests of a placement
  that carries only that banner, or use the Advanced report's no-ad columns.

## Symptom: conversions dropped after shortening an attribution window

Shortening an action's post-click or post-view window (**Account → Conversion
Actions → action**) immediately disqualifies every conversion whose matching click or view
is now older than the window — the drop is expected, not data loss. To size it, add the
**Expired post-click conversions** and **Expired post-view conversions** columns to a General
report (they are opt-in — pick **Expired windows** under *Split columns by*, or tick them in the
report's **Columns settings**): each matched-but-out-of-window
conversion is recorded there as a zero-revenue diagnostic instead of vanishing. If the expired
columns roughly equal the missing conversions, the window change explains the drop; widen the
window (or accept the stricter attribution) deliberately. Note the expired diagnostics are
excluded from all conversion and revenue totals and never trigger CPA pricing, capping,
limits or piggybacks — and conversions recorded before the attribution feature shipped
report as **Unattributed**, not as expired.

## Symptom: S2S conversions started expiring after an action setting changed

A server-to-server postback is only measured against an attribution window when it claims a
click or a view. Two settings on the action can start such a claim where there was none:
**Default attribution type** (set to Post-click or Post-view, it classifies every postback that
declares nothing) and **Apply attribution window to server-to-server conversions** (ticked, it
lets the windows apply to S2S at all). Switching both on turns postbacks that used to count
unconditionally into window-checked ones, and the late ones become zero-revenue
**Expired post-click conversions** / **Expired post-view conversions** rows.

Check, in this order: the action's Default attribution type, the S2S window checkbox, then the
two window values against the partner's real conversion latency (trials and delayed approvals
can be weeks). The Conversions Log's **Attribution Type** column shows which arm the
conversions moved into. The effect ramps up over days rather than appearing at once, because
stored values expanded before release 149 carry no timestamp and keep counting until the
partner's database rotates them out. Reverting the default to Unattributed stops the expiry for
postbacks that declare nothing; conversions already recorded as expired stay as diagnostics.

Neither setting takes effect the second you save it. The ad servers read action settings from a
cache reloaded on a schedule — every 10 minutes on a standard network — so both the change that
started the expiry and the change that stops it land up to one reload later. Judge a test
postback only after that.

## Related

- [Analytics discrepancies](https://epom.com/ad-server/docs/troubleshooting/analytics-discrepancies.md) — the 60-second check, the cause table and what to send support
- [Analytics discrepancies against a partner's numbers](https://epom.com/ad-server/docs/troubleshooting/analytics-discrepancies-third-party.md)
- [Reports that disagree or come back empty](https://epom.com/ad-server/docs/troubleshooting/analytics-discrepancies-reports.md)
- [Pop-under and direct-link placements](https://epom.com/ad-server/docs/guides/inventory/pop-under-direct-link.md)
- [My fill rate is low](https://epom.com/ad-server/docs/troubleshooting/low-fill-rate.md)
- [VAST errors and playback](https://epom.com/ad-server/docs/troubleshooting/vast-errors-and-playback.md)
- [Conversion actions](https://epom.com/ad-server/docs/guides/conversions/conversion-actions.md)