### Request Reporting

The Request Reporting feature adds additional columns to your Kevel reports. In addition to impressions, clicks, events, and revenue, you can view data from the requests received in the time period.

- A **request** is a single HTTP request to one of Kevel's ad serving engines. This can be placed by ados.js ad tags or from the Decision API. Each request may contain multiple decisions.
- The ad serving engine makes a **decision** from the request as to which ad (if any) to return in the response. Every **placement** sent in the request will receive its own decision, so one request could generate ten decisions if there are ten placements.
- **Candidates** are ads that are eligible to serve after the ad serving engine applies targeting filters on the decision.
- If the engine chooses to serve a candidate, this ad is the **selection** returned in the response, such as in the JSON `response` object in the Decision API or in the ados.js response.
- **Blanks** are decisions for which no ads are selected.
- If the impression pixel associated with a selection is hit, an **impression** is recorded in Kevel reporting.

The **Fill Rate** shows you the difference between selections and blanks and how many impressions were counted.

How Fill Rate is Calculated:

```text
Fill Rate = (Impressions / (Selections + Blanks))
```

For example, if impressions are recorded on every selection, that site will have a 100% Fill Rate in reporting. If impressions are recorded half the time (or if impressions are recorded 100% of the time but half the decisions are blanks) that site will have a 50% Fill Rate.

## Request Reporting Columns

The following columns are added when Request Reporting is turned on for your account:

| Name | Description |
| --- | --- |
| Selection Requests | Total of Selections and Blanks |
| Ad Decision Requests (ADRs) | Requests multiplied by the number of placements |
| Valid User Agent Requests | _(optional)_ Selections and Blanks that were made with a valid user agent when bot filtering was on. |
| Invalid User Agent Requests | _(optional)_ Selections and Blanks that were made with an invalid user agent when bot filtering was on. |
| Bot Filtering Disabled Requests | _(optional)_ Selections and Blanks that were made when bot filtering was disabled (i.e. it was explicitly set to `false` on the Request) User agent is thus irrelevant. |
| RTB Bid Responses | _(optional)_ Out of `RTB Bid Requests`, number of times Kevel received a bid from an RTB partner. |
| Passback Requests | _(optional)_ Number of Selections from flights enabled for passbacks, i.e. the cumulative length of adChains. |
| RTB Bid Requests | _(optional)_ Number of times Kevel sent a bid request to an RTB partner. |
| RTB Matched Bid Requests | _(optional)_ Out of `RTB Bid Requests`, number of times a user was synced (matched) with an RTB partner. |
| Fill Rate | Impressions divided by Selections and Blanks as a percentage. |

## Running Request Reports

To see request data in a report, you will need to run an **Inventory Report**. An Inventory Report is a report that:

- Includes no GroupBys or Filters, **OR**
- Groups By or Filters by: Site, Zone, Country, Metro, Region, City, Ad Type, or Keyword, **AND**
- Does not Group By or Filter by: Advertiser, Campaign, Flight, Creative, Priority, Channel, or Device dimensions (Model Name, Brand Name, OS Major/Minor Version, Browser Major/Minor Version and Form Factor)
- Does not have a specific Time Zone selected.

(Additionally, a report that filters by an RTB ad will also show RTB Request data.)

All performance reports (i.e. reports that Group By or Filter by Advertiser, Campaign, Flight, Priority, Channel, or Device dimensions) will **not** contain request data.

If you Group By Keyword in an Inventory Report, the report will contain _request keywords_, i.e. keywords that were present on the request but not necessarily matched to an ad via keyword targeting.

Keyword in Inventory Reports only returns selection request counts, not ADR counts.

If there are more than 5 `adTypeIds` or `zoneIds` passed in an ad request, we will only report requests for **the first 5** ad types or zones listed on the request.

When multiple ad type, site or zone values are passed on the request they will be separated onto individual rows in a report. i.e. if a request comes through with 3 sites, the report will contain 3 rows, one for each unique value in the request and a count towards the relevant request metrics. This can lead the ADR counts in custom reports to be larger than the counts found on the Ad Decision Requests reports page.

Impression data loads faster than request data. If you run a report for the current day, you may see impression data without request data. This is normal - re-running the report later will include the requests.
