# Analytics

Canonical: https://useformwork.com/docs/forms/analytics

Updated: 2026-10-17

See how a form performs: submissions, views and conversion, page reaches, field interactions, sources, answer summaries and process timings, and how to send events to Google Analytics, Google Tag Manager and Meta.

Every form has an **Analytics** tab. It shows how many people submit, where they come from, how far they get, what they answered and how quickly your team deals with their entries.

Some figures come from entries and are always there. Others come from tracked visits, which an account admin turns on and respondents agree to. See [What needs visit collection](#what-needs-visit-collection).

## Open Analytics

Open a form from the project's form list and select the **Analytics** tab. It has these sections:

| Section | What it shows |
| --- | --- |
| **Summary** | Headline figures, activity over time, the visitor journey and submissions by channel. |
| **Performance** | Three reports: **Pages**, **Fields** and **Sources**. |
| **Responses** | A summary of the answers to each question. |
| **Process** | Current workload, stage turnaround, cycle time and approvals. Only shown when the form has [stages](/docs/process/stages). |

The section, dates, filters and chart choices are kept in the page address, so you can bookmark a report or send the link to someone on your team.

## What needs visit collection

| Figures | Come from | Need visit collection |
| --- | --- | --- |
| Submissions and submissions by channel | Entries | No |
| **Pages** | Respondents' entries as they move between pages | No |
| **Responses** | Entries' answers | No |
| **Process** | Stage moves, due dates and approval decisions | No |
| Tracked views, visitor conversion, median completion time, visitor journey | Tracked visits | Yes |
| **Fields** and **Sources** | Tracked visits | Yes |

Visit history starts when collection is turned on. Earlier visits can't be filled in afterwards. Where there is no visit history, charts show a gap rather than zero, and the headline figures show "—".

## Dates and filters

Choose **Last 7 days**, **Last 30 days**, **Last 90 days** or **Custom dates**. Dates use the account's timezone, and the end date is included. Today is incomplete until the day ends.

Select **Filters** to open **Analytics filters**:

| Filter | What it does |
| --- | --- |
| **Start date**, **End date** | A custom period. |
| **Version** | One published or archived version of the form. |
| **Submission channel** | How entries were created: Respondent, Team, API, MCP, Automation, Import, Starter or Unknown. |
| **Surface** | Hosted form, Embedded form or Headless client. Visits only. |
| **Device** | Desktop, Tablet, Mobile or Unknown. Visits only. |
| **Identified automation** | Visits from automated browsers that identify themselves are left out by default. Choose **Unclassified visitors** or **Identified automation only** to look at them. |
| **Stage** | One stage. **Process** only. |

Active filters show as chips above the report. Select a chip to remove it. A filter that doesn't apply to the current section is marked "(inactive in this report)".

**Export CSV** downloads the current section as a CSV file, with the filters applied. It's available on Pro and Ultimate.

Expand **Data coverage** under a report to see the timezone, when each kind of data started recording, how far back visits are kept and when the report was worked out. It says **Partial history** when the period goes back further than the data does.

## Summary

### Headline figures

| Figure | Meaning |
| --- | --- |
| **Submissions** | Entries submitted in the period, from every selected channel, by submission date. With **Compare previous period** on, it also shows the change. |
| **Tracked views** | New tracked visits in the period, by visit date. A view counts once the form is on screen: at least a quarter of it, or 200 pixels of its height. |
| **Visitor conversion** | The share of tracked views that went on to submit, with the counts behind it. |
| **Median completion time** | For new visits that submitted in the same visit, the middle time from starting to submitting. |

A rate built on few entries or visits is marked "small sample".

### Activity over time

The chart shows one figure a day. Choose **Submissions** (by submission date), **Tracked views**, **Started visits** or **Origin conversions** (by visit date). Origin conversions can still go up after the day has passed, as people come back and finish drafts.

- **Compare previous period** adds the period before as a dashed line. It's only available when your plan and the retained history cover all of the previous period.
- Dashed **Published** lines mark the days a new version was published.
- **Daily figures** lists the numbers behind the chart.

### Visitor journey

For new tracked visits in the period: how many **Viewed**, **Started** and **Eventually submitted**, and the completion rate of started visits. Someone who comes back later and submits counts against their first visit. **Journey details** adds return visits, the median time from first answer to submission and the number of inactive drafts (no activity for seven days).

### Submissions by channel

Submissions split by how they were created. Select a channel to filter the whole report by it.

## Performance

### Pages

For forms with more than one page. For each page, how many respondent entries could reach it (**Eligible**), how many did (**Reached**) and how many stopped there (**Inactive exits**, drafts with no activity for seven days). Entries are counted by the date someone first interacted with them.

Conditional logic and jumps change which pages each person can reach, so these figures aren't a step-by-step drop-off, and an exit doesn't tell you why someone left. Select a page title to open it in the builder. **Page figures** lists the numbers.

### Fields

Available on Ultimate. For each field: the **Average focus** time, the **Visits** that used it, **Error events** (validation messages shown, not people) and **Inactive exits** (the last field used before 30 minutes without activity). Answers are never recorded here.

Results are kept separately for each version, with that version's field labels. Select a field to open it in the builder.

### Sources

Where tracked visits came from. Choose what to group by under **Group visits by**: **Campaign source**, **Campaign**, **Campaign medium**, **Referrer**, **Website**, **Page path**, **Surface**, **Device**, **Browser**, **Operating system**, **Country**, **Language** or **Identified automation**. Sort by **Most views**, **Most conversions** or **Highest conversion rate**.

Select a source to filter the visit figures by it. **Unknown** covers visits with nothing recorded. **Page path** is only recorded when the form allows it; see [Turn collection off for one form](#turn-collection-off-for-one-form).

## Responses

A card for each question with how many entries answered it. Number, rating and scale questions show the mean, median, range and a distribution chart. Choice questions show how often each option was picked; with Multiple choice the shares can add up to more than 100%. Text questions show the latest five answers, each linked to its entry.

Responses use each entry's own version of the form, so questions that were added, removed or renamed are summarised correctly. Team fields are listed separately. Password answers are never summarised. Hidden value answers are, so only collect attribution you need.

Turn on **Include touched respondent drafts** to include unfinished entries that someone has started.

## Process

Only for forms with stages.

- **Workload now**: entries in each stage and how many are overdue, as of now. It ignores the date range. Select a stage to see its entries. **Workload by owner** splits it by owner or group.
- **Stage turnaround**: for stays that ended in the period, the median and 90th percentile time in each stage, the share finished on time and the share sent back. Undone moves are left out.
- **Cycle time**: for entries that first reached a closed stage in the period, the median and 90th percentile time from their first stage to that point.
- **Approvals**: approved, rejected and expired rounds, the median time to decide and the share of rounds that needed a reminder.

See [Stages](/docs/process/stages) and [Approvals](/docs/process/approvals).

## The forms list

The project's form list shows **Views · 30 days**, **Submissions · 30 days** and **Conversion** for each form, over the last 30 calendar days. Views marked "partial" don't cover all 30 days.

## Turn on visit collection

Visit collection is off until an account admin turns it on.

1. Open **Account settings** and select **General**.
2. In **Form analytics**, turn on **Allow consented visit collection**.
3. Choose **Raw visit retention**: **30 days**, **90 days (recommended)**, **12 months** or **25 months**. The default is 90 days.
4. Select **Save analytics settings**.

Shortening retention deletes older visits for good. Your plan also limits how far back reports go, and upgrading doesn't bring back visits that have been deleted.

### Turn collection off for one form

1. Open the form in the builder and select **Share**.
2. In the **FormWork analytics** card, turn off **Allow FormWork visit collection**.
3. Publish the draft.

The same card has **Include the embed page path in visit sources**, off by default. Turn it on only when your page addresses contain nothing sensitive. Both settings can only be changed on the draft.

### What respondents see

On hosted forms, below the form, FormWork asks whether it may count the visit, with **Accept analytics** and **Decline analytics**. Nothing is collected until the person accepts. Their choice is remembered in that browser for 180 days and applies to all your account's forms. **Analytics preferences** lets them change it at any time; declining after accepting removes the visit in progress.

The question isn't shown in previews or when your team edits an entry.

If the browser sends Global Privacy Control, FormWork doesn't collect visits and the question says so.

### Embedded forms

On your own website, your consent tool decides. Add `analytics="on"` to the `<formwork-form>` element once the visitor has agreed, and set it to `off` or remove it if they withdraw. FormWork doesn't show its own question on embedded forms. See [Embedding and the JavaScript API](/docs/embedding/web-component#analytics).

### What is recorded

- No cookies, no visitor IDs that last beyond the visit, and nothing that links one form's visits to another's.
- No answers. Only counts and timings, such as views, starts, page changes, time in a field and validation messages shown.
- The website and referring site, campaign (`utm_`) parameters, browser, device, language and, where available, country. The page path is only recorded when the form allows it, and never its query string.

Visits can still be blocked by browsers and extensions, so tracked views will usually be lower than real traffic. Submissions are always counted in full.

## Plan limits

| | Starter | Pro | Ultimate |
| --- | --- | --- | --- |
| History in reports | 30 days | 12 months | 25 months |
| Export CSV | No | Yes | Yes |
| Field interactions | No | No | Yes |

The history limit applies to visits, pages and process figures. **Responses** can cover any period. See [Plans and billing](/docs/platform/billing).

## Send events to Google Analytics, Google Tag Manager or Meta

FormWork's own reports don't need any of this. If you also want form events in Google Analytics 4, Google Tag Manager or Meta, use their analytics extensions. FormWork never loads tracking scripts: browser events only reach tags your website already has, so they work on embedded forms only. For hosted forms, use server conversions.

### Set up an extension

1. In the project, select **Extensions** and choose **Google Analytics**, **Google Tag Manager** or **Meta**.
2. Select **Install extension**.
3. Enter a **Configuration name**, such as "Production" or "Test website", and the **Measurement ID**, **Container ID** or **Pixel ID**.
4. For Google Analytics or Meta, turn on **Enable server conversions** if you want them, and paste the **Measurement Protocol API secret** or **Conversions API access token**. Meta also needs a **Graph API version**. The credential is stored in the project and never sent to browsers.
5. Turn on **Enable this configuration** and select **Save configuration**.

A configuration can be used by any form in the project. Select **New configuration** to add another, for example for a test website. Once saved, the page shows a short guide to connect a form and check that events arrive.

### Choose it on a form

1. Open the form in the builder and select **Share**.
2. In **External analytics**, choose the configuration for each provider, or **Do not use for this form**.
3. Leave **Browser events** on to send events from the embedded form. For Google Analytics, **Lead conversion** also sends `generate_lead` on submission.
4. Publish the draft.
5. On your website, add `analytics-events="on"` to the `<formwork-form>` element once the visitor has agreed to these tags, and switch it `off` if they withdraw. This is separate from `analytics`, which only controls FormWork's own visit collection.

What each provider receives:

| Provider | Browser events |
| --- | --- |
| Google Analytics | `formwork_view`, `formwork_page`, `formwork_start`, `formwork_submit` and `formwork_resume`, sent to the chosen property. |
| Google Tag Manager | The same event names, pushed to the page's data layer. Download the FormWork GTM template from the extension's guide and import it with **Merge**. It adds triggers and variables only; add your own tags. |
| Meta | `Lead` after a confirmed submission, sent to the chosen Pixel. The entry ID is the event ID, so Meta can match it with a server conversion. |

Use either Google Analytics or Google Tag Manager for browser events on a form, not both, so events aren't counted twice. Events never include answers.

If a configuration is turned off or deleted, forms using it stop sending events. They don't switch to another configuration.

### Server conversions

Server conversions are sent by an automation, so they work for hosted and embedded forms, and for later stage changes. Add one of these automation templates and choose a configuration with server conversions turned on:

- **Send submissions to Google Analytics** or **Send leads to Meta**: when the form is submitted.
- **Send stage conversions to Google Analytics** or **Send stage conversions to Meta**: when an entry reaches the stage you choose, such as Won or Approved.

FormWork doesn't know whether a visitor allowed advertising tags, so the templates ask for Hidden value fields that hold it:

- **Destination permission (true means permitted)** and **Permission observation timestamp**. Nothing is sent unless permission is `true` and the time is filled in.
- For Google Analytics, optionally the **GA4 client ID** and **GA4 session ID**, to join the visitor's Google Analytics session.
- For Meta, **Original website URL** and **Original browser user agent**, and at least one of **Meta fbc**, **Meta fbp** or **Original fbclid** (with the click time).

Your website fills these fields, for example with [`setAnswers()`](/docs/embedding/web-component#setanswersanswers), once the visitor has chosen. Keep the permission field up to date if they change their mind; for stage conversions, your team must too. These automations don't retry by default. Don't use the Google Analytics browser **Lead conversion** and the Google Analytics submission template on the same form; FormWork won't let you.

### Why the numbers differ

FormWork's reports and your external reports collect, ask permission and attribute visits separately, so their totals won't match. The **Analytics integrations** note at the bottom of the Analytics tab lists the providers a form sends to.

## Campaign attribution

To keep a visitor's campaign on their entry, add a Hidden value field and set **Fill from the page address**, for example to `utm_campaign`. **Common URL parameters** offers the usual campaign and click ID names. See [Field settings](/docs/forms/field-settings#hidden-value). These answers appear in **Responses** and in exports like any other answer.

**Sources** reads the `utm_source`, `utm_medium` and `utm_campaign` parameters from tracked visits by itself, so you don't need Hidden value fields for that report.

## AI assistants

A connected [AI assistant](/docs/ai-assistants/overview) can read the same figures, with the same plan limits, to answer questions about a form's performance.

## Related

- [Share and embed](/docs/forms/share-embed)
- [Embedding and the JavaScript API](/docs/embedding/web-component)
- [Extensions](/docs/extensions/overview)
- [Stages](/docs/process/stages)