> ## Documentation Index
> Fetch the complete documentation index at: https://docs.raykoi.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Analytics & Activity

> Views, starts, completion rate, and a per-visitor engagement log.

<Info>
  Both tabs require a paid plan — the Free plan gets a `402` on either. Blocked/spam submission data (the [Submissions](/dashboard/viewing-submissions#blocked-attempts) screen's own filtering) is unaffected and free on every plan; only visitor-engagement tracking is gated.
</Info>

Two distinct tabs, both about visitor behavior rather than submitted data itself:

<CardGroup cols={2}>
  <Card title="Analytics" icon="chart-line">
    Aggregate numbers over time — views, starts, submissions, completion rate.
  </Card>

  <Card title="Activity" icon="list">
    A per-event log — every individual view/start, with country, device, and browser.
  </Card>
</CardGroup>

## Analytics

Pick a window — 7, 30, or 90 days, or all-time — and see:

<ResponseField name="totalViews" type="number">
  How many times the form was loaded.
</ResponseField>

<ResponseField name="totalStarts" type="number">
  How many visitors interacted with at least one field.
</ResponseField>

<ResponseField name="totalSubmissions" type="number">
  How many actually completed it.
</ResponseField>

<ResponseField name="completionRate" type="number">
  `totalSubmissions / totalStarts`, as a percentage — the gap between "started filling it out" and "actually submitted." A low number here usually means the form is too long, a field is confusing, or validation is rejecting people silently.
</ResponseField>

<ResponseField name="usageHistory" type="array">
  One entry per day in the window — `{ date, views, starts, submissions }` — for charting the trend rather than just the totals.
</ResponseField>

Tracked automatically by the SDK/`submit.js` (`view` on load, `start` on first field interaction, `submit` on success) — see [Track an Event](/api-reference/track-event) if you're driving this from a headless integration and need to fire these yourself.

```json 200 — a 30-day window theme={null}
{
  "totalViews": 1204,
  "totalStarts": 340,
  "totalSubmissions": 289,
  "completionRate": 85.0,
  "usageHistory": [
    { "date": "2026-08-01", "views": 41, "starts": 12, "submissions": 10 },
    { "date": "2026-08-02", "views": 38, "starts": 15, "submissions": 13 }
  ]
}
```

On the Free plan, both tabs return this instead:

```json 402 Payment Required theme={null}
{ "error": "Analytics is not available on the Free plan. Upgrade to access detailed analytics.", "code": "ENTITLEMENT_REQUIRED" }
```

## Activity

The raw event log behind the Analytics numbers above — every individual `view`/`start` event, with:

* **When** it happened
* **Country** — derived from IP, never the raw address
* **Device type & browser** — derived server-side from the User-Agent, never trusted from the client
* A session identifier, so you can see which events belong to the same visit

Search and filter by event type, or by time range. Useful for spotting *where* drop-off happens (a burst of `start` events with no matching `submit`) rather than just knowing the aggregate rate is low.

<Note>
  Analytics is opt-out per integration, not per form — a specific integration can skip tracking with `data-analytics="false"` (Basic HTML) or `analytics: false` (SDK config), e.g. for a compliance reason that applies to one embed but not others.
</Note>
