# In-app message reporting

> Read an in-app message's views, clicks and dismissals, and see exactly what the SDK counts as each.

Source: https://docs.grovs.io/docs/engagement/in-app-messages/reporting

Every in-app message has a report. Open it from **Engage** › **In-App** with **Open report** on the message's row.

## The report

Pick a **Period**: **Today (UTC), by hour**, **Last 7 days**, **Last 30 days** or **Last 90 days**. Days are UTC. Numbers refresh at most once a minute.

| Metric                      | Means                                                                                          |
| --------------------------- | ---------------------------------------------------------------------------------------------- |
| **Views**                   | Times the message was on screen. The hint below counts distinct devices                        |
| **Clicks**                  | Times someone acted on it: a button, or a tap on the message. The hint counts distinct devices |
| **Click rate**              | Clicks divided by views                                                                        |
| **Dismissals**              | Times someone closed it without acting                                                         |
| **Devices that may see it** | For a segment message, the devices in its audience. Not shown for **Everyone**                 |

Below the totals:

- ****Over time**** charts views, clicks and dismissals by day, or by hour for today.
- ****By platform**** splits them by iOS, Android and web.
- ****Clicks by button**** shows clicks per button. **Tap on the message** counts taps on the message itself.

A message with a question shows **Answers** and **Answer rate** instead of clicks, plus an **Answers** tab. See [Surveys and ratings](https://docs.grovs.io/docs/engagement/in-app-messages/surveys-and-ratings#read-the-answers). A message with a goal, control group or variants has an **Experiment** card. See [Experiments](https://docs.grovs.io/docs/engagement/experiments).

## What counts

The SDK reports three events in its normal event batches: `in_app_viewed`, `in_app_clicked` and `in_app_dismissed`. Because of batching, a view can take a while to appear, and an offline device reports when it reconnects.

### A view

A view counts when the message is actually on screen, not when its trigger fires.

- A message waiting out a delay or behind another message counts when it appears. If it no longer applies by then, it never appears and isn't counted.
- A message that couldn't be drawn isn't counted and reports nothing.
- A [custom HTML](https://docs.grovs.io/docs/engagement/in-app-messages/custom-html) message counts once its page is ready. A page not ready within 5 seconds is dropped and not counted.
- Test messages are never counted.
- Each view has its own id, so a batch sent twice counts once.

Every limit, such as "at most once a day", counts the views this device recorded.

### A click

At most one click per view: the first action on the message.

| Template               | Counts as the click                                                                                                                                        |
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Templates with buttons | A tap on a button, or on the message when it has a tap action                                                                                              |
| Image-only templates   | A tap on the picture                                                                                                                                       |
| Custom HTML            | The first `grovs.track()` or `grovs.open()` call, including from a `data-grovs-action="track"` or `="open"` element or a plain link. Closing doesn't count |

The click is reported before the action runs, so it's recorded even if the action leaves the app.

### A dismissal

A dismissal is a close without a click. The SDK records why:

| Reason         | When                                                                                  |
| -------------- | ------------------------------------------------------------------------------------- |
| `close_button` | The close button, the Escape key on the web, or `grovs.close()` in a custom HTML page |
| `backdrop`     | A tap outside the message                                                             |
| `swipe`        | A swipe on a banner or card (iOS)                                                     |
| `app`          | Your app closed it through the SDK, or the page went away                             |

Two closes aren't counted as **Dismissals**:

- **Screen rotation.** A **Portrait only** or **Landscape only** message closes when the device turns. It's reported with reason `orientation`, since the person didn't dismiss it.
- **After an answer.** Once a question is answered, any close counts as answered.

In custom HTML, a person can track an event (a click) and then close the page, so one view can have both a click and a dismissal.

## Reading the numbers

- **Views and devices.** Three views by one person is three views and one device. Device counts aren't people: someone with a phone and a laptop counts twice.
- **Control groups.** Held-back people never see the message and add no views. The **Experiment** card compares them with viewers.
- **Edits.** Editing a live message doesn't reset its report. Each click carries the revision it was shown with, so clicks on a since-removed button still count.
- **Ended messages** keep their report.

The raw events are also in your analytics and the [event stream](https://docs.grovs.io/docs/data/event-stream), with the message's `campaign_id`, `revision`, `template` and, for clicks, `button_id` and `action`.

## Related

- [In-app messages overview](https://docs.grovs.io/docs/engagement/in-app-messages)
- [Surveys and ratings](https://docs.grovs.io/docs/engagement/in-app-messages/surveys-and-ratings)
