# 1. Introduction

### 1.1 What is FullSession?

Welcome to FullSession! This chapter gives you a high-level understanding of what FullSession is, how it works, and the vocabulary you'll see throughout the rest of the documentation. If you're new to FullSession, start here — the later chapters assume you're comfortable with the concepts introduced below.

FullSession is a **session-replay and product-analytics platform** that helps you understand how real people use your website. Instead of guessing why visitors drop off, abandon a cart, or fail to convert, you can *watch* their actual sessions, see exactly where they get stuck, and quantify those moments across thousands of users.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FpHtixJs0miJchPUCqhbC%2Fimage.png?alt=media&amp;token=b593c324-d378-414e-a2d4-9d753103c057" alt="FullSession dashboard showing session recordings, conversion metrics, and user experience analytics"><figcaption></figcaption></figure>

In a single platform, FullSession brings together:

* **Session replay** — pixel-perfect recordings of real user visits, complete with mouse movement, scrolls, clicks, taps, console errors, and network activity.
* **Heatmaps** — aggregated visualizations of where people click, how far they scroll, and which elements cause frustration.
* **Funnels** — multi-step conversion flows that show exactly where users drop off, with one-click access to the sessions behind each drop-off.
* **Segments** — saved groups of users defined by behavior, location, device, or any custom attribute you send.
* **Dashboards & insights** — customizable views built from your own metrics and widgets.
* **Feedback & surveys** — an in-page widget for collecting CSAT scores and qualitative responses.
* **Lift AI** — natural-language analysis that surfaces issues, builds segments from a prompt, and explains funnel drop-offs in plain English.
* **Alerts** — proactive notifications when something in your funnel, segment, or site behavior changes.

#### Who FullSession is for

FullSession is built for the people who care about the user experience on a website:

* **Product managers** — validate feature usage and prioritize what to build next.
* **UX & design teams** — see how visitors actually interact with new layouts.
* **Growth & conversion specialists** — diagnose funnel drop-offs and run experiments.
* **Customer support** — replay a specific user's session to debug an issue they reported.
* **QA teams** — reproduce hard-to-find bugs by watching the exact session where they happened.
* **Executives** — track high-level KPIs across all of your sites in one dashboard.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FSdLGzmZDlTeVVYh3PbJH%2Fimage.png?alt=media&amp;token=ef97351c-94be-4677-a3b9-de0c673b7ab3" alt="Different FullSession dashboard templates tailored for different team roles and workflows"><figcaption></figcaption></figure>

#### What problems does it solve?

| You want to know…                               | FullSession answers it with…               |
| ----------------------------------------------- | ------------------------------------------ |
| *Why are users dropping off at checkout?*       | Funnels + session replays of drop-offs     |
| *Which buttons do people actually click?*       | Click heatmaps                             |
| *Is anyone hitting that new feature?*           | Custom events + insight cards              |
| *What did the user do right before this error?* | Console & network panels inside the player |
| *How happy are visitors with this page?*        | Embedded CSAT widget                       |
| *Are conversions getting worse this week?*      | Alerts on segments and funnels             |

***

### 1.2 How FullSession Works

FullSession has three stages: **capture → process → insights.** Once it's set up, the entire pipeline runs automatically — you only interact with the third stage.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F5xdndMMP4WMfimn0frCH%2Fimage.png?alt=media&amp;token=8cc02c08-24e3-44eb-8a0a-db10f2910a27" alt="FullSession data flow showing website activity tracking, cloud processing, data storage, and dashboard analytics visualization"><figcaption></figcaption></figure>

#### Stage 1 — Capture

A small JavaScript snippet (the **tracker**) runs on every page of your site. As visitors browse, it records:

* DOM mutations needed to replay the page exactly
* Mouse movement, clicks, taps, and scrolls
* Page navigation and URL changes
* Console messages and JavaScript errors
* Network requests
* Custom events and user identity (if you choose to send them)

The tracker is asynchronous and designed to have no measurable impact on page performance. Sensitive content (passwords, credit-card fields, anything you mark) is **masked at capture time** — it never leaves the visitor's browser.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FlnqKOi88koOoGodCHMtj%2Fimage.png?alt=media&amp;token=528c6e3a-45cd-4961-aaf8-6347282f6485" alt="FullSession tracker installation using a single script tag or Google Tag Manager integration"><figcaption></figcaption></figure>

#### Stage 2 — Process

Captured data is streamed to the FullSession cloud, where it is:

1. **Indexed** so you can filter sessions by any attribute in milliseconds.
2. **Aggregated** into heatmaps, page statistics, segment counts, and funnel metrics.
3. **Analyzed** by Lift AI for emerging issues and conversion problems.
4. **Stored** for the retention period included with your plan.

You don't have to do anything here — processing happens within seconds of a session ending, and most sessions are watchable in near real-time.

#### Stage 3 — Insights

This is where you spend your time. From the FullSession web app you can:

* Watch any session in the **player**
* Build **funnels**, **segments**, and **dashboards**
* View **heatmaps** for any page
* Read **feedback & survey responses**
* Configure **alerts** that notify you when things change

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FfDlZvIqECnaWK7qAtQKL%2Fimage.png?alt=media&amp;token=114274a9-5ad8-47c9-ad29-c478dc87f6c7" alt="FullSession platform showing sessions, dashboards, heatmaps, and funnels powered by a single captured data stream."><figcaption></figcaption></figure>

***

### 1.3 Key Concepts & Glossary

These terms appear throughout the documentation. Knowing what each one means will make every other chapter easier to read.

#### Site

A **site** is a property you track in FullSession — typically one domain (e.g. `example.com`). You can have multiple sites under the same account, each with its own tracker, settings, sessions, and dashboards.<br>

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FBwqPhhL19U8YWp1zDCgm%2Fimage.png?alt=media&amp;token=ef2ff38d-92f1-4be5-b581-bff05c670ef8" alt="FullSession site switcher allowing users to switch between different properties within their account."><figcaption></figcaption></figure>

#### Visitor

A **visitor** is a unique person browsing your site. Visitors are anonymous by default. If you send identity information through the tracker (such as an email or user ID), they become **identified visitors** and are searchable by those traits.

#### Session

A **session** is one continuous visit by a single visitor. It begins when they land on your site and ends after a period of inactivity or when they leave. Every session has a recording you can play back.<br>

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FgaiSkfz4ez2bmmXM8uzY%2Fimage.png?alt=media&amp;token=8599ef7a-59db-4802-aebf-c44c87878f55" alt=""><figcaption></figcaption></figure>

#### Event

An **event** is any meaningful action recorded during a session — a click, a page view, a form submission, a console error, or a custom event you define (such as "Added to cart"). Events are what funnels, segments, and insight cards are built on.

#### Element

An **element** is anything you can point at on the page — a button, link, image, form field, or container. FullSession lets you target elements by CSS selector to build heatmaps, watched-element reports, and custom events.

#### Tag

A **tag** is a label attached to a session, so you can find or group sessions later. Some tags are **predefined** (e.g. "rage click", "error"), and some are **custom** — added manually or automatically based on rules you set.

#### Segment

A **segment** is a saved group of visitors or sessions matching a set of conditions ("Mobile users from Germany who reached the checkout page"). Segments power filtered dashboards, funnels, alerts, and AI analysis.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FocwX88oam2egzTZuyuVG%2Fimage.png?alt=media&amp;token=a02908e5-7c89-4ec9-9d69-8924a21337df" alt="FullSession segment builder showing how conditions are combined using AND, OR, and NOT operators to create user segments."><figcaption></figcaption></figure>

#### Funnel

A **funnel** is a sequence of steps you want users to complete (for example: *View product → Add to cart → Checkout → Purchase*). FullSession shows the conversion rate between each step and the sessions where users dropped off.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FjlKY4vDTT3ivhH1RnwTb%2Fimage.png?alt=media&amp;token=59eeaddc-482c-4925-ab32-b687c3aaa629" alt="FullSession checkout funnel showing four steps with user drop-off counts at each stage."><figcaption></figcaption></figure>

#### Heatmap

A **heatmap** is an aggregated visualization of behavior on a single page — where people clicked, how far they scrolled, or which elements they interacted with most.

#### Dashboard

A **dashboard** is a customizable page made up of **widgets** — charts, counters, lists, and other visualizations powered by your data. FullSession ships with role-based templates (Executive, Growth, Engineering, Product, Digital Ops) and you can build your own from scratch.

#### Insight Card

An **insight card** is a single widget on a dashboard. Each card shows one metric (such as "Average session duration this week vs. last week"). You build dashboards by combining cards.

#### Alert

An **alert** is a rule that watches a metric, segment, or funnel and notifies you when something changes — a conversion rate drops, an error spikes, or a goal is met.

#### Lift AI

**Lift AI** is FullSession's built-in assistant. It can analyze funnels, generate segments from a natural-language description, and surface user-experience issues automatically.

***

### 1.4 Plans & Feature Availability

FullSession is available on several plans, each unlocking a different set of features and capacity (sessions per month, data retention, team seats, etc.).

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FqJZlIa7RHM1N8MRB0mr0%2Fimage.png?alt=media&amp;token=6c7719ff-dbf7-4dbc-bb64-94ac94983f48" alt="FullSession plan comparison page showing included features and features available through plan upgrades."><figcaption></figcaption></figure>

#### Plan tiers at a glance

| Plan             | Best for                                       | Highlights                                                                    |
| ---------------- | ---------------------------------------------- | ----------------------------------------------------------------------------- |
| **Free**         | Individuals and small sites trying FullSession | Limited monthly sessions, core replay, heatmaps, feedback                     |
| **Growth**       | Teams doing day-to-day analysis                | Funnels, event tracking, alerts, UTM tracking, integrations                   |
| **Professional** | Established product & growth teams             | Everything in Growth, plus Lift AI, dashboards & charts, longer retention     |
| **Enterprise**   | Organizations with security & compliance needs | SSO (SAML), RBAC & custom roles, audit logs, dedicated support, custom limits |

> **Note** — exact session quotas, retention periods, and pricing are listed on the \[FullSession pricing page]. Always check the pricing page for the most current details, as plans evolve over time.

#### Feature availability by plan

Throughout this documentation, features that are not on every plan are marked with a tag:

* `Growth` — available on Growth and higher
* `Professional` — available on Professional and higher
* `Enterprise` — available on Enterprise only

For example, **funnels** and **alerts** are `Growth` features, **Lift AI** and **dashboards** are `Professional+`, and **SSO**, **custom roles**, and **audit logs** are `Enterprise`. In the app, locked areas show a badge naming the first plan that includes them and an **Upgrade plan** link. A full feature-by-plan table lives in \[Chapter 17, section 17.1].\
\
![FullSession workspace showing the main navigation menu on the left and the active dashboard view on the right.](https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FDgdzPBnQw1OrJYVUzht5%2Fimage.png?alt=media\&token=a06ce948-aee4-4f6f-82e7-586935d06fa9) ![FullSession interface showing locked features with an upgrade prompt for higher plan access.](https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FCpZm5Q3WLYpGUnHedLaV%2Fimage.png?alt=media\&token=e44264ee-a7ac-48c2-aa78-0abe01f2c878)

#### Upgrading or changing plans

You can change plans at any time from **Settings → Subscription**. Upgrades *and* downgrades take effect immediately and start a fresh billing cycle — FullSession doesn't prorate the remainder of the old one. See \[Chapter 17 — Billing & Subscriptions] for the full walkthrough.

#### What happens if you exceed your quota?

If you hit your monthly session limit, FullSession will continue to display your existing data but will **pause new recording** until the next cycle or until you upgrade. Track how close you are on the usage bar under **Settings → Subscription**, and per site in the site picker in the top bar (\[Chapter 17, section 17.6]).

***

> **Next up:** \[Chapter 2 — Getting Started] walks you through creating your account, adding your first site, installing the tracker, and watching your first session.


# 2. Getting Started

This chapter is your fast path from "I just signed up" to "I'm watching real sessions on my site." You can complete every step here in about 15 minutes. If you ever get stuck, jump to \[Chapter 23 — Troubleshooting & FAQ].

***

### 2.1 Creating Your Account

To start using FullSession, you'll need an account. There are three ways to create one:

1. **Email + password** — the most common option for individuals and small teams.
2. **Sign in with Google** — uses your existing Google identity.
3. **Single Sign-On (SSO)** — for organizations on the Enterprise plan that have already configured SAML or Auth0. See \[Chapter 18 — SSO].

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FRYoLgOTQVebQYSGdPH0a%2Fimage.png?alt=media&amp;token=366be06a-6a94-4c61-8f15-d194f5d03bd5" alt="FullSession sign-up screen showing account creation options using email, Google, and SSO."><figcaption></figcaption></figure>

#### Step-by-step

1. Go to **app.fullsession.io** and click **Sign Up**.
2. Enter your work email and a password (or click **Continue with Google**).
3. Check your inbox for a confirmation email and click the verification link.
4. Fill in a few onboarding questions — your name, company, role, and what you want to use FullSession for. These answers shape the dashboard templates suggested to you later.
5. Choose a plan to start with. You can begin on the **Free** plan and upgrade at any time. See \[Chapter 17 — Billing & Subscriptions].

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FOIdUKIvBGkdh8HKhPUcY%2Fimage.png?alt=media&amp;token=5d8f041b-70d4-4b1c-b586-8ea0796eec82" alt="FullSession onboarding wizard showing role selection to customize the initial dashboard experience."><figcaption></figcaption></figure></div>

> **Tip** — if your company already uses FullSession, ask a teammate with admin access to **invite you** instead of signing up fresh. That way you'll be added to the existing organization with the right permissions. See section 2.5 below.

***

### 2.2 Setting Up Your First Site

A **site** in FullSession represents one web property you want to track — usually a single domain. Your account can hold **many sites**, and they all share one account-level **Customer ID** (more on that in section 2.3 and \[Chapter 3 — Installing the Tracker]).

#### Add the site

1. From the home screen, click **Add Site** (or **Set up your first site** in the onboarding wizard).
2. Enter:
   * **Site name** — a friendly label, e.g. *"Acme Production"*.
   * **Site URL** — the domain you want to track, e.g. `https://www.acme.com`.
   * **Industry / category** *(optional)* — used to suggest dashboards and benchmarks.
   * **Time zone** — used when displaying dates and time-based reports.
3. Click **Create site**.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FooeRAHTKx2kTo0VjMG8z%2Fimage.png?alt=media&amp;token=8b5e5ecd-f90e-4dee-a0eb-77a386e3dcea" alt="FullSession Add Site form showing fields for site name, URL, industry, and time zone configuration."><figcaption></figcaption></figure></div>

The **Site URL** matters for more than display: FullSession routes each recorded session to the correct site by matching the session's origin domain against your saved site URLs. So make sure the URL is accurate (mind `www` vs. non-`www` and `http` vs. `https`).

Your account's **Customer ID** is what the tracker snippet carries — it's shared across every site you add, not generated per site. You're now ready to install it.

#### Multi-domain notes

If your product spans multiple domains or subdomains (e.g. `app.acme.com` and `www.acme.com`), you can:

* Add each domain as its **own site** and install the **same snippet** (same Customer ID) on each — FullSession files each domain's sessions under its matching site automatically, or
* Treat closely related subdomains as **one site** if you'd rather see their data combined.

See \[Chapter 3 — Installing the Tracker] for the full multi-domain walkthrough.

***

### 2.3 Installing the Tracker (Overview)

The tracker is a small JavaScript snippet that, once placed on your site, begins capturing sessions automatically. There are two common installation paths:

| Method                 | Best for                                         | Effort    |
| ---------------------- | ------------------------------------------------ | --------- |
| **Direct snippet**     | Sites where you can edit the HTML / template     | 2 minutes |
| **Google Tag Manager** | Marketing-managed sites, no engineering required | 3 minutes |

*(There are also an npm package and native Android/iOS SDKs — see \[Chapter 3 — Installing the Tracker].)*

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FVRr9nGTRYuUyZxgy5DBe%2Fimage.png?alt=media&amp;token=0770eb51-9b28-40e3-8628-465b7f905753" alt="FullSession installation panel showing setup options for Script, GTM, NPM, Android, and iOS with a pre-filled Customer ID."><figcaption></figcaption></figure></div>

#### Option A — Direct snippet

1. On the installation panel, open the **Script** tab and click **Copy** (always copy from here so your Customer ID and the correct CDN URL are embedded). The snippet looks like this:

   ```html
   <!-- Fullsession Recording Code for http://fullsession.io/ -->
   <script type="text/javascript">
       window.FUS_IS_IN_IFRAME = (window.top != window.self);
       (function (m, n, t, l, x, p, o) {
           window["_fus_host"] = l;
           window["_site_id"] = p;
           window["_fus_id"] = x;
           o = n.createElement(t);
           o.type = "text/javascript";
           o.async = true;
           o.src = "https://emitter.fullsession.io/RTSessions.js";
           y = n.getElementsByTagName(t)[0];
           y.parentNode.insertBefore(o, y);
       })(window, document, "script", "fullsession.io", 'YOUR_CUSTOMER_ID');
   </script>
   ```
2. Paste it inside the `<head>` of every page on your site, as high as possible. Most CMSs and frameworks have a single "site header" template where you can paste this once.
3. Publish your site.

The same snippet (carrying the same `YOUR_CUSTOMER_ID`) goes on **every** domain in your account.

#### Option B — Google Tag Manager (GTM)

1. On the installation panel, choose **GTM**. You can let FullSession connect to your GTM account and create the tag automatically, or do it manually:
2. In GTM, create a new **Custom HTML** tag named **Fullsession Tracking Script**.
3. Paste the snippet into the tag body.
4. Set the trigger to fire on **All Pages** (a page-view trigger).
5. **Save**, then **Submit & Publish** the container.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FRkLYtF1r0RM3iQmep2XV%2Fimage.png?alt=media&amp;token=997fdbb5-d01c-4d69-aca6-eb8d774c59cb" alt="Google Tag Manager setup showing a Custom HTML tag named FullSession Tracking Script with a page-view trigger."><figcaption></figcaption></figure></div>

> **Note** — full installation details, including the npm package, mobile SDKs, single-page apps, and multi-domain routing, live in \[Chapter 3 — Installing the Tracker]. This section is the express version.

***

### 2.4 Verifying Installation

After installing the tracker, FullSession checks that it's actually loading and reaching your account. Verification is a live handshake — the tracker posts a **`FUS_LOADED`** signal back to FullSession when it initializes — not just a check that the snippet text is present.

#### Automatic verification

Open your site in another tab and browse for \~30 seconds, then return to the installation panel. The status will move from **Waiting for data** to **Verified** once the tracker's `FUS_LOADED` handshake is received (verification waits about 8 seconds for the signal before falling back to checking for recorded sessions).

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FNFuHGhbrSOl5VHxPHQB9%2Fimage.png?alt=media&amp;token=9a93aa1e-0754-47ea-801d-43092c945ccf" alt="FullSession installation panel showing tracker status updates with verification and data flow indicators."><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F131rp4T7h9ubpKX7FxF3%2Fimage.png?alt=media&amp;token=c3887fc5-c477-4028-9cc8-161ae8bf8a38" alt="FullSession installation panel showing tracker status updates with verification and data flow indicators."><figcaption></figcaption></figure></div>

#### Manual verification

If the panel doesn't reach **Verified** within a couple of minutes, run these checks:

| Check                               | How to do it                                                                                                                            |
| ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| **Snippet is on the page**          | View page source and search for `FUS` or `RTSessions`                                                                                   |
| **Snippet runs without errors**     | Open browser DevTools → Console; look for tracker errors                                                                                |
| **Network calls reach FullSession** | DevTools → Network → filter by `fullsession`; you should see the `RTSessions.js` load and outbound requests to `emitter.fullsession.io` |
| **Customer ID is correct**          | Verification only succeeds when the snippet's Customer ID matches your account — re-copy from the Script tab if unsure                  |
| **GTM container is published**      | In GTM, confirm the version containing the tag has been published, not just saved                                                       |

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FFPvaOhwa9FlzKKoTXfLB%2Fimage.png?alt=media&amp;token=3f37f243-675e-46d5-a3f2-d94d4d6b8ea6" alt="Chrome DevTools showing the RTSessions.js recorder loaded from emitter.fullsession.io, confirming the FullSession tracker connection."><figcaption></figcaption></figure>

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FTK7DxOssY6DKAPM6ec7Q%2Fimage.png?alt=media&amp;token=9c231ee3-3f31-46d3-b94f-c60f9d46d23c" alt="Chrome DevTools showing the RTSessions.js recorder loaded from emitter.fullsession.io, confirming the FullSession tracker connection."><figcaption></figcaption></figure>

#### Watch a live test session

The best end-to-end test is to record yourself:

1. Open your site in a fresh **incognito/private window** (so you're treated as a new visitor).
2. Click around for \~30 seconds — visit a few pages, scroll, click a button.
3. Close the tab.
4. Return to FullSession and open **Sessions**. Within \~1 minute, your test session should appear at the top of the list.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F8GVG9RyGwcZVq773jo13%2Fimage.png?alt=media&amp;token=087a6d45-5bfc-4b7f-bde1-a0a05a2323cd" alt="FullSession Sessions list showing the first live user session appearing after the tracker starts collecting data."><figcaption></figcaption></figure>

> **Common gotcha** — if you're testing while signed in to FullSession in the same browser, your session may be excluded by the "ignore internal users" settings. Use a private window. See \[Chapter 4 — Identifying Users].

***

### 2.5 Inviting Your Team

FullSession is built for collaboration — the more your team uses it, the more value you get from it. Inviting teammates takes a minute.

#### Send invitations

1. Open **Settings → Team** (or **People**).
2. Click **Invite member**.
3. Enter the teammate's email address.
4. Choose a **role** for them — this controls what they can see and change:
   * **Admin** — full access, including billing and team management.
   * **Member** — can use all product features (sessions, dashboards, funnels, etc.) but can't change billing or invite others.
   * **Viewer** — read-only access to dashboards, sessions, and reports.
   * **Custom roles** *(Pro+)* — define your own permission sets. See \[Chapter 16 — Team & Account Management].
5. Click **Send invite**.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FYaSJJTiYslIONgN6b4Hh%2Fimage.png?alt=media&amp;token=afdf6def-c237-4ee2-af54-97f0c9c50178" alt="FullSession team list showing members with their roles, account status, and last sign-in information."><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FUyQnbB37idpQf2gAnSRY%2Fimage.png?alt=media&amp;token=e56636a1-9502-478b-8e27-ebaf72e8f612" alt="FullSession invite dialog showing email entry, role selection, and sending team invitations with a join link."><figcaption></figcaption></figure></div>

#### What invitees see

The teammate receives an email with a link to accept the invite. Once accepted:

* They create their own password (or sign in with Google / SSO).
* They land directly on your organization's dashboard.
* They appear in **Settings → Team** with a status of **Active**.

#### Managing existing members

From **Settings → Team** you can:

* Change a member's role
* Resend a pending invite
* Remove a member from the organization
* See when each member last signed in

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FUbRqfkk6aGhzFD6qgi7e%2Fimage.png?alt=media&amp;token=099eadb0-707b-4a96-bd61-f646091b8a7a" alt="FullSession team list showing members with their roles, account status, and last sign-in information."><figcaption></figcaption></figure></div>

***

### 2.6 A 5-Minute Tour of the App

Now that the tracker is running, here's a quick orientation to the parts of the app you'll use most. Each item links to a later chapter where it's covered in depth.

\
![FullSession workspace showing the main navigation menu on the left and the active dashboard view on the right.](https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Fiz46EnjlrbJMaKiqllys%2Fimage.png?alt=media\&token=49da6541-298c-478e-bc02-7287f103c018)

#### The left navigation

| Icon | Section        | What it does                           | Read more |
| ---- | -------------- | -------------------------------------- | --------- |
| ▶    | **Sessions**   | Watch recordings of real visits        | Ch. 5–6   |
| 📊   | **Dashboards** | Customizable charts and KPIs           | Ch. 9     |
| 🔥   | **Heatmaps**   | Click, scroll, and element heatmaps    | Ch. 8     |
| 🪜   | **Funnels**    | Multi-step conversion analysis         | Ch. 12    |
| 👥   | **Segments**   | Saved groups of users / sessions       | Ch. 11    |
| 💡   | **Insights**   | Cards and metrics built from your data | Ch. 10    |
| 💬   | **Feedback**   | Survey responses and CSAT scores       | Ch. 13    |
| 🔔   | **Alerts**     | Notifications when things change       | Ch. 15    |
| ⚙    | **Settings**   | Sites, team, integrations, billing     | Ch. 16–19 |

#### The top bar

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FH7yndr0gjfAr8hPkOAma%2Fimage.png?alt=media&amp;token=a1d8572e-30a4-4f4a-aabc-c405b99b0484" alt="FullSession top bar showing the site switcher, notifications, and profile menu."><figcaption></figcaption></figure>

* **Site switcher** *(top-left)* — change which site you're viewing.
* **Date range picker** — applied globally across most views.
* **Global search** — jump to a session, dashboard, segment, or funnel by name.
* **🔔 Notifications** — alert triggers, mentions, and system messages.
* **Profile menu** — your account settings, theme toggle, sign out.

#### What to try first

Now that you've completed setup, a good 5-minute tour looks like this:

1. **Sessions → click any session** — get a feel for the player. Hit play, scrub the timeline, open the **Errors** and **Network** panels.
2. **Dashboards → pick a template** — choose the role-based template that matches you (Growth, Product, etc.) and watch widgets populate.
3. **Heatmaps → pick a page** — see where visitors click most.
4. **Funnels → create a 2-step funnel** — pick *Home → Pricing* (or any two pages) just to see the flow.
5. **Settings → Recording Rules** — review what pages are being recorded and adjust if needed. See \[Chapter 7 — Recording Rules & Element Tracking].

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FKGeu5kCVwN6WR1gVwYBF%2Fimage.png?alt=media&amp;token=03c33c77-675f-4cb8-8398-f6a79262c6b0" alt="FullSession onboarding sidebar showing the &#x22;What to try first&#x22; checklist with setup tasks to complete."><figcaption></figcaption></figure></div>

> **You're set!** From here, every other chapter dives into one area of the app. If you want a guided suggestion, head to **Chapter 5 — Sessions** next — sessions are the foundation of everything else in FullSession.

***

> **Next up:** \[Chapter 3 — Installing the Tracker] covers the full installation details — the `<script>` snippet, GTM, the `fullsession` npm package, native mobile SDKs, multi-domain routing, and verifying installation in tricky environments.


# 3. Installing the Tracker

Chapter 2 covered the express install. This chapter is the **complete, accurate reference** for installing the FullSession tracker. It documents the exact snippet FullSession generates for you, what every line of it does, the alternative install paths (Google Tag Manager, the `fullsession` npm package, and the native mobile SDKs), and how FullSession verifies that recording has actually started.

#### One Customer ID, many sites

Your account has a **single Customer ID** that is shared across **all** the domains you track. You don't get a different ID per website — instead, you install the *same* snippet (carrying that one Customer ID) on every domain you want to record.

FullSession then sorts the incoming data for you: when a session is recorded, FullSession matches the **origin domain** the session came from against the URLs of the **sites** you've saved in your account, and files the session under the matching site automatically. This is what lets a single Customer ID power a marketing site, a web app, and a help center — each one's sessions land in its own site, even though they all share the same tracking code.

Wherever you see `YOUR_CUSTOMER_ID` below, the Installation page will have already substituted your real Customer ID.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FlnqKOi88koOoGodCHMtj%2Fimage.png?alt=media&amp;token=528c6e3a-45cd-4961-aaf8-6347282f6485" alt="FullSession Installation page showing install method tabs for Script, GTM, NPM, Android, and iOS with a pre-filled Customer ID."><figcaption></figcaption></figure></div>

> **Add your domains first.** Because sessions are routed by matching their origin domain to your saved site URLs, make sure each domain you intend to track is listed under **Settings → Sites** before (or shortly after) you install. A domain that isn't saved has no site to be filed under.

***

### 3.1 JavaScript Snippet Installation

The direct `<script>` snippet is the most universal install method. It works on any site where you can edit the page HTML — a custom site, WordPress, Shopify, Webflow, and so on.

#### The snippet

This is the exact snippet FullSession generates. Copy it from **Settings → Installation → Script** (don't retype it — the app embeds your Customer ID and the correct CDN URL for your environment automatically):

```html
<!-- Fullsession Recording Code for http://fullsession.io/ -->
<script type="text/javascript">
    window.FUS_IS_IN_IFRAME = (window.top != window.self);
    (function (m, n, t, l, x, p, o) {
        window["_fus_host"] = l;
        window["_site_id"] = p;
        window["_fus_id"] = x;
        o = n.createElement(t);
        o.type = "text/javascript";
        o.async = true;
        o.src = "https://emitter.fullsession.io/RTSessions.js";
        y = n.getElementsByTagName(t)[0];
        y.parentNode.insertBefore(o, y);
    })(window, document, "script", "fullsession.io", 'YOUR_CUSTOMER_ID');
</script>
```

The **same snippet goes on every domain** in your account. You do not customize it per site — the Customer ID is identical everywhere, and FullSession handles the per-site routing on its end.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Fmo6T2c3RK152udlnLnBR%2Fimage.png?alt=media&amp;token=c7a0128e-16a6-45e0-8e58-0c6e62830cbf" alt="FullSession Installation page showing the Script tab with a copy button for the tracking snippet used across domains."><figcaption></figcaption></figure></div>

#### Anatomy of the snippet

You don't need to understand the internals to install it, but knowing what each part does helps when troubleshooting:

| Line                                                      | What it does                                                                                                                |
| --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| `window.FUS_IS_IN_IFRAME = (window.top != window.self);`  | Detects whether the page is running inside an iframe. The tracker uses this to behave correctly when your site is embedded. |
| `(function (m, n, t, l, x, p, o) { … })(...)`             | A self-executing function (IIFE) that injects the recorder script without blocking your page.                               |
| `window["_fus_host"] = l;`                                | Stores the FullSession host (`"fullsession.io"`).                                                                           |
| `window["_fus_id"] = x;`                                  | Stores **your Customer ID** — the value passed in as `'YOUR_CUSTOMER_ID'`. This is what ties recordings to your account.    |
| `o = n.createElement("script"); o.async = true;`          | Creates a new `<script>` element and marks it **async** so it loads in the background.                                      |
| `o.src = "https://emitter.fullsession.io/RTSessions.js";` | The recorder library that actually captures sessions.                                                                       |
| `y.parentNode.insertBefore(o, y);`                        | Inserts the recorder ahead of the first existing script on the page.                                                        |

The key takeaways:

* The tracker is loaded **asynchronously** (`async = true`), so it never blocks your page from rendering.
* Your **Customer ID** is the last argument to the function — `'YOUR_CUSTOMER_ID'`. This single value is what every domain in your account shares.
* The recorder itself is served from FullSession's emitter CDN, so you never host or update any tracking code yourself — improvements ship automatically.
* The **origin domain** of each recorded page is what FullSession later uses to route the session to the correct site — you don't encode the site anywhere in the snippet.

#### CDN URLs by environment

The `src` in your snippet depends on which FullSession environment your account uses:

| Environment               | Recorder URL                                           |
| ------------------------- | ------------------------------------------------------ |
| **Production**            | `https://emitter.fullsession.io/RTSessions.js`         |
| **Development / staging** | `https://dev-emitter.fullsession.io/RTSessions-dev.js` |

The Installation page always shows the correct one for your account — you normally never need to change this by hand.

#### Where to paste it

Paste the snippet inside the `<head>` of every page you want to record, as **high as possible** — ideally right after the opening `<head>` tag. Placing it early means the recorder initializes before the rest of your page loads, so it captures the full session from the very first moment.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FYOg2kWxgmDpoWELxDLVJ%2Fimage.png?alt=media&amp;token=858496b6-4bcf-42c4-bed0-476b2523b34e" alt="FullSession tracking snippet placement recommendation showing the script added near the top of the HTML head section."><figcaption></figcaption></figure></div>

If your site uses a shared layout, theme header, or master template, paste the snippet there **once** so it's automatically present on every page of that domain. Repeat for each separate domain you want to track.

#### Common platforms

| Platform        | Where to paste                                                      |
| --------------- | ------------------------------------------------------------------- |
| **WordPress**   | Theme's `header.php`, or a "Header & Footer Scripts" plugin         |
| **Shopify**     | Online Store → Themes → Edit code → `theme.liquid`, inside `<head>` |
| **Webflow**     | Project Settings → Custom Code → Head Code                          |
| **Squarespace** | Settings → Advanced → Code Injection → Header                       |
| **Custom site** | The shared `<head>` include / master layout                         |

#### Tracking multiple domains

Because all your domains share one Customer ID, adding another site to FullSession is straightforward:

1. Add the new domain under **Settings → Sites** so FullSession has a URL to match sessions against.
2. Install the **same snippet** on that domain.
3. Sessions from the new domain are automatically filed under its site, separate from your other sites' data.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Fsyr3EoNr3A1XgVPRVAOT%2Fimage.png?alt=media&amp;token=6f7e67e4-b095-4098-b38d-80cf81718557" alt="FullSession setup showing one Customer ID connected to multiple domains with sessions routed by the origin URL."><figcaption></figcaption></figure></div>

#### Publish and check

After pasting, **save and publish** your site, then open it in an incognito window and browse for \~30 seconds. The Installation page should change from **Waiting for data** to **Verified** (covered in detail in section 3.5).

***

### 3.2 Google Tag Manager Installation

If your site runs **Google Tag Manager (GTM)**, FullSession can install the tracker for you — no copy-pasting into your site's code. This is the path most marketing-managed sites use.

#### Automated GTM setup (recommended)

From the **GTM** tab on the Installation page, you can connect your Google account and let FullSession create and publish the tag for you:

1. On the Installation page, open the **GTM** tab.
2. Click **Connect Google Tag Manager** and authorize access to your GTM account.
3. Select the **GTM container** for your site.
4. Confirm — FullSession will then automatically:
   * Create a **page-view trigger** named **"Fullsession Trigger"**.
   * Create a **Custom HTML tag** named **"Fullsession Tracking Script"** containing your snippet (with your Customer ID).
   * Wire the tag to fire on the trigger (i.e. on every page view).
   * Create and **publish** a new container version named **"Fullsession tracking code added"**.<br>

     <div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FKjUJZLEOkql9UakdKuNp%2Fimage.png?alt=media&amp;token=71469e5f-288c-4fbb-98c0-33ed1baaf7b8" alt="Automated GTM setup flow showing FullSession creating the tracking script tag, trigger, and publishing the container after authorization." width="563"><figcaption></figcaption></figure></div>

When the flow finishes, the tracker is live on every page covered by the container — no manual GTM work required. If that container serves more than one domain, all of them report under your single Customer ID and are routed to their respective sites automatically.

#### Manual GTM setup

If you'd rather not connect your Google account, you can add the tag yourself:

1. In Google Tag Manager, open your container and go to **Tags → New**.
2. Name the tag **Fullsession Tracking Script**.
3. Choose **Tag Configuration → Custom HTML**.
4. Paste the FullSession **Script** snippet (from section 3.1) into the HTML field.
5. Under **Triggering**, create or select a trigger that fires on **All Pages** (a page-view trigger).
6. Click **Save**.
7. Click **Submit → Publish** to push a new container version live.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Fzd7GxKmoZ6gsfDkK4bGP%2Fimage.png?alt=media&amp;token=2e8be17b-9025-4ec8-834c-806017185ab1" alt="Manual GTM setup showing a Custom HTML tag named FullSession Tracking Script with a page-view trigger."><figcaption></figcaption></figure>

> **Don't forget to publish.** In GTM, saving a tag is not enough — the tracker only goes live after you **Submit** and publish a new container version. The automated flow does this for you; the manual flow does not.

#### A note on the HTML tag settings

When FullSession creates the GTM tag automatically, it configures it as a **Custom HTML** tag with `convertJsValuesToExpressions` enabled and `usePostscribe` disabled. If you build the tag manually, the GTM defaults are fine — you don't need to change these unless your container has special requirements.

***

### 3.3 NPM Package Installation

For applications built with a bundler (React, Vue, Angular, Svelte, Next.js, etc.), FullSession publishes an official npm package. This is often cleaner than a raw `<script>` tag because the tracker becomes part of your app's normal dependency and build process.

#### Install

```bash
npm i fullsession
```

#### Initialize

Import the tracker and initialize it **once**, as early as possible in your app's startup (for example, in your root entry file — `main`, `index`, `App`, or equivalent):

```javascript
import { fullSessionTracker } from 'fullsession'

// initialize fullsession tracker
fullSessionTracker.initialize('YOUR_CUSTOMER_ID');
```

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FLgOKIPde0vcoKeceaBF0%2Fimage.png?alt=media&amp;token=9a12828a-0bd5-400f-b096-22d410b55343" alt="FullSession Installation page showing the NPM setup with the install command and tracker initialization code pre-filled with the Customer ID."><figcaption></figcaption></figure></div>

#### Where to put `initialize`

Call `initialize` **exactly once**, at app boot — not inside a component that re-renders or a route that re-mounts. Initializing repeatedly can start the recorder more than once.

| Framework            | Recommended location                                                         |
| -------------------- | ---------------------------------------------------------------------------- |
| **React (Vite/CRA)** | `src/main.tsx` / `src/index.tsx`, before rendering the root                  |
| **Next.js**          | A top-level client component / `app/layout.tsx` (client side), or `_app.tsx` |
| **Vue**              | `src/main.ts`, before `app.mount()`                                          |
| **Angular**          | `main.ts`, or an `APP_INITIALIZER`                                           |

#### Single-page apps capture navigation automatically

Once initialized, the tracker detects client-side route changes on its own — each route change is recorded as a separate page within the same session, even though there's no full page reload. You do **not** need to re-initialize on navigation. This applies to both the npm package and the `<script>` snippet.<br>

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FgaiSkfz4ez2bmmXM8uzY%2Fimage.png?alt=media&amp;token=8599ef7a-59db-4802-aebf-c44c87878f55" alt=""><figcaption></figcaption></figure>

***

### 3.4 Mobile SDK Installation (Android & iOS)

FullSession also records native mobile apps through dedicated SDKs. The Installation page has **Android** and **iOS** tabs that generate the exact dependency and initialization code, pre-filled with your Customer ID and site URL. *(React Native and Flutter are listed as coming soon.)*

#### Android

Add the dependency in your module's `build.gradle`:

```gradle
implementation("io.fullsession:fullsession-android:0.1.2")
```

Initialize the SDK when your application starts (typically in your `Application` class):

```kotlin
import io.fullsession.FullSession
import io.fullsession.config.FullSessionConfig

FullSession.init(application, FullSessionConfig(
    customerId = "YOUR_CUSTOMER_ID",
    siteUrl = "https://yoursite.com"
  )
)
```

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FNiNABT0Nq2af1pv8VgaO%2Fimage.png?alt=media&amp;token=d32f06bc-8cb9-4c41-99d7-01cc19af6174" alt="FullSession Android installation tab showing the Gradle dependency and initialization code with customer ID and site URL configured."><figcaption></figcaption></figure></div>

#### iOS

Add the package via Swift Package Manager in your `Package.swift` (or through Xcode → Add Packages):

```swift
dependencies: [
    .package(url: "https://github.com/fullsession/ios-sdk-releases", from: "0.1.2")
],
targets: [
    .target(
        name: "<YOUR_TARGET_NAME>",
        dependencies: [
            .product(name: "FullSessionIos", package: "FullSessionIos")
        ]
    )
]
```

Initialize recording at app launch:

```swift
import FullSessionIos

let config = FullSessionConfig(
    customerId: "YOUR_CUSTOMER_ID",
    siteUrl: "https://yoursite.com"
)

FullSession.shared.initRecording(config: config)
```

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Fgr8RXJtvJwIQ3oLG7v3O%2Fimage.png?alt=media&amp;token=73a7f30e-bac6-41f0-bb0d-c2b41d18d24d" alt="FullSession iOS installation tab showing the Swift Package Manager setup and FullSession recording initialization code."><figcaption></figcaption></figure>

#### Mobile configuration

Both mobile SDKs take the same two configuration values:

| Option       | Required | Purpose                                                                     |
| ------------ | -------- | --------------------------------------------------------------------------- |
| `customerId` | Yes      | Your Customer ID — ties recordings to your account                          |
| `siteUrl`    | Yes      | The app's site URL, used for context and to route data to the matching site |

***

### 3.5 Identifying Users & Sending Events (the `FUS` API)

Once the tracker is installed via the `<script>` snippet or GTM, it exposes a small global object called **`FUS`** on `window`. You'll use this to attach identities and custom events to recordings. (This section is a quick reference; \[Chapter 4 — Identifying Users] and \[Chapter 7 — Recording Rules & Element Tracking] cover the concepts in depth.)

The `FUS` object exposes two primary methods:

#### `FUS.identify(...)` — attach a user identity

```javascript
window.FUS.identify('YOUR_USER_ID', {
  name: 'Jane Doe',
  email: 'jane@example.com'
});
```

* **First argument** — a stable, unique identifier for the user (your internal user ID or their email).
* **Second argument (optional)** — a properties object. The recognized fields are **`name`** and **`email`**.

Call this right after a user logs in, so their sessions become searchable by identity.<br>

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FvjqHi5N4eMArCWy9npAK%2Fimage.png?alt=media&amp;token=56816e49-73fa-489b-960e-ad95ff703c40" alt=""><figcaption></figcaption></figure></div>

#### `FUS.event(...)` — record a custom event

```javascript
window.FUS.event('funnel_access', {
  funnel_id: '1024',
  funnel_name: 'Checkout'
});
```

* **First argument** — the event name.
* **Second argument (optional)** — a properties object of any key/value details you want attached.

Custom events become the building blocks of funnels, segments, and insight cards.

<div align="left" data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FS5dZa6sm198tGGSiVoii%2Fimage.png?alt=media&amp;token=0f353426-90e0-4a85-892a-b13c6869f2f7" alt="FullSession session timeline showing a custom event with its name and captured properties alongside the session replay." width="359"><figcaption></figcaption></figure></div>

> **Guard against early calls.** Because the tracker loads asynchronously, `window.FUS` may not exist for the first few milliseconds after page load. If you call `FUS.identify` or `FUS.event` very early, check that `window.FUS` is defined first, or call it after the user has interacted (e.g. right after login).

***

### 3.6 Site Verification & Troubleshooting

After you install the tracker, FullSession verifies that it's actually loading and reaching your account. Verification is a real handshake between FullSession and your live site — not just a check that the snippet text is present.

#### How verification works

When you open the Installation page (or click **Verify**), FullSession loads your site in a hidden iframe and listens for messages the tracker posts back as it initializes:

| Signal                         | Meaning                                                                                                                        |
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ |
| **`FUS_LOADED`**               | The tracker initialized successfully. It includes a `customer_id`, which FullSession checks against your expected Customer ID. |
| **`FUS_FAILED_TO_REACH_SITE`** | The tracker could not initialize. It includes an `error` with details.                                                         |

If no signal arrives within about **8 seconds**, verification times out and falls back to checking whether any sessions have been recorded for the site yet.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FVRr9nGTRYuUyZxgy5DBe%2Fimage.png?alt=media&amp;token=0770eb51-9b28-40e3-8628-465b7f905753" alt="FullSession verification process showing the site loading and waiting for the tracker handshake confirmation."><figcaption></figcaption></figure></div>

#### The two status states

The Installation page shows one of two states:

| Status                  | Meaning                                                                                              |
| ----------------------- | ---------------------------------------------------------------------------------------------------- |
| 🟢 **Verified**         | The tracker loaded and its `customer_id` matches your account — data is being recorded. You're done. |
| 🟡 **Waiting for data** | The snippet may be present, but no successful handshake or session has been received yet.            |

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FNFuHGhbrSOl5VHxPHQB9%2Fimage.png?alt=media&amp;token=9a93aa1e-0754-47ea-801d-43092c945ccf" alt="FullSession status indicator showing tracker verification state with verified and waiting for data statuses." width="563"><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F131rp4T7h9ubpKX7FxF3%2Fimage.png?alt=media&amp;token=c3887fc5-c477-4028-9cc8-161ae8bf8a38" alt="FullSession status indicator showing tracker verification state with verified and waiting for data statuses." width="563"><figcaption></figcaption></figure></div>

The fastest way to flip from **Waiting for data** to **Verified** is to open your site in an incognito window and browse a few pages — that produces a real session and a real `FUS_LOADED` signal.

#### Troubleshooting: "It still says Waiting for data"

Work through these in order:

1. **Are you testing in incognito?** Sessions from signed-in internal users may be excluded. Use a private window. See \[Chapter 4, section 4.4].
2. **Is the snippet actually on the live page?** View page source (Ctrl+U / Cmd+Option+U) and search for `FUS` or `RTSessions`.
3. **Does the Customer ID match?** Verification only succeeds when the snippet's `customer_id` equals your account's Customer ID. If you pasted a malformed or truncated ID, the tracker will load but never verify. Re-copy the snippet from the Installation page.
4. **Is the domain saved as a site?** Sessions are routed by matching their origin domain to your saved site URLs. If you're testing on a domain that isn't listed under **Settings → Sites**, add it so the session has a site to land in.
5. **Is a Content Security Policy (CSP) blocking it?** A strict CSP can stop the recorder from loading or sending data. Allow the FullSession emitter domain (`emitter.fullsession.io`) in your `script-src` and `connect-src` directives.
6. **Did you publish your GTM container?** If you installed via GTM, confirm you **published** a new version — a saved-but-unpublished tag won't fire. See section 3.2.
7. **Are ad blockers active?** Test in a browser without blockers, or allowlist your own test page.

<mark style="color:$warning;">\[img\_place\_holder]</mark> *<mark style="color:$warning;">An example CSP that allows the FullSession recorder to load (</mark><mark style="color:$warning;">`script-src`</mark><mark style="color:$warning;">) and report sessions (</mark><mark style="color:$warning;">`connect-src`</mark><mark style="color:$warning;">).</mark>*

#### Troubleshooting: sessions landing under the wrong site (or no site)

Because routing is based on matching the origin domain to your saved site URLs:

* If sessions aren't showing up under the expected site, confirm the **domain is spelled and saved correctly** under **Settings → Sites** (watch for `www` vs. non-`www`, `http` vs. `https`, and subdomain differences).
* If a domain isn't saved at all, its sessions have **no matching site** to be filed under. Add the domain, and subsequent sessions will route correctly.

#### Troubleshooting: replay shows broken styling

If sessions record but the replay looks unstyled, the recorder usually couldn't read some of your CSS:

* **Cross-origin stylesheets without CORS headers** won't be captured. Host them on the same origin, or serve them with `crossorigin="anonymous"` and a permissive `Access-Control-Allow-Origin` header.
* **Authenticated/login-gated CSS** that the player can't fetch won't render. Make critical styles public or inline them.

#### Troubleshooting: wrong pages, or too many/too few sessions

* Check **Settings → Recording Rules** to see whether any rules limit which URLs are recorded. See \[Chapter 7 — Recording Rules & Element Tracking].
* Remember that bot traffic and pre-render requests are filtered out and won't appear as sessions.

> **The big picture** — one **Customer ID** powers all your domains; the snippet loads an async recorder from `emitter.fullsession.io` keyed to that ID; GTM, the `fullsession` npm package, and the native mobile SDKs are alternative ways to load the same recorder; and FullSession routes each session to the right site by matching its origin domain to your saved site URLs. Once you see **Verified**, every other chapter in this guide is fed by the data the tracker captures.

***

> **Next up:** \[Chapter 4 — Identifying Users] builds on the `FUS.identify` call introduced here, showing how to turn anonymous recordings into searchable, named user journeys.


# 4. Identifying Users

By default, FullSession records visitors anonymously. That's enough to see *what* people do, but not *who* did it. By identifying your users, you can search sessions by name or email, attach business context like plan or company to each session, and follow a specific customer's journey. This chapter covers the difference between anonymous and identified visitors, the exact `FUS` API calls that attach identity and custom data, and how to keep internal users out of your recordings.

All of the calls below use the tracker's global **`FUS`** object, which becomes available on `window` once the tracker is installed (\[Chapter 3 — Installing the Tracker]).

***

### 4.1 Anonymous vs. Identified Visitors

Every person who visits your site shows up in FullSession as a **visitor**, in one of two states.<br>

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FhiV48nt2u0bjOVEGdV3V%2Fimage.png?alt=media&amp;token=830d4b9e-1d69-4160-a1c4-cd4354948b0f" alt=""><figcaption></figcaption></figure></div>

#### Anonymous visitors

An **anonymous visitor** is known by behavior only. The tracker stores a generated **visitor ID** in the browser, which means:

* ✅ Repeat visits in the same browser are stitched into one visitor.
* ✅ You can filter by location, device, browser, referrer, and behavior.
* ⛔ You don't know their name, email, or anything about *who* they are.
* ⛔ If they clear browser storage or switch devices, they look like a new visitor.

Anonymous tracking is enough for many cases — marketing pages, public landing pages, or pre-login funnels.

#### Identified visitors

An **identified visitor** is one your site has told FullSession about — typically right after they sign in — by calling `FUS.identify(...)`. Once identified:

* ✅ Sessions are tied to a **username** you control (your user ID or their email).
* ✅ You can search by **name** and **email**.
* ✅ Support can paste a customer's email and watch what they did.
* ✅ Combined with custom attributes (section 4.3), you can segment by plan, company, and more.<br>

  <div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FyUX3u4xT8JPOSzW00HLo%2Fimage.png?alt=media&amp;token=6ddb2104-3f89-4e53-8103-ecf349ca7c9c" alt=""><figcaption></figcaption></figure></div>

#### When to identify

Identify a visitor **as soon as you reliably know who they are** — almost always right after a successful login or sign-up. Don't identify before login; guessing or hard-coding an identity pollutes your data.

***

### 4.2 Sending User Identity

To identify a visitor, call `FUS.identify(...)` with a unique **username** and, optionally, the user's **name** and **email**. This is usually a one-line addition to your post-login code.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FYBNmgCUZKFkPK79IJLmM%2Fimage.png?alt=media&amp;token=c8269ce9-41a0-494a-92fc-743f0fef3964" alt="FullSession integration showing a FUS.identify() call added to the post-login handler to identify users."><figcaption></figcaption></figure></div>

#### The method signature

```javascript
window.FUS.identify(username, { name, email });
```

* **`username`** *(string, required)* — a **stable, unique** identifier for the user. Use your internal user ID or the user's email — anything that uniquely and consistently refers to that person.
* **`name`** *(string, optional)* — the user's display name, shown in session lists and the visitor panel.
* **`email`** *(string, optional)* — the user's email, used for searching and display.

> **Only `name` and `email` are recognized here.** The identity object accepts exactly these two profile fields. Any *other* business context — plan, company, role, A/B variant — is attached separately with custom attributes (section 4.3), not through `identify`.

#### A real example

```javascript
window.FUS.identify('user_12345', {
  name: 'Jamie Rivera',
  email: 'jamie@example.com'
});
```

Here `'user_12345'` is your internal, stable user ID. Even if Jamie later changes their email, the `username` stays the same, so all their sessions remain linked.

<div align="left" data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FvjqHi5N4eMArCWy9npAK%2Fimage.png?alt=media&amp;token=56816e49-73fa-489b-960e-ad95ff703c40" alt="FullSession visitor panel showing identified user details including username, name, email, and session history."><figcaption></figcaption></figure></div>

#### Choosing a good username

The `username` is the key that ties every session to one person, so choose it carefully:

| Do                                                 | Avoid                                                         |
| -------------------------------------------------- | ------------------------------------------------------------- |
| A stable internal user ID (`user_12345`)           | A value that changes between logins                           |
| The user's email, if it never changes as their key | A session token or temporary ID                               |
| A consistent value across all your apps/domains    | Different identifiers in different places for the same person |

Because a single **Customer ID** can serve several domains ([Chapter 3](/installing-the-tracker)), using the *same* `username` for a person across all of those domains lets FullSession follow them consistently wherever they go.

#### Updating name or email

If a user's name or email changes, simply call `identify` again with the same `username` and the new values:

```javascript
window.FUS.identify('user_12345', {
  name: 'Jamie Rivera-Lee',
  email: 'jamie.lee@example.com'
});
```

The username stays the anchor; the profile fields update going forward.

#### Logging out & shared devices

> **There is no `logout` or `reset` method.** The tracker does not expose a call to clear the current identity.

This matters most on **shared devices** (a kiosk, a support rep testing different accounts, a family computer). To handle a user switch, **call `FUS.identify(...)` with the new user's `username`** as soon as the next person logs in — the new identity takes over from that point.

If you also want to **end the current recording session** at logout (for example, so the previous user's activity doesn't bleed into the next), you can call:

```javascript
window.FUS.terminate();
```

`FUS.terminate()` ends the current session recording. Note that it **terminates the session** — it does not, by itself, erase the stored identity, so still call `identify` with the new user when someone else signs in.

***

### 4.3 Custom Attributes & User Properties

Identity tells FullSession *who* the visitor is. **Custom attributes** tell it everything else worth knowing about them or their visit — plan, company, role, A/B test variant, feature flags, and so on. The tracker provides two methods for this, depending on whether the data describes the **session** or the current **page**.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FZnHyXh37ExYhFFPJOLMz%2Fimage.png?alt=media&amp;token=1323f3e3-05db-48da-ab68-a342916b18f3" alt="FullSession session details panel showing custom user attributes such as plan, company, and experiment variant attached to the visit."><figcaption></figcaption></figure>

#### Two methods

```javascript
// Attach attributes to the whole session
window.FUS.setSessionAttributes({ plan: 'Pro', company: 'Acme' });

// Attach attributes to the current page view only
window.FUS.setPageAttributes({ template: 'checkout_v2' });
```

| Method                                | Scope                   | Use it for…                                                                                     |
| ------------------------------------- | ----------------------- | ----------------------------------------------------------------------------------------------- |
| **`FUS.setSessionAttributes({ … })`** | The current **session** | Things that describe the visit or the user as a whole — plan, company, role, experiment variant |
| **`FUS.setPageAttributes({ … })`**    | The current **page**    | Things specific to one page — which template/variant rendered, a page-level flag                |

#### Important: values must be strings

> Both methods accept an object whose **values are all strings**. Numbers and booleans aren't accepted as attribute values — convert them to strings first.

```javascript
// ✅ Correct — all string values
window.FUS.setSessionAttributes({
  plan: 'Pro',
  trial_day: '5',
  is_admin: 'true'
});

// ⛔ Wrong — numeric/boolean values are not accepted
window.FUS.setSessionAttributes({
  trial_day: 5,
  is_admin: true
});
```

If you need to capture and analyze a **numeric** value (revenue, count, score), record it as a custom **event** with a numeric field instead (see "Numbers and events" below, and \[Chapter 7 — Recording Rules & Element Tracking]).

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FsSMhO8709oebzT9dP4hd%2Fimage.png?alt=media&amp;token=ce40ea0c-f6f1-4122-9199-c292ac6a199a" alt="FullSession session attributes setup showing plan, company, and role values added after identification for filtering across the app."><figcaption></figcaption></figure>

#### Good things to send as attributes

* **Plan / subscription tier** — `plan: 'Pro'`
* **Company / account (B2B)** — `company: 'Acme'`
* **Role** — `role: 'admin'`
* **A/B test variant** — `experiment_variant: 'checkout_v2'`
* **Feature flags** — `flag_new_nav: 'on'`
* **Onboarding state** — `onboarding_stage: 'completed'`

A common, clean pattern is to call `identify` and `setSessionAttributes` together right after login:

```javascript
window.FUS.identify('user_12345', {
  name: 'Jamie Rivera',
  email: 'jamie@example.com'
});

window.FUS.setSessionAttributes({
  plan: 'Pro',
  company: 'Acme',
  role: 'admin'
});
```

#### Numbers and events

For data that is fundamentally a **number** or represents a discrete **action**, use a custom event rather than an attribute:

```javascript
window.FUS.event('purchase_completed', {
  product_str: 'Annual Plan',
  amount_real: 199
});
```

In event data, a key ending in **`_str`** is treated as a string and a key ending in **`_real`** is treated as a number — so numeric values *are* supported in events, even though attribute values are string-only. (Event names cannot contain hyphens, and the data object cannot be empty.) Custom events are covered fully in \[Chapter 7 — Recording Rules & Element Tracking].

#### Naming attributes well

* Use a **consistent style** — pick `snake_case` or `camelCase` and stick to it.
* Use **clear names** — `plan` and `signup_date`, not `p` and `sd`.
* **Don't repurpose** an attribute name once you've sent data with it — it makes history confusing.
* Keep a **shared list** of attribute names so teammates reuse rather than duplicate them.

#### Where attributes show up

Once sent, attributes appear throughout FullSession as:

* A filter option in the **Sessions** list (\[Chapter 5 — Sessions]).
* A condition in the **Segment** builder (\[Chapter 11 — Segments]).
* A field you can reference in **Alerts** (\[Chapter 15 — Alerts & Notifications]).

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FI3BVoKm02uEDdQR8nLiX%2Fimage.png?alt=media&amp;token=11d8d347-e14e-4a34-ac91-0faad76a039f" alt="FullSession segment builder showing custom attribute filters for isolating Pro users in the new checkout experience."><figcaption></figcaption></figure>

***

### 4.4 Ignoring Internal Users

You almost certainly don't want recordings of your own team's testing, demos, and QA — they inflate session counts, distort metrics, and consume quota. FullSession lets you keep internal activity out of your data using the **ignored users** settings.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FulIpjWn0qp8xz6gYIXwn%2Fimage.png?alt=media&amp;token=cb254989-a36a-42ad-b531-b5022a85e4ab" alt="FullSession Ignored Users settings page showing options to exclude internal team members from session recording."><figcaption></figcaption></figure>

#### Who counts as "internal"

Typical candidates:

* **Engineering** — testing against production-like environments.
* **QA** — running test scripts on the live site.
* **Support** — viewing the site as a customer to troubleshoot.
* **Sales & success** — demoing the product to prospects.
* **Marketing** — previewing pages and copy.

#### How ignoring works

Open the ignored-users settings for your site and add the people you want to exclude. Because you control the **username**, **name**, and **email** passed to `FUS.identify(...)`, the most reliable approach is to ignore internal users by an identity you consistently send for them — for example, everyone on your company email domain.

#### What happens to ignored users

For someone who is ignored:

* ⛔ Their sessions are **not recorded** — no replay, no events, no metadata.
* ⛔ They **don't count** toward your monthly session quota.
* ✅ They can use the site normally — the tracker simply stays silent for them.
* ✅ Your own backend analytics are unaffected (FullSession changes nothing about your site itself).

> **Ignoring is enforced at recording time, in the browser.** Once a session has been excluded, there's no way to retrieve it later. If you need to temporarily record your own sessions for debugging, remove yourself from the ignore settings, test, then add yourself back.

#### Verifying you're being ignored

1. Sign in to your site as yourself (so your usual `identify` call runs).
2. Browse for \~30 seconds.
3. Open FullSession in another tab — your session should **not** appear in **Sessions**.

If it *does* appear, check that:

* The identity you exclude (email/domain) **exactly matches** what you pass to `FUS.identify(...)`.
* `identify` runs **early** in the session, before most activity.
* You aren't sometimes identifying with a personal email and sometimes a company email.

#### Choosing the right exclusion tool

| Goal                                     | Best tool                              |
| ---------------------------------------- | -------------------------------------- |
| Stop recording **specific people**       | **Ignored users** (this section)       |
| Stop recording **specific URLs**         | **Recording rules** (\[Chapter 7])     |
| Stop recording **everyone, temporarily** | **Site-level controls** (\[Chapter 3]) |
| End the **current session** from code    | `FUS.terminate()` (section 4.2)        |

#### Privacy and compliance

The ignored-users list is one of several privacy tools. For masking sensitive on-page content and managing data retention, see \[Chapter 21 — Privacy, Security & Compliance].

***

> **The big picture** — `FUS.identify(username, { name, email })` attaches *who* a visitor is (name and email only); `FUS.setSessionAttributes` and `FUS.setPageAttributes` attach *everything else* as string-valued custom data; numeric and action data go through `FUS.event`; there is no logout, so switch users by re-calling `identify` (and optionally `FUS.terminate()` to end the recording); and ignored-users settings keep your own team out of the data entirely.

***

> **Next up:** \[Chapter 5 — Sessions] dives into the Sessions list — filtering, tagging, sharing, and exporting the recordings that identity and attributes make searchable.


# 5. Sessions

The Sessions area is the heart of FullSession. Every visit to your site becomes a session you can search, filter, tag, comment on, flag, and share. This chapter covers everything *around* the recording — finding the right sessions, organizing them with your team, and getting data out. The session **player** itself (controls, panels, timeline) gets its own deep dive in \[Chapter 6 — The Session Player].

***

### 5.1 Session List & Navigation

Open **Sessions** to see your recorded visits. Alongside the full, filterable list, FullSession gives you three **curated views** so you don't always have to build a filter to find something worth watching:

| View               | What it shows                                                                                             |
| ------------------ | --------------------------------------------------------------------------------------------------------- |
| **Worth Watching** | Sessions ranked by **frustration score** (highest first) — the most problematic visits surface to the top |
| **Recent**         | The newest sessions, in reverse-chronological order                                                       |
| **Flagged**        | Sessions you (or teammates) have pinned for follow-up                                                     |

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F08s2c4YBh5gbDS0tWDvQ%2Fimage.png?alt=media&amp;token=802b474e-6590-4a29-933d-bbeca38a5e41" alt="FullSession session list showing the three session views: Worth Watching, Recent, and Flagged."><figcaption></figcaption></figure>

#### What each row tells you

The columns shown depend on the view, but a session row summarizes who the visitor was and what happened, so you can decide whether to watch it:

| Field           | Meaning                                                                           |
| --------------- | --------------------------------------------------------------------------------- |
| **Visitor**     | Name/email if identified, otherwise a user ID, plus *"since"* the date first seen |
| **Location**    | Country and city, derived from IP                                                 |
| **Device**      | Device type, with OS and browser                                                  |
| **Duration**    | How long the session lasted (and active time)                                     |
| **Date & time** | When the session started — or **Live** if it's in progress                        |
| **Events**      | Number of recorded events in the session                                          |
| **Pages**       | Number of pages visited                                                           |
| **Signals**     | Frustration indicators — Rage, Dead, Error, Thrash (see section 5.4)              |

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FuEO53084nJtPq1cwOstO%2Fimage.png?alt=media&amp;token=fb6f65b4-b1b6-4769-8ba6-59b9551825c5" alt="FullSession session row showing visitor identity, session date, activity signals, and event count details."><figcaption></figcaption></figure>

#### The frustration score

In the **Worth Watching** view, each session carries a **frustration score from 0 to 100**, calculated by FullSession from the density of frustration signals in the session (rage clicks, dead clicks, errors, thrashing, and more). Higher scores mean a rougher experience. The score is color-tiered, so the worst sessions stand out at a glance — this is the fastest way to find the experiences most in need of attention.

#### Live sessions

Sessions that are happening **right now** are marked **Live**. You can watch active visitors as they browse, which is useful for real-time monitoring during a launch or a support call.

#### Watched vs. unwatched

FullSession tracks which sessions you've already played, so it's easy to keep your place as you work through a list — sessions you've opened are marked as watched. You can also filter by watched status (section 5.2) to focus on what you haven't reviewed yet.

#### Opening a session

Click any row to open it in the **player**. Use the browser **Back** button to return to the list. Because the list uses cursor-based paging, you can scroll through very large result sets smoothly.

***

### 5.2 Filtering Sessions

You'll rarely scroll the full list. The **filter builder** lets you narrow thousands of sessions down to exactly the ones you care about — *"mobile users from Germany who had a rage click on the checkout page."* Filters are organized into categories, and most fields offer autocomplete as you type.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FWGKDARI6tWbpjph9hiJI%2Fimage.png?alt=media&amp;token=8a677d17-656c-4d22-8d09-365e464f2e81" alt="FullSession filter panel showing categories for user, events, engagement, technology, location, performance, and other session filters."><figcaption></figcaption></figure>

#### Filter categories

| Category                | Filter by…                                                                                                                                                     |
| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **User identification** | Any User, Email, Name, Signed-up status, User ID                                                                                                               |
| **Events**              | Any Activity, Clicked on, Error Clicks, Rage Clicks, Dead Clicks, Thrashed Cursor, Abandoned Form, Input Changed, Error Log, Uncaught Exception, Network Error |
| **Engagement**          | Visited URL, Query String, Page visits, Total Sessions, Landing page, Exit page, Total Time, Total/Avg Active Time, Avg Session Length, First Seen, Last Seen  |
| **Technology**          | Device Type, Browser, Operating System, Is Mobile App                                                                                                          |
| **Location**            | City, Country, IP Address                                                                                                                                      |
| **Performance**         | Page Load Time, Avg Page Load Time                                                                                                                             |
| **Others**              | UUID, Number of clicks, Screen height/width, Referrer URL, Is Live Session, Has Answered Feedback                                                              |

If your account has the **Optimizely** integration enabled, you'll also get filters for Experiment ID/Name and Variation ID/Name.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FjApIsfc1cU5LWnfhXba6%2Fimage.png?alt=media&amp;token=2f01b555-58bf-452b-9b19-a8fbcc4fb183" alt="FullSession filter builder showing multiple conditions combined to find specific sessions by device type, country, and rage clicks."><figcaption></figcaption></figure>

#### Operators

The operator available depends on the field type. The full set includes:

| Operator                                          | Use for                 |
| ------------------------------------------------- | ----------------------- |
| **is / is not**                                   | Exact match or negation |
| **contains / starts with / ends with**            | Text matching           |
| **equals**                                        | Equality                |
| **greater than / at least / less than / at most** | Numeric comparisons     |
| **between / not between**                         | Numeric or date ranges  |

#### Combining conditions with AND / OR / NOT

Filters aren't limited to simple AND lists — the builder supports **nested groups** combined with **AND, OR, and NOT**. This lets you express complex audiences like *"on the checkout page **AND** (had a rage click **OR** abandoned a form)."*

> **Tip** — your custom attributes (\[Chapter 4 — Identifying Users]) and identity fields (name, email, user ID) are all filterable here, so the data you send through `FUS.identify`, `FUS.setSessionAttributes`, and `FUS.event` becomes searchable the moment it arrives.

***

### 5.3 Sorting & Saving Filter Definitions

#### Sorting the list

Beyond the curated views, you can sort sessions by:

| Sort by               | Surfaces                                                      |
| --------------------- | ------------------------------------------------------------- |
| **Frustration score** | The most problematic sessions (the default in Worth Watching) |
| **Most recent**       | The newest sessions (the default in Recent)                   |
| **Event count**       | The busiest sessions — most activity first                    |

Each sort can run ascending or descending; clearing the sort restores the view's default order.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F08s2c4YBh5gbDS0tWDvQ%2Fimage.png?alt=media&amp;token=802b474e-6590-4a29-933d-bbeca38a5e41" alt="FullSession session list sorting controls showing options to order sessions by frustration score, recency, or event count."><figcaption></figcaption></figure>

#### Saving a filter you'll reuse

The session list's curated views (Worth Watching, Recent, Flagged) are built in, and the filter builder lets you assemble any ad-hoc query. When you want to **save** a filter definition to reuse across the product — in dashboards, funnels, and alerts — build it as a **Segment**. Segments are FullSession's reusable, named audience definitions and are covered in \[Chapter 11 — Segments].

> **Rule of thumb** — use the **filter builder** for a one-off question on the session list; promote it to a **Segment** when you'll ask the same question repeatedly or want to power a dashboard or alert with it.

***

### 5.4 Signals & Tags

FullSession marks notable sessions in two complementary ways: **signals** it computes automatically, and **tags** you apply yourself.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FuEO53084nJtPq1cwOstO%2Fimage.png?alt=media&amp;token=fb6f65b4-b1b6-4769-8ba6-59b9551825c5" alt="FullSession session view showing automatic signals such as Rage, Dead, and Error alongside a user-applied tag."><figcaption></figcaption></figure>

#### Automatic signals

Signals are computed from the session's own data — you don't apply them, and they're always up to date. The core frustration signals are:

| Signal     | Detected from                                                  |
| ---------- | -------------------------------------------------------------- |
| **Rage**   | Rapid, repeated clicking in frustration (rage-click intervals) |
| **Dead**   | Clicks that produced no response (dead clicks)                 |
| **Error**  | Clicks associated with errors (error clicks)                   |
| **Thrash** | Erratic, "thrashing" cursor movement                           |

FullSession also surfaces developer-oriented signals — **error logs, uncaught exceptions, unhandled rejections, and response (network) errors** — as well as contextual markers like **inactive periods** and **custom events**. All of these feed the frustration score (section 5.1) and are filterable (section 5.2).

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FW2rAuEjq9r240E8V3ISV%2Fimage.png?alt=media&amp;token=a0e6feea-c2ea-4029-8dd4-be9227c46319" alt="FullSession signal icons showing rage, dead, error click, thrash, and errors or exceptions indicators."><figcaption></figcaption></figure>

### 5.5 Flagging, Comments & Watched Status

Sessions in FullSession are a shared workspace. Three features help your team triage and collaborate.

#### Flagging (pinning) a session

When you find a session worth coming back to, **flag** it (pin it). Flagged sessions collect in the **Flagged** view, stamped with the date they were pinned, so your team has a running shortlist of sessions that matter. Unpin a session to remove it from the list.<br>

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FPnmQPQeAwetusaxCnr0Q%2Fimage.png?alt=media&amp;token=e06bee1b-6a80-40e3-8ebf-5f5f18fbed26" alt=""><figcaption></figcaption></figure></div>

Flagging is ideal for:

* **Triage** — pin sessions that need a closer look or a follow-up.
* **Curation** — collect strong examples to share with design, onboarding, or leadership.
* **Hand-offs** — flag a session so a teammate can find it in the shared Flagged list.

#### Commenting on a session

You can leave **comments** on a session to capture what you found — a note for a teammate, a description of a bug, or context for later. Comments are tied to you as the author and timestamped, so a session becomes a small thread of team discussion rather than a silent recording. Comments can be edited and deleted by their author.<br>

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FAVwYRffS40W8AEjYKmhd%2Fimage.png?alt=media&amp;token=f2c7d59c-7c8f-43ea-be00-57c2c7518074" alt="FullSession session comment thread showing teammates adding notes and observations with timestamps."><figcaption></figcaption></figure></div>

#### Watched status

FullSession remembers which sessions you've **watched**, so as you and your team work through a list, it's clear what's already been reviewed and what hasn't. Combine this with the watched-status filter (section 5.2) to focus only on unreviewed sessions.

> **Tip** — a simple team workflow: sort by **frustration score**, **flag** the sessions that need action, **comment** with what you found, and let **watched status** track your progress through the backlog.

***

### 5.6 Sharing a Session

When you find a session worth showing someone, you can share it with a link.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FREJ2T5n5k8Ot3Eo2cvs3%2Fimage.png?alt=media&amp;token=b995a214-e1a8-4c62-9c3a-e9369244b0a4" alt="FullSession &#x22;Copy Session Link&#x22; dialog showing a shareable link for the session."><figcaption></figcaption></figure>

#### Copying a share link

1. Open the session in the player.
2. Open the **Share** option.
3. Click **Copy Session Link**.

The link points to the specific session (and can include more than one session at once). Paste it into your ticketing tool, chat, or email so the recipient can open the exact recording you're referring to.

#### Good to know about share links

* **The link opens the session directly** — there's no need to describe where to click.
* **Links are accessible to people who have them.** Treat a session link like any sensitive link: anyone you give it to can view the recorded session, so share thoughtfully — especially if the session contains customer activity.
* **Links don't carry a timestamp.** A share link opens the session from the start; it doesn't jump to a specific moment. If you want a colleague to see a particular moment, tell them roughly where to scrub to (or add a **comment** at that point — section 5.5).
* **A link relies on the session still existing.** If a session is later removed (section 5.8), its link stops working — so for anything you must keep, capture findings in a comment or your ticketing tool as well.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FxlAJ2Rls9cMANbHxzXWZ%2Fimage.png?alt=media&amp;token=5db50963-dfd5-4d91-85af-8ce4faa5a7d1" alt="FullSession shared session opening directly in the session player for a teammate with access to the link."><figcaption></figcaption></figure>

***

### 5.7 Exporting Session Data

When you need session **data** outside FullSession — for a spreadsheet analysis or a report — you can export it as **CSV** from a **session card on a dashboard**.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FHO6bb2gk65Yyzg4JrHjk%2Fimage.png?alt=media&amp;token=2d8a96c6-d209-4431-b1d5-3b19547a0365" alt="FullSession dashboard export showing a session card being exported to CSV with the current filters and sorting applied."><figcaption></figcaption></figure></div>

#### How to export

1. Add or open a **session card** on a dashboard (\[Chapter 9 — Dashboards]), filtered to the sessions you want.
2. Use the card's **download / CSV** option.
3. FullSession builds the CSV and downloads it.

#### What's in the export

The CSV contains the session **metadata** — visitor, date, duration, location, device, event counts, and the like — for the sessions in that card's view.

> **Notes & limits**
>
> * **Export is available from dashboard session cards**, not as a button on the main Sessions list. Build a card scoped to the sessions you want, then export it.
> * Exports are capped at **10,000 rows** — narrow your filters or date range if you need a focused set.
> * The export contains session **data**, not the **recordings**. Replays can only be watched inside FullSession.

For programmatic access to session data, see \[Chapter 20 — API & Developer Tools].

***

### 5.8 Retention & Deletion

Recorded sessions don't necessarily live forever, and a few are removed automatically because they hold little value.

#### What gets removed automatically

FullSession may remove a session for reasons such as:

* It **ended with no events** (a visit with nothing meaningful recorded).
* It matched a **deletion rule** configured for the account.
* It **expired** under the account's retention window.

This keeps your data focused on sessions that are actually worth reviewing.

#### Preserving what matters

Because some sessions are pruned over time, capture the important ones while they're available:

* **Flag** key sessions (section 5.5) so they're easy to revisit.
* **Comment** on them to record what you found — the note persists as part of your team's discussion.
* **Export** the surrounding metadata from a dashboard card (section 5.7) for a permanent record.
* Document findings in your ticketing tool, since a **share link stops working** once a session is removed (section 5.6).

> **Quota vs. retention** — two different limits affect your data. **Quota** governs how many *new* sessions you can record in a cycle (managed via plan and recording controls — see \[Chapter 3] and \[Chapter 7]); **retention/deletion** governs how long *existing* sessions are kept. Neither is something most users adjust day to day.

***

> **Next up:** \[Chapter 6 — The Session Player] opens a single session in full detail — playback controls, the event timeline, and the console, network, and error panels that turn a replay into a debugging tool.


# 6. The Session Player

The session player is where a recording comes to life. You're not watching a screen capture — you're replaying a faithful reconstruction of exactly what the visitor saw and did, with an event timeline, a console, and per-visitor context layered on top. This chapter walks through every control and panel that actually exists in the player, so you can move from *"play the session"* to *"jump straight to the moment something went wrong."*

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FgaiSkfz4ez2bmmXM8uzY%2Fimage.png?alt=media&amp;token=8599ef7a-59db-4802-aebf-c44c87878f55" alt="The session player — the replay on the left, the timeline and controls beneath it, and the visitor/events panel on the right.FullSession session player showing the session replay on the left, timeline and playback controls below, and visitor details with events on the right."><figcaption></figcaption></figure>

> **A note on permissions.** Some player features are gated by your role — for example, **Dev Tools**, **commenting**, **pinning**, and the **Heatmaps** tab each require the matching permission. If you don't see a control described here, your role may not include it. See \[Chapter 16 — Team & Account Management].

***

### 6.1 Player Controls

The playback controls sit beneath the replay. They behave much like a video player, with a few session-specific extras.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FqqQy9xOQCiIzajUcL797%2Fimage.png?alt=media&amp;token=4fcc8d60-a33d-4879-93bc-891f6b68cd8b" alt="FullSession session player control bar showing playback controls, skip options, speed settings, inactivity skip, Dev Tools, AI Summary, fullscreen, and current playback time."><figcaption></figcaption></figure>

#### Core controls

| Control                       | What it does                                                                 |
| ----------------------------- | ---------------------------------------------------------------------------- |
| **Play / Pause**              | Start or stop playback. The **spacebar** also toggles play/pause.            |
| **Rewind 10 seconds**         | Jump back 10 seconds.                                                        |
| **Forward 10 seconds**        | Jump ahead 10 seconds.                                                       |
| **Speed**                     | Cycle playback speed — **0.5×, 1×, 2×, 4×, 8×** (shown as "X2", "X4", etc.). |
| **Skip Inactivity**           | Automatically fast-forward over idle stretches.                              |
| **Fullscreen**                | Expand the player to fill the screen.                                        |
| **Current time / total time** | Where you are in the session, and its total length.                          |

#### Skip inactivity

Real sessions have dead air — a visitor reads, switches tabs, or steps away. With **Skip Inactivity** enabled, the player jumps over periods with no recorded activity, so you only watch the parts where something is actually happening. This often turns a long, mostly-idle session into a couple of minutes of real activity.

#### Speed

Use higher speeds to triage quickly: **2×** for a general watch-through, **4×–8×** to skim a long session for a specific moment, and back to **1×** (or **0.5×**) when you've found the moment and want to study it closely.

#### Dev Tools & AI Summary

Two toggles open extra layers over the player:

* **Dev Tools** — opens the **Console** panel (section 6.4).
* **AI Summary** — generates a plain-language summary of the session (section 6.9).

#### Keyboard shortcuts

The player's keyboard shortcut is **spacebar** to play/pause. (Other navigation — skipping, seeking, changing speed — is done with the on-screen controls.)

***

### 6.2 The Timeline

Below the replay runs the **timeline** — a seek bar that doubles as a map of everything that happened during the session. Instead of scrubbing blindly, you can see where the interesting moments are and jump straight to them.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Ftls1rx3Ujab5fdzU2HUo%2Fimage.png?alt=media&amp;token=ef4f5f9e-d8c9-4fcb-96c0-8ca427d3a627" alt="FullSession session timeline showing a draggable playhead with event markers, inactivity periods, and commenter avatars."><figcaption></figcaption></figure>

#### Seeking

* **Drag the playhead** to move to any point in the session.
* **Click anywhere** on the timeline to jump to that moment.
* A **progress fill** shows how far through the session you are.

#### Color-coded event markers

The timeline renders markers for events at their position in time, color-coded so patterns stand out:

| Color      | Marks                        |
| ---------- | ---------------------------- |
| **Yellow** | Click events                 |
| **Orange** | Page visits / navigation     |
| **Green**  | DOM changes (page mutations) |
| **Pink**   | Frustration (rage clicks)    |

#### Inactivity & comments on the timeline

* **Gray blocks** mark **inactive periods** — the idle stretches that Skip Inactivity (section 6.1) jumps over.
* **Avatar circles** mark **comments** left by you or teammates. Click one to open the comment at that exact moment (section 6.7).

> **Tip** — the pink frustration markers are the fastest visual cue on the timeline. When you open a high-frustration session, look for the pink clusters and click straight to them.

***

### 6.3 Session Events Panel & Event Types

The **Session Events** panel (in the right sidebar) lists everything that happened during the session, in order. It's the player's index: filter it, search it, and click any entry to jump the replay to that exact instant.

<div align="left" data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FZXKxDhAFKFgWstQz3Ho1%2Fimage.png?alt=media&amp;token=25ed7b22-328d-440c-8459-7f6cb9656a31" alt="FullSession Session Events panel showing a searchable and filterable event list with icons and jump-to navigation links." width="275"><figcaption></figcaption></figure></div>

#### Event types

Each event has an icon and label:

| Event                         | Meaning                                                |
| ----------------------------- | ------------------------------------------------------ |
| **Click event**               | A click/tap interaction                                |
| **Visited page**              | The visitor loaded or moved to a URL                   |
| **Inactive period**           | An idle stretch with no activity                       |
| **Comment**                   | A comment left on the session                          |
| **Rage click event**          | Rapid, repeated clicking (frustration)                 |
| **Dead click event**          | A click that produced no response                      |
| **Thrashing event**           | Erratic cursor "thrashing"                             |
| **Error click event**         | A click associated with an error                       |
| **Custom event**              | An event you sent with `FUS.event(...)` (\[Chapter 7]) |
| **Error log event**           | A logged error                                         |
| **Uncaught exception event**  | An uncaught JavaScript exception                       |
| **Unhandled rejection event** | An unhandled promise rejection                         |
| **Response error event**      | A failed network response                              |

#### Jump to any event

Click an event to **seek the replay to that moment and pause** there — no scrubbing required. This is the core debugging move: find the error event, click it, then watch the seconds leading up to it.

#### Filtering & searching events

Busy sessions can have hundreds of events. Filter the panel to a specific type — show only **errors** to debug, only **custom events** to trace a flow, or only **page visits** to follow the journey — and use the search box to find a specific event.

#### Errors and network failures live here

FullSession does **not** have a separate "Errors" tab or a network-waterfall panel. Instead, the relevant events surface directly in this list:

* **Error log**, **uncaught exception**, and **unhandled rejection** events capture JavaScript errors.
* **Response error** events capture failed network responses.

To investigate a problem, filter the events panel to these types, click the event to jump to it, and watch what the visitor did right before. For logged console output and stack traces, open the **Console** (section 6.4).

#### Per-event insights & locked events

* Some events offer an **insights** action (a chart icon) that opens a details view with analytics for that event across sessions.
* Events your role can't access appear **locked** — a small lock icon indicates the feature requires a higher permission or plan.

***

### 6.4 Console / Dev Tools Panel

Clicking **Dev Tools** opens the **Console** panel — the browser console output captured from the real visitor's browser, synced to the replay.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FbWA524coyt7GqiO2uVCs%2Fimage.png?alt=media&amp;token=cecd611a-d48c-4dd1-a5c3-dd457069656b" alt="FullSession Console panel showing captured logs, warnings, and errors with jump-to-moment links and expandable stack traces."><figcaption></figcaption></figure>

> The button is labeled **Dev Tools**, but it opens the **Console**. There is no separate Network or Resources tab in the player — network failures appear as **Response error** events in the Session Events panel (section 6.3).

#### What it captures

The console reconstructs the messages logged during the session — **log**, **warning**, and **error** output — at the moment each was printed.

#### Using the console

* **Filter by level** — switch between **All**, **Log**, **Warn**, and **Error**.
* **Search** — type in the **Filter** box to find a specific message.
* **Jump to moment** — each message has a link that seeks the replay to the instant it was logged, so you can correlate what the user saw with what the code was doing.
* **Expand stack traces** — error messages with a stack trace can be expanded to show the file, function, and line/column, so an engineer can trace the error to its source.

> **Workflow** — open Dev Tools, filter to **Error**, find the failing message, expand its stack trace, then click **jump to moment** to see exactly what the visitor did to trigger it.

***

### 6.5 Page Navigation

A session usually spans several pages. The player's **page navigation** lets you step through them without scrubbing.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FVWmwEjrqMSumW4Bvof6i%2Fimage.png?alt=media&amp;token=b44557cf-8dcd-47d7-a5bd-dacb9209460e" alt="FullSession session player header showing the page indicator, current URL step, and previous or next navigation controls."><figcaption></figcaption></figure></div>

#### The page stepper

In the player header, a counter shows which page you're on out of the total — for example **`url: 2/5`** (or a `view:` indicator for mobile app sessions). The full URL or path is shown, with the complete value on hover.

* **Previous / Next page** arrows jump the replay to the start of the adjacent page.
* Each page knows its **time visited** and **total time on page**, so you can see how long the visitor spent on each step.

#### Session statistics

The player also surfaces page-level engagement for the session, including **Average Time on Page** and **Total Active Time on Pages** — a quick read on how engaged the visit was overall. (For aggregate page statistics across all visitors, see \[Chapter 10 — Insights & Cards].)

> **Tip** — the page stepper is the fastest way to skip to "the part where they reached checkout" — step forward to the checkout page rather than scrubbing the whole session.

***

### 6.6 Visitor Info & Sentiment

The right sidebar shows **who** you're watching and the context of their visit.

<div align="left" data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FvjqHi5N4eMArCWy9npAK%2Fimage.png?alt=media&amp;token=56816e49-73fa-489b-960e-ad95ff703c40" alt="FullSession visitor info panel showing visitor avatar, identity details, country, IP address, session start time, sentiment, and connected Intercom profile when available."><figcaption></figcaption></figure></div>

#### What's shown

| Field                  | Detail                                                        |
| ---------------------- | ------------------------------------------------------------- |
| **Avatar**             | A generated symbol so each visitor is visually distinct       |
| **Identity**           | Email if identified, otherwise the user ID                    |
| **Country**            | The visitor's country                                         |
| **IP address**         | The visitor's IP                                              |
| **Session start time** | When the session began (e.g. *June 14, 2026, 2:30 PM*)        |
| **Referrer**           | Where the visitor came from (shown at the top of the sidebar) |

> **No map.** Location is shown as a **country name** (and IP), not as a point on a map.

#### Sentiment indicator

The panel shows a quick **sentiment** read — a happy or unhappy face — based on how much frustration the visitor experienced (error clicks, dead clicks, and rage clicks). A handful of frustration signals tips it to "unhappy," giving you an at-a-glance sense of how the visit went before you even press play.

#### First session & integrations

* A **First Record** link (when you're not already on the visitor's first session) jumps to that visitor's earliest recorded session — useful for understanding how a returning user first arrived.
* If the **Intercom** integration is configured and the visitor has an email, a link opens their Intercom profile, connecting the replay to your support conversations.

***

### 6.7 Comments, Tags, Flagging & Sharing

The player is a collaborative workspace. Several actions let you capture findings and hand sessions to teammates. (Most are available in your private workspace and may depend on your permissions.)

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Fz8jjSy79MIhaYCSI3917%2Fimage.png?alt=media&amp;token=d86aedbe-09ac-4eb8-852b-de9fb533e6bf" alt="FullSession player header showing share, pin, and comment actions with comment avatars displayed on the session timeline."><figcaption></figcaption></figure>

#### Comments

Leave **comments** anchored to a moment in the session. Use **Add comment** while a session is paused, and the current timestamp is captured automatically. Comments appear as **avatars on the timeline** (section 6.2); click one to read it, and comments can be **edited or deleted** by their author. This turns a recording into a small discussion thread — perfect for flagging a bug at the exact second it happens.

#### Tags

Attach **color-coded tags** to a session to organize it — for example **UX Design**, **Bug**, **Rage**, or a custom tag of your own. Tags are searchable from the Sessions list, so *"every session tagged Bug"* is one query away (\[Chapter 5 — Sessions]).

#### Pin / Flag

**Pin** a session from the header to add it to your **Flagged** list (and the session playlist), so your team has a shared shortlist of sessions worth revisiting (\[Chapter 5, section 5.5]).

#### Share

Use **Share** in the header to open a **Copy Session Link** dialog and send the recording to a teammate. See \[Chapter 5, section 5.6] for how share links behave (they open the session from the start and are accessible to anyone with the link).

***

### 6.8 Watching Across a Visitor's Sessions

A single recording is one visit; the player also helps you see the **whole relationship** with a visitor.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FQ71fao0svGMwBXmxMWSM%2Fimage.png?alt=media&amp;token=9910a169-4de5-47a2-bf7b-18599894034d" alt="FullSession session player showing autoplay and the visitor&#x27;s recent sessions queued for continuous playback."><figcaption></figcaption></figure>

#### Autoplay & recent sessions

The sidebar includes an **Autoplay** toggle and a **Recent Sessions** selector. With autoplay on, FullSession plays through sessions in sequence — handy for reviewing several visits (or several sessions in a segment or funnel) without returning to the list between each.

#### A visitor's full history

Because sessions can be linked to an identified visitor (\[Chapter 4 — Identifying Users]), you can move from one session to **that visitor's other sessions** — including their **first recorded session** — to understand their journey over time rather than in a single snapshot.

***

### 6.9 AI Summary

For a fast read on what happened in a session, toggle **AI Summary**. FullSession generates a plain-language, written summary of the session and displays it as an overlay over the player (with a brief loading state while it's produced).

<div align="left"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Fgj8KhWee3LLvvE7el2ip%2Fimage.png?alt=media&amp;token=c72f3b38-edaf-4e98-8568-47a13894ebf4" alt="FullSession AI Summary overlay showing a generated summary of the visitor&#x27;s actions during the session." width="394"><figcaption></figcaption></figure></div>

The summary is a quick orientation — *"what happened in this visit?"* — before (or instead of) watching the whole thing end to end. It's especially useful when triaging a long session or deciding whether a recording is worth a full watch.

> **The big picture** — the player gives you precise playback controls (including ±10s and 0.5–8× speed), a color-coded timeline, a filterable **Session Events** panel where errors and network failures surface as events, a synced **Console** behind the Dev Tools toggle, a **page stepper**, rich **visitor context** with a sentiment read, full **comment / tag / flag / share** collaboration, **autoplay** across a visitor's sessions, and an **AI Summary** for a quick recap. There is no separate network or errors panel and no geolocation map — those signals live in the events list and the visitor panel respectively.

***

> **Next up:** \[Chapter 7 — Recording Rules & Element Tracking] moves from watching sessions to **configuring what gets captured** — controlling which pages record, defining the custom events that appear in this player's events panel, and tracking the elements you care about.


# 7. Recording Rules & Element Tracking

So far you've been *watching* what FullSession captures. This chapter is about *configuring* it — controlling which pages are recorded, naming and watching the elements that matter to your business, and sending the custom events that show up in the player and power funnels. These settings live in two places: **Settings → Privacy Rules** (what gets recorded) and **Settings → Element Tracking** (which elements you measure). Custom events are added in your site's code.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FBJbmnzS4bxeHWc7R2NTk%2Fimage.png?alt=media&amp;token=f6b2b0b5-9d3a-452e-9b38-b1ddb5e0704c" alt=""><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Ffa7NuJJRxMcVMmwh39q6%2Fimage.png?alt=media&amp;token=9f75af77-0baa-48f1-b3b9-88bc7ec42774" alt="FullSession Settings showing the Element Tracking section for configuring what interactions are measured."><figcaption></figcaption></figure></div>

***

### 7.1 What You Can Configure (Overview)

Before diving in, here's the lay of the land. FullSession separates three related concerns

| Setting                          | Where                       | Controls                                                                       |
| -------------------------------- | --------------------------- | ------------------------------------------------------------------------------ |
| **Page recording rules**         | Settings → Privacy Rules    | Which **pages/URLs** are recorded (section 7.2)                                |
| **Element recording rules**      | Settings → Privacy Rules    | Which **elements are masked or excluded** for privacy (section 7.3)            |
| **Named Elements & Watch Rules** | Settings → Element Tracking | Which **elements you measure** in reports, heatmaps, and funnels (section 7.4) |
| **Custom events**                | Your website code           | Business actions sent via `FUS.event(...)` (section 7.5)                       |

> **Page rules vs. element rules** — *page* rules decide whether a whole page is recorded at all; *element* recording rules decide whether specific elements on a recorded page are masked or hidden. They work together.

***

### 7.2 Page Recording Rules

By default, FullSession records your site's pages. **Page recording rules** let you change that — either to *exclude* specific pages you don't want recorded, or to record *only* a chosen set of pages.

These are configured under **Settings → Privacy Rules → Page recording rules**.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FwOxTSjNjOAcaMx0aVRUl%2Fimage.png?alt=media&amp;token=8a76d58d-2172-454d-8a0c-43260736f7e3" alt="FullSession Page recording rules panel showing page targeting rules and the site-level recording mode toggle."><figcaption></figcaption></figure></div>

#### The two modes

A single site-level toggle determines what your rule list *means*:

| Mode                                         | Behavior                                                                                              |
| -------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| **Record all except listed pages** (default) | Every page is recorded **except** the ones your rules match — the list acts as an **exclusion list**. |
| **Exclude all pages** (record only listed)   | **No** page is recorded **except** the ones your rules match — the list acts as an **allowlist**.     |

So the same rule list flips purpose depending on the mode. Switch to **Exclude all pages** when you want a tightly scoped recording (e.g. only your signup funnel); leave it off when you want to record broadly and only carve out a few sensitive pages.

#### Creating a page rule

1. Click **Create Page Rule**.
2. In the **page** field, paste any URL — *"Put any url and we'll extract the path!"* FullSession extracts just the path (and strips trailing slashes), so you can paste a full address and it figures out the path for you.
3. Choose the matching options:
   * **Ignore Query Parameters** — match the path regardless of any `?query=...` string. Turn this on when the same page has many query-string variants you want treated as one.
   * **Include sub-paths** — match the path *and everything beneath it*. With this on, a rule for `/account` also covers `/account/settings`, `/account/billing`, and so on.
4. Save.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FtfbJUMUWAU9taWDNVrog%2Fimage.png?alt=media&amp;token=51909e94-fbfa-4af7-9fbf-78abca3fe771" alt="FullSession page targeting rule dialog showing a page path with options to ignore query parameters and include sub-paths."><figcaption></figcaption></figure></div>

#### How matching works

Page rules match the **literal path**, refined by the two checkboxes above. Importantly:

> **There are no wildcards or regular expressions.** Matching is the path itself, optionally with query parameters ignored and/or sub-paths included. To cover a whole section of your site, use **Include sub-paths** rather than a `*` pattern.

#### Common recipes

| Goal                               | Mode              | Rule(s)                                                             |
| ---------------------------------- | ----------------- | ------------------------------------------------------------------- |
| Never record account pages         | Record all except | `/account` with **Include sub-paths** on                            |
| Ignore checkout query-string noise | Record all except | `/checkout` with **Ignore Query Parameters** on                     |
| Record only the signup funnel      | Exclude all pages | `/`, `/pricing`, `/signup` (add **Include sub-paths** where needed) |

#### Test your rules

After saving, browse the affected pages in an incognito window and confirm in the **Sessions** list (\[Chapter 5 — Sessions]) that the right pages do (and don't) appear. A few minutes of testing prevents weeks of missing — or unwanted — data.

> **Related privacy controls** in the same panel include **IP Address Collection** (on/off) and a **Total Session Length Recording Rule** that caps how long a single session is recorded. See \[Chapter 21 — Privacy, Security & Compliance].

***

### 7.3 Element Recording Rules (Masking & Exclusion)

Where page rules decide *which pages* record, **element recording rules** decide whether specific *elements* on a recorded page are captured, masked, or hidden — the core of protecting sensitive content. These live under **Settings → Privacy Rules → Element recording rules**.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FsBvvZ8ISpHEGsGbdVaqQ%2Fimage.png?alt=media&amp;token=dc0d4cc2-42e9-4522-b316-198059ce0784" alt="FullSession Element recording rules panel showing CSS selector rules with exclude, mask, and unmask actions."><figcaption></figcaption></figure></div>

#### What a rule does

Each rule targets elements by **CSS selector** and applies one of three actions:

| Action      | Effect                                                                                                                    |
| ----------- | ------------------------------------------------------------------------------------------------------------------------- |
| **Exclude** | Fully block the element from recording — it isn't captured at all.                                                        |
| **Mask**    | Capture the element's presence but hide its **content** (e.g. show that a field exists without recording what was typed). |
| **Unmask**  | Explicitly *re-enable* capture for something inside a masked region — an exception to a broader mask.                     |

Each rule also has a **scope** — **Live Sessions** (active, applied to new sessions) or **No Sessions (inactive)** (the rule exists but isn't applied) — plus optional **notes** and an **exception selector**.

#### Built-in protections

FullSession ships with sensible defaults already in place, so common sensitive fields are protected out of the box — **all input fields** (`input`) are masked by default, including **password fields** (`input[type=password]`), **hidden inputs** (`input[type=hidden]`), and **credit-card fields** (`[autocomplete*=cc-]`). You can add your own rules for anything else specific to your site.

#### AI-suggested rules

The **Suggest Rules** button in the Element recording rules header gives Owners and Admins an AI-powered way to discover which elements may need masking. It is visible only to users with the `privacy_rules:element:create` permission.<br>

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FhIlsDWdEDx6IAoQcpETG%2Fimage.png?alt=media&amp;token=887ecd69-d4be-4c79-bfdc-e0d7b2204f2c" alt=""><figcaption></figcaption></figure></div>

Clicking **Suggest Rules** opens a panel where you choose a set of already-recorded sessions and start an analysis run. The agent inspects DOM snapshots, identifies elements likely to contain PII — names, email addresses, phone numbers, addresses, payment card numbers, and similar — and proposes CSS selector rules. While a scan is active, the button shows **Scan in progress** with a spinner; only one scan can run at a time.<br>

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FCdbNeJLXMaRD6vD3iDTu%2Fimage.png?alt=media&amp;token=fb62c1b1-b9a4-446b-8ed9-bb2201629830" alt=""><figcaption></figcaption></figure></div>

When the scan completes, each proposed rule is listed with its suggested selector, recommended action (mask or exclude), detected PII type, confidence level, and redacted evidence. Raw PII is never shown in the UI. Per-row actions:<br>

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FgunivYAGL4dx2SN6zHNE%2Fimage.png?alt=media&amp;token=33e49795-de74-420a-b236-35cdaf98ab44" alt=""><figcaption></figcaption></figure></div>

| Action               | Effect                                                                                            |
| -------------------- | ------------------------------------------------------------------------------------------------- |
| **Accept**           | Creates the rule in the main Element recording rules list; applies to new sessions going forward. |
| **Edit then accept** | Adjust the selector, action, or scope before promoting it to a real rule.                         |
| **Dismiss**          | Removes the suggestion; dismissed items are not re-surfaced in later scans.                       |

Bulk **Accept all** and **Dismiss all** are available with a confirmation step. Every accept and dismiss action is written to the **Audit Log** (\[Chapter 16, section 16.6]).

> This section is a summary; masking, privacy, and compliance are covered in full in \[Chapter 21 — Privacy, Security & Compliance].

***

### 7.4 Element Tracking: Named Elements & Watch Rules

To *measure* the specific elements that matter — your CTAs, nav links, key buttons — use **Element Tracking** under **Settings → Element Tracking**. There are two complementary tools.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Ffa7NuJJRxMcVMmwh39q6%2Fimage.png?alt=media&amp;token=9f75af77-0baa-48f1-b3b9-88bc7ec42774" alt="FullSession Element Tracking settings showing Named Elements (Labels) and Watch Rules configured with CSS selectors."><figcaption></figcaption></figure></div>

#### Named Elements (Labels)

A **Named Element** attaches a human-readable name to an element (or group of elements), so it appears clearly in **click reports** and **funnels** instead of as a raw selector.

A named element consists of:

* **Name** — the friendly label (e.g. *"Hero CTA – Start trial"*).
* **Description** — optional context.
* **Selectors** — one or more **CSS selectors** identifying the element(s).

> *"Assign human-readable names to tracked elements so they appear clearly in click reports and funnels."*

Use named elements whenever you want a specific element to be recognizable in your analytics — they turn `button.btn-primary.cta-xl` into *"Start trial."*<br>

<div align="center" data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FSd4PG7lf92htmH5qmrD4%2Fimage.png?alt=media&amp;token=d6856a55-46df-4151-bc48-3c22fc4d0b21" alt="FullSession Named Element configuration showing a friendly name and CSS selectors used to identify the element." width="482"><figcaption></figcaption></figure></div>

#### Watch Rules

A **Watch Rule** tells FullSession to **log and surface interactions** on specific elements across **all** recorded sessions — feeding heatmaps and element-level reporting.

> *"Define rules to log and surface interactions on specific elements across all recorded sessions."*

A watch rule consists of:

* **Name** and optional **description**.
* A **selector definition** that targets the element by any combination of:
  * **Element/tag** (e.g. `button`)
  * **ID**
  * **Classes**
  * An optional **parent relationship** — match only when the element sits under a given parent, either as a **direct** child or **any** descendant.

This structured targeting lets you be as broad ("all buttons with class `cta`") or as precise ("the `Apply` button directly inside the `coupon-form`") as you need.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FyEnIdM84mT32o7KnElGE%2Fimage.png?alt=media&amp;token=c4566733-7426-4139-92a1-fff71c1d66bc" alt="FullSession Watch Rule selector configuration showing targeting by tag, ID, classes, and optional direct or parent relationships." width="485"><figcaption></figcaption></figure></div>

#### How tracked elements feed reports

* **Named Elements** provide the labels that make click data and funnel steps readable.
* **Watch Rules** identify which elements' interactions are logged and surfaced — these power **element heatmaps** and the interaction reporting in \[Chapter 8 — Heatmaps].

#### Selectors are entered as text

> **There is no visual point-and-click element picker.** Named Elements and Watch Rules are defined by entering **CSS selectors** (or the structured selector definition). To get a reliable selector, inspect the element in your browser's developer tools and copy a stable selector.

**Tips for durable selectors:**

* Prefer a stable **id** or a dedicated attribute over auto-generated class names.
* Avoid deep, brittle chains like `div > div > div:nth-child(3) > button` — they break when your layout shifts.
* Coordinate with engineering to add stable hooks (e.g. a consistent class or attribute) to important elements.

> **Tip** — if a tracked element's click metrics suddenly drop to zero, a markup change likely broke its selector. Update the selector in the Named Element or Watch Rule.

***

### 7.5 Custom Events with `FUS.event`

A **custom event** is a named action meaningful to *your* product — *purchase*, *plan upgraded*, *search performed*. Custom events appear in the session player's events list (\[Chapter 6, section 6.3]) and are the building blocks of funnels, segments, and insight cards.

> **Custom events are code-only.** There is no UI for creating "no-code" custom events from a click or page visit — you send them from your website code with `FUS.event(...)`. (To *measure clicks* on an element without code, use a **Watch Rule** / **Named Element**, section 7.4.)

#### The method

```javascript
window.FUS.event(eventName, eventData);
```

* **`eventName`** *(string, required)* — the event name.
* **`eventData`** *(object, required)* — a **non-empty** object of properties whose values are strings or numbers.

```javascript
window.FUS.event('purchase', { amount_real: 99.99, product: 'Widget' });
```

#### Validation rules

FullSession validates every event and **rejects invalid ones** (it throws a descriptive error listing what's wrong), so getting the format right matters:

| Rule                                   | Detail                                                                                     |
| -------------------------------------- | ------------------------------------------------------------------------------------------ |
| **Event name is a string**             | Required.                                                                                  |
| **No hyphens in the event name**       | `'user-action'` is rejected — use `'user_action'`.                                         |
| **`eventData` is a non-empty object**  | An empty object `{}` or an array `[]` is rejected.                                         |
| **No hyphens in property keys**        | `{'event-type': ...}` is rejected.                                                         |
| **Values are strings or numbers only** | No booleans, objects, or arrays as values.                                                 |
| **Default type is string**             | A key with no type suffix is treated as a **string** — passing a number to it is rejected. |
| **`_str` suffix → string**             | A key ending in `_str` is validated as a string.                                           |
| **`_real` suffix → number**            | A key ending in `_real` is validated as a (finite) number.                                 |
| **Numbers must be finite**             | `Infinity` and `NaN` are rejected.                                                         |

#### The `_str` / `_real` convention

This is the part teams most often miss: because the **default value type is string**, you must use the **`_real` suffix** to send a number.

```javascript
// ✅ VALID
window.FUS.event('purchase', { amount_real: 99.99, product: 'Widget' });
window.FUS.event('login', { username_str: 'john' });

// ⛔ INVALID
window.FUS.event('user-action', {});            // hyphen in event name (and empty data)
window.FUS.event('action', { 'event-type': 'click' }); // hyphen in a key
window.FUS.event('action', {});                  // empty eventData
window.FUS.event('action', []);                  // eventData is an array
window.FUS.event('purchase', { amount: 99.99 }); // number sent to a string-typed key — use amount_real
```

In that last example, `amount` has no suffix, so FullSession expects a string and rejects the number — the error even suggests using `amount_real`. Switching to `amount_real: 99.99` makes it valid.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FSEZOX8s87eaWWFli3x2m%2Fimage.png?alt=media&amp;token=0e0cf97c-739a-4816-8b50-a14ca9f7e5a0" alt="FullSession player events list showing a custom &#x22;purchase&#x22; event with captured properties such as amount_real and product."><figcaption></figcaption></figure></div>

#### Naming events well

Your event names appear across the player, funnels, segments, and dashboards, so name them deliberately:

* Use **clear, human names** — `purchase`, `plan_upgraded`, `search_performed`.
* Use a **consistent style** (and remember: **underscores, never hyphens**).
* **Don't rename** an event after collecting data — it splits your history.
* Keep a **shared list** of event names so teammates reuse rather than duplicate them.

#### What custom events unlock

Once events are flowing, you can:

* See them in the **session player** events list (\[Chapter 6]).
* Build **funnels** from them (\[Chapter 12 — Funnels]).
* Define **segments** around them (\[Chapter 11 — Segments]).
* Chart them as **insight cards** (\[Chapter 10 — Insights & Cards]).

> **The big picture** — **page recording rules** decide which pages record (literal paths, with ignore-params and include-sub-paths, switched between exclude-list and allowlist modes); **element recording rules** mask or exclude sensitive elements, with an AI-powered **Suggest Rules** feature to help discover which ones need covering; **Named Elements and Watch Rules** (CSS selectors, no visual picker) decide which elements you measure in heatmaps and funnels; and **custom events** — sent only via `FUS.event` with the `_str`/`_real`, no-hyphen, non-empty rules — translate your interactions into business actions.

***

> **Next up:** \[Chapter 8 — Heatmaps] takes the Named Elements and Watch Rules you configured here and visualizes them in aggregate — showing where visitors click, how far they scroll, and which tracked elements draw the most interaction.


# 8. Heatmaps

A single session shows you what *one* person did. A **heatmap** aggregates many sessions into one color-coded picture of behavior on a page — where people click, how their cursor moves, and how far they scroll. In FullSession, a heatmap is a **saved configuration** you build for a specific page, audience, and device, and it's rendered as an overlay on a real snapshot of your page.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FZTwNSHhoqUt1CuWwzOQ3%2Fimage.png?alt=media&amp;token=4dc9189e-1469-4e13-ba58-308b1b2ac99e" alt="FullSession Click Map overlay showing click activity on a captured page snapshot with areas of higher visitor interaction."><figcaption></figcaption></figure>

***

### 8.1 How Heatmaps Work

#### The three map types

FullSession offers three heatmap types, switched with a toggle at the top of the heatmap view:

| Type         | Button           | Shows                                   |
| ------------ | ---------------- | --------------------------------------- |
| **Click**    | **Clicks Map**   | Where visitors clicked or tapped        |
| **Movement** | **Movement Map** | Where the mouse/cursor moved            |
| **Scroll**   | **Scroll Map**   | How far down the page visitors scrolled |

#### Rendered on a real snapshot

A FullSession heatmap isn't drawn on a generic screenshot. When you build one, FullSession:

1. Finds **sessions that match your filters** (page, segment, device, date, minimum page duration).
2. Picks a **representative session** — typically the one with the most scroll depth (or the longest visit) on that page.
3. Captures that session's **full DOM snapshot** (the actual page, with its real styles and structure).
4. **Overlays** the aggregated heatmap data on top of that snapshot inside a scaled iframe.

Because the overlay sits on a genuine snapshot of your page, the hotspots line up with the real layout your visitors saw. You can swap to a different representative snapshot at any time with **Update Snapshot** (section 8.7).

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FI709ce2xXuNWRIobcSiq%2Fimage.png?alt=media&amp;token=72183a4c-5ab7-4138-94d6-801ebd4ad50f" alt="FullSession heatmap showing an interaction overlay on a captured DOM snapshot with click hotspots aligned to the actual page elements."><figcaption></figcaption></figure>

#### Creating a heatmap

1. Go to **Heatmaps** and create a new heatmap.
2. Choose the **page**:
   * **Page** — pick from your site's known pages, or
   * **URL** — enter a URL pattern (supports a `*` wildcard for matching variations).
3. Set the **filters** — segment, device, date range, minimum page duration, and optionally a **funnel** (section 8.6).
4. FullSession renders the map. Switch between **Clicks**, **Movement**, and **Scroll** as needed.
5. **Save** it so you (and your team) can return to it later (section 8.7).

> **Tip** — heatmaps draw from your **recorded sessions**. A brand-new page with little traffic will produce a sparse map; give it time to collect visits, or widen the date range.

***

### 8.2 Click Map

The **Clicks Map** overlays your page with a heat visualization of where visitors clicked or tapped — the warmer the area, the more interaction it received.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FYzZHrrSZMusryWo1Updv%2Fimage.png?alt=media&amp;token=37b1fab2-abac-4c77-bd74-ebf961ef11f5" alt="FullSession Clicks Map showing a heat overlay that highlights the most-clicked areas of the page."><figcaption></figcaption></figure>

Switching to **Rage Clicks**, **Error Clicks**, or **Dead Clicks** turns the click map into a **frustration map** — instantly showing *which parts of the page* are causing problems, not just where people click.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F10CB465bPt7uYNZTkCIQ%2Fimage.png?alt=media&amp;token=8e9879d1-9552-4bf1-a7b5-c8a2f874789b" alt="FullSession Click Map switched to Rage Clicks view showing areas where repeated frustrated clicks are concentrated."><figcaption></figcaption></figure>

#### Page statistics

Alongside the map, a statistics panel summarizes the page's health and traffic for your filters, including:

* **Total views** and **unique users**
* **Average time on page** and **average load time**
* Totals for **Rage**, **Error**, and **Dead** clicks

This gives you the headline numbers behind the visualization at a glance.

> **Finding frustration by element** — to see *which specific elements* receive the most rage/dead/error clicks (ranked, with counts), use the **Top Elements report** in section 8.5. FullSession does not have a separate "raging elements" page; that data lives in the click-map element report.

***

### 8.3 Movement Map

The **Movement Map** visualizes where visitors moved their **mouse/cursor** across the page. Because cursor movement often tracks where people are looking and reading, it's a useful proxy for attention on desktop.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FWZEaDYJavY19xu3OqPsW%2Fimage.png?alt=media&amp;token=ff87d560-82b7-45fc-a8eb-45bfa06ea78f" alt="FullSession Movement Map showing cursor activity trails and areas where visitors spent the most time."><figcaption></figcaption></figure>

#### What it reveals

* **Areas of attention** — sustained cursor presence often indicates where visitors focused.
* **Reading patterns** — movement can hint at how people scan a layout.
* **Ignored regions** — cold areas suggest content visitors never engaged with.

> **Movement is cursor movement, not hover-only.** The Movement Map shows where the pointer traveled across the page; it's most meaningful for desktop sessions, where a mouse is in play. On touch devices, interaction is better understood through the Clicks Map (taps are captured as clicks).

***

### 8.4 Scroll Map

The **Scroll Map** shows how far down the page visitors actually scrolled — answering the single most important question about any long page: *how much of it does anyone see?*

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FgAuEaEmwweAGezoeGtun%2Fimage.png?alt=media&amp;token=76d1bafb-3a3d-417c-a5d9-986983e89df8" alt="FullSession Scroll Map showing scroll depth distribution with page areas highlighted by visitor engagement and percentile markers."><figcaption></figcaption></figure></div>

#### What it shows

The scroll map colors the page from top to bottom by what share of visitors reached each depth, and it marks several reference lines:

| Marker             | Meaning                                                                 |
| ------------------ | ----------------------------------------------------------------------- |
| **Average Fold**   | The average scroll depth visitors reached (e.g. *"Average Fold 450px"*) |
| **25% percentile** | 25% of visitors scrolled at least this far                              |
| **50% percentile** | The median scroll depth — half of visitors reached this point           |
| **75% percentile** | 75% of visitors scrolled at least this far                              |

#### Reading the scroll map

* If your key message or CTA sits **below the average fold**, most visitors never see it without scrolling.
* The gap between the **25%** and **75%** lines shows how *consistent* scrolling is — a tight band means most visitors behave similarly; a wide band means behavior varies.
* A steep fall-off near a percentile line tells you where visitors tend to stop.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FV2i1PWcbKiM3ztHcBD0i%2Fimage.png?alt=media&amp;token=9247ece0-b03f-48d9-a200-984ff8084978" alt="FullSession Scroll Map showing fold and percentile markers on a long page, highlighting visitor reach and scroll depth."><figcaption></figcaption></figure></div>

> **Tip** — pair the Scroll Map with the Clicks Map. If an important button is below the average fold *and* getting few clicks, the fix is usually placement: move it up.

***

### 8.5 Top Elements & the Element Report

Beyond the visual overlay, the Clicks Map includes a **Top Elements report** — a ranked list of the page's most-interacted elements, with detailed metrics. This is where heatmaps connect to the **Named Elements** and **Watch Rules** from \[Chapter 7 — Recording Rules & Element Tracking].

<div align="left" data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FrcIwBCKyA2fs8aTw3WXy%2Fimage.png?alt=media&amp;token=728d0e6d-8f2e-485a-b988-a0e08e875a94" alt="FullSession Top Elements report showing ranked elements by interaction with click metrics, user metrics, labels, and view session actions." width="373"><figcaption></figcaption></figure></div>

#### What each element shows

For every ranked element, the report displays its **CSS selector** (copyable) and metrics including:

* **Total clicks**, with the **percentage of sessions** that clicked it
* **Users who clicked**, with the **percentage of unique users**
* Per-element frustration counts — **rage**, **error**, and **dead** clicks
* Interaction detail such as **hover-to-click** counts and **average hover time**

The ranking follows whichever aggregation is selected — choose **Rage Clicks**, for example, and the list re-ranks to show the elements causing the most frustration first.

#### Funnel conversion per element

When the heatmap is linked to a **funnel** (set in the heatmap's configuration — see section 8.6), the Top Elements report gains three additional columns for each element:

| Metric                     | Meaning                                                             |
| -------------------------- | ------------------------------------------------------------------- |
| **Funnel finished**        | Sessions that interacted with this element and completed the funnel |
| **Funnel total**           | Sessions that interacted with this element                          |
| **Funnel conversion rate** | The share of those sessions that went on to finish the funnel       |

This answers *"which elements on this page are most — or least — associated with users completing the funnel?"* without any cross-referencing. Elements with fewer than twelve clicks are excluded from this view to avoid noisy percentages.

#### Actions on each element

| Action            | What it does                                                                                                      |
| ----------------- | ----------------------------------------------------------------------------------------------------------------- |
| **Label**         | Give the element a human-readable name (creates a **Named Element**) so it appears clearly in reports and funnels |
| **View Sessions** | Jump to the sessions where visitors interacted with this element                                                  |

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F4P4fZPYPrLFKClrqgLFt%2Fimage.png?alt=media&amp;token=ac73ac4a-5aaa-46e9-abf3-1126393a6002" alt="FullSession element labeling view showing a raw selector converted into a named element for clearer reports and funnels."><figcaption></figcaption></figure>

#### Picking elements directly on the heatmap

The element report includes an **Element Selector** mode that lets you pick elements **directly on the heatmap** to track — creating or updating a **Watch Rule** (\[Chapter 7, section 7.4]) without hand-writing a selector. This is the most convenient way to start tracking a specific element.

There's also a **Hidden Elements** toggle to show or hide elements that are no longer present or visible in the captured snapshot — useful when reconciling a heatmap against a page that has since changed.

#### Per-element details

Clicking an element on the map opens a detail popup with its full stats — number of clicks and hovers, unique-session clicks, visitor click rate, hover-to-click rate, average hover time, and timing metrics — so you can analyze one element in depth.

> **Tip** — use **View Sessions** on a high-frustration element to watch real recordings of people struggling with it, then confirm the cause before filing a fix.

***

### 8.6 Filtering, Segments & Device Views

A heatmap of *all* visitors is useful, but the real insight comes from scoping it. FullSession heatmaps support a specific set of filters, applied when you configure the heatmap.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FYdcwch4N3wyYfxYHyYwm%2Fimage.png?alt=media&amp;token=cab63d61-ced8-4704-9d78-14053f1b0e57" alt="FullSession heatmap configuration filters showing options for page or URL, segment, device, date range, and minimum page duration."><figcaption></figcaption></figure></div>

#### Direct heatmap filters

| Filter                    | Use it for                                                                                                |
| ------------------------- | --------------------------------------------------------------------------------------------------------- |
| **Page / URL**            | The page to analyze — a known page or a URL pattern (with `*` wildcard)                                   |
| **Segment**               | The audience to focus on (\[Chapter 11 — Segments])                                                       |
| **Device**                | Desktop, Tablet, or Mobile (see below)                                                                    |
| **Date range**            | A relative preset or a custom start/end window                                                            |
| **Minimum page duration** | Excludes very short, bounce-like visits (helps filter out noise)                                          |
| **Funnel** (optional)     | Link to a funnel to show per-element conversion data in the Top Elements report (\[Chapter 12 — Funnels]) |

#### Filtering by audience uses Segments

> Heatmaps don't have direct filters for **country**, **traffic source**, **new vs. returning**, **browser**, or **OS**. To narrow a heatmap by any of those, build a **Segment** with those conditions and select it as the heatmap's segment. Segments are FullSession's reusable audience definitions — see \[Chapter 11 — Segments].

#### Device views

Switch the heatmap between three device renderings, each with its own viewport size:

| Device      | Viewport    |
| ----------- | ----------- |
| **Desktop** | 1920 × 1080 |
| **Tablet**  | 768 × 1024  |
| **Mobile**  | 412 × 915   |

The snapshot and overlay are scaled to fit your screen while preserving the page's responsive layout. Always review **desktop and mobile separately** — the same page often behaves very differently across viewports, and a CTA that's a hotspot on desktop can be missed entirely on mobile.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FkxsSB2IS9cKFQsUQg2Go%2Fimage.png?alt=media&amp;token=5953b2b0-8269-4c8c-8049-1d0a97f6ed85" alt="FullSession Mobile heatmap showing the same page with interaction patterns adjusted for the mobile layout."><figcaption></figcaption></figure></div>

#### Comparing segments

> There's **no built-in side-by-side segment comparison** in a single heatmap. To compare two audiences, create **two saved heatmaps** for the same page — one per segment — and view them side by side. (See section 8.7 for saving and duplicating.)

***

### 8.7 Saving, Managing & Updating Heatmaps

Because heatmaps are configured artifacts, FullSession keeps a managed library of them per site.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FwQqSom7wuSV5jjGAFRh9%2Fimage.png?alt=media&amp;token=8b7a330d-674b-4412-af4e-26266ba2cfbe" alt="FullSession heatmap list showing saved heatmaps with name, URL, creator, date, and management actions."><figcaption></figcaption></figure></div>

#### The heatmap library

Your saved heatmaps appear in a list showing each one's **name, URL, creator, and date**. From here you can **edit**, **duplicate**, or **delete** a heatmap, and search by title, URL, or creator. This makes it easy to maintain a standing set of heatmaps for the pages you watch most.

#### Saving and duplicating

* **Save** — update the current heatmap's configuration.
* **Save As** — create a copy under a new title (handy for spinning up a segment- or device-specific variant).
* **Duplicate** — one-click copy from the list.

Duplicating is the practical way to build the **two-heatmap comparison** described in section 8.6 — duplicate a heatmap, change the segment or device, and view both.

#### Update Snapshot

The map is drawn on one representative session's snapshot. If that snapshot doesn't represent the page well (or the page has changed), click **Update Snapshot** to re-pick a different representative session and re-render the overlay.

<div align="left" data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F7GCD4w9elpTlrKwOPXHj%2Fimage.png?alt=media&amp;token=732cb4ae-fbdb-4f29-a13c-bf05e5aeb0c9" alt="FullSession Update Snapshot feature showing a new representative session snapshot selection when the current snapshot is outdated or not suitable."><figcaption></figcaption></figure></div>

#### Heatmaps in the session player

Heatmaps are also reachable from the **session player**: the player offers a **Session Replay / HeatMaps** tab pair (\[Chapter 6, section 6.1]), so you can flip from watching one visitor to seeing the aggregate heat for that page.

#### Exporting

> **Heatmap export is not yet available.** A download option is marked **coming soon**. For now, share findings by saving the heatmap (so teammates can open it directly) or by capturing your own screenshot.

> **The big picture** — FullSession heatmaps are saved configurations rendered over a real page snapshot, in three flavors (**Clicks**, **Movement**, **Scroll**). The Click Map doubles as a frustration map via its **Rage / Error / Dead** aggregations, and the **Top Elements report** ranks the exact elements driving interaction and frustration — with one click to label them or watch the sessions behind them. Link a **funnel** to a heatmap to see per-element conversion rates alongside click metrics. Scope by device, date, page-duration, and **Segment** (for geo/source/returning audiences), and manage everything from the heatmap library. There's no separate raging-elements page, no segment-comparison view, and export is still coming.

***

> **Next up:** \[Chapter 9 — Dashboards] zooms out from individual pages to your whole product, assembling session metrics, heatmap insights, and custom events into shareable dashboards.


# 9. Dashboards

Sessions, heatmaps, and funnels each answer a specific question. **Dashboards** bring the answers together — a customizable grid of **cards** (charts, metrics, and lists) that tells you how your product is doing at a glance. This chapter covers the prebuilt templates, building and configuring your own cards, scoping a dashboard with filters and segments, and getting data out.

> Dashboards and Charts, including the five prebuilt role-based templates (section 9.2), are available from the **Pro** plan (\[Chapter 17, section 17.1]).

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Fu2VSjMMGpOQ3406vDkIZ%2Fimage.png?alt=media&amp;token=00409463-78c1-4176-a03a-96af9f33f862" alt="FullSession dashboard showing a drag-and-drop layout of cards summarizing sessions, engagement, errors, and feedback."><figcaption></figcaption></figure>

***

### 9.1 Dashboards Overview

A **dashboard** is a page made of **cards** arranged on a grid. Each card visualizes one piece of your data — a metric, a trend, a breakdown, a list of sessions — and together they give you a tailored picture.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F0Xzrf54VlD7IusXlMaqB%2Fimage.png?alt=media&amp;token=5df718b3-86de-4a84-9f8b-c7994538a4a6" alt="FullSession Dashboards list showing dashboards with owner, visibility settings, and an option to set a default dashboard."><figcaption></figcaption></figure></div>

#### The dashboard list

Your dashboards are listed with their **name, owner, and visibility** (private or team). From here you can open, edit, archive, or delete them, and **set one as your default** so it opens automatically for you (you can have one default per site).

#### Cards and the card library

Cards aren't locked to a single dashboard. When you build a card it's stored in your **card library**, and the same card can be added to **multiple dashboards**. A card's visibility can be **personal** (only you) or **team** (everyone), just like dashboards themselves. To browse and manage the full card library independently of any dashboard, use the [**Charts**](/dashboards/charts) page.

#### Refreshing

Dashboards don't auto-refresh in real time. Use **Refresh All** to reload every card, or refresh an individual card from its menu. (There is no live/auto-updating mode.)

#### Drilling from dashboard to detail

Dashboards are a starting point, not a dead end. **Table-based cards** (Breakdown and Pages) let you click a row to **Add to Filter** or **View Sessions** — jumping from a summary number into the real recordings behind it (section 9.7).

> **Note** — clicking an individual *point* on a line or bar chart does **not** drill in. Drill-in actions are available on **table rows** (Breakdown and Pages cards).

***

### 9.2 Prebuilt Templates

You don't have to start from a blank page. FullSession ships with **five role-based dashboard templates**, each pre-built with relevant cards. Pick the one that matches your role and you'll have a useful dashboard in seconds.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FExLCqTjo254Q6Hm9VKaC%2Fimage.png?alt=media&amp;token=10483141-faea-4e53-9d34-f1130cc91a4c" alt="FullSession dashboard templates showing five role-based starting dashboards that can be used to create a populated copy."><figcaption></figcaption></figure></div>

#### The available templates

| Template                   | Built for                                 |
| -------------------------- | ----------------------------------------- |
| **Growth / CRO / RevOps**  | Conversion, growth, and revenue teams     |
| **Product Management**     | Product teams tracking usage and adoption |
| **Engineering / QA / SRE** | Developers, QA, and reliability engineers |
| **Executive Overview**     | Leadership wanting high-level KPIs        |
| **CS / Digital Ops**       | Customer success and digital operations   |

#### Using a template

Creating from a template requires the **create dashboards** permission. Click a template card and FullSession creates a **new dashboard pre-filled with that template's cards**, populated with your live data. From there you can freely add, remove, rearrange, and reconfigure cards (sections 9.4–9.6) — the template is just a fast starting point.

> **Tip** — start from the template closest to your role, then trim and tweak. It's almost always faster than building from blank.

***

### 9.3 Creating & Managing Dashboards

#### Creating a dashboard

1. Click **Add Dashboard**.
2. Fill in:
   * **Name** *(required, up to 100 characters)*.
   * **Description** *(optional, up to 240 characters)*.
   * **Private** — check *"Private (visible only to you)"* to keep it to yourself, or leave it unchecked to make it visible to your whole team.
3. Create the dashboard — it opens ready for you to add cards.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Fv3gVhOlFH7M8zKWs3LAA%2Fimage.png?alt=media&amp;token=b43e406e-9f4c-4e52-a44e-70d6565cce60" alt="FullSession create dashboard dialog showing fields for dashboard name, description, and the Private toggle." width="563"><figcaption></figcaption></figure></div>

#### Editing, archiving, and deleting

| Action             | What it does                                                                             |
| ------------------ | ---------------------------------------------------------------------------------------- |
| **Edit**           | Change the name, description, or visibility                                              |
| **Set as default** | Make this the dashboard that opens first for you (one default per site)                  |
| **Archive**        | Hide the dashboard from the main list without deleting it; an admin can restore it later |
| **Delete**         | Permanently remove the dashboard (with a confirmation prompt)                            |

These actions are governed by permissions — editing requires the **edit** permission, deleting requires the **delete** permission (section 9.8).

> **No "duplicate dashboard."** FullSession doesn't copy a whole dashboard in one click. Because **cards are reusable across dashboards** (section 9.1), the practical approach is to create a new dashboard and add the existing cards you want to it. (Archiving, not duplication, is how you set a dashboard aside.)

***

### 9.4 Cards: Adding & Arranging

Dashboards are built on a **drag-and-drop grid**, so composing one is fast and visual.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FAAhpHhJovGxkOEKLZUmR%2Fimage.png?alt=media&amp;token=620deba5-f3b5-4ed5-8f8c-2bde33d8a0f1" alt="FullSession dashboard edit mode showing cards that can be dragged, resized, and removed from the grid layout."><figcaption></figcaption></figure>

#### Adding cards

1. Click **Add charts**.
2. Choose from the **card library** — your existing cards plus any available template cards — or build a new card (section 9.5).
3. The card is placed on the grid, populated with live data.

#### Arranging the grid

The grid is fully malleable:

* **Drag** a card to move it.
* **Resize** by dragging its edges — make key cards larger, supporting ones smaller.
* **Remove** a card from the dashboard via its menu (with confirmation).
* **Enlarge** any card to a full-screen view for a closer look.

Layout changes are saved automatically.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Fp7uOyiVFkcB1XvDh2zg4%2Fimage.png?alt=media&amp;token=97d31236-9923-4020-a228-2160ff058858" alt="FullSession dashboard showing an enlarged card view for detailed analysis of sessions or user journey data."><figcaption></figcaption></figure>

#### Layout best practices

* **Most important, top-left** — put the headline metric where the eye lands first.
* **Group related cards** — keep error cards together, funnel cards together.
* **Size by importance** — give a critical KPI a larger tile.
* **Don't overcrowd** — if it feels cramped, split into a second dashboard.

***

### 9.5 Card Types

FullSession offers a focused set of card types, each suited to a different question.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FL4VyAauwdtoKV2ymPGOV%2Fimage.png?alt=media&amp;token=1021515c-a977-4fb7-bc04-0a9a35bb9fb5" alt="FullSession card-type chooser showing available dashboard cards: Metric, Time Series, Breakdown, Pages, Sessions, Feedback, and User Journey."><figcaption></figcaption></figure></div>

| Card type        | Shows                                                               | Typical use                            |
| ---------------- | ------------------------------------------------------------------- | -------------------------------------- |
| **Metric**       | A single KPI value, optionally compared to the previous period      | "Total sessions, +12% vs. last period" |
| **Time Series**  | A metric over time                                                  | Spotting trends and spikes             |
| **Breakdown**    | A metric distributed across a category, as a **bar chart or table** | Sessions by device, country, browser   |
| **Pages**        | Top pages by views or load time, with a link to the heatmap         | Finding your busiest or slowest pages  |
| **Sessions**     | A browsable, replayable list of sessions matching filters           | Jumping straight into recordings       |
| **Feedback**     | Feedback sentiment over time                                        | Tracking CSAT and survey responses     |
| **User Journey** | How visitors flow through pages, as a **Sankey** diagram            | Understanding common paths             |
| **Label**        | A text block                                                        | Headings and notes on the dashboard    |

> **Visualizations are line, area, column, bar, and spline** (powered by Highcharts). There are **no pie/donut charts** and **no goal/gauge** cards — comparisons are expressed through the Metric card's previous-period option and through breakdowns.

Templates may also include specialized widgets such as **funnel** cards, **sessions-review** tiles (Worth Watching / Recent / Flagged), and small **trend sparklines** (Sessions, Friction Rate, Feedback, Errors). The eight types above are the ones you build directly in the card builder.

***

### 9.6 Configuring a Card

When you create or edit a card, the **card builder** lets you define exactly what it measures and how it looks, with a **live preview** that updates as you go.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Frvu07NGO0v5FdlOI1zMk%2Fimage.png?alt=media&amp;token=60475fca-7d13-440b-95be-e946b93cefb1" alt="FullSession card builder showing options to select a measure, aggregation, grouping, and visualization with a live preview."><figcaption></figcaption></figure></div>

#### Choose a measure

Pick what the card counts. Available measures include:

| Group                | Measures                                                          |
| -------------------- | ----------------------------------------------------------------- |
| **Volume**           | Total Sessions, Total Events, Unique Users, Identified, Anonymous |
| **Engagement**       | Active Time, Duration, Pages Viewed                               |
| **Interaction**      | Clicks, Rage Clicks, Dead Clicks, Error Clicks                    |
| **Errors**           | Error Sessions, Response Errors                                   |
| **Forms & Feedback** | Abandoned Forms, Total Feedbacks, Answered Feedbacks              |

#### Choose an aggregation

For numeric measures, pick how values are combined: **sum, average, median, min, or max**.

#### Group by (breakdown)

Break a metric down by a dimension, such as:

**device, browser, operating system, country / region / city, landing page, exit page, referrer, page, user ID, screen size**, error categories (error logs, uncaught exceptions, unhandled rejections, response errors), or click **text / selector**.

#### Time interval (Time Series)

For time-series cards, choose the bucket: **hour, day, week, or month**.

#### Series & comparison

* A card can have **up to five series**, so you can compare multiple filtered slices on one chart (e.g. mobile vs. desktop sessions).
* The **Metric** card can show **one to four measures** at once, and can display a **previous-period comparison** so a number arrives with context ("+12%").

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F9Qgd8wmc83TxR6r0AGu9%2Fimage.png?alt=media&amp;token=74160213-d520-4dd0-a775-bf1493e91d62" alt="FullSession Time Series card showing two data series (mobile and desktop sessions) plotted together for comparison over time."><figcaption></figcaption></figure></div>

#### Per-card options

Some card types have their own settings:

| Card             | Options                                                                                                           |
| ---------------- | ----------------------------------------------------------------------------------------------------------------- |
| **Pages**        | Page type (visited / landing / exit), order by most-viewed or slowest, and show percent / views / heatmap columns |
| **Breakdown**    | Bar or table shape, show percentage, show heatmap, and group everything beyond the top 5 as "Others"              |
| **Sessions**     | Show a live **sessions** list or only **pinned** (flagged) sessions                                               |
| **Feedback**     | Overview or trends, optionally scoped to a single feedback form                                                   |
| **User Journey** | Max steps and top nodes per step                                                                                  |

> **Tip** — build the card, watch the **live preview**, and confirm the number looks right before saving. If it's off, your measure, aggregation, or filter is usually the cause.

***

### 9.7 Filters, Segments & Drill-in

#### Scoping a dashboard

Rather than a single global date picker, dashboards use a **shared filter/segment bar** that applies across all cards. You can:

* Apply **filters** to the whole dashboard, or
* **Connect the dashboard to a Segment**, so that segment's definition scopes every card on the page.

When a segment is connected, all cards reflect that audience — for example, a dashboard connected to a "Mobile Users" segment shows every card for mobile visitors only. Build the segment once (\[Chapter 11 — Segments]) and the whole dashboard inherits it.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F0NZqkRAlbms9zbFEhQgC%2Fimage.png?alt=media&amp;token=62bcd2aa-c650-4f90-947b-ddeb41b4ed71" alt="FullSession dashboard filter showing a connection to the &#x22;Pro-plan customers&#x22; segment, with all cards recalculated for the selected audience."><figcaption></figcaption></figure>

> Date scoping is handled through the filter/segment bar rather than a dedicated dashboard-level date field.

#### Drilling into sessions

The **Breakdown** and **Pages** cards are tables, and each row offers two actions:

| Action            | What it does                                                                                        |
| ----------------- | --------------------------------------------------------------------------------------------------- |
| **Add to Filter** | Adds that row's value (e.g. a country or page URL) to the dashboard's filters, narrowing every card |
| **View Sessions** | Opens the sessions that match that row, so you can watch the real recordings behind the number      |

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FSHeXD28xAzKZzlneir2f%2Fimage.png?alt=media&amp;token=531224d5-08d9-4a38-a653-5cc4efd7e507" alt="FullSession Breakdown card showing a &#x22;View Sessions&#x22; action that opens the recordings matching the selected row, such as sessions from a specific country."><figcaption></figcaption></figure>

This is what keeps a FullSession dashboard from being a static report: a surprising number in a table is always one click away from the sessions that explain it.

***

### 9.8 Export, Sharing & Permissions

#### Exporting a card to CSV

Each card (except the Label card) has a **download** action that exports its data as a **CSV**, named after the card. Exports are capped at **10,000 rows** — narrow your filters or date range for a focused set.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F1yq8mFABuc0rKkgF3XUG%2Fimage.png?alt=media&amp;token=e0b0ec07-4a82-4003-91ad-779f12e14e63" alt="FullSession dashboard card export showing a CSV download named after the card and containing the current filters and data view."><figcaption></figcaption></figure>

> CSV is the only export format — there is **no PDF, image, or scheduled email-report** export. The CSV contains the card's underlying data, not the visualization.

#### Sharing: private vs. team

Dashboard (and card) visibility is a simple, two-level choice:

| Visibility  | Who sees it          |
| ----------- | -------------------- |
| **Private** | Only you             |
| **Team**    | Everyone on the site |

A team dashboard means everyone works from the **same view of the truth**. (There is no finer-grained "share with specific people or roles" — visibility is private or team.)

#### Permissions

What each teammate can do with dashboards is governed by permission keys assigned to their role (\[Chapter 16 — Team & Account Management]):

| Permission                 | Allows                                          |
| -------------------------- | ----------------------------------------------- |
| **View charts**            | Browse the card library and view cards          |
| **Create dashboards**      | Add dashboards and use templates                |
| **Edit dashboards**        | Change name, description, and visibility        |
| **Delete dashboards**      | Remove dashboards                               |
| **Edit dashboards layout** | Add cards to or rearrange a dashboard grid      |
| **Create charts**          | Build new chart cards                           |
| **Edit charts**            | Modify existing chart cards                     |
| **Delete charts**          | Permanently remove chart cards from the library |

If you don't see an action described here, your role may not include the corresponding permission.

> **The big picture** — start from one of the **five role-based templates** or a blank dashboard; build cards (Metric, Time Series, Breakdown, Pages, Sessions, Feedback, User Journey) in a live-preview **card builder** with rich measures, aggregations, and breakdowns; arrange them on a drag-and-drop grid; scope the whole dashboard with **filters or a connected segment**; drill from **table rows** into real sessions; export cards to **CSV**; and share **private or team-wide**. There's no dashboard duplication, no pie charts, no chart-point drill-down, and no scheduled reports.

***

> **Next up:** \[Chapter 10 — Insights & Cards] goes deeper into the individual cards — the measures, breakdowns, and comparisons that make each one — and how to read the page and engagement statistics FullSession computes automatically.


# Charts

The **Charts** page is a standalone library for building and managing reusable chart cards. Every chart created here is stored in your card library and can be added to any dashboard — use this page to browse, create, and maintain those cards without opening a specific dashboard.

Access **Charts** from the sidebar. Requires the `charts:view` permission and the dynamic-dashboards feature, available from the **Pro** plan (\[Chapter 17, section 17.1]).

***

### What is a Chart?

In FullSession, a **chart** is a reusable card — the same kind of widget you build in the dashboard card builder ([Chapter 9, section 9.6](/dashboards)). Charts created on this page appear in the **Add charts** panel when composing a dashboard, so you can reuse the same chart across as many dashboards as you like.

***

### The Charts List

The main view is a searchable, paginated table of all charts on your site.

| Column      | Shows                                                        |
| ----------- | ------------------------------------------------------------ |
| **Name**    | Chart title, optional description, and a chart-type icon     |
| **Type**    | Card type — Metric, Time Series, Breakdown, Pages, and so on |
| **Owner**   | Email of the team member who created the chart               |
| **Updated** | Date the chart was last modified                             |

Click any row to open that chart in the builder and edit it.

#### Searching

Type in the **Search by chart name** field above the table to filter the list in real time.

***

### Creating a Chart

#### From a template

A strip of **template cards** at the top of the page lets you start with a chart type already selected. Click a template to open the chart builder with that type pre-filled.

#### From scratch

Click **Create Chart** (top-right) to open the builder with a blank configuration.

The builder is the same one used inside Dashboards ([Chapter 9, section 9.6](/dashboards)) — choose a measure, aggregation, group-by dimension, visualization, and up to five filtered series, with a live preview that updates as you configure.

***

### Editing a Chart

Click any row in the table to open the chart builder in **edit mode**. Saving updates the chart everywhere it is used — dashboards that already include the chart reflect the change immediately.

***

### Deleting a Chart

Open the row's actions menu (⋮) and choose **Delete**. A confirmation dialog warns that the chart will be permanently removed and detached from every dashboard currently using it.

> **This action cannot be undone.**

***

### Previewing a Chart

Click the eye icon on a row to open a read-only preview without entering edit mode.

***

### Permissions

| Permission      | Allows                                  |
| --------------- | --------------------------------------- |
| `charts:view`   | Access the Charts page and see the list |
| `charts:create` | Create new charts and use templates     |
| `charts:edit`   | Edit existing charts                    |
| `charts:delete` | Delete charts                           |

Permissions are governed by your role ([Chapter 16, section 16.3](/team-account-management)). If you don't see the **Create Chart** button or the template strip, your role doesn't include `charts:create`.

***

> **See also:** [Chapter 9 — Dashboards](/dashboards) for how to add charts to a dashboard and arrange them on the grid, and [Chapter 10 — Page Statistics & Building Cards](/page-statistics-engagement-building-cards) for the full reference on measures, aggregations, and breakdowns.


# 10. Page Statistics, Engagement & Building Cards

This chapter is the **metrics and reference companion** to \[Chapter 9 — Dashboards]. It has two halves:

* **Part A — Automatic statistics:** the page and engagement metrics FullSession computes for you, what each one means, and where to find it.
* **Part B — A deeper card-building reference:** every measure, aggregation, breakdown, series filter, interval, and how values are formatted — so you can build a card to answer almost any question.

> **A note on terminology.** FullSession doesn't have a separate "Insights" section with its own card catalog. **Cards are dashboard cards** (stored in your reusable card library — \[Chapter 9, section 9.1]). This chapter explains the data and options behind them.

***

### Part A — Automatic Statistics

#### 10.1 Page Statistics

FullSession automatically computes a set of **page statistics** for any page, surfaced most prominently in the **page statistics panel** beside a heatmap (\[Chapter 8 — Heatmaps]) and in the **Pages** dashboard card.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FTCV3iJZB2F8bKQoWcIx6%2Fimage.png?alt=media&amp;token=b53a8b88-9d79-4ef8-941b-82aeb4dbf6da" alt="FullSession heatmap page statistics panel showing click totals, frustration signals, traffic metrics, and timing details alongside the heatmap."><figcaption></figcaption></figure></div>

#### The metrics

| Label                | What it measures                                               |
| -------------------- | -------------------------------------------------------------- |
| **Total**            | Total clicks on the page                                       |
| **Rage**             | Rage-click intervals on the page                               |
| **Error**            | Error clicks on the page                                       |
| **Dead**             | Dead clicks on the page                                        |
| **Total views**      | How much of your traffic this page received (shown as a share) |
| **Avg time on page** | Average time visitors spent on the page                        |
| **Avg load time**    | Average page load time                                         |
| **Users**            | Unique visitors who saw the page                               |

The frustration metrics (**Rage / Error / Dead**) sit right next to traffic and timing, so a page that's busy *and* frustrating stands out immediately.

#### The Pages card

On a dashboard, the **Pages** card (\[Chapter 9, section 9.5]) presents these statistics as a ranked table. You can:

* Choose the **page type** — visited pages, **landing** pages, or **exit** pages.
* Order by **most viewed** or **slowest** (by load time).
* Show **percentage**, **views**, and a **heatmap** link per row.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FMRLBxxnUAzFL2VeiHpnw%2Fimage.png?alt=media&amp;token=2c24e588-9e56-4a69-81b3-b2fc3f5a8fe8" alt="FullSession Pages card showing pages ordered by slowest performance with links to their corresponding heatmaps."><figcaption></figcaption></figure></div>

> **Note** — page statistics cover **clicks, frustration, views, time, load time, and users**. Scroll depth isn't part of this panel; it lives in the **Scroll Map** (\[Chapter 8, section 8.4]).

***

#### 10.2 Engagement Metrics & the Data Behind a Session

Every session FullSession records carries a rich set of **engagement fields**. These power the metrics you chart, the filters you build, and the frustration score you sort by.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FW84UFY0mvd15sEYbGscu%2Fimage.png?alt=media&amp;token=4b8f462a-3ea7-4f2b-a822-17f159592729" alt="FullSession session details view showing session metrics including duration, active time, visited pages, clicks, frustration signals, and page load time." width="405"><figcaption></figcaption></figure></div>

#### Session-level engagement fields

| Field                                        | Meaning                                           |
| -------------------------------------------- | ------------------------------------------------- |
| **Duration**                                 | Total length of the session                       |
| **Active time**                              | Time the visitor was actively engaged (not idle)  |
| **Pages visited**                            | Number of pages in the session                    |
| **Clicks**                                   | Total clicks                                      |
| **Rage clicks / Dead clicks / Error clicks** | Frustration-signal counts                         |
| **Thrashing periods**                        | Count of erratic "thrashing" cursor stretches     |
| **Abandoned forms ratio**                    | How much form abandonment occurred in the session |
| **Avg load time**                            | Average page load time across the session's pages |
| **Events count**                             | Number of events captured                         |
| **Landing / exit page**                      | Where the session began and ended                 |
| **Referrer**                                 | Where the visitor came from                       |
| **First session date**                       | When this visitor was first seen                  |

#### Per-page detail

Within a session, each page carries its own stats — the **page URL**, **time visited**, **time on page**, **load time**, **click count**, and **frustration clicks** — which is what makes the player's page stepper and the page statistics so precise (\[Chapter 6, section 6.5]).

#### In the player: session statistics

The session player surfaces two engagement readouts for the visit:

* **Average Time on Page**
* **Total Active Time on Pages**

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FMvLWVHd8S8RYBHYv2GVq%2Fimage.png?alt=media&amp;token=628a35e9-6477-45a5-ad96-38f53bd71123" alt="FullSession session player statistics panel showing average time on page and total active time for the session being replayed."><figcaption></figcaption></figure>

#### The frustration score

The **0–100 frustration score** you sort by in the Sessions list (\[Chapter 5, section 5.1]) is **computed on demand** from the session's frustration signals — it isn't a stored field. That's why it's available when you request it (e.g. in the Worth Watching view) and reflects the latest signal data.

***

#### 10.3 What FullSession Computes — and What It Doesn't

Knowing which metrics exist saves you from looking for ones that don't. Here's the honest picture.

#### Metrics that exist

| Metric                | How it's defined                                                                                                           |
| --------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| **Identified Users**  | Sessions where **at least one** of email, name, or username is present                                                     |
| **Anonymous Users**   | Sessions where **all** of email, name, and username are absent                                                             |
| **Pages per Session** | Number of pages visited per session                                                                                        |
| **Error Sessions**    | Sessions with **any** error signal — an error click, error log, uncaught exception, unhandled rejection, or response error |

#### Metrics that do *not* exist (and how to approximate them)

| Not available                  | What to do instead                                                                             |
| ------------------------------ | ---------------------------------------------------------------------------------------------- |
| **Bounce rate**                | Filter or break down by **Pages per Session** (e.g. sessions with 1 page)                      |
| **Exit rate**                  | Use the **Pages** card with page type **Exit Page**, or **group by Exit Page**                 |
| **New vs. returning visitors** | Filter by **First Seen** (first session date) — there's no dedicated returning-visitor measure |
| **Engagement rate**            | Build from **Active Time** / **Duration** measures directly                                    |
| **Conversion rate**            | Use **Funnels** (\[Chapter 12 — Funnels]) — conversion isn't a dashboard card measure          |
| **Sessions per user**          | Use a **Breakdown** card: measure **Total Sessions**, grouped by **User**                      |

> **Why this matters** — FullSession gives you the raw, accurate building blocks (active time, pages per session, identified/anonymous, error sessions) and lets you compose them, rather than shipping pre-baked "rates" that hide their definitions. The trade-off is that a few familiar web-analytics ratios must be approximated with the measures above.

***

### Part B — Card-Building Reference

#### 10.4 How a Card Is Built

Every dashboard card is assembled from the same parts in the **card builder** (\[Chapter 9, section 9.6]). Understanding these parts lets you build almost anything:

| Part              | Question it answers                                         |
| ----------------- | ----------------------------------------------------------- |
| **Measure**       | *What* are we counting? (sessions, clicks, duration…)       |
| **Aggregation**   | *How* do we combine numeric values? (sum, average…)         |
| **Group by**      | *Sliced by what?* (device, country, page…)                  |
| **Series**        | *Which filtered slices to compare?* (up to five)            |
| **Interval**      | *What time bucket?* (for time-series: hour/day/week/month)  |
| **Visualization** | *How is it drawn?* (line, area, column, bar, spline, table) |

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FlTGO68BN1I4DLI7WPsyP%2Fimage.png?alt=media&amp;token=77db02d6-6432-49a0-b8c0-5c6e7fd5efae" alt="FullSession card builder showing labeled configuration options for measure, aggregation, group-by, series, interval, and a live preview."><figcaption></figcaption></figure></div>

***

#### 10.5 Measures Reference

A **measure** is the value a card counts. The full set, with the labels you'll see in the builder:

| Label (in builder)        | Measures…                       | Type            |
| ------------------------- | ------------------------------- | --------------- |
| **Total Sessions**        | Sessions                        | Count           |
| **Total Events**          | Custom events                   | Count           |
| **Unique Users**          | Distinct visitors               | Count           |
| **Identified Users**      | Sessions with an identity       | Count           |
| **Anonymous Users**       | Sessions without an identity    | Count           |
| **Error Sessions**        | Sessions with any error signal  | Count           |
| **Active Time**           | Active engagement time          | Numeric         |
| **Duration**              | Session length                  | Numeric         |
| **Pages per Session**     | Pages visited per session       | Numeric         |
| **Number of Clicks**      | Clicks                          | Numeric (click) |
| **Rage Click Count**      | Rage clicks                     | Numeric (click) |
| **Dead Click Count**      | Dead clicks                     | Numeric (click) |
| **Error Clicks**          | Error clicks                    | Numeric (click) |
| **Total Feedbacks**       | Feedback submissions            | Count           |
| **Answered Feedbacks**    | Completed feedback responses    | Count           |
| **Total Response Errors** | Network/response errors         | Count           |
| **Abandoned Forms**       | Forms started but not submitted | Count           |

**Two kinds of measure:**

* **Numeric measures** (Active Time, Duration, Pages per Session, and the four click measures) can be **aggregated** — summed, averaged, etc. (section 10.6).
* **Count measures** (everything else) count matching sessions/items and don't take an aggregation.

> **Click measures** (Number of Clicks, Rage / Dead / Error Click Count) are available in click-oriented contexts. If you don't see them, switch the card to a click-based measure setup.

***

#### 10.6 Aggregations & Breakdowns

#### Aggregations

For **numeric** measures, choose how the values are combined:

| Aggregation | Result                            |
| ----------- | --------------------------------- |
| **Sum**     | Total of all values               |
| **Average** | Mean value                        |
| **Median**  | Middle value (robust to outliers) |
| **Minimum** | Lowest value                      |
| **Maximum** | Highest value                     |

> **Tip** — for time-based measures like Duration and Active Time, **Median** is often more honest than **Average**, because a few very long sessions can skew the mean.

#### Breakdowns (Group by)

A **group-by** dimension slices a measure into categories. The available dimensions:

| Group          | Dimensions                                                                                                                                  |
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| **Audience**   | User                                                                                                                                        |
| **Technology** | Browser, Browser Version, Device, Operating System, Screen Width, Screen Height (and the **Screen Resolution** combo, shown as `1920x1080`) |
| **Location**   | Country, Region, City                                                                                                                       |
| **Navigation** | Page, Landing Page, Exit Page, Referrer                                                                                                     |
| **Errors**     | Error Logs, Uncaught Exceptions, Unhandled Rejections, XHR Errors, Response Error Status / Method / URL                                     |
| **Clicks**     | Element Text, CSS Selector                                                                                                                  |

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FYvyGsRBZ5hdfDzLtQmqf%2Fimage.png?alt=media&amp;token=08342db9-d4a9-42ae-90b0-eb4f712996e3" alt="FullSession Breakdown card showing Total Sessions grouped by Country as a bar chart, with an option to switch to a table view."><figcaption></figcaption></figure></div>

**Combining dimensions:** session-level dimensions (device, country, browser, etc.) can be combined with page-level dimensions (page, landing/exit page). However, the **error-category breakdowns** (error logs, exceptions, response errors) must be used **on their own** — they can't be combined with other group-bys.

***

#### 10.7 Series, Filters, Intervals & Comparison

#### Series (comparing slices)

A single card can carry **up to five series**, and **each series has its own filter**. This is how you put related slices side by side on one chart — for example, one series filtered to *mobile* and another to *desktop*, plotting both together.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FuRUqfosoxX7YbM4bkO7X%2Fimage.png?alt=media&amp;token=25a6b948-b2f0-4d40-b409-1f1255c8f087" alt="FullSession Time Series card showing two separate filtered series — Mobile and Desktop sessions — plotted together on the same chart for comparison."><figcaption></figcaption></figure></div>

#### Filters

Series filters use the **same filtering system as the Sessions list** (\[Chapter 5, section 5.2]) — the same fields, the same operators (is / is not / contains / greater than / between…), and the same **AND / OR / NOT** grouping. Anything you can filter a session list by, you can scope a card series by.

#### Time intervals

For **Time Series** cards, choose the bucket the data is grouped into:

**hour · day · week · month**

#### Date range

A card's date range comes from the **dashboard's shared filter bar** (which can be "all time" or a custom window), applied to **every card on the dashboard**. There's **no per-card date override** — change the dashboard's range and all cards move together. Scope by audience using a **connected Segment** (\[Chapter 9, section 9.7]).

#### Previous-period comparison

The **Metric** card can show a **previous-period comparison** — the current value alongside the prior period and the change. This turns a bare number ("4,210 sessions") into a trend signal ("4,210, +12%"). It's the simplest way to give a KPI context.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FLq9O6uhFtKhd0ajB9Tla%2Fimage.png?alt=media&amp;token=0244e7c3-db2d-4602-a42f-887d2036765f" alt="FullSession Metric card showing the current value with a previous-period comparison and the change versus the prior date range."><figcaption></figcaption></figure></div>

***

#### 10.8 How Values Are Formatted

FullSession formats card values for readability, which is worth knowing so the numbers don't surprise you.

#### Durations become human-readable

**Active Time** and **Duration** are captured in milliseconds but displayed as human time:

| Underlying      | Displayed    |
| --------------- | ------------ |
| Under a minute  | `45s`        |
| Under an hour   | `2m 30s`     |
| An hour or more | `1h 15m 30s` |

#### Large counts are compacted

Counts (sessions, events, users, clicks…) are shown compactly:

| Range                 | Displayed        |
| --------------------- | ---------------- |
| 1,000–999,999         | `1.5k`           |
| 1,000,000–999,999,999 | `1.5M`           |
| 1,000,000,000+        | `1.5B`           |
| Under 1,000           | the plain number |

#### Unit labels

Where helpful, values carry a unit label — *Sessions*, *Events*, *Users*, *Clicks* — pluralized automatically (e.g. "1 Session" vs. "3 Sessions"). Duration values embed the unit in the value itself (the `m`/`s`/`h`), so they don't show a separate label.

> **The big picture** — FullSession computes accurate, well-defined **page statistics** (views, time, load time, clicks, frustration) and **engagement fields** (duration, active time, pages per session, frustration counts, identified/anonymous, error sessions), and exposes them through a **composable card builder**: pick a **measure**, optionally **aggregate** it, **break it down** by any compatible dimension, compare up to **five filtered series**, bucket time by **hour/day/week/month**, and read it back in human-friendly units. A handful of classic ratios (bounce, exit, returning, conversion) aren't pre-computed — you build them from these parts or use **Funnels**.

***

> **Next up:** \[Chapter 11 — Segments] introduces the reusable audience definitions that power series filters, connected dashboards, heatmaps, and alerts — letting you name a group of users once and reuse it everywhere.


# 11. Segments

A **segment** is a saved, named definition of an audience — *"mobile visitors from Germany who rage-clicked this week."* Build it once, and you can reuse it across the Sessions list, dashboards, heatmaps, funnels, Lift AI, and alerts. Segments are FullSession's single saved-filter mechanism: there's no separate "saved filters" concept — when you save a set of filters, you're creating a segment.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FPA05DHLGfx73FBj4GkhS%2Fimage.png?alt=media&amp;token=7d55c8e8-c033-45cd-a301-ddbf0d8418a3" alt="FullSession Segments list showing saved audiences with favorites pinned at the top and an ownership label for each segment."><figcaption></figcaption></figure></div>

***

### 11.1 What Is a Segment?

A segment bundles a **filter definition** with a name and a little metadata. Each segment has:

| Part                  | Detail                                                                                              |
| --------------------- | --------------------------------------------------------------------------------------------------- |
| **Title**             | The segment's name                                                                                  |
| **Description**       | Optional notes (short — a sentence or two)                                                          |
| **Filters**           | The audience definition (the filter tree)                                                           |
| **Owner**             | Who created it (shown as *"Created By You"*, *"Created By FullSession"*, or *"Created By \[name]"*) |
| **Favorite**          | A star that pins it to the top of the list                                                          |
| **Created / updated** | Timestamps                                                                                          |

#### Segments and funnels are cousins

Internally, **funnels** are built on the same model as segments (distinguished by a flag), which is why they share filtering concepts. In the app they appear in separate lists — **Segments** and **Funnels** — so you work with each in its own place. Funnels get their own chapter (\[Chapter 12 — Funnels]).

#### The built-in "Everyone" segment

Every site has a default segment called **Everyone** — essentially "all activity" over the last 30 days. It's always present, always starred, and can't be edited or deleted. It's the baseline you see before you apply a more specific segment.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FGDHvIkhsQyJwDDfrjsxM%2Fimage.png?alt=media&amp;token=158bade4-8486-410e-b187-4e1281022d87" alt="FullSession &#x22;Everyone&#x22; segment showing the default all-activity baseline segment that cannot be edited or removed."><figcaption></figcaption></figure></div>

***

### 11.2 Building a Segment

You build a segment with the **categorized filter editor** — the same filtering system used on the Sessions list (\[Chapter 5, section 5.2]). Define the filters you want, then save them as a named segment.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FhoN3g1gRbfHvgcDqWbwa%2Fimage.png?alt=media&amp;token=ad2d0047-28c6-49fc-b0ed-3e071e33fa84" alt="FullSession categorized filter editor showing the available fields, categories, and operators used throughout the platform."><figcaption></figcaption></figure></div>

#### Filter categories

The filter fields are grouped into categories:

| Category                | Examples                                                                                                                                                        |
| ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **User Identification** | Any User, Email, Name, Signed-up Status, User ID                                                                                                                |
| **Events**              | Any Activity, Clicked on, Error/Rage/Dead Clicks, Thrashed Cursor, Abandoned Form, Input Changed, Error Log, Uncaught Exception, Network Error                  |
| **Engagement**          | Visited URL, Query String, Page visits, Total Sessions, Landing/Exit page, Total Time, Total/Average Active Time, Average Session Length, First Seen, Last Seen |
| **Technology**          | Device Type, Browser, Operating System, Is Mobile App                                                                                                           |
| **Location**            | City, Country, IP Address                                                                                                                                       |
| **Performance**         | Page Load Time, Avg Page Load Time                                                                                                                              |
| **Others**              | UUID, Number of clicks, Screen height/width, Referrer URL, Is Live Session, Has Answered Feedback                                                               |

If your account has the **Optimizely** integration, you'll also get Experiment/Variation fields, and any **custom attributes and events** you've sent appear here too.

#### Operators

Each condition uses an operator appropriate to its field:

| Operator                                          | Use for                 |
| ------------------------------------------------- | ----------------------- |
| **is / is not**                                   | Exact match or negation |
| **contains / starts with / ends with**            | Text matching           |
| **equals**                                        | Equality                |
| **greater than / at least / less than / at most** | Numeric comparisons     |
| **between / not between**                         | Numeric or date ranges  |

#### Combining conditions: AND / OR, and how to exclude

Conditions are combined into groups using **AND** and **OR**, and groups can be nested for complex logic — *"on checkout AND (rage-clicked OR abandoned a form)."*

> **There is no "NOT" group.** To **exclude**, negate the individual condition with its **"is not"** operator (or "not between" for ranges) rather than wrapping a group in NOT. For example, *"Country is not United States."*

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Fk9C9v029QQkUoZc7C23c%2Fimage.png?alt=media&amp;token=a5baa50f-8366-42ab-981b-f95edfe2485a" alt="FullSession segment builder showing a nested segment structure with an AND group containing an OR group and a negated condition using &#x22;is not&#x22;."><figcaption></figcaption></figure></div>

#### Saving the segment

1. Build your filters.
2. Click **Save segment…**
3. In the **Save new segment as…** dialog, enter a **title** and an optional **description**.
4. Save.

> **Tip** — while you're editing filters but haven't saved, you're working in a temporary "draft" state on top of whichever segment you started from. Saving turns that draft into a permanent, named segment; navigating away without saving discards it.

***

### 11.3 Generating a Segment with AI

If your plan includes the AI filtering feature, you can describe an audience in plain language and let FullSession build the filters for you.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FYr0ROeHxOTcsRPQBL02s%2Fimage.png?alt=media&amp;token=f03a3f7b-78ca-41bb-89e4-17930eb9deb0" alt="FullSession &#x22;Generate Filters&#x22; input showing the Quick Filter box where an audience description can be entered and AI creates the matching filter conditions."><figcaption></figcaption></figure></div>

#### How it works

1. In the **Quick Filter** box, type a natural-language description — e.g. *"mobile users in Canada who rage-clicked in the last week."*
2. Click **Generate Filters** (the wand button) or press Enter.
3. FullSession shows **"AI is Generating data please wait"** while it works.
4. The generated filters are applied to your draft segment.
5. **Review** them, adjust if needed, then **save** the segment (section 11.2) — or discard.

#### Good to know

* The generator is **aware of your custom events and custom attributes**, so prompts can reference the events and traits specific to your product.
* It produces an ordinary filter definition — once generated, you can fine-tune every condition by hand.
* If you submit an empty prompt, you'll see *"You need to give a description to receive an answer."*
* This feature (Smart Filter) is available from the **Growth** plan (\[Chapter 17, section 17.1]); if you don't see the **Generate Filters** option, it isn't included in your plan.

> **Tip** — treat the AI output as a **first draft**. It's a fast way to get 80% of a complex segment in place; always glance over the conditions before saving to confirm they match your intent.

***

### 11.4 Segment Size & Stats

When you open a segment, FullSession shows **how big it is** relative to all of your data — computed live from the current filters.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FliudYTQ9QqcOkJm6JGBy%2Fimage.png?alt=media&amp;token=788fe509-f5ec-43a3-be28-dd68a0cb5cb3" alt="The segment stats header — matching users, sessions, and events, each shown against the total."><figcaption></figcaption></figure>

The stats include:

| Stat         | Shows                                           |
| ------------ | ----------------------------------------------- |
| **Users**    | Visitors matching the segment, vs. all visitors |
| **Sessions** | Sessions matching the segment, vs. all sessions |
| **Events**   | Events matching the segment, vs. all events     |

These are displayed with **percentages** so you can immediately see what share of your traffic the segment represents. The counts are **computed on demand** — they reflect the data matching your filters right now, not a cached number — so a segment's size naturally changes as new sessions arrive.

> **Tip** — segment size is a quick sanity check. If a segment you expected to be large comes back tiny (or vice-versa), one of your conditions is probably narrower or broader than you intended.

***

### 11.5 Managing Segments

Your segments live in the **Segments** list, where favorites are pinned to the top and you can search by name.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FXIjVqJCEiDMCLk4K7ITo%2Fimage.png?alt=media&amp;token=ba76743c-ab64-4028-ba49-8bab323308bd" alt="FullSession segment management view showing options to rename, edit description, update filters, favorite, or delete a segment from the list."><figcaption></figcaption></figure>

#### What you can do

| Action                        | Detail                                                                                                                                      |
| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| **Rename / edit description** | Update the title and description from the inline editor                                                                                     |
| **Update filters**            | Save changes to the segment's filter definition. FullSession confirms first: *"Are you sure you want to update the filters of \[segment]?"* |
| **Favorite (star)**           | Toggle the star to pin a segment to the top                                                                                                 |
| **Search**                    | Filter the list by segment name                                                                                                             |
| **Delete**                    | Remove a segment, after confirming. (The **Everyone** segment can't be deleted.)                                                            |

#### Ownership and who can edit

Segments are **owned by whoever created them**, but **everyone in the workspace can see all segments**. The difference is editing rights:

* You can **edit and delete segments you created**.
* Segments created by teammates (and built-ins like **Everyone**) are visible and usable, but you can't edit or delete them.

> **No private/team toggle.** Unlike dashboards, segments don't have a private-vs-team visibility setting — every segment is visible to the whole workspace. Ownership only governs who can change it.

#### What segments don't have

To set expectations clearly, segments are intentionally simple — these features **don't exist**:

* **No status/lifecycle** (no draft/active/archived) — a segment is either saved or deleted; the only flag is *favorite*.
* **No duplication** — there's no one-click clone; to base a new segment on an existing one, rebuild and save under a new name.
* **No folders/categories** — the list is flat, organized only by favorites and search.
* **No export** and **no side-by-side segment comparison** (comparison is a funnels feature).

***

### 11.6 Using Segments Everywhere

The payoff of building a segment once is reusing it across the product. A segment can scope:

| Where          | What it does                                             | Reference                              |
| -------------- | -------------------------------------------------------- | -------------------------------------- |
| **Sessions**   | Filters the session list to the segment                  | \[Chapter 5 — Sessions]                |
| **Dashboards** | A *connected segment* scopes every card on the dashboard | \[Chapter 9, section 9.7]              |
| **Heatmaps**   | Restricts a heatmap to the segment's audience            | \[Chapter 8, section 8.6]              |
| **Funnels**    | Analyzes a funnel for the segment                        | \[Chapter 12 — Funnels]                |
| **Lift AI**    | Runs AI analysis on the segment                          | \[Chapter 14 — Lift AI]                |
| **Alerts**     | Triggers an alert on sessions matching the segment       | \[Chapter 15 — Alerts & Notifications] |

<div><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Ftcwj8a87eE0J8QZ2db9n%2Fimage.png?alt=media&amp;token=60909763-6f7f-49ef-b9e1-8bc4ab9f3161" alt="FullSession segment usage showing the same &#x22;Mobile — rage clicked&#x22; segment applied across the Sessions list, a dashboard, and a heatmap."><figcaption></figcaption></figure> <figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FKvOZS0iQ0ztfFPtqztWU%2Fimage.png?alt=media&amp;token=ec4ec45c-7215-4052-8140-e1ea223e79b2" alt="FullSession segment usage showing the same &#x22;Mobile — rage clicked&#x22; segment applied across the Sessions list, a dashboard, and a heatmap."><figcaption></figcaption></figure></div>

Per-area segment context

Each area keeps its **own selected segment**, so the segment you're viewing on the Sessions page is independent of the one connected to a dashboard or applied to a heatmap. This lets you analyze the same audience in several places at once without them interfering — pick the segment in each area as you go.

> **The big picture** — a segment is a named, reusable filter definition built with the standard categorized editor (AND/OR grouping, with per-condition **is not** to exclude), optionally drafted by **AI** from a plain-language prompt. It reports its **size** live against your totals, is **owned by its creator** but visible to the whole workspace, and can be **applied across sessions, dashboards, heatmaps, funnels, Lift AI, and alerts**. There's no private/team setting, no status lifecycle, and no duplication, folders, export, or comparison.

***

> **Next up:** \[Chapter 12 — Funnels] builds on segments to analyze conversion — defining multi-step flows, measuring drop-off at each step, and jumping into the sessions behind every lost conversion.


# 12. Funnels

A **funnel** is an ordered sequence of steps you want visitors to complete — *View product → Add to cart → Checkout → Purchase* — and the analysis of how many make it through each one. Funnels show you exactly **where people drop off**, **why**, and let you jump straight into the sessions behind every lost conversion. They build on segments (\[Chapter 11 — Segments]), with which they share their underlying model.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FjlKY4vDTT3ivhH1RnwTb%2Fimage.png?alt=media&amp;token=59eeaddc-482c-4925-ab32-b687c3aaa629" alt="FullSession four-step funnel showing how many visitors reached each step, with drop-off between steps highlighted."><figcaption></figcaption></figure></div>

> Funnels are available from the **Growth** plan (\[Chapter 17, section 17.1]) and require the **view funnels** permission. If you don't see Funnels, it isn't included in your plan or allowed by your role.

***

### 12.1 Building a Funnel

A funnel is a named set of **ordered steps**. Each step is a condition a visitor must satisfy, in sequence, to keep advancing through the funnel.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FzAhV0hzMG3DYMwx1Rnju%2Fimage.png?alt=media&amp;token=d366557a-d0e1-4e08-8b08-779039284b43" alt="FullSession funnel builder showing ordered steps where each step is a page visit, click, input change, or custom event."><figcaption></figcaption></figure></div>

#### Step types

A step can be any of four types:

| Step type         | Matches when a visitor…                   | Defined by                                           |
| ----------------- | ----------------------------------------- | ---------------------------------------------------- |
| **Visit page**    | Loads a particular page/URL               | A URL (with a match operator like *is* / *contains*) |
| **Click**         | Clicks a specific element                 | A **CSS selector** or the element's **text**         |
| **Changed input** | Changes an input field                    | The field's selector/text                            |
| **Custom event**  | Fires one of your `FUS.event(...)` events | The event name                                       |

Each step has a **name**, a **value** (the URL, selector, text, or event name), a **match operator**, and an **order** in the sequence.

#### Defining steps

1. Open **Funnels** and create a new funnel.
2. Add steps in order — for example:
   * Step 1: *Visit page* `/product`
   * Step 2: *Click* the *Add to cart* button (by selector or text)
   * Step 3: *Visit page* `/checkout`
   * Step 4: *Custom event* `purchase`
3. Name the funnel and save.

#### Scoping to a segment

A funnel is analyzed within a **segment**. By default that's **Everyone** (\[Chapter 11, section 11.1]), but you can select any saved segment to analyze the funnel for a specific audience — *"the checkout funnel, for mobile users in Germany."*

> **Processing** — when a funnel is created or its definition changes, FullSession may need to compute it. You might briefly see a **processing** state (in queue / processing) before the results are ready.

> **Funnels are linear.** Steps run in a single ordered sequence — there's no branching or alternative paths. Model distinct paths as separate funnels.

***

### 12.2 Reading the Results

Once computed, a funnel shows headline metrics plus a step-by-step breakdown. The view is organized into tabs — **Funnel Overview**, **Funnel Steps**, and (where enabled) **Funnel Trends**.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FiTVbMKcMCu9p1f34I2F9%2Fimage.png?alt=media&amp;token=78234a52-a8c3-486f-aca3-f8e0e034a05e" alt="FullSession Funnel Overview showing conversion rate, time to convert, and users completed above the step-by-step funnel chart."><figcaption></figcaption></figure></div>

#### Headline metrics

| Metric                         | Meaning                                                                                     |
| ------------------------------ | ------------------------------------------------------------------------------------------- |
| **Conversion rate**            | The share of visitors who completed the whole funnel                                        |
| **Time to convert**            | The **median** time from the first step to completion (shown as days/hours/minutes/seconds) |
| **Users completed the funnel** | How many visitors finished all steps                                                        |

#### Step-by-step breakdown

The chart shows the count reaching each step and the drop between steps, so the biggest leak is obvious at a glance. FullSession also highlights the **largest single drop-off** to point you at the step most worth fixing.

#### Sessions vs. unique users

Funnels can count **sessions** or **unique users** at each step — switch depending on whether you care about per-visit behavior or per-person reach.

#### Breakdown dimension

Add a **Breakdown** to split the funnel by a dimension and see how conversion differs across groups:

**Browser · Operating System · Country · Device · Region · UTM Source · UTM Medium · UTM Campaign · Referrer · Browser Version**

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F8tKjjMCQNhIIiOA9zN2T%2Fimage.png?alt=media&amp;token=132532b9-5922-47f2-a2fa-9297624187fc" alt="FullSession funnel breakdown by Device showing desktop conversion performance and mobile drop-off at checkout."><figcaption></figcaption></figure>

#### Funnel Trends

Where the trends feature is enabled, the **Funnel Trends** tab plots funnel performance **over time**, so you can see whether conversion is improving or degrading across days, weeks, or months.

#### Filtering

Funnel analysis respects the **date range** (the global time filter), the selected **segment**, and your **breakdown** and **step-scope** choices (you can focus on "all steps" or a single transition like *Step 2 → Step 3*).

> **No conversion window.** There's **no setting** that requires visitors to complete the funnel within a fixed time. FullSession reports the *median* time to convert, but it doesn't constrain conversions to a window.

***

### 12.3 Effort Analysis

Beyond raw conversion, FullSession measures the **effort** visitors expend between steps — a strong signal of friction even where people eventually convert.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FHXl4zroEuCrzWGWUF6NK%2Fimage.png?alt=media&amp;token=61cd3660-1f80-427d-af73-a76e853d1013" alt="FullSession effort analysis showing interactions, time engaged, conversion rate, and revisit rate between two funnel steps."><figcaption></figcaption></figure></div>

For each transition between steps, effort analysis reports (as medians):

| Metric           | Meaning                                                   |
| ---------------- | --------------------------------------------------------- |
| **Conversion**   | The share of visitors who advanced to the next step       |
| **Interactions** | How many interactions visitors made between the two steps |
| **Time Engaged** | How long visitors spent between the two steps             |
| **Revisit Rate** | The share who left before advancing                       |

High interactions or time engaged between two steps — even with decent conversion — usually means that part of the flow is harder than it should be. Effort analysis surfaces that hidden friction.

***

### 12.4 Drop-off Analysis & Watching Sessions

The most actionable part of a funnel is understanding *why* people drop off — and watching it happen.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FPrkWf2yQjWebAsqxZum5%2Fimage.png?alt=media&amp;token=f7aa9008-6682-48a1-9f23-9eefc70593c5" alt="FullSession conversion analysis table showing issues most associated with drop-off, ranked by impact and lost conversions."><figcaption></figcaption></figure>

#### Conversion analysis

For a given transition, FullSession surfaces the **issues correlated with drop-off** — for example **dead clicks**, **rage clicks**, **network errors**, or specific **custom events** — each with:

| Column                        | Meaning                                            |
| ----------------------------- | -------------------------------------------------- |
| **Event / issue**             | What happened (e.g. a rage click, a network error) |
| **Location**                  | Where it occurred (e.g. a CSS selector)            |
| **Lost conversions**          | Conversions estimated lost to this issue           |
| **% of lost conversions**     | Its share of the drop-off                          |
| **Impact**                    | Its overall impact on the funnel                   |
| **Affected sessions / users** | How many were affected                             |

This turns "people drop off at checkout" into "people who hit this failing request at checkout were far less likely to convert."

#### Watch the sessions behind a drop-off

Click into an issue (or a step) to open the **sessions** behind it, split into:

* **Dropped off** — visitors who did *not* complete the funnel.
* **Converted** — visitors who did.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F5knhT0TlsePtJNm61sXT%2Fimage.png?alt=media&amp;token=55710f15-e00a-4986-b130-9ab74e3dce3b" alt="FullSession drop-off sessions view showing a list of users who did not complete the funnel step and opening directly into their replays."><figcaption></figcaption></figure>

Watching a handful of dropped-off sessions usually reveals the concrete cause — a confusing form, an unresponsive button, a slow request — which you can confirm against the **player's** console and event panels (\[Chapter 6 — The Session Player]).

***

### 12.5 Top Issues and Conversion Analysis

Funnels include several higher-level reports to help you interpret a funnel without reading every session.

#### Top Issues

The **Top Issues** report ranks the problems most affecting the funnel's conversion — each with its affected sessions/users, estimated **lost conversions**, **impact**, the **step** it relates to, and a likely **cause**.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F0HTgbffgCacw97ShYjII%2Fimage.png?alt=media&amp;token=2b12a95c-1a83-4f33-b18a-5b819b615c53" alt="The Top Issues report — the funnel&#x27;s biggest conversion blockers, ranked by impact."><figcaption></figcaption></figure>

#### AI failed-conversion analysis

Funnels also offer an **AI analysis of failed conversions**: FullSession examines sessions of visitors who dropped off and produces a written explanation of **why** they likely didn't convert — a fast, plain-language read on a step's problems.

> **Funnels vs. Lift AI.** The AI explanation here is part of **Funnels** — it interprets drop-off for a step on demand. The deeper, ongoing AI capability — **AI goals**, scheduled **AI runs**, and tracked **AI issues** linked to a funnel over time — is the separate **Lift AI** feature, covered in \[Chapter 14 — Lift AI].

***

### 12.6 Comparing Across Time & Segments

Unlike standalone segments, funnels support **comparison** — putting two or more views of the funnel side by side. This is how you measure whether something changed or whether two audiences behave differently.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FtIoiN9GnplyhACiA1zTj%2Fimage.png?alt=media&amp;token=aa553f9c-7202-499b-b372-83de24a99101" alt="FullSession funnel comparison showing this month versus last month with two audience segments overlaid."><figcaption></figcaption></figure>

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FzXxvaAwjpseDu7dNhADd%2Fimage.png?alt=media&amp;token=27d17807-20d8-460e-8bd1-1d970fd57b9d" alt="FullSession funnel comparison showing this month versus last month with two audience segments overlaid."><figcaption></figcaption></figure>

#### Time-period comparison

Compare the funnel against a **previous period**: previous **day, week, month, quarter, or year**. Ideal for answering *"did our checkout conversion improve after the redesign?"*

#### Segment comparison

Compare the funnel across **up to three other segments** at once — for example *Free vs. Pro vs. Enterprise* users moving through onboarding. This reveals where different audiences diverge in the same flow.

> **Comparison is time- and segment-based.** You can compare against earlier periods and against other segments; there's no separate cohort-comparison mechanism beyond these.

***

### 12.7 Managing & Exporting Funnels

Funnels live in their own list, separate from segments.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FNgKm0AORN8cPqbc0DoBa%2Fimage.png?alt=media&amp;token=f581d2d7-3bc3-4e5d-898d-a76c8c5dd504" alt="FullSession funnels list showing saved funnels with their owner and a star icon for favorites."><figcaption></figcaption></figure></div>

#### Managing funnels

| Action              | Notes                                                                                  |
| ------------------- | -------------------------------------------------------------------------------------- |
| **Create**          | Requires the **create funnels** permission                                             |
| **Edit**            | Update steps, breakdown, comparison, and saved selections (**Save funnel selections**) |
| **Favorite (star)** | Pin frequently used funnels to the top                                                 |
| **Delete**          | Remove a funnel (requires the **delete** permission)                                   |

Like segments, funnels are owned by their creator. Conversion analysis is gated by its own permission.

#### Exporting

Funnels can be **exported**: FullSession produces the funnel's data — the **overall** numbers plus the lists of **converted** and **dropped-off** sessions — as **CSV files in a downloadable archive**. This is useful for sharing results or cross-referencing converters and non-converters in another tool.

#### As a dashboard card

A funnel can also appear as a **funnel card** on a dashboard (\[Chapter 9, section 9.5]), so its conversion rate and step progress sit alongside your other metrics.

#### What funnels don't have

To set expectations: there's **no funnel duplication**, **no templates/library**, **no branching** (steps are linear), **no version history**, and **no built-in goals/targets** (targets live in **Lift AI**, \[Chapter 14]).

> **The big picture** — define an ordered funnel from **page / click / input / custom-event** steps, scope it to a **segment**, and read **conversion rate, median time-to-convert, and completions** with a step-by-step breakdown (sessions or unique users, optionally split by a **breakdown dimension** or over time in **Trends**). **Effort analysis** exposes hidden friction, **drop-off/conversion analysis** ranks the issues and opens the **sessions** behind them, **Top Issues/Events** and an **AI explanation** interpret the leaks, and **time/segment comparison** plus **CSV export** round it out. There's no conversion window, duplication, branching, or templates.

***

> **Next up:** \[Chapter 13 — Feedback & Surveys] covers the in-page feedback widget and survey responses — and how feedback connects back to the sessions and funnels in this and earlier chapters.


# 13. Feedback & Surveys

FullSession lets you collect feedback directly on your site with an embeddable **feedback widget**, then read the responses — and watch the sessions behind them. Unlike a long-form survey tool, each FullSession widget asks **one focused question** in one of three formats, which keeps response rates high and the data easy to act on.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FxUtqbBkGCxjsghWJDtTw%2FChatGPT%20Image%20Jun%2016%2C%202026%2C%2001_51_59%20PM.png?alt=media&amp;token=e7f03eb4-b9e3-4c90-bb2c-bcdcf3181b7b" alt="FullSession feedback widget on a live page showing a focused question that visitors can answer with a single click."><figcaption></figcaption></figure>

> Feedback features are gated by permissions (viewing, creating, reading responses, and viewing analytics are separate). If you don't see an action below, your role may not include it.

***

### 13.1 The Three Feedback Types

Every widget you build is one of these three types. Choose based on the question you want answered.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FxL79bbRx7sikot1oTsjS%2FChatGPT%20Image%20Jun%2016%2C%202026%2C%2001_46_58%20PM.png?alt=media&amp;token=e058dcce-00e5-4619-ac47-a85aab95ab0e" alt="FullSession three feedback widget types showing CSAT with an emoji scale, NPS with a 0–10 scale, and Open Ended with free-text responses."><figcaption></figcaption></figure>

#### CSAT — Customer Satisfaction

A **1–5 satisfaction scale**, shown as **emoji faces** or **numbers** (your choice). The five points map to:

| Rating | Meaning                  |
| ------ | ------------------------ |
| 1      | Very dissatisfied (Hate) |
| 2      | Dissatisfied (Dislike)   |
| 3      | Neutral                  |
| 4      | Satisfied (Like)         |
| 5      | Very satisfied (Love)    |

Best for measuring satisfaction with a specific page, feature, or interaction.

#### NPS — Net Promoter Score

A **0–10 scale** asking how likely a visitor is to recommend you. Responses are classified automatically:

| Score | Group          |
| ----- | -------------- |
| 0–6   | **Detractors** |
| 7–8   | **Passives**   |
| 9–10  | **Promoters**  |

Best for measuring overall loyalty and tracking it over time.

#### Open Ended

A **free-text** question. Responses are analyzed for **sentiment** (positive / neutral / negative) automatically, and the text is **full-text searchable**.

Best for capturing qualitative, "in their own words" feedback.

> **These three are the only types.** There's no multi-question survey, multiple-choice, yes/no, star rating, or thumbs widget — and the CSAT (1–5) and NPS (0–10) scales are fixed. Each widget asks one question of one type.

***

### 13.2 Building a Widget

Widgets are created in a **six-step builder**. You move through the steps in order, and the live preview updates as you go.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FK2dPfAqqUriKAP9x4aBD%2Fimage.png?alt=media&amp;token=db485250-67b3-49e4-aba5-70ccbf1d429b" alt="FullSession widget builder showing six setup steps from naming to publishing, with a live preview of the feedback widget."><figcaption></figcaption></figure></div>

| Step                      | What you configure                                                                                            |
| ------------------------- | ------------------------------------------------------------------------------------------------------------- |
| **1. Name & Description** | An internal **name** (unique per site) and an optional description                                            |
| **2. Type & Appearance**  | The widget **type** (CSAT / NPS / Open Ended), plus language, position, colors, theme, and (CSAT) emoji style |
| **3. Messages**           | The main **question** and optional follow-up, email-request, and thank-you messages                           |
| **4. Targeting**          | Which **devices** and **pages** the widget appears on                                                         |
| **5. Triggers**           | **When** the widget appears (and how often)                                                                   |
| **6. Finalize**           | **Display mode** (side beacon vs. pop-up) and optional email forwarding of responses                          |

The next sections cover appearance/messages (13.3) and triggers/targeting (13.4) in detail.

***

### 13.3 Appearance & Messages

#### Appearance

You can tailor the widget to match your site:

| Option                   | Choices                                              |
| ------------------------ | ---------------------------------------------------- |
| **Position**             | Middle Right, Middle Left, Bottom Right, Bottom Left |
| **Display mode**         | **Side beacon** (a tab on the edge) or **Pop up**    |
| **Accent color**         | Hex color (default `#0055A8`)                        |
| **Font color**           | Hex color (default `#1F263E`)                        |
| **Theme**                | Light or Dark                                        |
| **Language**             | English, French, or Arabic                           |
| **Emoji style** *(CSAT)* | Emoji faces or numeric 1–5                           |

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FXTdFJYQACOdPRuIoi4rz%2Fimage.png?alt=media&amp;token=bbc0b97f-7f67-4d6d-90a9-81c1ee5eeb4c" alt="FullSession appearance options showing position, display mode, accent and font colors, light/dark theme, and CSAT emoji style settings."><figcaption></figcaption></figure>

#### Messages

Beyond the main **question**, a widget can show several optional messages, each with its own on/off switch:

* A **follow-up comment** prompt (so a rater can add detail).
* An **email request** message (to optionally capture the respondent's email).
* A **thank-you** message after submitting.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FA3PbUgi7IDsl182qSlcz%2Fimage.png?alt=media&amp;token=d6307d18-5be8-4348-8c25-3b66049ff146" alt="FullSession message steps showing the main question, optional follow-up comment, email request, and thank-you message."><figcaption></figcaption></figure></div>

#### Screenshot capture

A widget can optionally **capture a screenshot** along with the response, giving you visual context for what the visitor was looking at when they answered.

***

### 13.4 Triggers & Targeting

**Targeting** decides *where* a widget can appear; **triggers** decide *when* it actually shows.

#### Targeting

| Targeting          | Options                                                                                       |
| ------------------ | --------------------------------------------------------------------------------------------- |
| **Devices**        | Desktop, Tablets, Phones                                                                      |
| **Pages**          | All pages, or specific URLs matched by **exact / starts with / ends with / contains / regex** |
| **Audience share** | A **percentage of visitors** to show the widget to (default 50%)                              |

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FrrahLTipUukdjVwFd9kv%2Fimage.png?alt=media&amp;token=fbcac492-10f3-426b-bf82-74a9ebf6f6f8" alt="FullSession targeting settings showing how to restrict a widget by device, pages using URL match rules, and a percentage of visitors."><figcaption></figcaption></figure></div>

#### Triggers

A widget appears when its trigger fires. Available triggers:

| Trigger                   | Fires when…                                     |
| ------------------------- | ----------------------------------------------- |
| **Page Load**             | The page loads                                  |
| **Rage Clicks**           | The visitor rage-clicks                         |
| **Dead Clicks**           | The visitor dead-clicks                         |
| **Error Click**           | A click coincides with an error                 |
| **Scrolled To**           | The visitor scrolls to a given percent (1–100%) |
| **Exits Page**            | The visitor shows exit intent                   |
| **Time After Page Load**  | A set number of seconds after load (1–1000)     |
| **Time After Inactivity** | A set number of seconds of inactivity (1–1000)  |
| **Manual**                | Your code calls it (see below)                  |

Triggering on **frustration signals** (rage, dead, error clicks) is especially powerful — you can ask *"What went wrong?"* at the exact moment a visitor struggles.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FzuYbphARTFZsBlvtkUpf%2Fimage.png?alt=media&amp;token=ab6fde36-2501-4666-8327-6aadebf279fb" alt="FullSession trigger settings showing how to configure a delay, device, OS, and browser filters, with per-session persistence options."><figcaption></figcaption></figure></div>

#### Manual triggering from your code

The **Manual** trigger lets you show a widget from your own code, using the tracker API (\[Chapter 3, section 3.5]):

```javascript
window.FUS.triggerWidget('YOUR_WIDGET_ID');
```

Use this to fire feedback at a precise moment in your app — after a key action completes, at the end of a flow, or when your own logic decides the time is right.

#### How often it shows

Each trigger has frequency controls:

* **Persistence** — show **once per session** or **once per user**.
* **Appearance count** — the maximum number of times the widget may appear (1–99).
* **Trigger filters** — further restrict by **device**, **OS**, or **browser**.

> **Targeting is by device, OS, browser, page, and visitor percentage** — there's no targeting by custom attribute or saved segment within the widget itself.

***

### 13.5 Results & Scoring

Each widget type has its own results view, with a headline score and trends over time.

#### CSAT results

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F0p5PyTAPCXb8z1iKTREa%2Fimage.png?alt=media&amp;token=afe2a0bf-639f-48be-bd70-2349729b6a41" alt="FullSession CSAT results showing the average score, rating breakdown, and score trend over time."><figcaption></figcaption></figure></div>

* **Average score** (1–5), with an overall **sentiment** label (an average above 3 reads positive, below 2 negative, in between neutral).
* A **breakdown** of how many responses landed on each rating.
* **Total responses** and a **trend chart** over time.

#### NPS results

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FGPyhkXnkkfMBb3nbSClT%2Fimage.png?alt=media&amp;token=972826f3-b2de-4095-a77a-950d501fa609" alt="FullSession NPS results showing the score on a gauge, promoter/passive/detractor breakdown, and trend over time."><figcaption></figcaption></figure></div>

* The **NPS score**, computed as **(% Promoters − % Detractors)**, shown on a gauge with a rating:

| NPS  | Rating     |
| ---- | ---------- |
| ≥ 70 | Excellent  |
| ≥ 30 | Great      |
| ≥ 0  | Good       |
| < 0  | Needs Work |

* **Total shown**, **all responses**, and **response rate**.
* A **trend** of Promoters / Passives / Detractors over time.

#### Open-Ended results

For open-ended widgets, results center on **sentiment** — the counts and average scores of **positive**, **neutral**, and **negative** responses — so you can gauge the mood of qualitative feedback at a glance.

***

### 13.6 Reading & Filtering Responses

Every individual response is browsable in the responses list, with rich filtering.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FAFGPFYcaQCJ6yXnKAdCd%2Fimage.png?alt=media&amp;token=0b6f521b-1e5a-4463-9dc2-0cb294e8866e" alt="FullSession responses list showing each response with comment, device, page, date, and filter options."><figcaption></figcaption></figure></div>

#### What each response shows

| Column                    | Detail                                         |
| ------------------------- | ---------------------------------------------- |
| **Response**              | The rating/emoji/score, or the open-ended text |
| **Comment**               | Any follow-up comment the visitor added        |
| **Device / browser / OS** | The respondent's environment                   |
| **Page**                  | The URL where the feedback was given           |
| **Date**                  | When it was submitted                          |

#### Filtering responses

| Filter             | Options                                                                                          |
| ------------------ | ------------------------------------------------------------------------------------------------ |
| **Time period**    | Last 7 / 15 / 30 / 90 / 180 / 365 days, or all responses                                         |
| **Response value** | By rating (CSAT 1–5), score (NPS 0–10), or sentiment (Open Ended: positive / neutral / negative) |
| **Page URL**       | Responses from a particular page                                                                 |
| **Text search**    | Full-text search of the response text *(Open Ended only)*                                        |

#### Response detail & the session link

Open a response to see its full detail — the respondent's **email** (if captured), **sentiment**, **country**, **device/browser/OS**, the session's **active time** and **event count**, and the **full text**.

Most importantly, each response includes a **link to the session replay** — so you can jump from *"this person rated us 2/5"* straight into watching exactly what they experienced.<br>

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Fl4nVLAOluilUv8dpOxIE%2Fimage.png?alt=media&amp;token=0e62cc3d-7fe7-487e-bbc3-6a51f4ed0a40" alt=""><figcaption></figcaption></figure></div>

> **Tip** — the response→session link is the heart of FullSession feedback. A score tells you *that* someone was unhappy; the linked replay shows you *why*.

***

### 13.7 Feedback in Dashboards & Sessions

Feedback data flows into the rest of FullSession.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FmlgNcA9K3kbqDPbNyvE1%2Fimage.png?alt=media&amp;token=88df2a40-e45c-4957-8c58-af4d83363341" alt="FullSession Feedback card on a dashboard showing sentiment over time, scoped to a single widget."><figcaption></figcaption></figure>

#### On dashboards

The **Feedback** dashboard card (\[Chapter 9, section 9.5]) visualizes feedback in three modes:

* **Overview** — summary stats.
* **Trends** — sentiment/score over time.
* **Recent feedback** — a list of the latest responses.

A Feedback card can be **scoped to a single widget**. You can also chart the **Total Feedbacks** and **Answered Feedbacks** measures (\[Chapter 10, section 10.5]) on any card.

#### In sessions

The **Has Answered Feedback** filter (\[Chapter 5, section 5.2]) lets you find sessions where the visitor responded to a widget — a quick way to watch the sessions of people who gave you feedback.

***

### 13.8 Managing Widgets & Limitations

You can run **multiple widgets per site**, each managed independently.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FwSFSe1hGAwYiRQLcyjoX%2Fimage.png?alt=media&amp;token=20252617-b942-47b8-90cc-d8faedf00526" alt="FullSession widget list showing filters by type (All, CSAT, NPS, Open Ended), with create, copy, edit, and status controls."><figcaption></figcaption></figure>

#### Managing widgets

| Action                    | Notes                                                                     |
| ------------------------- | ------------------------------------------------------------------------- |
| **Create**                | Build a new widget (name must be unique per site)                         |
| **Edit**                  | Update a widget — **but the type can't be changed once it has responses** |
| **Copy**                  | Duplicate a widget (its name gets a "– Copy" suffix)                      |
| **Activate / deactivate** | Turn a widget on or off without deleting it                               |
| **Delete**                | Remove the widget                                                         |
| **Delete a response**     | Remove an individual response (with the right permission)                 |

The widget list can be filtered by type — **All, CSAT, NPS, Open Ended**.

#### Email forwarding

A widget can **forward each response to an email address** — useful for routing feedback to a team inbox in real time.

> This **forwards responses**; it isn't a separate admin "you have new feedback" alert system. For event-driven alerting, see \[Chapter 15 — Alerts & Notifications].

#### What feedback doesn't do

To set expectations clearly, these **don't exist**:

* **No response export** (CSV/Excel) — analyze responses in the app, or pull feedback metrics via the dashboard's CSV card export.
* **No question branching / skip logic** — each widget is a single question.
* **No A/B testing** of widget variants.
* **No custom question types** or custom scales (CSAT 1–5 and NPS 0–10 are fixed).
* **No targeting by custom attribute or segment** within the widget (device/OS/browser/page/percentage only).
* **Languages are English, French, or Arabic** (one language per widget).
* **No two-way conversation** — a feedback widget asks and records an answer; it doesn't let you reply. For a live back-and-forth with visitors, see [Talk to User](/talk-to-user).

> **The big picture** — a FullSession feedback widget asks **one** question as **CSAT, NPS, or Open Ended**, built in a six-step flow with full control over **appearance, messages, targeting, and triggers** (including frustration-based and **manual `FUS.triggerWidget`** triggers). Results give you a **CSAT average, NPS gauge, or sentiment** view with trends; the **responses list** filters by period, value, page, and text and **links every response to its session replay**; and feedback flows into **dashboards** and **session filters**. There's no response export, branching, or A/B testing.

***

> **Next up:** \[Chapter 14 — Lift AI] covers FullSession's AI layer — the goals, scheduled runs, and tracked issues that build on the funnels and segments from earlier chapters.


# 14. Lift AI

**Lift AI** is FullSession's automated optimization layer. You point it at a funnel and a target metric, and it works continuously in the background — analyzing sessions, finding the issues most likely to be costing you conversions, recommending fixes, and then **measuring whether your fix actually worked**. Where the rest of FullSession helps you investigate, Lift AI helps you prioritize and prove impact.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FaoLH8Nbt9HD61T2woxPe%2Fimage.png?alt=media&amp;token=6fcce4a1-bd69-4d97-b20f-0ce5bc090424" alt="FullSession Lift AI recommendations view showing detected issues ranked by severity, with predicted and actual lift after fixes."><figcaption></figcaption></figure></div>

> Lift AI is available from the **Professional** plan (\[Chapter 17, section 17.1]). On Free and Growth the Lift AI item is locked, with an **Upgrade plan** link to **Settings → Subscription**.

***

### 14.1 What Lift AI Is

Lift AI is built around three connected objects:

| Object    | What it is                                                                                                           |
| --------- | -------------------------------------------------------------------------------------------------------------------- |
| **Goal**  | A monitoring target you create — a specific **funnel** and a **KPI** to improve (e.g. "improve checkout conversion") |
| **Run**   | A scheduled analysis of a goal. Lift AI **runs automatically every 8 hours** for each active goal                    |
| **Issue** | A conversion-blocking problem a run detects — with a severity, a recommendation, and an estimated impact             |

The flow is: you **create a goal** → Lift AI **runs** on it automatically → each run surfaces **issues** (recommendations) → you act on an issue → Lift AI **measures the real lift** over a validation window.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FjxQ71RArGle1Jv5sbOkT%2Fimage.png?alt=media&amp;token=21fafae2-7653-48a5-a844-8ad3115f55b3" alt="FullSession Lift AI model showing one goal, recurring runs, and detected issues tracked over time."><figcaption></figcaption></figure></div>

#### How it differs from the Funnels AI explanation

FullSession has two AI capabilities that are easy to confuse:

|                 | **Funnels AI** (\[Chapter 12, section 12.5]) | **Lift AI** (this chapter)         |
| --------------- | -------------------------------------------- | ---------------------------------- |
| Trigger         | You click "analyze" on a funnel step         | Runs automatically on a schedule   |
| Scope           | One step, one drop-off, right now            | A whole goal, tracked continuously |
| Persistence     | Ephemeral explanation                        | Persistent goals, runs, and issues |
| Measures fixes? | No                                           | Yes — predicted *and* actual lift  |

In short: Funnels AI is an **on-demand explanation**; Lift AI is an **always-on optimization program**.

***

### 14.2 Creating a Goal

You create a goal in a short setup wizard. The goal ties together a funnel, an audience, and a KPI, plus some context that helps the AI tailor its analysis.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FumvMCflN6XAtiaUNTBD4%2Fimage.png?alt=media&amp;token=c60bd8a3-ce27-49de-8086-7b15e7cca898" alt="FullSession goal setup wizard showing context, funnel selection, and data-readiness/KPI verification."><figcaption></figcaption></figure>

#### Step 1 — Context

| Field           | What you provide                                                                                                                                 |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Name**        | A name for the goal (e.g. *"Checkout Conversion"*)                                                                                               |
| **Description** | Optional notes                                                                                                                                   |
| **Industry**    | Your industry, from a list (e.g. *Software / SaaS*, *E-commerce / DTC*, *Financial Services*)                                                    |
| **Role**        | Your team's role(s) — Support, UX & Design, Engineering, Marketing, Customer Experience, Product Management, Data & Analysis, Account Management |

The industry and role help Lift AI frame its recommendations for your context.

#### Step 2 — Funnel selection

Choose the **funnel** the goal will monitor — pick an existing funnel (\[Chapter 12 — Funnels]) or define a new one on the spot.

> **A goal's funnel needs more than three steps.** Lift AI analyzes transitions between steps, so a meaningful funnel is required.

#### Step 3 — Verify (data readiness & KPI)

The final step checks that Lift AI has what it needs and sets your KPI:

* **Installation & data-readiness check** — confirms the tracker is installed and there's enough data for reliable analysis.
* **Baseline segment** — the audience to measure against (defaults to **Everyone**, or pick a segment).
* **KPI** — Conversion Rate or Revenue Per Visitor (section 14.3).

<div align="center"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FQWMWQhqNgS25YLsVan9z%2Fimage.png?alt=media&amp;token=a85734fe-4bad-4d9e-bc11-0f11a75d272b" alt="FullSession data-readiness check showing Lift AI confirming enough data is available before creating a goal."><figcaption></figcaption></figure></div>

#### What you set vs. what Lift AI computes

| Set by you                          | Computed automatically                                         |
| ----------------------------------- | -------------------------------------------------------------- |
| Name, description, industry, role   | **Baseline value** (your current KPI)                          |
| Funnel and baseline segment         | **Prediction confidence** (low / medium / high)                |
| KPI (and RPV config, if applicable) | **Validation window** (auto-selected for statistical validity) |

The **baseline** is read from your funnel's current performance, and the **prediction confidence** reflects how much data is available — neither is hand-entered. If there isn't enough data or the required signals are missing, Lift AI won't let you create the goal until that's resolved.

***

### 14.3 KPIs: Conversion Rate & Revenue Per Visitor

A goal targets one of two KPIs:

#### Conversion Rate

The share of visitors who complete the funnel. This is the default and needs no extra configuration — Lift AI reads the baseline from your funnel.

#### Revenue Per Visitor (RPV)

Revenue divided by visitors — useful when you care about money, not just completion. RPV combines your funnel's conversion rate with an **Average Order Value (AOV)**, which you supply one of two ways:

| AOV source              | How it works                                                                                                                   |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| **Enter directly**      | Type your average order value                                                                                                  |
| **From a custom event** | Point Lift AI at a numeric value on one of your `FUS.event(...)` events (\[Chapter 7, section 7.5]) and it averages it for you |

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FoyRc0DMlB5xEsctsHTac%2Fimage.png?alt=media&amp;token=cd8421f0-9804-4fba-89df-1dedf352e4bc" alt="FullSession KPI selection showing Conversion Rate or Revenue Per Visitor with its AOV source."><figcaption></figcaption></figure></div>

> **The KPI is fixed once the goal is created.** You can edit most of a goal later, but the KPI and baseline can't be changed — to switch KPI, create a new goal.

***

### 14.4 How Analysis Runs

Once a goal is **active**, you don't trigger anything — Lift AI does the work on a schedule.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FsSV13XQReEdlPtF6LOZv%2Fimage.png?alt=media&amp;token=265912bd-1e21-4c25-9523-8c30b2391d0c" alt="FullSession goal run history showing recurring automatic analyses with predicted conversion and improvement results."><figcaption></figcaption></figure></div>

#### Scheduled, automatic runs

Lift AI **runs every 8 hours** for each activated goal. Each run:

* Analyzes recent sessions against the goal's funnel.
* Produces a **predicted conversion rate** (with a confidence range) representing where the KPI could land if the detected issues were addressed.
* Calculates a **predicted improvement** — the lift on the table.
* Detects and updates the goal's **issues** (section 14.5).

Paused or archived goals are skipped.

> **There's no "run now" button.** Analysis is driven entirely by the schedule — you can't force an immediate run. New goals will show their first results after the next scheduled run.

***

### 14.5 Reading Recommendations (Issues)

Each goal has a **recommendations** view listing the issues Lift AI has found, prioritized so you can work top-down.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FaoLH8Nbt9HD61T2woxPe%2Fimage.png?alt=media&amp;token=6fcce4a1-bd69-4d97-b20f-0ce5bc090424" alt="FullSession recommendations table showing issues ranked by severity, with predicted lift and affected funnel steps."><figcaption></figcaption></figure>

#### Summary stat cards

At the top, counters summarize issues by **severity** — **Severe, High, Medium, Low** — with trends, so you can see your overall problem load at a glance.

#### The recommendations table

| Column             | Shows                                                                                      |
| ------------------ | ------------------------------------------------------------------------------------------ |
| **Recommendation** | The issue title (e.g. *"Rage clicks at the shipping step"*)                                |
| **Status**         | Where the issue is in its lifecycle (section 14.6)                                         |
| **Page**           | The URL where it occurs                                                                    |
| **Issue type**     | Rage click, dead click, error click, page-load error, uncaught exception, or network error |
| **Severity**       | Severe / High / Medium / Low                                                               |
| **Funnel steps**   | The affected transition (e.g. *2 → 3*)                                                     |
| **Baseline**       | Current conversion at those steps                                                          |
| **Predicted lift** | The expected improvement if fixed (a range, e.g. *15.2% → 16.9%*)                          |
| **Actual lift**    | The measured improvement after a fix (appears once validated)                              |
| **Last seen**      | The most recent run that detected it                                                       |

#### Issue detail

Open an issue to see its full detail:

* **Rationale** — the AI's explanation of the **root cause**.
* **Recommendation** — a suggested **fix**.
* **Impact** — the estimated **conversion loss** and the affected-vs-unaffected session breakdown.
* **Sample sessions** — example recordings, so you can **watch the issue happen** (\[Chapter 6 — The Session Player]).

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FVvWMjXkLZaCOD2xYsmMN%2Fimage.png?alt=media&amp;token=00682b6e-3270-45ff-88be-7ee4c1590196" alt="FullSession issue detail showing root-cause rationale, recommended fix, impact, and sample sessions to watch."><figcaption></figcaption></figure></div>

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FkW2TQiRL8ovBDsYBjIts%2Fimage.png?alt=media&amp;token=2510472c-7314-4a18-a524-7f1d5cee2424" alt="FullSession issue detail showing root-cause rationale, recommended fix, impact, and sample sessions to watch."><figcaption></figcaption></figure>

> **Tip** — work the **Severe** and **High** issues with the largest **predicted lift** first. The sample sessions let you confirm the AI's read before you invest in a fix.

***

### 14.6 The Issue Lifecycle & Measuring Real Lift

Lift AI's distinctive value is closing the loop: not just *finding* issues, but **proving whether your fix worked**. That happens through an issue's status lifecycle.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FpYhaW6WhecXQAkAtDI4v%2Fimage.png?alt=media&amp;token=8d156aa2-7ee6-4383-ab44-702fde182642" alt="FullSession issue lifecycle showing progress from new to validating to validation complete, with measured lift results."><figcaption></figcaption></figure>

#### The status flow

| Status                  | Meaning                                              |
| ----------------------- | ---------------------------------------------------- |
| **New**                 | Just detected                                        |
| **Undecided**           | Acknowledged, not yet triaged                        |
| **Dismissed**           | You've rejected it as not worth acting on            |
| **Planned**             | Scheduled for a fix                                  |
| **Change is live**      | You've deployed a fix                                |
| **Validating**          | Lift AI is monitoring the impact                     |
| **Validation complete** | The validation period has ended and the result is in |

You move an issue through these states as you work it.

#### Predicted lift vs. actual lift

* **Predicted lift** is Lift AI's *estimate* — what the KPI could gain if the issue were resolved. You see it as soon as the issue is detected.
* **Actual lift** is the *measured* result. When you mark an issue **Change is live** and then **Validating**, Lift AI captures the baseline and monitors performance for the goal's **validation window** (auto-selected for statistical validity). When that window closes, the issue reaches **Validation complete** and the **Actual lift** column shows what really happened.

This before/after measurement is what turns Lift AI from a recommendation engine into an accountable optimization program — every fix gets a verdict.

***

### 14.7 Managing Goals & Issues

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FwXkdqbmmzvmGUASkDbgK%2Fimage.png?alt=media&amp;token=0c8b35f8-2d82-4da3-a22d-3a0ef2d651eb" alt="FullSession Lift AI goals list showing each goal with its funnel, KPI, status, and number of new issues."><figcaption></figcaption></figure></div>

#### Managing goals

| Action      | Notes                                                                                                    |
| ----------- | -------------------------------------------------------------------------------------------------------- |
| **Create**  | Via the setup wizard (section 14.2)                                                                      |
| **Edit**    | Change name, description, funnel, baseline segment, industry, and role — **but not the KPI or baseline** |
| **Pause**   | Stop scheduled runs without deleting the goal                                                            |
| **Archive** | Hide a goal from the active list                                                                         |
| **Delete**  | Remove the goal entirely                                                                                 |

Goals are scoped to the funnels you own.

#### Managing issues

* **Change status** — move issues through the lifecycle (section 14.6); status changes are tracked over time.
* **Filter** — by status, severity, issue type, funnel steps, and date.
* **Sort** — by impact, conversion loss, predicted lift, or detection date.

#### What Lift AI doesn't do

To set expectations clearly, these **don't exist**:

* **No alerts/notifications** when a new issue is found (no email or Slack on detection) — check the recommendations view, or use **Alerts** (\[Chapter 15]) for metric-based notifications.
* **No industry benchmark comparisons.**
* **No auto-generated fix code** — recommendations are written guidance, not patches.
* **No issue clustering**, **A/B-test integration**, **custom alert thresholds**, **leaderboards**, **export/reporting**, or **webhooks**.
* **No manual run trigger** — runs are scheduled only.

> **The big picture** — Lift AI turns a funnel and a KPI (**Conversion Rate** or **RPV**) into a continuously analyzed **goal**. It **runs every 8 hours**, surfaces ranked **issues** with a root-cause **rationale**, a **recommendation**, an estimated **impact**, and **sample sessions** to watch, then measures **actual lift** over a validation window as you move each issue from *new* to *validation complete*. It's automated (no prompts, no manual runs), accountable (predicted vs. actual lift), and distinct from the on-demand Funnels AI explanation.

***

> **Next up:** \[Chapter 15 — Alerts & Notifications] covers proactive, metric-based alerting — being told when a conversion rate drops or errors spike, complementing Lift AI's continuous issue detection.


# 15. Alerts & Notifications

Alerts let FullSession tell you when an audience changes size — *"let me know when fewer than 100 people reach checkout this week"* or *"alert me when active mobile users drop 20% month over month."* When an alert's condition is met, FullSession notifies you in the app, by email, or through Slack/Zapier. This chapter covers what alerts can watch, how to build them, how they're delivered, and how to work the in-app notification center.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FajJkDaOIgatiY8UIkZU8%2Fimage.png?alt=media&amp;token=26056549-e453-41e9-b1bb-9df9e23a0158" alt="FullSession alert firing showing a notification that a segment&#x27;s user count crossed the configured threshold." width="475"><figcaption></figcaption></figure></div>

> Alerts are available from the **Growth** plan (\[Chapter 17, section 17.1]) and governed by permissions (view / create / edit / delete). If you don't see Alerts, it isn't included in your plan or allowed by your role.

***

### 15.1 What Alerts Do

It's important to be precise about what an alert watches, because it's narrower than many analytics tools:

> **An alert watches the number of unique users matching a segment, over a time window.**

That's the single metric. You pick a **segment** (\[Chapter 11 — Segments]) and a **time frame** (daily, weekly, or monthly), and FullSession notifies you when the count of unique users in that segment meets your condition — either crossing a fixed number or changing significantly versus the previous period.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F3glP0XM2xkQB4AYwC0cy%2Fimage.png?alt=media&amp;token=d653c59d-fe98-4f7c-9f58-7f622d0cfc68" alt="FullSession alert setup showing a segment user count configuration with selected segment, time window, and condition."><figcaption></figcaption></figure>

#### What alerts can't watch

Alerts do **not** fire on error spikes, rage/dead clicks, conversion-rate drops, funnel steps, feedback scores, session duration, or custom events. If you need those, use:

| You want to monitor…                     | Use instead                                                                                                                                                                                  |
| ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Conversion or drop-off changes           | **Funnels** + **Lift AI** ([Chapters 12](https://claude.ai/epitaxy/local_f5f6ba49-6bd2-4e30-b58d-b88360e08610) & [14](https://claude.ai/epitaxy/local_f5f6ba49-6bd2-4e30-b58d-b88360e08610)) |
| Errors, frustration, engagement trends   | **Dashboards** (review them) ([Chapter 9](https://claude.ai/epitaxy/local_f5f6ba49-6bd2-4e30-b58d-b88360e08610))                                                                             |
| UX issues affecting a goal, continuously | **Lift AI** issue detection ([Chapter 14](https://claude.ai/epitaxy/local_f5f6ba49-6bd2-4e30-b58d-b88360e08610))                                                                             |

Think of alerts as **audience-size monitors**, and Lift AI as the continuous, AI-driven issue watcher.

***

### 15.2 Creating an Alert

Alerts are created from a single dialog. You define what segment to watch, how often, and the condition.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F2RmMx3sGUb9Yd7hn9AMR%2Fimage.png?alt=media&amp;token=cd2d6320-bfd3-41c1-9aad-a8954c2af8cc" alt="FullSession Create Alert dialog showing alert name, segment, frequency, condition type, operator, and threshold settings."><figcaption></figcaption></figure>

#### The fields

1. **Alert name** — a name for the alert.
2. **Segment** — the segment whose user count you're watching (*"Segment selected for the alert"*).
3. **Frequency** — **Daily**, **Weekly**, or **Monthly** (the comparison window).
4. **Alert type** — how the condition is evaluated: **Value**, **Relative Change**, or **Absolute Change** (explained in section 15.3).
5. **Condition operator** — depends on the type:
   * For **Value**: *Greater than*, *Less than*, *Equal to*.
   * For **Relative/Absolute Change**: *Increased by*, *Decreased by*.
6. **Threshold** — the number to compare against (a count, a percent, or an absolute difference).
7. **Delivery & notification preferences** — covered in sections 15.4–15.5.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FRF1bB7xQlVVsBvvHz8n5%2Fimage.png?alt=media&amp;token=338bdb3f-1a76-4275-9b61-efafd849cb68" alt="FullSession alert type selection showing Value, Relative Change, and Absolute Change options with their operators."><figcaption></figcaption></figure></div>

#### One alert per segment

> **You can have one alert per segment, per site.** If an alert already exists for a segment, you'll edit that one rather than create a second. To watch the same audience two different ways, you'd need two different segments.

***

### 15.3 Alert Conditions Explained

The **alert type** determines how FullSession evaluates the segment's user count. There are three.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Fam5eiwVSwIs0zEdbPkeu%2Fimage.png?alt=media&amp;token=0ecd8a2a-3216-4c64-a92c-0134ba6f167b" alt="FullSession alert types showing comparisons against a fixed value, percentage change, or absolute change."><figcaption></figcaption></figure>

#### Value — compare to a fixed number

Fires when the current count crosses a threshold you set. Operators: *Greater than*, *Less than*, *Equal to*.

> *Example:* **Weekly · Value · Less than · 100** — "alert me when fewer than 100 users reached the checkout segment this week."

#### Relative Change — percentage change vs. the previous period

Fires when the count changes by a **percentage** versus the prior window. Operators: *Increased by*, *Decreased by*.

> *Example:* **Weekly · Relative Change · Decreased by · 20%** — "alert me when the signups segment shrinks 20% week over week."

#### Absolute Change — raw difference vs. the previous period

Fires when the count changes by a **raw number** versus the prior window. Operators: *Increased by*, *Decreased by*.

> *Example:* **Monthly · Absolute Change · Increased by · 500** — "alert me when active mobile users grow by 500 month over month."

#### The time windows

| Frequency   | Compares                                    |
| ----------- | ------------------------------------------- |
| **Daily**   | The last 24 hours vs. the previous 24 hours |
| **Weekly**  | The last 7 days vs. the previous 7 days     |
| **Monthly** | The last 30 days vs. the previous 30 days   |

> **Daily frequency supports only the Value type.** Change-based comparisons (relative/absolute) are available on **Weekly** and **Monthly** frequencies.

Alerts are evaluated **periodically in the background** — they aren't real-time. FullSession checks your conditions on a regular cycle and notifies you when one is met.

***

### 15.4 Delivery: App, Email, Slack & Zapier

When an alert fires, FullSession can deliver it through several channels, chosen when you create the alert.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FirtuShb7xBhbHpjNX5f9%2Fimage.png?alt=media&amp;token=c85a4536-5612-4e2a-8c6d-aab7ebff4cb0" alt="FullSession delivery options showing in-app, email, Slack, and Zapier notifications with team-member recipients."><figcaption></figcaption></figure>

#### Channels

| Channel    | How it works                                                      |
| ---------- | ----------------------------------------------------------------- |
| **In-app** | A notification appears in your notification center (section 15.6) |
| **Email**  | An email is sent to the recipients (see below)                    |
| **Slack**  | Posts to a Slack channel via a **webhook URL** you paste in       |
| **Zapier** | Sends the alert to a Zapier hook for downstream automations       |

The dialog presents these as preset choices — for example *"Get notified via App and Email,"* *"Get notified via App only,"* or *"Disable App and Email notifications"* — plus the option to **send to Slack** and **send to Zapier**.

#### Recipients

Email and in-app notifications go to the **alert's owner and site admins** by default. You can also **add specific team members** — *"Add other team members to the email or in-app notifications"* — and each recipient's app/email preference is respected.

#### Slack setup

Enable **Slack** and paste your channel's **Webhook URL** into the field. When the alert fires, FullSession posts a formatted message — the alert name, segment, threshold, the affected user count, and the date.

#### Zapier setup

Enable **Zapier** to send alert data to a Zap. The in-app dialog links you to a **tutorial**; the Zapier side of the connection is completed in Zapier itself, where the alert's data (operator, threshold, current/previous values, segment, site, and timestamp) arrives as the trigger payload.

> **Only Slack and Zapier** are supported as outbound integrations for alerts — there's no generic custom-webhook field or mobile push.

***

### 15.5 Notification Frequency & Limits

To prevent alert fatigue, FullSession lets you control how often a single alert can notify you.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FE6YHRNo7pUtlSvX9GGsX%2Fimage.png?alt=media&amp;token=c928b8b2-b807-4255-bdcd-66615ada71b0" alt="FullSession notification preferences showing options to notify once or send multiple notifications up to a daily limit."><figcaption></figcaption></figure>

#### Notify once vs. multiple

* **Notify me only once** *(default)* — you get a single notification when the condition is first met.
* **Send me multiple notifications** — you can receive repeated notifications, up to a **daily limit** you set (1–5 per day).

#### How limits behave

* An alert won't notify more than your chosen number of times per day.
* There's a built-in **cool-down** between notifications so you don't get a burst.
* If an alert hits its daily limit and isn't set to keep sending, it **pauses itself** for the rest of the day and resumes the next day automatically.

> **Tip** — start with **Notify me only once** for most alerts. Reserve multiple notifications for conditions you genuinely want repeated reminders about.

***

### 15.6 The Notification Center

In-app alerts (and other system notifications) collect in the **notification center**, opened from the bell in the top bar.

> **Billing events land here too.** Plan changes, plan cancellations, and failed payments arrive as notifications in this panel — see \[Chapter 17, section 17.9].

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FzBSx0QoXWgjZbNfR8eno%2Fimage.png?alt=media&amp;token=2a88726b-3d39-419f-84cc-8c560354c541" alt="FullSession notification center showing All, Unread, Snoozed, and Read tabs with severity labels and quick actions."><figcaption></figcaption></figure>

#### Tabs and overview

The panel organizes notifications into tabs, each with a count:

* **All** — everything.
* **Unread** — not yet read.
* **Snoozed** — temporarily set aside.
* **Read** — already handled.

A **Mark all as read** action clears your unread queue in one click. Each notification shows a **severity** (high / medium / low), a message, and a relative timestamp; some include a **call-to-action** link to jump to a relevant view.

#### Actions on a notification

| Action             | What it does                                      |
| ------------------ | ------------------------------------------------- |
| **Mark as read**   | Moves it to Read                                  |
| **Mark as unread** | Returns it to Unread                              |
| **Snooze**         | Temporarily moves it to Snoozed                   |
| **Unsnooze**       | Brings it back                                    |
| **Open (CTA)**     | Follows the notification's link, where one exists |

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FZb2a4bgKa29hQbIrbdtL%2Fimage.png?alt=media&amp;token=6190e6f6-7e4a-47e2-a865-8c9c4c18fb75" alt="FullSession notification actions showing options to mark as read or unread and snooze notifications independently."><figcaption></figcaption></figure></div>

> **Snooze applies to notifications, not alerts.** You snooze an individual *notification* in this panel; there's no "mute this alert" toggle on the alert itself. To stop an alert entirely, disable it (section 15.7).

#### From an alert notification to the data

An alert notification names the **segment** and the **threshold** that triggered it. Note that there isn't a one-click jump from the alert into that segment's sessions — to investigate, open the named **segment** (\[Chapter 11 — Segments]) and review its sessions there.

***

### 15.7 Managing Alerts & Limitations

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FpXU1WwHIrT9UPPP50vbg%2Fimage.png?alt=media&amp;token=db20cd0d-8821-4236-a353-84b4d43c131c" alt="FullSession alerts list showing each alert with its segment, frequency, condition, and active state."><figcaption></figcaption></figure>

#### Managing alerts

| Action               | Notes                                                                                                    |
| -------------------- | -------------------------------------------------------------------------------------------------------- |
| **Create**           | Requires the create-alerts permission                                                                    |
| **Edit**             | Update the name, condition, threshold, delivery, and preferences — **but not the alert type or segment** |
| **Enable / disable** | Turn an alert on or off (it may auto-pause when its daily limit is reached)                              |
| **Delete**           | Remove the alert and its Slack/Zapier hooks                                                              |

To change an alert's **segment** or **type**, delete it and create a new one.

#### What alerts don't do

To set expectations clearly, these **don't exist**:

* **No alerts on metrics other than segment user count** (no error, frustration, conversion, funnel, feedback, or custom-event alerts).
* **No alert-level snooze/mute** (snooze is per-notification).
* **No severity setting on alerts** (severity appears on notifications generally).
* **No alert duplication, templates, bulk actions, or escalation rules.**
* **No time-of-day scheduling** (only the daily/weekly/monthly windows).
* **No custom webhooks** (Slack and Zapier only) and **no mobile push**.
* **No test/preview send**, and **no one-click drill-in** from an alert to its sessions.

> **The big picture** — a FullSession alert watches one thing: the **unique-user count of a segment**, compared **daily/weekly/monthly**, as a **Value**, **Relative Change**, or **Absolute Change** condition. It's delivered **in-app, by email, to Slack, or to Zapier**, with **per-alert frequency limits**, and collected in a **notification center** with read/unread/snooze and severity. It's deliberately narrow — for error, conversion, and UX monitoring, lean on **Dashboards**, **Funnels**, and **Lift AI**.

***

> **Next up:** \[Chapter 16 — Team & Account Management] covers the organization, users, roles, and the permission keys (like `alerts:create` and `dashboards:edit`) that have governed what each teammate can do throughout this manual.


# 16. Team & Account Management

FullSession is built for teams. This chapter covers how your account is organized, how to invite and manage users, how roles and permissions control who can do what, and how to manage your own profile. The permission keys referenced throughout this manual (like `dashboards:edit` or `alerts:create`) all come from the system described here.

Most of these settings live under **Settings**, grouped into **Account Management** (profile, users, access control, audit log, SSO, subscription) and the data/integration settings covered in other chapters.

<div align="left"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F3J8aPVyv6u2FeRrzBHRq%2Fimage.png?alt=media&amp;token=42b4e83d-2311-4d15-914b-e8ab4fea11ca" alt="FullSession Settings sidebar showing Account Management sections for profile, users, roles, audit log, SSO, and subscription." width="215"><figcaption></figcaption></figure></div>

***

### 16.1 How Your Account Is Organized

FullSession's hierarchy has a few levels:

| Level                  | What it is                                                                                                                                   |
| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| **Account (Customer)** | Your organization — the top-level account, with one billing relationship                                                                     |
| **Site**               | A web property you track ([Chapter 3](https://claude.ai/epitaxy/local_f5f6ba49-6bd2-4e30-b58d-b88360e08610)); an account can have many sites |
| **Team / Users**       | The people in your account, who belong to one or more sites                                                                                  |
| **Roles**              | What each user is allowed to do — assignable **per site**                                                                                    |

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FvTuJSKTnAWzrAG0GRrbK%2FChatGPT%20Image%20Jun%2016%2C%202026%2C%2002_57_42%20PM.png?alt=media&amp;token=08f181a3-5ae5-4949-858e-32a454fd637a" alt="FullSession account hierarchy showing one account with multiple sites and users assigned different roles across sites."><figcaption></figcaption></figure>

#### Roles are per-site

A crucial detail: **roles are assigned per site**. The same person can be an **admin** on one site and a **viewer** on another within the same account. This lets larger organizations give teams full control of their own properties while keeping access to others read-only.

***

### 16.2 Inviting & Managing Users

Users are managed under **Settings → Users** (requires the **view members** permission).

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FUbRqfkk6aGhzFD6qgi7e%2Fimage.png?alt=media&amp;token=099eadb0-707b-4a96-bd61-f646091b8a7a" alt="FullSession Users page showing members with assigned roles and an option to invite new members."><figcaption></figcaption></figure>

#### Inviting a member

1. Click **Invite New Member**.
2. Enter the teammate's **email**.
3. Assign one or more **roles** (you can invite several people at once).
4. Send.

The invitee receives an email to join. Until they accept, they appear in the list as **Pending Invite**. You can **cancel** a pending invitation at any time.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F4z2tMtW2CoC1IY9aBoZk%2Fimage.png?alt=media&amp;token=71100adf-d79d-456e-b741-86c9fcfec905" alt="FullSession invite dialog showing email entry, role assignment, and pending invites marked until accepted."><figcaption></figcaption></figure>

#### What the users list shows

Each row shows the member's **name** (or *Pending Invite*), **email**, their **assigned roles** (with a tooltip of all role names), and when they were added.

> **Note** — the users table does not display a "last login" column. Login activity is captured behind the scenes, but it isn't surfaced per-user in this list.

#### Changing roles and removing users

* **Assign/change roles** — use the per-user role selector to add or remove roles (this respects the per-site model). Requires the **assign roles** permission.
* **Remove a user** — **Delete user** for an active member, or **Cancel invite** for a pending one. Requires the **remove members** permission.

#### Built-in protections

| Protection                                                | Why                                        |
| --------------------------------------------------------- | ------------------------------------------ |
| The **Owner** can't be removed or have their role changed | The account always has an owner            |
| You **can't change your own role**                        | Prevents accidentally locking yourself out |

Permissions used on this page: **view members**, **invite members**, **remove members**, **assign roles**.

***

### 16.3 Roles & Permissions (RBAC)

FullSession controls access through **roles** made up of granular **permissions**. There are built-in roles and, on the **Enterprise** plan, fully **custom roles** (\[Chapter 17, section 17.1]).

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FMwe6lHOIINMq6wgsvWiN%2Fimage.png?alt=media&amp;token=d493acec-9e74-4ed0-b6a4-b46f4d6b1f5d" alt="FullSession Access Control page showing built-in and custom roles with permission counts and assigned member totals."><figcaption></figcaption></figure>

#### Built-in roles

| Role               | Access                                                                    |
| ------------------ | ------------------------------------------------------------------------- |
| **Owner**          | The account owner — full control; this role can't be edited or reassigned |
| **Admin**          | Full access across features                                               |
| **(Basic member)** | Limited access                                                            |

Built-in system roles are **read-only** — you can assign them but not change their permissions.

#### Custom roles (RBAC)

On Enterprise, where role-based access control is included, you can create **custom roles** with exactly the permissions you choose — for example a "QA" role that can view sessions and use dev tools but can't manage billing or invite people. Custom roles are managed under **Settings → Access Control** (requires the **view roles** permission).

#### The permission catalog

Permissions are grouped by area. The major groups:

| Area                 | Permissions (view / create / edit / delete unless noted)                                                                                                                                  |
| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Sessions**         | View, comment, use dev tools, pin                                                                                                                                                         |
| **Dashboards**       | View, create, edit, delete; edit layout; **Charts** (own permission group): view/create/edit/delete                                                                                       |
| **Heatmaps**         | View, create, edit, delete                                                                                                                                                                |
| **Segments**         | View, create, edit, delete                                                                                                                                                                |
| **Funnels**          | View, create, edit, delete; view conversion analysis                                                                                                                                      |
| **Feedback**         | View; manage/create/edit/delete widgets; view/delete responses; view response analysis                                                                                                    |
| **Alerts**           | View, create, edit, delete                                                                                                                                                                |
| **Talk to User**     | View conversations; respond (reply, assign, close, reopen, delete); manage widget settings                                                                                                |
| **Element tracking** | Watch rules (view/create/edit/delete); labels (view/create/edit/delete)                                                                                                                   |
| **Privacy rules**    | Element & page rules (view/create/edit/delete); manage IP, session length, frustration, geolocation rules                                                                                 |
| **Data**             | Custom attributes (view/delete); site pages (view/create/edit/delete); excluded users (view/create/edit/delete)                                                                           |
| **Account**          | Members (view/invite/remove); roles/RBAC (view/create/edit/delete/assign); audit log (view); SSO (view/create/edit/delete); subscription (view/manage); domains (view/create/edit/delete) |
| **Developer**        | API tokens (view/create/delete); integrations (view/create/delete)                                                                                                                        |

> Throughout this manual, when a feature says *"requires the … permission,"* it's referring to one of these.

#### How permissions are enforced

Permissions control what you see and can do — buttons, menu items, and whole pages appear only if your role grants the matching permission, and access is enforced **per site**. (Security is ultimately enforced on the server, not just hidden in the UI.)

***

### 16.4 Creating a Custom Role

If your plan includes RBAC (Enterprise), you can build a role from scratch under **Settings → Access Control → Create role** (requires the **create roles** permission).

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FpjTBzOkj85rWK9IwXv9A%2Fimage.png?alt=media&amp;token=31b7754a-4032-47f5-bb3a-3be11c389048" alt="FullSession Create Role screen showing role name, description, domain access, and a permission tree with toggle controls."><figcaption></figcaption></figure>

#### The role form

1. **Name** *(required)* — e.g. *"QA Reviewer."*
2. **Description** *(optional)* — what the role is for.
3. **Domain access** — choose **All sites** or **Limited**:
   * **All** — the role applies across every site.
   * **Limited** — restrict the role to specific sites (a *domain-limited* role).
4. **Permissions** — toggle the permissions on, using the **permission tree** (permissions are grouped hierarchically by area, as in section 16.3).
5. Save.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FP6spbhoQS17oqlNWegO4%2Fimage.png?alt=media&amp;token=f88e55a6-799e-4ee5-b1fb-d832eba4ed63" alt="FullSession permission tree showing toggles to grant specific access grouped by feature area."><figcaption></figcaption></figure>

#### Editing and deleting roles

From the Access Control list you can **edit** or **delete** custom roles (built-in system roles can't be changed). The list also shows how many **members** hold each role, so you can see a role's reach before changing it. These actions require the **edit roles** / **delete roles** permissions.

> **Tip** — design roles around responsibilities, not individuals: a *"Support"* role (view + comment on sessions, view feedback) or an *"Analyst"* role (dashboards, segments, funnels) is easier to maintain than per-person tweaks.

***

### 16.5 Your Profile

Every user manages their own details under **Settings → Profile** (no special permission needed — it's your own account).

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FUWf5M0Ymo2jViyHCDatf%2Fimage.png?alt=media&amp;token=efda72ee-da2f-4bda-93a1-6db6974f9a67" alt="FullSession Profile page showing name, avatar, specialization, and sections for Security, Account Ownership, and Danger Zone."><figcaption></figcaption></figure>

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Fq8uw9QhZih0U76mHHcfI%2Fimage.png?alt=media&amp;token=0c6b0e59-f13a-477f-a0e2-fdbe817f2f5d" alt="FullSession Profile page showing name, avatar, specialization, and sections for Security, Account Ownership, and Danger Zone."><figcaption></figcaption></figure>

#### What you can edit

| Field                 | Notes                                                                                                                                             |
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| **First / last name** | Your display name                                                                                                                                 |
| **Avatar**            | Upload and crop a profile image                                                                                                                   |
| **Specialization**    | Your area(s) — e.g. Data & Analytics, Marketing, Development, Product Management, Customer Support, Account Management, Digital Agency, UX Design |
| **Organization name** | Shown for reference (read-only)                                                                                                                   |

#### Security

In the **Security** section you can **change your password** — available for password-based accounts. If you sign in via **SSO/SAML** (\[Chapter 18 — SSO]), password management happens with your identity provider, so the in-app change-password option doesn't apply.

#### Account ownership & deletion

The account owner has two additional controls in their profile:

* **Account Ownership** — transfer ownership to another user.
* **Danger Zone** — permanently delete the account and all associated data.

> **What's not in profile settings** — there is **no two-factor authentication (2FA), no theme/dark-mode toggle, no language preference, and no self-service email change** in account settings. (To change a member's email, an admin updates it.)

***

### 16.6 Audit Log

On plans that include RBAC (Enterprise), the **audit log** records administrative changes — who did what, and when. It's found under **Settings → Audit Log** and requires the **view audit log** permission (admins/owner).

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Ff4GUUGw8eNISCthNA5DB%2Fimage.png?alt=media&amp;token=4b0a6b53-f707-425d-b73d-a39766488932" alt="FullSession Audit Log showing a searchable and filterable record of administrative actions across the account."><figcaption></figcaption></figure>

#### What's recorded

Each entry captures:

| Field             | Detail                                                                         |
| ----------------- | ------------------------------------------------------------------------------ |
| **User**          | Who performed the action (name, email, avatar)                                 |
| **Action**        | What was done (e.g. creating or editing a role, inviting or removing a member) |
| **Site / domain** | Where it applied                                                               |
| **Timestamp**     | When it happened                                                               |

The log focuses on **account and access changes** — role creation/edits, role assignments, and member invites/removals.

#### Working with the log

* **Search** by user name or action.
* **Filter** by **email address** (specific users) or **domain** (specific sites).
* **Sort** by time and page through the history.

> **Audit log ≠ personal login history.** The audit log tracks administrative actions across the account; it isn't a per-user "where am I signed in" or login-history view (which FullSession doesn't provide).

***

### 16.7 The Settings Map

Because the manual references many settings pages, here's a consolidated map of where things live and the permission each needs.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Fj8ku0kVQoS1ok0E2Ebn0%2FChatGPT%20Image%20Jun%2016%2C%202026%2C%2003_10_15%20PM.png?alt=media&amp;token=abf2de5c-0f64-4f4d-bb5a-21e03c74bdba" alt="FullSession Settings map showing all panels grouped by category with the permissions that control access to each one."><figcaption></figcaption></figure>

| Category            | Page                   | Gated by               | Covered in                                                                               |
| ------------------- | ---------------------- | ---------------------- | ---------------------------------------------------------------------------------------- |
| **Account**         | Profile                | — (your own)           | This chapter                                                                             |
|                     | Users                  | view members           | This chapter                                                                             |
|                     | Access Control (roles) | view roles             | This chapter                                                                             |
|                     | Audit Log              | view audit log         | This chapter                                                                             |
|                     | SSO                    | view SSO               | [Chapter 18](/sso)                                                                       |
|                     | Subscription           | view subscription      | [Chapter 17](/billing-subscriptions)                                                     |
| **Data Capture**    | Setup / Installation   | —                      | [Chapter 3](/installing-the-tracker)                                                     |
|                     | Privacy Rules          | privacy-rules view     | [Chapters 7](/recording-rules-and-element-tracking) & [21](/privacy-security-compliance) |
|                     | API Tokens             | view API tokens        | Chapter 20                                                                               |
|                     | Excluded Users         | view excluded users    | [Chapters 4](/identifying-users) & [21](/privacy-security-compliance)                    |
| **Data Management** | Custom Attributes      | view custom attributes | [Chapter 4](/identifying-users)                                                          |
|                     | Site Pages             | view site pages        | [Chapter 7](/recording-rules-and-element-tracking)                                       |
|                     | Element Tracking       | watch rules + labels   | [Chapter 7](/recording-rules-and-element-tracking)                                       |
| **Integration**     | Integrations           | view integrations      | [Chapter 19](https://claude.ai/epitaxy/local_f5f6ba49-6bd2-4e30-b58d-b88360e08610)       |
| **Site**            | Manage Domains         | view domains           | [Chapter 3](/installing-the-tracker)                                                     |

> **The big picture** — your account is a **Customer** containing **Sites** and **Users**, with **roles assigned per site**. Built-in **Owner** and **Admin** roles cover the basics; **custom RBAC roles** (on supporting plans) let you grant any subset of the \~99 permissions, optionally limited to specific sites. You manage members under **Users**, your own details under **Profile** (including ownership transfer and account deletion), and review administrative changes in the **Audit Log**. There's no 2FA, theme, or language setting, and login history isn't surfaced.

***

> **Next up:** \[Chapter 17 — Billing & Subscriptions] covers plans, member-seat limits, and the subscription controls referenced throughout this chapter.


# 17. Billing & Subscriptions

FullSession billing is handled through **Stripe** and managed under **Settings → Subscription**. This chapter covers the plans, how to subscribe and change plans, payment methods and promo codes, how to read your usage against quota, what happens when a payment fails, and what happens when you cancel.

Billing is gated by permissions: anyone with the **view subscription** permission can see the page; only those with **manage subscription** (typically the account owner/admin) can change plans, payment, or cancel.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FPfOBD4KtJliWjVmUPUoM%2Fimage.png?alt=media&amp;token=4fcec29c-2f13-46c1-9845-25d02fee2483" alt="FullSession Subscription page showing current plan, usage against quota, payment method, and options to change or cancel."><figcaption></figcaption></figure></div>

***

### 17.1 Plans & What They Include

FullSession offers four plans, plus separate **Web** and **Mobile** product lines.<br>

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FhLxxt3yRjwbXcN7f8WQ4%2Fimage.png?alt=media&amp;token=f36a3fc8-4926-47a4-bd15-a180400aa688" alt=""><figcaption></figcaption></figure></div>

#### The plans

| Plan             | Best for                                                                      |
| ---------------- | ----------------------------------------------------------------------------- |
| **Free**         | Trying FullSession on a small site                                            |
| **Growth**       | Teams that need funnels, event tracking, alerts, and integrations             |
| **Professional** | Growing product, growth, and engineering teams that want dashboards & Lift AI |
| **Enterprise**   | Organizations needing custom limits, SSO, RBAC, and a tailored agreement      |

#### What differs between plans

Each plan sets the limits and features available to your account:

| Dimension                | Controls                                                                   |
| ------------------------ | -------------------------------------------------------------------------- |
| **Monthly sessions**     | How many sessions you can record per billing period                        |
| **Team members (seats)** | How many users your account can have (some plans are unlimited)            |
| **Domains / sites**      | How many sites you can track                                               |
| **Data retention**       | How long recorded sessions are kept (\[Chapter 5, section 5.7])            |
| **Features**             | Which capabilities are unlocked — e.g. funnels, Lift AI, alerts, RBAC, SSO |

Within a plan, you pick a **tier** based on your monthly session volume (e.g. a "5,000 monthly sessions" option), and choose **Web** or **Mobile** depending on what you're tracking.

#### Which plan unlocks what

Features unlock cumulatively — anything listed for Growth is also on Professional and Enterprise.

| Feature                                                | Available from   |
| ------------------------------------------------------ | ---------------- |
| Session replay, heatmaps, feedback & surveys, segments | **Free**         |
| Funnels, funnel effort analysis, funnel trends         | **Growth**       |
| Conversion analysis                                    | **Growth**       |
| Event tracking, custom events, customer attributes     | **Growth**       |
| Element watcher & element labels                       | **Growth**       |
| Alerts                                                 | **Growth**       |
| UTM tracking                                           | **Growth**       |
| Smart Filter (AI-generated segment filters)            | **Growth**       |
| Integrations                                           | **Growth**       |
| Dashboards & Charts (dynamic dashboards)               | **Professional** |
| Lift AI                                                | **Professional** |
| Role-based access control, custom roles & audit log    | **Enterprise**   |
| Single Sign-On (SAML)                                  | **Enterprise**   |
| SLA                                                    | **Enterprise**   |

> **How gating looks in the app.** Navigation items you don't have carry a small **plan badge** naming the first plan that includes them (*Growth*, *Professional*, *Enterprise*). Opening a locked area shows a lock overlay reading *"\[Feature] feature is available from \[Plan] plan"* with an **Upgrade plan** link that takes you straight to **Settings → Subscription**. The page still loads — it's just not interactive.

> **Enterprise pricing can be custom.** Enterprise also offers self-serve tiers with set session-volume options you can subscribe to directly from the plan chooser, same as Growth and Professional. Beyond those tiers, Enterprise pricing can be tailored to your account, with the option to override standard session, member, domain, retention, and feature limits — those custom terms are arranged with FullSession rather than self-served.

***

### 17.2 The Free Plan & Trial

#### The Free plan

FullSession includes a **Free plan** so you can use the product without a paid subscription. It has modest limits (sessions, members, domains, retention) suitable for small sites or evaluation. If you cancel a paid plan, your account automatically returns to Free (section 17.8).

Free is a real subscription rather than an absence of one: selecting it in the plan chooser subscribes you immediately (no checkout step), and moving from Free to a paid plan ends the Free subscription as part of the switch.

#### The trial

New accounts start with a **14-day trial** that includes generous starter limits:

| Trial resource   | Amount |
| ---------------- | ------ |
| **Sessions**     | 5,000  |
| **Team members** | 5      |
| **Domains**      | 3      |

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FwqCMq2HvdMuwizZvBz1u%2Fimage.png?alt=media&amp;token=f881161e-6a7c-42cc-8ad3-377b2933ea75" alt="FullSession trial banner showing remaining trial days and starter allocation for sessions, members, and domains."><figcaption></figcaption></figure></div>

While the trial is still running, the plan chooser shows your status as *"Your free trial status: \[N] days Left"* (or *"Expired"*) and **hides the Free plan** — you can only move up to a paid plan, not sideways to Free. Once the trial expires, Free becomes selectable again.

When the trial ends, you'll either be on a paid subscription (if you subscribed) or fall back to the Free plan's limits. Subscribe before the trial ends to avoid interrupting recording.

> **Upgrade prompts during the trial.** A trial panel elsewhere in the app offers an **Upgrade** shortcut into the plan chooser, plus a short *"How can we help you today?"* form for asking FullSession about **customized plans & invoicing** or **payment methods**. Only the account owner can upgrade — other members see *"Just the owner can upgrade the plan."*

***

### 17.3 Subscribing & Changing Plans

You subscribe and change plans from **Settings → Subscription** (requires the **manage subscription** permission). The **Your Plan** block has an **Adjust Plan** button that opens the plan chooser.<br>

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FW1OwxnEGWXVAMhu9uvnO%2Fimage.png?alt=media&amp;token=baf51aea-50fa-4364-84ec-30a3fe2afbd5" alt=""><figcaption></figcaption></figure></div>

#### Choosing a plan

1. Click **Adjust Plan** to open the chooser ("**Choose a plan**").
2. Pick the product line — **Web** or **Mobile**.
3. Choose **Yearly** or **Monthly** billing. Yearly shows the discount as **"Save XX%."**
4. Select the plan card, then the **tier** (session volume) from its dropdown — tiers are labelled like *"5,000 monthly sessions."*
5. Continue to checkout, enter payment (section 17.4), optionally add a **promo code** (section 17.5), and **Subscribe**.

Each card shows the plan name, its description, and a **"From \[price]/mo"** figure for the currently selected tier and billing term. The footer restates your choice as **"Selected Rate: \[price]/mo"**, and on yearly billing adds the **annual total** in parentheses. A **Learn more about our Pricing Plans** link opens the public pricing page for a full side-by-side comparison.

> **Nothing to confirm when nothing changed.** If the plan, tier, and billing term you've selected match what you're already on, the action button is hidden — there's no way to "re-subscribe" to your current plan by accident.

> **Deep links from the pricing site.** Opening the subscription page with plan parameters in the URL (plan name, tier index, yearly/monthly, web/mobile) pre-selects that combination and opens the chooser automatically. This is how the **Upgrade** buttons on the public pricing page hand off into the app; the parameters are cleared from the URL once applied.

#### Yearly vs. monthly

Billing can be **annual** or **monthly**. Annual billing is discounted; the chooser shows the effective monthly cost, the annual total, and the percentage saved compared with paying monthly.

#### Changing plans (upgrade or downgrade)

To move between plans or tiers, open **Adjust Plan** and confirm with **Change Plan**.

> **Plan changes take effect immediately, and the billing cycle resets.** Both upgrades and downgrades apply right away, starting a fresh billing period. FullSession does **not** prorate — there's no partial credit or charge for the unused portion of your previous cycle. Plan with that in mind, especially when downgrading mid-cycle.

A plan change is confirmed asynchronously: FullSession waits for Stripe to confirm the new subscription before the page updates, then shows *"Successfully changed the plan."* You'll also get a **plan-change notification** (section 17.9).

***

### 17.4 Payment Methods

FullSession stores a **single payment method** per account through Stripe.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F0sx58oHsqI0culfdBEkW%2Fimage.png?alt=media&amp;token=3da6e01b-afba-4643-9adc-282eef345806" alt="FullSession Stripe payment form showing secure card entry and the saved card displayed with brand and last four digits."><figcaption></figcaption></figure></div>

#### Adding or changing your card

* During checkout (or via **Change Payment Method**), you enter card details in Stripe's secure form.
* Your saved card is shown as its **brand, country, and last four digits**.
* Setting a new card **replaces** the previous one — only one payment method is kept on file at a time.

The **Change Payment Method** button appears only once you're on a paid subscription; on Free there's no card on file to change.

> Card data is handled by Stripe; FullSession never stores full card numbers.

***

### 17.5 Promo Codes

If you have a promotional or discount code, apply it during checkout.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FAHxjoLuCpL8sCU7uprTO%2Fimage.png?alt=media&amp;token=4da16631-3d94-40a7-be14-1fc119fcbeff" alt="FullSession promo code application showing &#x22;Insert Promo Code&#x22; and &#x22;Activate Code&#x22; with the discount applied to the price."><figcaption></figcaption></figure></div>

1. In the plan chooser, find **Insert Promo Code**.
2. Enter the code and click **Activate Code**.
3. FullSession validates it. If valid, the **discount** (a percentage or fixed amount, applied once, repeating, or forever depending on the code) is reflected in the displayed price. If not, you'll see an error and can try another.

A valid code is applied to your subscription when you complete checkout.

> **Codes are validated against a specific plan and tier.** A code can be restricted to particular plans or session tiers, so the discount only shows on the prices it applies to. If you change plan, tier, or billing term after activating a code, re-activate it to see the updated price.

#### When a code is rejected

An invalid code clears the field and raises a **Promo Code Error** panel — *"the promo code inserted is incorrect"* — with a **Retry** action that puts the code back in the box so you can correct a typo. The panel dismisses itself after a few seconds, or you can close it.

***

### 17.6 Usage & Quota

The subscription page shows your **current usage against your plan's limits**, so you always know where you stand.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FKQ13So7z0ikJZqdtUmu9%2Fimage.png?alt=media&amp;token=6c2b35fd-2dc6-43d5-bbc8-6da378177fc5" alt="FullSession usage panel showing sessions used versus quota for the current period, with a progress bar and quota reset date."><figcaption></figcaption></figure>

#### What's shown

* Your **plan name**, with a status suffix where one applies — **"– CANCELLED"** after you cancel, or **"– EXPIRED"** once a cycle has lapsed without renewal.
* **Sessions used vs. total** for the current billing period, as *"\[N]% — \[used] of \[total] sessions used"* with a **progress bar**.
* Your **Sessions** and **Members** allocation (members shows **Unlimited** where applicable).
* **Quota Period Resets: \[date]** — when your session count rolls over (or **Subscription ends at: \[date]** if you've cancelled). Custom Enterprise agreements arranged with FullSession don't show a reset date, since their term is set by agreement; self-serve Enterprise subscriptions started from the plan chooser show one like any other plan.

#### How the quota is split across sites

Your session quota is account-wide, but it's **divided between your sites by percentage**. Each site has a **Recording %** under **Settings → Manage Domains**, and the percentages across all your sites must add up to **100%**. A site's effective limit is its percentage of the plan's monthly sessions.

The **site picker** in the top bar shows each site's usage against its own share — *"\[recorded] / \[limit] sessions"* with a small bar — so you can spot the site that's consuming the quota before the account total gets close.

> **Rebalance rather than upgrade, where you can.** If one site is starved while another barely records, adjust the Recording % split before moving to a larger tier.

#### What happens at the limit

> Session limits are **hard caps** — there's **no overage billing or soft limit**. When you reach your monthly session quota, FullSession **stops recording new sessions** until the quota resets or you upgrade. Existing data remains viewable. To avoid hitting the cap, monitor this panel, exclude internal users (\[Chapter 4, section 4.4]), and scope recording with page rules (\[Chapter 7, section 7.2]).

***

### 17.7 Failed Payments & Renewals

Subscriptions renew automatically at the end of each billing period. If a renewal payment fails, what happens depends on when it fails.

| Situation                                       | What happens                                                                                                                                                                                                         |
| ----------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Renewal fails at the end of your cycle**      | The paid subscription ends and the account moves to the **Free plan** — but your previous plan's **data-retention period is carried over**, so existing recordings stay viewable for as long as they would have been |
| **Payment fails while changing plan mid-cycle** | Your **current plan continues** unchanged to the end of the period — the attempted change simply doesn't take effect                                                                                                 |
| **Payment fails during the trial**              | You stay on the **trial** for its remaining days; the account falls back to Free only once the trial has ended                                                                                                       |

In every case a **payment-failed notification** is raised (section 17.9) naming the amount, the plan that was attempted, and the attempt date.

> **Fixing a failed payment.** There's no in-app "retry payment" button. Update your card under **Change Payment Method** (section 17.4) and, if the account has already dropped to Free, subscribe again (section 17.3).

***

### 17.8 Cancellation & Your Data

You can cancel a paid subscription from the **End Subscription** section of the subscription page (requires **manage subscription**).

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Fq9UaPA88RfRGECt2QHGD%2Fimage.png?alt=media&amp;token=41ee21cb-c9d2-4563-9289-6543570c0fca" alt="FullSession End Subscription section showing a warning that cancelling ends access to recorded session data."><figcaption></figcaption></figure>

#### How cancellation works

1. Click **Cancel your Subscription**.
2. Confirm in the prompt (*"Are you sure you want to cancel your subscription?"*).

What happens next:

* Your plan is **marked as cancelled** immediately (shown as *"– CANCELLED"*), but the subscription **remains active until the end of the current billing period** — you keep access until then.
* The **Cancel your Subscription** button is disabled from that point on; there's nothing further to do.
* At the end of the period, the paid subscription ends and your account **automatically reverts to the Free plan**.
* **Your team loses access to recorded session data** that exceeds the Free plan's limits. Export anything you need first (\[Chapter 5, section 5.6]; \[Chapter 9, section 9.8]).

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FeLy32YWG6mAVwBsLJ5tB%2Fimage.png?alt=media&amp;token=f47ae832-c4be-497d-96bd-43518313ec8e" alt="FullSession cancelled subscription view showing access remains active until the period end date, then the account returns to Free."><figcaption></figcaption></figure>

> **No "reactivate" button.** There isn't a resume/reactivate flow. To return to a paid plan after cancelling, simply **subscribe again** (section 17.3) by choosing a plan.

> **Free plan cancellation** is handled separately — cancelling the Free plan doesn't delete your account the way a profile-level account deletion does (\[Chapter 16, section 16.5]).

***

### 17.9 Billing Notifications & Emails

Billing events reach you through the **notification center** (\[Chapter 15, section 15.6]) rather than a billing history page:

| Event              | You're told                                                           |
| ------------------ | --------------------------------------------------------------------- |
| **Plan changed**   | The previous plan, the new plan, and the date the change takes effect |
| **Plan cancelled** | The cancelled plan and the date access actually ends                  |
| **Payment failed** | The amount due, the plan that was attempted, and the attempt date     |

Separately, Stripe emails your **payment confirmations and receipts**, and FullSession sends a **welcome email** the first time you move from trial or Free onto a paid plan.

***

### 17.10 Billing Admin & Limitations

#### Who can manage billing

| Permission              | Allows                                         |
| ----------------------- | ---------------------------------------------- |
| **View subscription**   | See the subscription page, plan, and usage     |
| **Manage subscription** | Subscribe, change plan, update payment, cancel |

**Manage subscription** is typically held by the account **owner/admin**, and can be granted via a custom role (\[Chapter 16 — Team & Account Management]).

#### What billing doesn't include

To set expectations clearly, these **don't exist** in FullSession's billing interface:

* **No in-app invoices, receipts, or billing history.** Payment confirmations come from Stripe by email; there's no invoice list or download inside FullSession, and no link to a self-serve billing portal.
* **No proration** on plan changes (section 17.3).
* **No usage overage billing** — limits are hard caps (section 17.6).
* **No à-la-carte add-ons or extra-seat purchases** — seats and limits are set by your plan (Enterprise uses custom overrides).
* **No retry-payment action** after a failed charge (section 17.7).
* **No in-app tax/VAT breakdown** or plan-comparison matrix (a full comparison lives on the public pricing page).

> **The big picture** — FullSession bills through **Stripe** with **Free, Growth, Professional, and Enterprise** plans across **Web and Mobile** lines and **monthly/annual** terms. Subscribing, **immediate non-prorated** plan changes, a **single saved card**, **promo codes**, and a live **usage-vs-quota** view all live on the **Subscription** page. Session quota is **split across sites by Recording %**, limits are hard caps, a failed renewal drops you to **Free with your old retention carried over**, and cancellation is **end-of-period with an auto-revert to Free** (and loss of access to recorded data beyond Free's limits). Billing events arrive as **notifications**; there's no in-app invoice history — receipts come from Stripe.

***

> **Next up:** \[Chapter 18 — Single Sign-On (SSO)] covers enterprise authentication — SAML/identity-provider configuration, domain verification, and the `sso:*` permissions that govern it.


# 18. Single Sign-On (SSO)

`Enterprise` SSO lets your team sign in to FullSession through your own identity provider (IdP) using **SAML 2.0**, so you control authentication centrally — no separate FullSession passwords. This chapter covers setting up SSO, verifying your domain, enabling and enforcing it, the sign-in experience, and its limits.

SSO is configured under **Settings → SSO** and is governed by the `sso:view`, `sso:create`, `sso:edit`, and `sso:delete` permissions (\[Chapter 16 — Team & Account Management]). It's an Enterprise-tier feature.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FpvBpA742zilpINZFjINu%2Fimage.png?alt=media&amp;token=d28f24e8-480d-45ad-a327-ffa0ce148a1d" alt="FullSession SSO settings page showing SAML connection setup, domain verification, and SSO enable or disable controls."><figcaption></figcaption></figure></div>

***

### 18.1 SSO Overview

FullSession's SSO is a **SAML 2.0** integration in which FullSession acts as the **Service Provider (SP)** and your IdP (Okta, Azure AD, Google Workspace, OneLogin, or any SAML-capable IdP) acts as the **Identity Provider**. FullSession brokers the SAML exchange behind the scenes, so you configure it once and your users sign in with their existing corporate credentials.

#### Key characteristics

| Aspect         | What to know                                                                   |
| -------------- | ------------------------------------------------------------------------------ |
| **Protocol**   | SAML 2.0 only (no OIDC/OAuth or IdP-specific templates)                        |
| **Connection** | **One SSO connection per account**, bound to **one email domain**              |
| **Flow**       | SP-initiated (users start from FullSession's login page)                       |
| **Users**      | SSO **authenticates existing FullSession users** — it does **not** create them |

> **Important — no automatic user provisioning.** FullSession does **not** auto-create accounts on first SSO login (no JIT provisioning, no SCIM). A user must already be a member of your account (\[Chapter 16, section 16.2]) before they can sign in via SSO. The recommended order is: **invite your users first, then enable SSO.**

***

### 18.2 Setting Up SSO

Setting up SSO is a two-way exchange of metadata: you give your IdP FullSession's **Service Provider** details, and you give FullSession your **IdP's** details. The setup wizard walks you through both.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F6JIobcDuoEyIillYRmvV%2Fimage.png?alt=media&amp;token=5a664098-f11e-4c48-8f4e-9a7ed428dc7e" alt="FullSession empty SSO state showing &#x22;No SSO Connection Configured&#x22; with a button to create an SSO connection."><figcaption></figcaption></figure></div>

#### Step 1 — Configure your IdP with FullSession's details

Click **Create SSO Connection**. FullSession shows its **Service Provider Configuration** — the values to enter into your IdP:

| Field                                                   | Use it for                                        |
| ------------------------------------------------------- | ------------------------------------------------- |
| **Issuer / Metadata URL**                               | Import into your IdP for automatic configuration  |
| **Assertion Consumer Service (ACS) URL / Callback URL** | The destination your IdP sends SAML assertions to |
| **Service Provider Certificate**                        | FullSession's public X.509 certificate            |

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FpOp7KmU4hPhQXLb1yiYY%2Fimage.png?alt=media&amp;token=ffbf0efb-bc4f-4c56-afca-c1a8bdf57493" alt="FullSession SSO setup step showing Service Provider details including Metadata URL, ACS URL, and SP certificate for IdP registration."><figcaption></figcaption></figure></div>

Follow the on-screen **Next Steps**: configure your IdP with these details, then obtain your IdP's **SSO URL, Issuer, and Certificate**, and click **Continue to IdP Configuration**.

#### Step 2 — Enter your IdP's details into FullSession

On the **Create SAML SSO Connection** form, provide:

| Field                                    | What to enter                                                                                             |
| ---------------------------------------- | --------------------------------------------------------------------------------------------------------- |
| **Domain**                               | The email domain your users sign in from — **must exactly match** their email domain (e.g. `example.com`) |
| **Identity Provider Single Sign-On URL** | Your IdP's SSO endpoint (e.g. `https://idp.example.com/sso/saml`)                                         |
| **Entity ID**                            | Your IdP's Entity ID / issuer                                                                             |
| **Certificate**                          | Your IdP's X.509 signing certificate                                                                      |

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FWmU0N6lprIRNE1RoiMvB%2Fimage.png?alt=media&amp;token=863dada5-5f73-4f63-8005-151fd05eac66" alt="FullSession SSO setup step showing IdP configuration fields for SSO URL, Entity ID, certificate, and email domain."><figcaption></figcaption></figure></div>

Click **Create Connection**. The connection is created, but **SSO can't be turned on until you verify your domain** (next section).

***

### 18.3 Verifying Your Domain

Before SSO can be enabled, FullSession verifies that you own the email domain you entered — this prevents anyone from hijacking sign-in for a domain they don't control.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FVETKz7h4lHxyLJdAckjp%2Fimage.png?alt=media&amp;token=39797226-2e15-430a-91d6-094012336ff4" alt="FullSession domain verification panel showing the required DNS TXT record with a Verify Domain button."><figcaption></figcaption></figure>

#### Add the DNS record

FullSession generates a unique verification key and shows you a DNS **TXT record** to add:

| Field     | Value                            |
| --------- | -------------------------------- |
| **Type**  | `TXT`                            |
| **Name**  | `_fus_domain_verification`       |
| **Value** | (the generated verification key) |

Add this record to your domain's DNS, wait for it to propagate, then click **Verify Domain**.

The status badge moves through **Pending → Verifying… → Verified** (or **Failed** if the record isn't found). If verification fails, double-check the record name and value and that DNS has propagated, then try again — *"Domain verification failed. Please ensure the DNS record is correct and has propagated."*

> **Why the exact domain matters** — SSO routes users by their **email domain**, and the domain must match exactly. A user with `name@example.com` is matched to the `example.com` connection.

***

### 18.4 Enabling & Enforcing SSO

Once your domain is verified, you control two switches.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FzKl62S7zpEZ7XVIceyf8%2Fimage.png?alt=media&amp;token=98ce4c08-287b-42ee-b7ca-f437d4858a37" alt="FullSession SSO connection controls showing Enable/Disable SSO options and Force SSO Login or Allow Normal Logins settings."><figcaption></figcaption></figure></div>

#### Enable or disable

* **Enable SSO** — makes SSO available for users on your domain. (Only available once the domain is verified.)
* **Disable SSO** — turns it off again.

When enabled, the page shows **"SSO is enabled and active."**

#### Optional or enforced

* **Force SSO Login** — requires everyone on your domain to authenticate through SSO (password login is no longer offered for them). Shown as **"SSO Login is Forced."**
* **Allow Normal Logins** — reverts to optional, letting users choose SSO or password.

Force SSO can only be turned on when SSO is already enabled and the domain is verified.

> **Tip** — leave SSO **enabled but not forced** at first. Confirm a few users can sign in via SSO successfully, then **Force SSO Login** to make it mandatory.

***

### 18.5 Signing In with SSO

From your team's perspective, SSO adds an option to the login screen.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Fb3bDxvcgKA1OrLTuxcu5%2Fimage.png?alt=media&amp;token=a4de0bbd-0894-4a8e-931e-f0a0b5f9c8c5" alt="FullSession login screen showing a &#x22;Sign in with SSO&#x22; tab alongside password sign-in."><figcaption></figcaption></figure>

#### The sign-in flow

1. On the FullSession login page, choose the **Sign in with SSO** tab.
2. Enter your work **email** and click **Sign In with SSO**.
3. FullSession checks whether your email's domain has SSO configured. If it does, you're redirected to your IdP to authenticate (or signed straight through if you already have an IdP session).
4. After your IdP confirms your identity, you land in FullSession.

#### Fallbacks

* If a user's domain **has no SSO**, they simply use password sign-in as normal.
* If SSO is **enabled but not forced**, users can choose either method.
* If SSO is **forced** for the domain, those users sign in through SSO.

> **Remember** — the user must already exist in your account. If someone authenticates via your IdP but has no FullSession account, sign-in fails. Invite them first (\[Chapter 16, section 16.2]).

***

### 18.6 Managing the Connection, Limits & Troubleshooting

#### Viewing and editing the connection

Once configured, the SSO page shows the connection's **type, domain, entry point, issuer**, and a **View Certificate** option (opens the certificate in a modal). You can **edit** the IdP details or domain (requires `sso:edit`) and **Delete SSO Connection** from the Danger Zone (requires `sso:delete`) — deleting it means *"Users will no longer be able to sign in using SSO."*

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FrEqMzZ9KspxF80gqwZZd%2Fimage.png?alt=media&amp;token=45bc7430-968e-4b1f-a303-c0b85dc4842e" alt="FullSession existing SSO connection showing connection details, View Certificate option, enable and force login toggles, and delete option."><figcaption></figcaption></figure>

#### Permissions

| Permission   | Allows                                    |
| ------------ | ----------------------------------------- |
| `sso:view`   | See the SSO settings                      |
| `sso:create` | Create the SSO connection                 |
| `sso:edit`   | Edit details, enable/disable, force/allow |
| `sso:delete` | Delete the connection                     |

#### Limitations

To set expectations clearly, these **don't exist**:

* **No automatic provisioning** — no JIT user creation and **no SCIM**. Users are invited manually.
* **No default-role assignment via SSO** — roles are managed in **Users** ([Chapter 16](/team-account-management)).
* **One connection, one domain per account** — there's no multi-connection or multi-domain SSO.
* **SP-initiated only** — there's no IdP-initiated (tile/portal) launch.
* **No attribute-mapping UI** — FullSession reads standard name/email claims automatically; there's nothing to configure.
* **SAML only** — no OIDC/OAuth IdP connections, and no IdP-specific setup templates.

#### Troubleshooting

| Symptom                                              | Check                                                                                                                            |
| ---------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| Can't click **Enable SSO**                           | The **domain isn't verified yet** — complete the DNS TXT step (section 18.3)                                                     |
| Domain verification **fails**                        | Confirm the TXT record name (`_fus_domain_verification`) and value are exact, and that DNS has propagated                        |
| A user's SSO login **fails**                         | Confirm they have a **FullSession account** (invite first) and that their email domain **exactly matches** the configured domain |
| Users still see password login when you expected SSO | SSO may be **enabled but not forced** — use **Force SSO Login** to require it                                                    |
| SAML assertion rejected                              | Re-check the **IdP SSO URL, Entity ID, and certificate** you entered, and that your IdP is using the **ACS URL** from Step 1     |

> **The big picture** — FullSession SSO is a **SAML 2.0** integration: exchange metadata (FullSession's SP details ↔ your IdP's details), **verify your domain** via a DNS TXT record, then **enable** (and optionally **force**) SSO. Users sign in from the **"Sign in with SSO"** tab by email. It's **one connection per domain**, **SP-initiated**, and authenticates **existing** users only — so **invite your team first**, with **no JIT/SCIM provisioning** and no attribute-mapping to configure.

***

> **Next up:** \[Chapter 19 — Integrations] covers the third-party connections referenced throughout this manual — Zapier, Slack, Intercom, Optimizely, HubSpot, and Shopify — and how they extend FullSession.


# 19. Integrations

FullSession connects to a handful of third-party tools so your session data shows up where your team already works — in support conversations, your CRM, your experimentation tool, and automation platforms. Integrations are managed under **Settings → Integrations**.

Integrations are a `Growth+` feature governed by the `integrations:view`, `integrations:create`, and `integrations:delete` permissions (\[Chapter 16 — Team & Account Management]).

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FdU6myW0dNXiiA9VLeB4Q%2Fimage.png?alt=media&amp;token=cf37a746-9bc2-44a8-a168-f6a588ecb432" alt="FullSession Integrations panel showing Intercom, HubSpot, Optimizely, Shopify, and Zapier connections configured per site."><figcaption></figcaption></figure></div>

***

### 19.1 Integrations Overview

FullSession offers a focused set of integrations. Here's the lay of the land before the per-tool details:

| Integration    | What it does                                                                    | How it connects      |
| -------------- | ------------------------------------------------------------------------------- | -------------------- |
| **Intercom**   | Surfaces session recordings in your support tooling                             | OAuth                |
| **HubSpot**    | Puts recordings in the HubSpot contact timeline; powers lists/automations       | OAuth                |
| **Optimizely** | Turns A/B experiment data into session attributes you can filter and segment by | One-click (no login) |
| **Shopify**    | Connects your store via credentials                                             | Store credentials    |
| **Zapier**     | Links FullSession to thousands of apps via prebuilt Zaps                        | Opens Zapier         |

#### Connecting is per-site

Integrations are connected **per site**. If you track several sites, you connect (or disconnect) each one independently — the panel has a **site selector**, and each site shows its own status.

#### Connect / disconnect mechanics

* **OAuth integrations** (Intercom, HubSpot): click **Connect**, authorize FullSession in the provider's window, and you're returned with the integration active.
* **Optimizely**: a single **Connect** click — no login required.
* **Disconnect**: click **Disconnect** and confirm; the connection (and its stored credentials) is removed.

> **To update credentials, reconnect.** There's no "edit credentials" screen — if a connection needs refreshing, **disconnect and connect again**, which runs a fresh authorization.

#### Status

Each integration shows whether it's **connected** for a site. A **Connected** badge appears when at least one of your sites has it enabled. For your security, the access tokens behind a connection are never shown back in the app.

***

### 19.2 Intercom

The **Intercom** integration links your support conversations to FullSession recordings, so your team can watch what a customer actually did.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2Fwob0mQrtohhKZlW9rhfX%2Fimage.png?alt=media&amp;token=8f5e8753-1dd0-44f1-bd6c-0a800dea33f3" alt="FullSession Intercom integration setup showing authorization to connect Intercom and display session recordings alongside conversations."><figcaption></figcaption></figure>

#### What it does

* *"Access session recordings directly from your Intercom conversations."*
* Enriches support interactions with FullSession behavior data.

#### Where it surfaces — the player

Once Intercom is connected, the **session player's visitor info panel** shows a **View in Intercom** link for any **identified visitor with an email** (\[Chapter 6, section 6.6]). One click opens that person's Intercom profile, connecting the replay you're watching to your support history with them.

#### Setup

Click **Connect** on the Intercom card, authorize FullSession in Intercom, and the link appears in the player for matching visitors.

***

### 19.3 HubSpot

The **HubSpot** integration brings FullSession recordings and properties into your CRM.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FelJSh0hIPTdwSYNlp0K1%2Fimage.png?alt=media&amp;token=6af39ed0-36fd-4789-bc1e-265894642416" alt="FullSession HubSpot integration card showing connection setup, session recordings in contact timelines, and list creation from FullSession properties."><figcaption></figcaption></figure>

#### What it does

* *"View session recordings directly in your HubSpot contact timeline."*
* *"Utilize FullSession session properties to create lists and activate automations."*

This lets your sales and success teams see a contact's recorded behavior right where they manage the relationship, and use FullSession signals to drive HubSpot lists and workflows.

#### Setup

Click **Connect** on the HubSpot card and authorize FullSession in HubSpot. The connection is per site (connect each site you want represented in HubSpot).

***

### 19.4 Optimizely

The **Optimizely** integration makes your A/B testing data available throughout FullSession, so you can analyze sessions by experiment.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FDHR7ZojmrnDRfUC0XQlS%2Fimage.png?alt=media&amp;token=e6ff66d7-2352-44bd-86dd-ef84ed316c6b" alt="FullSession Optimizely integration card showing one-click connection and experiment or variation data mapped into session attributes."><figcaption></figcaption></figure>

#### What it does

* *"Use Optimizely experiments as attributes to segment users."*
* Translates experiment **variations into session attributes**, so you can compare how variants behave and how they affect conversion.

#### Where it surfaces — filters & segments

Once connected, four Optimizely fields become available in the **Sessions** and **Segment** filters ([Chapters 5](https://claude.ai/epitaxy/local_f5f6ba49-6bd2-4e30-b58d-b88360e08610) & [11](https://claude.ai/epitaxy/local_f5f6ba49-6bd2-4e30-b58d-b88360e08610)):

| Filter                   |                           |
| ------------------------ | ------------------------- |
| **Opt. Experiment ID**   | The experiment identifier |
| **Opt. Experiment Name** | The experiment name       |
| **Opt. Variation ID**    | The variation identifier  |
| **Opt. Variation Name**  | The variation name        |

This lets you build a segment like *"users in the `checkout-redesign` experiment, variation B"* and analyze their sessions, heatmaps, and funnels.

#### Setup

Optimizely requires **no login** — click **Connect** and it's enabled. Experiment data then flows into the filters above.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FozTSkdbfEzrkX8vxGOOp%2Fimage.png?alt=media&amp;token=324e5ca9-aea5-4864-86e8-7d7828762d6c" alt="FullSession segment builder showing Optimizely variation data used to compare behavior across different experiment test arms."><figcaption></figcaption></figure>

***

### 19.5 Zapier

The **Zapier** integration connects FullSession to thousands of apps through prebuilt automations — *"Automate workflows by connecting FullSession with thousands of apps."*

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FVY3iG19cwWKLSoBlroCN%2Fimage.png?alt=media&amp;token=fa799099-7802-440b-90e9-de191c27cb6c" alt="FullSession Zapier integration page showing prebuilt Zaps triggered when a new recording is created."><figcaption></figcaption></figure>

#### How it works

The Integrations panel's Zapier section is a **discovery page**: it lists ready-made Zaps and links you out to Zapier to set them up. The featured workflows all trigger **when a new recording is created**, and include:

| Zap                       | Does                                      |
| ------------------------- | ----------------------------------------- |
| **Google Sheets**         | Add a row when a new recording is created |
| **Microsoft Excel**       | Add a row when a new recording is created |
| **Intercom** (via Zapier) | Create an Intercom conversation           |
| **Trello**                | Create a Trello card                      |
| **Gmail**                 | Send an email                             |
| **Jira**                  | Create a Jira issue                       |

Clicking a card opens the corresponding Zap on **Zapier.com**, where you complete the connection.

> **Zapier shows up in two places.** Here, as **prebuilt recording-triggered Zaps**; and in **Alerts** (\[Chapter 15, section 15.4]), where an alert can **send to a Zapier hook**. They're separate uses of Zapier.

***

### 19.6 What Integrations Don't Include

To set expectations clearly, the following **don't exist** as native integrations:

* **No standalone Slack integration.** Slack is available **only via Alerts** — paste a Slack webhook URL when creating an alert (\[Chapter 15, section 15.4]). There's no Slack card in the Integrations panel.
* **No generic/custom webhook integration.** Outbound webhooks exist only through **Zapier** and the **Slack alert hook** — there's no "add your own webhook URL" integration.
* **No native Jira, Google Analytics, Segment, or Salesforce integrations.** (Jira is reachable through the **Zapier** Zap above.)
* **No integration marketplace** beyond the Zapier discovery list, and **no "coming soon"** catalog.

#### Integrations vs. the API

Integrations connect FullSession to specific third-party tools. For **programmatic access** to your FullSession data, use **API tokens** instead — a separate feature under **Settings → API Tokens**, covered in \[Chapter 20 — API & Developer Tools].

> **The big picture** — FullSession integrates natively with **Intercom** (recordings in support) and **HubSpot** (recordings in the CRM timeline) via OAuth, **Optimizely** (experiment data as filterable session attributes) with one click, and **Shopify** via store credentials — all **per site**. **Zapier** links FullSession to many more apps through prebuilt, recording-triggered Zaps. There's no standalone Slack integration (it lives in Alerts), no custom-webhook builder, and no native Jira/GA/Segment/Salesforce — and programmatic access is handled by **API tokens**, not integrations.

***

> **Next up:** \[Chapter 20 — API & Developer Tools] covers API tokens and programmatic access to your FullSession data — the developer counterpart to the integrations in this chapter.


# FullSession with HubSpot

This article states the steps needed to integrate FullSession site with a HubSpot account.

### What You Can Do with This Integration <a href="#h_e8a43ac03c" id="h_e8a43ac03c"></a>

* Automatic contact sync — Every FullSession visitor with an identified email is created as a HubSpot contact
* Session activity timeline — Each recorded session appears as an activity on the HubSpot contact's profile
* Enriched CRM data — Combine behavioral session data with your CRM for better customer insights
* Targeted marketing — Use session behavior to segment and target contacts with more relevant campaigns

### Prerequisites <a href="#h_7055bccc72" id="h_7055bccc72"></a>

A HubSpot account

* A FullSession account
* Admin access to both FullSession and HubSpot

### How to Install <a href="#h_e2ccb4c435" id="h_e2ccb4c435"></a>

#### Step 1: Navigate to the Integrations page <a href="#h_95bf296cc2" id="h_95bf296cc2"></a>

Log in to your FullSession account and go to Settings → Integrations in the left sidebar.

#### Step 2: Click Install <a href="#h_22d2c97f5e" id="h_22d2c97f5e"></a>

Locate HubSpot in the list of available integrations and click Install.

#### Step 3: Select your site and connect <a href="#h_1e8bead3ff" id="h_1e8bead3ff"></a>

Choose the domain (site) you want to integrate with HubSpot, then click Connect with HubSpot.

<figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1739896023/7fe1a45dc245c9c8714b407c1530/be72d9d7-0eb6-46c9-999f-e7980b1dedcc?expires=1782777600&#x26;signature=51a3054f87e6395fa17fe0c31c73f06d9299c6c4e9e130151ac9e593d03aaba6&#x26;req=dSckH8F3m4FdWvMW3nq%2BgfHN%2BKuVZJvGrvvHGzByb%2BQdnQ6IpPF0leN8%2BVh6%0AL3wSqSIgEDz8qGn0YxScTKk9nbM%3D%0A" alt=""><figcaption></figcaption></figure>

#### Step 4: Authorize your HubSpot account <a href="#h_7abe781c30" id="h_7abe781c30"></a>

You will be redirected to HubSpot to choose the account to integrate with.

* If you already have a HubSpot account, sign in and select it from the list
* If you don't have one yet, click Connect to a new HubSpot account

<div align="center"><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1739896024/d4d020dae10ebdfba7aae15f2a76/18a05235-c573-4b40-b4db-e0e741049bf5?expires=1782777600&#x26;signature=5ea5a8e86f50aaa315323d710894dc2560ad959999cd695440a0ae6fde3b7d57&#x26;req=dSckH8F3m4FdXfMW3nq%2BgTPDq%2BhZApKnAd1bkgnQJc45UvFEPWAzfwIVeaA5%0ATuRWeUdtwC3sgTvxELkmFyOKSCo%3D%0A" alt="FullSession - HubSpot"></div>

<figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1739896022/c7662f6c11d8195ca5870a2fce61/f6d1332c-7706-4d4c-af2a-7a82238e0a46?expires=1782777600&#x26;signature=f055ba46284b9cf9ebbdfe8605c3940029d88c6c9bc25f8884d944fe42ff6393&#x26;req=dSckH8F3m4FdW%2FMW3nq%2BgSBge%2BQ%2FvigjKZj3sNZCLCO9kruxHd9EefTTxtB8%0AsvOyDntHJsSvDd3kG5b9I7Rah78%3D%0A" alt=""><figcaption></figcaption></figure>

#### Step 5: Confirm the connection <a href="#h_1c0e52c0af" id="h_1c0e52c0af"></a>

You'll be redirected back to FullSession's integrations page, confirming that HubSpot is now connected. Session data will start flowing to HubSpot immediately.

<figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1739896021/11f8406e212a8a846b6ca156505a/6623ee9b-9962-4d57-bfed-c2be11397ec3?expires=1782777600&#x26;signature=fcd0f20b2cbe58df873b9d9192a0c4cd7211d0dc7270a568a772715be20af175&#x26;req=dSckH8F3m4FdWPMW3nq%2BgSX%2BiRN1dsn71AwUDvN%2BqCABhkwq1%2FTBvZskRDSL%0AmRhfDddASv1IBM0Hn1VzBGN0HVs%3D%0A" alt=""><figcaption></figcaption></figure>

### What Happens After Integration <a href="#h_f80a839562" id="h_f80a839562"></a>

Once configured, FullSession will automatically:

* Create a HubSpot contact for every identified visitor on your site
* Log each recorded session as an activity on that contact's timeline in HubSpot

This gives your sales and marketing teams a complete behavioral picture alongside their existing CRM data.

<figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/2159750844/cdf4c58fbd24d1847a77c2fdf8cc/image.png?expires=1782777600&#x26;signature=3cb8f2343ea3e9e719e25e18e8a613f73bfb2d59460fc46498d9d323c84b8254&#x26;req=diEiH857nYlbXfMW3nq%2BgazSlYpx2%2Bx0NWEatyKtdP5PCaJvsT6sddbo4EpW%0ANg1HKk1WqRvSnTbshhV15%2BARoI8%3D%0A" alt=""><figcaption></figcaption></figure>

### Important Note <a href="#h_9da64ef8da" id="h_9da64ef8da"></a>

To ensure visitors are correctly matched as HubSpot contacts, FullSession must be able to identify the visitor by email. Make sure you are [identifying users](https://help.fullsession.io/en/articles/6951496-fs-identify-identifying-users) via the FullSession SDK so that sessions can be properly linked to HubSpot contacts.


# FullSession with Optimizely

This article states the steps needed to integrate FullSession site with Optimzely

This guide outlines the steps for integrating FullSession with Optimizely. Through this integration, each recorded session can be associated with experiment and variation information, enabling FullSession customers to compare user behavior across different segments based on experiment or variation IDs and names. By consolidating these insights into a single solution, FullSession reduces the need to switch between tools and helps businesses better understand the impact of experiments on customer behavior. By the end of this tutorial, users will be able to integrate FullSession with Optimizely.

### Prerequisites: <a href="#h_19b4ce7762" id="h_19b4ce7762"></a>

* An Optimizely account
* A FullSession account
* Admin access to both FullSession and Optimizely

### Optimizely: <a href="#h_bfe4747de5" id="h_bfe4747de5"></a>

Establish the core elements of Web Experimentation by specifying pages, tags, and events, determining traffic allocation, guiding experiments from draft to launch to archive, and activating the winning variations. [Learn More](https://support.optimizely.com/hc/en-us/sections/39026458919181-Experiment-configuration)

### FullSession: <a href="#h_5abfe7ed15" id="h_5abfe7ed15"></a>

1. Log in to your FullSession account and navigate to "Settings” in the left bar.
2. From the submenu, select "Integrations".
3. Locate Optimizely in the list of available integrations and click "Install".
4. Select the domain (site) that you want to integrate Optimizely with and then press “Connect with Optimizely”.

<figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1749796871/48d4d8adba7c7dd5473bac96af9c/image.png?expires=1782777600&#x26;signature=6b8f8132d997a9745680c59a5caedbb815a4e7306afab7cdb74214379f413305&#x26;req=dScjH853m4lYWPMW3nq%2BgflrGQjml09dBuy2opwFW2MWUvOArLrsLTqu8Ogz%0AYCLnf2IYTu3%2BLBGO9EM10fXo01Y%3D%0A" alt=""><figcaption></figcaption></figure>

5\. Now, FullSession starts collecting the IDs/names of the different experimentations/variations from the recorded sessions and injecting them as custom attributes within the sessions. This allows FullSession users to start using optimizely filters to observe the different variations and create respective segments accordingly.

<figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1749800499/05ea3f051d37a093af082199fa1b/image.png?expires=1782777600&#x26;signature=2a68074eb338ed4436f91cd2f43bd73665b179a6429b0d9e2fe45ca527177311&#x26;req=dScjH8F%2BnYVWUPMW3nq%2BgdDYKEeu1hRwpUucwmVVt0P2O9pb0wgnkpcj4Fqf%0AiQrKROquxDO3qsI5Qj546WdDgPk%3D%0A" alt=""><figcaption></figcaption></figure>


# FullSession with Zapier

This article states the steps needed to integrate FullSession site with Zapier

This guide outlines the steps for integrating FullSession with Zapier to automate your workflows and connect FullSession data with 5,000+ apps. The FullSession-Zapier integration provides two powerful triggers that enable you to automatically send session data and user trend alerts to your favorite tools, streamlining your workflow without manual data transfers.

The two available triggers are:

1. Session Converted - Triggers when a user completes a specific funnel, sending session data to Zapier
2. User Trend Alert Received - Triggers when a user trend alert meets its threshold, sending alert and metric data to Zapier

By integrating FullSession with Zapier, you can:

* Automate actions when users convert - Send session data to your CRM, send notifications, or trigger follow-up workflows
* Get alerted on user trend changes - Monitor your user metrics and automatically respond when thresholds are met
* Connect with 5,000+ apps - Integrate FullSession with your entire tech stack
* Eliminate manual data entry and focus on what matters

Upon completing this tutorial, you'll be able to create automated workflows (Zaps) that trigger actions in other apps whenever these two events occur in FullSession.

### Prerequisites <a href="#h_18e2af1c04" id="h_18e2af1c04"></a>

Before you begin, ensure you have:

* A FullSession account with an active site
* A Zapier account (free or paid)

For Session Converted trigger:

* At least one funnel configured in FullSession

For User Trend Alert trigger:

* At least one user trend alert set up with specific segment, aggregation period, and threshold

***

### What Can You Do with FullSession + Zapier? <a href="#h_877e036e7e" id="h_877e036e7e"></a>

The FullSession-Zapier integration provides two powerful triggers that you can use to automate your workflows:

### 1. Session Converted <a href="#h_3a818833e7" id="h_3a818833e7"></a>

This trigger fires when a user completes a conversion on a specific funnel you've configured in FullSession. When triggered, FullSession sends the complete session data to Zapier, including:

* User identification (name, email, UUID)
* Traffic source data (UTM parameters, GCLID)
* Session metadata (browser, device, OS, location)
* Referrer information and session start time

Use this trigger when: You want to automate actions based on specific user conversions (e.g., signup, purchase, form submission).

### 2. User Trend Alert Received <a href="#h_8ccb403d63" id="h_8ccb403d63"></a>

This trigger fires when a user trend alert you've configured meets its threshold conditions. These alerts are set on specific segments in your User Trends chart with your chosen configurations (daily, weekly, or monthly aggregation) and threshold values. When triggered, FullSession sends information about the alert and the user trend metrics that met the threshold, including:

* Alert details and configuration (threshold, operator, aggregation type)
* Current metric value vs. previous period value
* Site and segment information
* When the alert was triggered

Use this trigger when: You want to be notified or take automated actions when user metrics change significantly (e.g., traffic drops, engagement spikes).

***

### Session Converted Trigger <a href="#h_33a500af1c" id="h_33a500af1c"></a>

This complete tutorial shows you how to set up a Zap that sends a Slack notification whenever a user completes your funnel.

### Part A: Create a Funnel in FullSession <a href="#h_aea29005d0" id="h_aea29005d0"></a>

Before setting up your Zap, you need to create a funnel in FullSession to track conversions.

1. Log in to your FullSession account
2. Navigate to Funnels in the sidebar

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804249186/bbbc3b48b067bdd85871e80fb342/w%3D2000?expires=1782777600&#x26;signature=2550572648e10bf8ff2085f72bf1620de3cdf04b59b65d25a2cb55dfe9a1f96f&#x26;req=dSgnEst6lIBXX%2FMW3nq%2Bgf%2FN4KCTmgOhXhc8%2FPd%2BX6zBM%2F4jQRR0jlFiTjiI%0A0rkp1ihvEksm75T0RSry2CDVqgo%3D%0A" alt=""><figcaption></figcaption></figure>
3. Add wanted steps for the funnel

   ![](https://downloads.intercomcdn.com/i/o/nosi46ch/1804249398/abe0cc31935d5e2bcb0743ddd2e0/w%3D2000?expires=1782777600\&signature=a0fc097641af5e416234307bec4f2fe35a29312148fde15c450127c8a3e345e9\&req=dSgnEst6lIJWUfMW3nq%2BgZlofJdoy3qSCCWTs6q1h%2FjeasUuCj3RhLAiHzid%0AXpIypxB2niGYqcG%2B9XPnivWG8S0%3D%0A)
4. Save the funnel with proper name

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804249749/cd978a6dc10cc1daa0c3d7a07a4c/w%3D2000?expires=1782777600&#x26;signature=f8ba76b9fa601b9a5e3c9c030152305b583c63c367be119f5116b2fb54781d82&#x26;req=dSgnEst6lIZbUPMW3nq%2BgSqSHJJk%2FwKP3YBil%2Br6XKb9cwcyQ8oWMM6jKZPM%0AAbkaawl6ms6ltVptFnCo9f1tARU%3D%0A" alt=""><figcaption></figcaption></figure>

### Part B: Create the Zap in Zapier <a href="#h_222bc7cb6e" id="h_222bc7cb6e"></a>

Now that your funnel is ready, let's create the automation in Zapier.

Step 1: Create a New Zap

1. Log in to your Zapier account
2. Click Create Button Then choose Zap

<figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804250836/2d12c63b32751f443682a9113da5/w%3D2000?expires=1782777600&#x26;signature=096f74752f902848ee6c970f00a9f534e905e5aee254ca7084bd4f8f48ab1d79&#x26;req=dSgnEst7nYlcX%2FMW3nq%2BgRGecgVlKCPPJLrFvgfTqpTV4q5OQOvdyFs6DFns%0AgnQG36P15Nzo%2BNBYMBbX6ChaFdI%3D%0A" alt=""><figcaption></figcaption></figure>

Step 2: Set Up the Trigger

1. Click on Trigger section

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804252118/4842b0974ab3a38b1b645ac84332/w%3D2000?expires=1782777600&#x26;signature=7427d6ffb62f695d5ebbbe59412e811139f8d44e1079296f5c370bc76bc3fa9b&#x26;req=dSgnEst7n4BeUfMW3nq%2BgRAw9okzlTycZwXLjrdFfeTkxaem96oneiy9q7DZ%0AeyE48ehOTIhctttKfbo6NdTql2A%3D%0A" alt=""><figcaption></figcaption></figure>
2. Search for FullSession And select it as your app

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804252187/4ff9fb6a4951c4b84dfde7545a7e/w%3D2000?expires=1782777600&#x26;signature=be35a681347689da7877b9636186482c088c6572b73238e49368e897d032fc72&#x26;req=dSgnEst7n4BXXvMW3nq%2BgbpOChboibosatqBDDEQFz%2FaZiiewiX5qFUbbX7g%0AnplG0QhVhC62VIcFTPZ50vVIaBM%3D%0A" alt=""><figcaption></figcaption></figure>
3. Choose Session Converted as the trigger event

Step 3: Connect Your FullSession Account

1. Click on Account and Click “Connect a new account”
2. You'll be redirected to Full Session's authorization page you need to authenticate your account
3. Once you finish authenticating You'll be redirected back to Zapier and the Setup page will look something like this

   ```
   Note: This authentication happens once. After connecting, you can use your FullSession account in any Zap.
   ```
4. Click Continue to go to the Configure Step

Step 4: Configure the Trigger

1. Choose Site: Select the site where your funnel is configured

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804255393/10e1c9756780b82760929117a3dc/w%3D1180?expires=1782777600&#x26;signature=9c0347c789fdf0d085354480f9d251caa69bc7fa8111955ec84fc1ae2b72ec5e&#x26;req=dSgnEst7mIJWWvMW3nq%2BgV8WFxwZumVfIMdmEgHlObUgm%2BMKh45t2BOk6s3W%0AndqC29DbOdX7SYbDvK0RSozpLjM%3D%0A" alt=""><figcaption></figcaption></figure>
2. Choose Funnel: Select The funnel you have created in the previews step

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804361494/18481940f6dce8c7fd6cf5d3e8b0/w%3D1180?expires=1782777600&#x26;signature=80b864ccc1315151e23e0144d82697f646245fa538af073bf9acb67e272b13b0&#x26;req=dSgnEsp4nIVWXfMW3nq%2BgcpWqdbCFLLtlpDK9Pxvqba0aN%2FkcWQSvS%2Fak4OS%0Aqjp7pfpWfjdBzz7LuJzH09e5%2Bmo%3D%0A" alt=""><figcaption></figcaption></figure>
3. Click Continue

Step 5: Test the Trigger

1. In the Test page Click Test trigger button to fetch test data

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804362866/5bbdb8d13a37c54f6862560f87be/w%3D1190?expires=1782777600&#x26;signature=a4b3e7fa2c1b39e6f771186892608f26832def397c54432675c1a775c6e4f82a&#x26;req=dSgnEsp4n4lZX%2FMW3nq%2BgTQ9CXPk4VMxCBsIpO%2BWiACIIzldp8q6atO0ZR2b%0Alz0yfdVEsO2A45YUMdVqhpxsCrI%3D%0A" alt=""><figcaption></figcaption></figure>
2. You will get latest sessions that are converted for the chosen funnel, select a row to use it later as data example for the action and click on Continue with selected record

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804363249/07917884f06e535f447f033f0d1b/w%3D2000?expires=1782777600&#x26;signature=487e8150c40183145ba1eba57a2d76ff854698ca684f134d2480b8a6ffd32494&#x26;req=dSgnEsp4noNbUPMW3nq%2BgdR3m04RDs41CvZ92zXnR7eWJ2Wmbp8Fknv9bHlP%0AvO19zuDTxisIJWx3J4cNRBlQJn0%3D%0A" alt=""><figcaption></figcaption></figure>

Step 6: Set Up the Action (Slack)

1. Search for and select Slack

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804365795/f7b04fc0896ee0928bde7b0aac24/w%3D1360?expires=1782777600&#x26;signature=345ac14302d0757f2654b5d64c56661dd6b03dbb98f34b986503383e3f71bcf2&#x26;req=dSgnEsp4mIZWXPMW3nq%2BgZC9adO%2FM6oaXqqffsgdjGgoHvZbWo36Wkx7BDZx%0A4UMe7uIsE4TFV32xK0JCIn0obSU%3D%0A" alt=""><figcaption></figcaption></figure>
2. Choose action event: Send Channel Message
3. Click on Sign In and login to your slack account

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804365983/cb377d534aa7a1c6e387676bfb1c/w%3D1180?expires=1782777600&#x26;signature=065633dfd93a06715743e309040cb00a78bb3edfeca3197c8c1c8493383a531a&#x26;req=dSgnEsp4mIhXWvMW3nq%2BgRxUIxiIjWOwh9Z5UYWvEo6DMF%2FERahu5Vj6B4dS%0A4eHnWMpVR8x7yrWXUnrjdQrWv60%3D%0A" alt=""><figcaption></figcaption></figure>
4. Click Continue

Step 7: Customize the Slack Message

1. Channel: Select your channel (e.g., `#conversions` or `#sales`)
2. Message Text: Click in the field and insert FullSession data:

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804367667/d23a1e7bf6f6b13459150b81411e/w%3D1190?expires=1782777600&#x26;signature=81552710e2a23aa775cdd49f3a9aab040371489eba4e973f14e086883c8386e4&#x26;req=dSgnEsp4modZXvMW3nq%2BgR4jZETZouyAGH%2F0ZVSWpDXG9O19xRpMZ22Iw1OZ%0A1ZxEdP1wMn4ZEtQkrmYlnLm7P2E%3D%0A" alt=""><figcaption></figcaption></figure>
3. Click Continue

Step 7: Test the Action

1. Click Test Step

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804369754/f4702fc21022ea97b87b4821e8a5/w%3D1180?expires=1782777600&#x26;signature=91ce5a6472d8d3e7c6a33e4e0a8abd1a93162b4adcdc8a24d34e1108143140ea&#x26;req=dSgnEsp4lIZaXfMW3nq%2BgfByDW5CJLTSA32z2f2vDXy1BZQR4VdZoscFmBhB%0AV2ymq0sJ2UAxSGnRYKMYOVaIZgk%3D%0A" alt=""><figcaption></figcaption></figure>
2. Check your Slack channel to verify the message appears correctly
3. If the message looks good, Review your input and output for the zap and click Publish

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804369954/6f8af92bd6d6c26c2e6f081d2deb/w%3D1180?expires=1782777600&#x26;signature=ea13dd68a7945544a95d08eb116710f8549ed334f8b595b7c1b7968ac5802ede&#x26;req=dSgnEsp4lIhaXfMW3nq%2Bgc8UEqpyhH0Ct2Z3cZZzhDFnd%2Bpxxrfu8%2BawI98s%0AdxcBASKXxHi%2Fb5SxZYObWSqVy08%3D%0A" alt=""><figcaption></figcaption></figure>
4. Your Zap is now active!

***

### User Trend Alert Trigger <a href="#h_61f34b7913" id="h_61f34b7913"></a>

This complete tutorial shows you how to set up a Zap that sends an email when your Weekly Active Users drops by more than 20%.

### Part A: Create a User Trend Alert in FullSession <a href="#h_e4e97f270d" id="h_e4e97f270d"></a>

Before setting up your Zap, you need to create an alert in FullSession to monitor user trends.

Step 1: Create Alert

1. Log in to your FullSession account
2. Create Or choose Already Existed Segment Segment
3. Scroll to the User Trends Chart and click on Create alert Button (if you cannot see it make sure to you selected a segment)

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804371629/5e73ab7fcd9af24d5a1a4e9f97af/w%3D1360?expires=1782777600&#x26;signature=cfa3fbfc0e390c2c23d819a3d603d2bd3e468563805e477b82db855d94657a93&#x26;req=dSgnEsp5nIddUPMW3nq%2BgfgvpbgWdWil0B%2B3J94VhR1Kx%2BAggZSHnoeJ%2BSrw%0AamA5yuYsWS4h3atzKFzojugxk%2BM%3D%0A" alt=""><figcaption></figcaption></figure>
4. Choose “Weekly” and “Relative Change” and then choose “Decreased by” “20%” then click continue

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804371857/127c64ccf3d2330edc93f0e2ec0d/w%3D1360?expires=1782777600&#x26;signature=b30a123999058757d1ae650d7add24341365169282af8aa4393d9a4d4b9e439c&#x26;req=dSgnEsp5nIlaXvMW3nq%2BgWvhovg5wBmNQOeZzpfxAiCUgE1wd4KTbesyCVb7%0AyAkaAiwTKl6MkiIfpAEwvltkhw8%3D%0A" alt=""><figcaption></figcaption></figure>
5. You can customize the alert by choosing how many time to be notified and where in the app but we will choose notify me “1” times a day, this will make sure the zap get triggered at most one time each day

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804372131/71b813b558976e9366df60e21963/w%3D1380?expires=1782777600&#x26;signature=e408eaf1d9399ba9614d9c7fad26ae85fbb36e920ceee7707a286771fe9bc024&#x26;req=dSgnEsp5n4BcWPMW3nq%2BgTReEO3TAzEmtfVKwCwYe%2BJhKrTG8VBtmkQgOc0i%0AfvYWpXlyY4kJfzYrkgb9Ob0uNg0%3D%0A" alt=""><figcaption></figcaption></figure>

6\. Click Continue and give the alert unique name to reference it later in Zapier then click Create

![](https://downloads.intercomcdn.com/i/o/nosi46ch/1804372858/669a380c0831818b614fb22e7e92/w-3D1360?expires=1782810000\&signature=5ed88e06fa1ecdd1621d690951248e92cfaa6fa4cce64fafa96437af19e457f2\&req=dSgnEsp5n4laUfMW3Hu4gTSuZuGK6sjzJFPWcAz41qhnxkW2wSwXPyopFST2%0AGQ%3D%3D%0A)

### Part B: Create the Zap in Zapier <a href="#h_98865611f2" id="h_98865611f2"></a>

Step 1: Create a New Zap

1. Log in to your Zapier account
2. Click Create Button Then choose Zap

<figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804373977/8f28f806786a97dfb99cb0f80f36/w%3D2000?expires=1782777600&#x26;signature=baf334a935643aafa1dde60d3292b4ff56363d0e4798087e080cf5888eebc213&#x26;req=dSgnEsp5nohYXvMW3nq%2BgTZznHo7PwTg3mi5wU8dAjYNfXgieD3KEApSlttf%0AWo9s9LKXH5xEqd%2FINyyblpSod%2Fc%3D%0A" alt=""><figcaption></figcaption></figure>

Step 2: Set Up the Trigger

1. Click on Trigger section

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804375461/d43f209c62f19b6205e1efae561c/w%3D1360?expires=1782777600&#x26;signature=28f112a003f0e93cb9e698e9e459f6255c48eafe6fb80785051822db9f44cfb9&#x26;req=dSgnEsp5mIVZWPMW3nq%2BgaROY2t3nebSfcJiqHrvqEAXEnFYZSWgQi0kg6wQ%0ARJgkT1X769B44POwP9tQ5nTniMU%3D%0A" alt=""><figcaption></figcaption></figure>
2. Search for FullSession And select it as your app

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804375660/88cdf7f8321f0c82971ab0bbcca0/w%3D1360?expires=1782777600&#x26;signature=a2d174b3937d4b65261a32e35772c114988c5d50c3ffdafc8bcb8cb61b2dc87e&#x26;req=dSgnEsp5mIdZWfMW3nq%2BgbPuwub2%2BNi%2FOooJhiGLwljukaYuOOSCaQ2tvnQF%0ATPKCZKlcxqMtr1%2F93wE%2BvsO6hdk%3D%0A" alt=""><figcaption></figcaption></figure>
3. Choose User Trend Alert Received as the trigger event

Step 3: Connect Your FullSession Account

1. Click on Account and Click “Connect a new account”
2. You'll be redirected to Full Session's authorization page you need to authenticate your account
3. Once you finish authenticating You'll be redirected back to Zapier and the Setup page will look something like this

```
Note: This authentication happens once. After connecting, you can use your FullSession account in any Zap.
```

<figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804377078/06db4f4876bd75f8b5dca82813f4/w%3D1200?expires=1782777600&#x26;signature=00141c6fd33089a651b4638da5c8e8674ec0a7a1417ee1bb0d3edf3894e4cfd9&#x26;req=dSgnEsp5moFYUfMW3nq%2BgVqaKeRlZgFEFFGGfoRlB%2BpZMKuIhfHMx9iSQq7L%0AbxGv0J%2FbqcDekxJMqawa1cXCxYE%3D%0A" alt=""><figcaption></figcaption></figure>

4\. Click Continue to go to the Configure Step

Step 4: Configure the Trigger

1. Choose Alert: Select The Alert you created from the drop down menu

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804377963/6e4c2cc29e395e14b142a9c97f1d/w%3D1190?expires=1782777600&#x26;signature=b4625a51cc306fcdde91346dcf016ea899bbeca0a8e68a8e1426c702c8666115&#x26;req=dSgnEsp5mohZWvMW3nq%2BgZp0tIppP2jTcpLPHLRAM0iSuFvi6DZO%2Bq4KswsU%0AvPIk1M0VEvRUFV0zkq43s%2BopbbI%3D%0A" alt=""><figcaption></figcaption></figure>
2. Click Continue

Step 5: Test the Trigger

1. Click Test trigger to pull in recent alert data

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804378978/f2e674537ae417ac07e7f42c690b/w%3D1200?expires=1782777600&#x26;signature=a991c2b208b8ae330f66dd22080e81c59efb4a25bab3962e2204a0f35e9e3159&#x26;req=dSgnEsp5lYhYUfMW3nq%2BgUQKOKlaFQSW7hUxoQJDGOM9FI6pGcwTzoB7ExYD%0AV19XiyvjiRPwzlAdqowwm%2BmjQDY%3D%0A" alt=""><figcaption></figcaption></figure>
2. Zapier will retrieve a recent alert notification (if available otherwise you can skip the test and get mocked data)

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804379235/1eee80422ad20f2d8ab377b2f0c5/w%3D1190?expires=1782777600&#x26;signature=e54dfbf9b2ac54bb6fef51af7802d20cd1e3beaef059ab26fad04172e6c8b61f&#x26;req=dSgnEsp5lINcXPMW3nq%2BgavmQGxUOx59NmHkpE4bvxpPBDMR8UTZxKGZVabe%0AiOb46G4JVFeraUw1xRwUCfae%2BEc%3D%0A" alt=""><figcaption></figcaption></figure>
3. Review the data returned and click continue

Step 6: Set Up the Action (Email)

1. Search for and select Email

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804380464/5bcf9cd5af2542cb00b224dd6646/w%3D1360?expires=1782777600&#x26;signature=1e1b5a41f9e37bb00a62fa1305207cc40898c7abf9d98e9d5634e4fec71db8b3&#x26;req=dSgnEsp2nYVZXfMW3nq%2Bgdk%2BZld0pnY3mQE938ZgQnIjawzALIA8HyRwuFbP%0Al1ppK%2BSfBOYouGLis2KqFPk3Kmc%3D%0A" alt=""><figcaption></figcaption></figure>
2. Choose action event: Send Outbound Email
3. Click Continue

Step 7: Customize the Email

1. To: Enter the email address(es) to notify (e.g., `operations@yourcompany.com`)
2. Subject: Create a clear subject line
3. Body: Compose a detailed email using FullSession data

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804380953/67e4286806d2e206c48a07549d31/w%3D1360?expires=1782777600&#x26;signature=9449c6abbd840c389e99ea87f9dfe1bd6ad73d7f46661ddf23b2f669dedb592f&#x26;req=dSgnEsp2nYhaWvMW3nq%2BgdsIa52cL1PF%2FaK2ace0SZn6zX3uQ2PftZ0%2BX%2FKz%0A0puykJJb5jqW3wT3CtgcoYKvzL4%3D%0A" alt=""><figcaption></figcaption></figure>
4. Click Continue

Step 8: Test the Action

1. Click Test Step

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804383291/e4e6dc10bb74d3b89774b368cf20/w%3D1190?expires=1782777600&#x26;signature=221da9c34cdf1dc8ee8c8045d2f5b65567be01bb86b6d69b8a6c0cc40b68f869&#x26;req=dSgnEsp2noNWWPMW3nq%2BgXlIiuKOcg9rHaQkaKAArannZrd23wxZNx7rFgrF%0AAHtZ9yGwAAe4KqNDM8cHyOJqhnQ%3D%0A" alt=""><figcaption></figcaption></figure>
2. Zapier will send a test email, Check your inbox to verify the email appears correctly
3. If the email looks good,, Review your input and output for the zap and click Publish

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804383631/c7a03002b52dcc7e1d239fb59f17/w%3D1210?expires=1782777600&#x26;signature=40691a55e6a5360a5fd21fdc92cd4309795c35dc7c8b821f123f1e2ff5d149f6&#x26;req=dSgnEsp2nodcWPMW3nq%2BgTjBxMRAMLgaAHB2rJBHbBQTPW7F00%2B7Boy1oPb%2B%0A%2BSSQdswRtPL3j28RuyOw84H2ZXQ%3D%0A" alt=""><figcaption></figcaption></figure>
4. Your Zap is now active!

***

### Available Triggers Reference <a href="#h_6c9c88b649" id="h_6c9c88b649"></a>

### Session Converted <a href="#h_4b21d5b0a9" id="h_4b21d5b0a9"></a>

When it triggers: When a user completes a conversion on a specific funnel you’ve configured in FullSession

What FullSession sends: Complete session data for the converted session, including user identification, traffic source, device information, and location data

Configuration Required:

* Site: Select which site to monitor
* Funnel: Select which specific funnel conversion should trigger this Zap

Data Fields Sent to Zapier:

| Field          | Type     | Description                         |
| -------------- | -------- | ----------------------------------- |
| uuid           | String   | Unique session identifier           |
| name           | String   | User’s name (if identified)         |
| email          | String   | User’s email (if identified)        |
| utmSource      | String   | Marketing source                    |
| utmMedium      | String   | Marketing medium                    |
| utmCampaign    | String   | Marketing campaign                  |
| GCLID          | String   | Google Click Identifier             |
| browser        | String   | Browser name                        |
| browserVersion | String   | Browser version                     |
| device         | String   | Device type (Desktop/Mobile/Tablet) |
| os             | String   | Operating system                    |
| city           | String   | User’s city                         |
| country        | String   | User’s country                      |
| countryCode    | String   | ISO country code                    |
| region         | String   | User’s region/state                 |
| referrer       | String   | Referring URL                       |
| startTime      | DateTime | Session start timestamp             |

***

### User Trend Alert Received <a href="#h_05c04f8a47" id="h_05c04f8a47"></a>

When it triggers: When a user trend alert you've set up meets its threshold conditions

What FullSession sends: Information about the alert configuration and the user trend metrics that triggered it, including current vs. previous period values

How it works:

You configure alerts in FullSession on specific segments in your User Trends chart. You set:

* Which segment to monitor
* Aggregation period (daily, weekly, or monthly)
* Threshold value and operator (greater than, less than, etc.)

When the metrics meet your threshold conditions, FullSession triggers this Zap and sends the alert data.

Configuration Required:

* Alert: Select which user trend alert should trigger this Zap (from your configured alerts in FullSession)

Data Fields Sent to Zapier:

<figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804387095/eab25e08336259fbb99bb3885b46/image.png?expires=1782777600&#x26;signature=3bf315e2f3983d57ef731da2a0cd99447876024197a0309615521cf87bf27b28&#x26;req=dSgnEsp2moFWXPMW3nq%2BgZa0XW3NXXkswpZ6p0RXPGX%2BkHsahzPmAVEg2ZKl%0Aa06%2BOIN548MUFjR9C7Qp1P6c1%2FM%3D%0A" alt=""><figcaption></figcaption></figure>


# FullSession with Segment

This article states the steps needed to integrate FullSession site with Segment

The FullSession integration with Segment allows you to install and enable FullSession on your website or app. With the click of a button, you’ll be able to capture sessions and send custom events and user traits from Segment to FullSession . This means no custom coding is necessary to get up and running, saving you time and development resources.

### Prerequisites: <a href="#h_023f1dfb0b" id="h_023f1dfb0b"></a>

* A Segment account
* A FullSession account
* Admin access to FullSession Account

Setting Up the Integration

Segment's *Destination Actions* allows more functionality and improves upon the existing process by enabling you to see and control how event data is captured and sent to action-based destinations. The actions available in Segment that can be mapped to FullSession's API are Identify User, Track Event, Viewed Page.

1. Log in to Segment, click Catalog, then click Destinations.
2. Find and Select FullSession , then click Add destination.

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804768522/217faae7403ee9a4a90157ede98e/w%3D1420?expires=1782777600&#x26;signature=1819829432a94f5b22bb4f4a17f0a952a3024563184e20ef9378b36f07fea56a&#x26;req=dSgnEs54lYRdW%2FMW3nq%2BgakW6uZbNmQ8%2FeBMcD1A82p7YOKnRxaNcrtXTv07%0A7Btrj2Iq4oEOZUd1n7rUBOYGazE%3D%0A" alt=""><figcaption></figcaption></figure>
3. Select the source site you want to add the integration to

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804768875/c241e1572582ada2a6514479255c/w%3D1420?expires=1782777600&#x26;signature=252d71311ef8e2802492d0701e05b1fd2b776f816175e40db8e6fb5acb7bce2b&#x26;req=dSgnEs54lYlYXPMW3nq%2BgXVhqHpbQNtWt80%2FcarssPjAuYBaeB40ySCcKY%2Fr%0AluwWyqs53339vKy5G9SA8hh1SQg%3D%0A" alt=""><figcaption></figcaption></figure>
4. Give the integration unique name

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804769193/19198f4fc3adfee3dbe9f2c6f21a/w%3D2000?expires=1782777600&#x26;signature=8b7e6f171ca259e8fb5774eb915091a37e0d8f3c8b3aed92a0c4c894d8988e6c&#x26;req=dSgnEs54lIBWWvMW3nq%2BgdNgGA7nHeGIwAwXZ35mUBlH28K8i0qgOFncNo65%0AL66VwQH1qm7Nt5nqFQ5vvJim0h8%3D%0A" alt=""><figcaption></figcaption></figure>
5. In the settings tap enter the customer ID (link to how to get the customerId) and toggle the enable destination

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804769511/9dafeb43e7f503d815b04cfc7c67/w%3D1420?expires=1782777600&#x26;signature=49b150e1a86d1825b833485b580445077ec579ed4e31df1691b5d8aaa6c494fd&#x26;req=dSgnEs54lIReWPMW3nq%2BgT3jk7eaMA9eA8Kc9d2dRLWYUYUmv75nXmFOw%2Fk0%0A%2FiiFBpqQfa%2Fyu1a7utgrytNNAFQ%3D%0A" alt=""><figcaption></figcaption></figure>
6. Don’t forget to save the changes

   <figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/1804769848/2729c67f06a0c98121394429ee4c/w%3D1420?expires=1782777600&#x26;signature=7cec0345f28255b6e1660ad4039e17fb51b8d8b8b63566cf619bbc9e31d74331&#x26;req=dSgnEs54lIlbUfMW3nq%2Bgb5JvCGHgnHr8FjZ6EoBABEavP7sXqJB%2FLw1WDHl%0AZdF5VukMaxYO806oFpVvPlC31dc%3D%0A" alt=""><figcaption></figcaption></figure>

And that’s it, now FullSession snippet code will be installed automatically into your source along with segment snippet code and all (Track, identify, Page) events that you configured in segment will be sent automatically to FullSession dashboard


# Integrating FullSession with Intercom

This article describes the steps needed to integrate FullSession with Intercom, allowing you to connect customer conversations with session recordings and enhance your support with FullSession insight

### What You Can Do with This Integration <a href="#h_e96c72117b" id="h_e96c72117b"></a>

* Watch session recordings — View all FullSession recordings for any contact directly in their Intercom profile
* Unified customer view — Intercom contacts and FullSession visitors are automatically matched as a single entity
* Smart filtering — Query and segment contacts based on FullSession activity (e.g., "contacts with sessions in the last 24 hours" or "contacts with 3+ sessions")
* Frustration detection — See rage clicks, dead clicks, and other frustration events directly in the contact profile

***

### How to Install <a href="#h_56a4e18bb1" id="h_56a4e18bb1"></a>

#### Step 1: Navigate to the Integrations page <a href="#h_6fa18ec1e1" id="h_6fa18ec1e1"></a>

Go to Settings → Integrations in your FullSession dashboard.

***

#### Step 2: Click Install <a href="#h_fdb2e0527d" id="h_fdb2e0527d"></a>

Find the Intercom integration and click Install.

<figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/2024188895/46e0d042a06f2741164e36cb820d/arrow-image.jpg?expires=1782777600&#x26;signature=7b2a156d14ee416354b8b12b292fda57642119869163f03de371f8160037e0fd&#x26;req=diAlEsh2lYlWXPMW3nq%2BgSFtmuG%2BX%2BDjibVltPHFn9p2tpgyuM9GDkBO5cbI%0Ays7QmrcxrPrD3xgS2iZvbGSykyk%3D%0A" alt=""><figcaption></figcaption></figure>

***

#### Step 3: Select your site and connect <a href="#h_3d4fe3e7c7" id="h_3d4fe3e7c7"></a>

Choose the site you want to connect with Intercom, then click Connect with Intercom.

<figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/2024190468/d95f8bed90544836176951e1e500/arrow-image+(1).jpg?expires=1782777600&#x26;signature=46b98d36702548537ce59a7262c073b654e17e93fcc452621cefa9d74f624588&#x26;req=diAlEsh3nYVZUfMW3nq%2BgQ6Ax7ysNVdaKIu0KRtGQ%2Fk%2BP9BW9CgcrNM0V8xf%0A9iuGSpE3LxL4iELPFmR9dDd%2Feb4%3D%0A" alt=""><figcaption></figcaption></figure>

***

#### Step 4: Authorize access <a href="#h_912769f9f3" id="h_912769f9f3"></a>

Log into your Intercom account and authorize the FullSession app to access your workspace.

<figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/2024192916/fddaba11bc12050f4ff04b56edb6/WhatsApp+Image+2026-01-29+at+00_36_10.jpeg?expires=1782777600&#x26;signature=eb9da902e4bc606e518d91bf2d892e356aaa16f335dfc7597aab8b3ef58c4841&#x26;req=diAlEsh3n4heX%2FMW3nq%2Bgfh2qkVYFoz%2FlgzgdvGdISry4LtkCDs3z2o0ojV4%0AGgY8rYoWQ7kfptP5tDcucEfxhnA%3D%0A" alt=""><figcaption></figcaption></figure>

***

#### Step 5: Confirm the connection <a href="#h_999f2cce99" id="h_999f2cce99"></a>

You'll be redirected back to the integrations page. Your site is now connected to Intercom.

<figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/2024194878/3cebdb897053145dfac7644bdad0/WhatsApp+Image+2026-01-29+at+00_36_23.jpeg?expires=1782777600&#x26;signature=03562af44857d5c20ef5f6e1d02e5b68ef96f41a13d617c354f0058fcee52779&#x26;req=diAlEsh3mYlYUfMW3nq%2BgVKqOhz2J9SD6Ij1kA4DbEBmyLWIeLKOie6haPyI%0AZ2YSbJz7AqSZE2Zq46O899Xtkyc%3D%0A" alt=""><figcaption></figcaption></figure>

***

### Important Note <a href="#h_69a219fe67" id="h_69a219fe67"></a>

To enable unified contact insights, make sure the email used for the Intercom visitor is the same email used for the FullSession visitor. This allows FullSession to correctly match users across both platforms.

***

### Features <a href="#h_e7657ea942" id="h_e7657ea942"></a>

#### Unified Contact Insights & Session Recordings <a href="#h_a8bad3d12f" id="h_a8bad3d12f"></a>

View all FullSession recordings linked to a contact directly within Intercom, and access the Intercom profile of any visitor from FullSession. Understand exactly what each user experienced before reaching out for support, with a complete view of their journey.

<figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/2024199284/7ecfe5895248380236d7a03bc1f8/arrow-image+(1).png?expires=1782777600&#x26;signature=fe175366ea4632dba4fb8d08bb3e87388eb5c3804bd997c5014d45daf4a8937d&#x26;req=diAlEsh3lINXXfMW3nq%2BgXByHaSEZt%2B0TPKH5WyAYhdmvmVMwQv9V0Gz9%2BCV%0AK7qRrXBf%2B%2FOjSeCdK91u0WxhcwU%3D%0A" alt=""><figcaption></figcaption></figure>

### Smart Contact Filtering <a href="#h_2753efa204" id="h_2753efa204"></a>

Query and filter your Intercom contacts based on FullSession activity:

* Sessions in last 24 hours — Target recently active users
* More than 3 sessions — Identify power users
* Frustration events detected — Find users who need help

<figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/2071832570/fe808b39b53826d2785f236ec863/WhatsApp+Image+2026-02-16+at+23_16_19.jpeg?expires=1782777600&#x26;signature=fac4566b13a1103fad66deeb433a6c660f3b73c993bb2229c4e3c191f4d992db&#x26;req=diAgF8F9n4RYWfMW3nq%2BgcgfXoGUINtDllJo71mpbfYQisKucBYje5XlIRLi%0APC1iXdm5dqe4EmvCaNaOpWKUKe4%3D%0A" alt=""><figcaption></figcaption></figure>

#### Frustration Event Detection <a href="#h_5d9877012b" id="h_5d9877012b"></a>

See frustration signals directly in the Intercom contact profile:

* Rage clicks — User clicked rapidly in frustration
* Dead clicks — User clicked on non-responsive elements
* Error clicks — User actions that triggered errors

<figure><img src="https://downloads.intercomcdn.com/i/o/nosi46ch/2071829943/eb8ccda00326da8b762ac78e0ba2/WhatsApp+Image+2026-02-16+at+23_16_48.jpeg?expires=1782777600&#x26;signature=ad6081177467207bfad161ef2aa2d9b8cdbab05ad14d41beb6a69aef73efa620&#x26;req=diAgF8F8lIhbWvMW3nq%2BgS7xQvidr6LEZ8aO7%2BrYsg5NeJPt6MKjpcE5ukGU%0AUdw%2FGUEaPyiwcc1KyMZgdqIJCEQ%3D%0A" alt=""><figcaption></figcaption></figure>


# 20. API & Developer Tools

FullSession exposes a small, focused **REST API** for pulling your session data into your own systems, authenticated with **API tokens** you generate in the app. This chapter covers creating and managing tokens, the one available endpoint, authentication, rate limits, and — importantly — where the API's boundaries are.

API tokens are managed under **Settings → API Tokens**, governed by the `api_tokens:view`, `api_tokens:create`, and `api_tokens:delete` permissions (\[Chapter 16 — Team & Account Management]).

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FRlb7HkLtgVWTml80zEBC%2Fimage.png?alt=media&amp;token=ff4ff559-3630-411b-aca2-eeeb50b01a11" alt="FullSession API Tokens settings page showing obfuscated tokens and the &#x22;Create New Token&#x22; action."><figcaption></figcaption></figure></div>

***

### 20.1 What the API Offers

Set expectations first: FullSession's public API is intentionally narrow. It provides **one read-only endpoint** — listing sessions for a site — authenticated by a token scoped to one or more of your sites.

It helps to know where the API fits among FullSession's three developer-facing surfaces, which are easy to confuse:

| Surface                                                   | Direction                   | Purpose                                    | Where it's covered                                                                                                                                                                                                                       |
| --------------------------------------------------------- | --------------------------- | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Tracker SDK** (`FUS.identify`, `FUS.event`, …)          | Browser → FullSession       | Send identity, events, and attributes *in* | [Chapters 3](https://claude.ai/epitaxy/local_f5f6ba49-6bd2-4e30-b58d-b88360e08610), [4](https://claude.ai/epitaxy/local_f5f6ba49-6bd2-4e30-b58d-b88360e08610), [7](https://claude.ai/epitaxy/local_f5f6ba49-6bd2-4e30-b58d-b88360e08610) |
| **Integrations** (Intercom, HubSpot, Optimizely, Zapier…) | FullSession ↔ third parties | Connect to specific tools                  | [Chapter 19](https://claude.ai/epitaxy/local_f5f6ba49-6bd2-4e30-b58d-b88360e08610)                                                                                                                                                       |
| **REST API** (this chapter)                               | FullSession → your code     | Pull session data *out*                    | This chapter                                                                                                                                                                                                                             |

> If you're looking to *send* data in, that's the **tracker SDK** (\[Chapter 3, section 3.5]). The REST API is only for *reading* session data out.

***

### 20.2 API Tokens

API tokens authenticate your requests. You can create multiple tokens, each scoped to specific sites.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FOVcR7xpgKsHEkws6gfS8%2Fimage.png?alt=media&amp;token=1e4c4230-3b69-4158-abc3-94170f521811" alt="FullSession token creation screen showing name, optional description, and site scope options for &#x22;All&#x22; or &#x22;Specific Sites&#x22;."><figcaption></figcaption></figure></div>

#### Creating a token

1. Click **Create New Token** (requires `api_tokens:create`).
2. Provide:
   * **Token name** *(required)* — must be unique.
   * **Description** *(optional)*.
   * **Permissions** — choose **All** (every site in your account) or **Specific Sites** (pick the sites this token may access).
3. Click **Create**.

#### Copy it now — it's shown only once

When the token is created, FullSession displays the full token value **once**, with the message *"You will only see the token ONCE, so make sure to copy it now."* Copy it immediately and store it securely. Afterward, the app only ever shows an **obfuscated** form (e.g. `fus_****abc`) — the full value can't be retrieved again.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F4GHItkJsaerdGLdc4inB%2Fimage.png?alt=media&amp;token=ab75cfee-5efa-42d1-8b68-22c9ef5253b6" alt="FullSession one-time token reveal showing the full API token value to copy, with only the obfuscated version visible afterward."><figcaption></figcaption></figure>

#### Token scope

Tokens are scoped by **site**, not by action:

| Scope              | Access                      |
| ------------------ | --------------------------- |
| **All**            | Any site in your account    |
| **Specific Sites** | Only the sites you selected |

> **Tokens are not granularly scoped.** There are no "read-only" vs. "write" or per-resource scopes — within its site scope, a token can call the available endpoint. (The API itself is read-only, so a token can only read sessions.)

#### Managing tokens

| Action                                 | Available?            |
| -------------------------------------- | --------------------- |
| **Create** multiple tokens             | ✅                     |
| **List** your tokens (obfuscated)      | ✅                     |
| **Delete / revoke** a token            | ✅                     |
| **Edit** a token's name/description    | ❌ Not supported       |
| **Regenerate** a token (keep the name) | ❌ Not supported       |
| **Expiration / TTL**                   | ❌ Tokens don't expire |
| **Last-used tracking**                 | ❌ Not tracked         |

> **Tokens are permanent until deleted, and don't expire.** Treat each token like a password. To "rotate" a token, **delete** the old one and **create** a new one, then update your integration with the new value. Deleting a token immediately revokes its access.

***

### 20.3 The Sessions API

The single public endpoint lists sessions for one of your sites.

#### Endpoint

```
GET /v1/external/sessions/{customerId}/{siteId}
```

* **`{customerId}`** — your account's Customer ID.
* **`{siteId}`** — the site to read sessions from (the token must be scoped to this site).

#### Authentication

Pass your token as a **Bearer** token in the `Authorization` header:

```
Authorization: Bearer fus_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

#### Query parameters

All are optional:

| Parameter        | Meaning                                                          |
| ---------------- | ---------------------------------------------------------------- |
| **`startTime`**  | Only sessions starting at/after this time (Unix milliseconds)    |
| **`endTime`**    | Only sessions ending at/before this time (Unix milliseconds)     |
| **`startAfter`** | Pagination cursor — pass the value returned by the previous page |

#### Example request

```bash
curl -H "Authorization: Bearer fus_xxxxxxxx..." \
  "https://<your FullSession API host>/v1/external/sessions/YOUR_CUSTOMER_ID/YOUR_SITE_ID?startTime=1717200000000&endTime=1717286400000"
```

#### Response

```json
{
  "data": {
    "startAfter": 1717250000000,
    "sessions": [
      { "...session fields (id, user, pages, duration, timestamp, …)..." }
    ]
  }
}
```

#### Pagination

* The endpoint returns **up to 1,000 sessions per request**.
* To page through more, take the **`startAfter`** value from the response and pass it as the `startAfter` query parameter on your next call.
* Repeat until `startAfter` is no longer returned (you've reached the end).

```
1. GET …/sessions/{customerId}/{siteId}?startTime=…&endTime=…
2. Read data.startAfter from the response
3. GET …?startTime=…&endTime=…&startAfter=<that value>
4. Repeat until no startAfter is returned
```

> **Tip** — drive bulk syncs by time window: page through a window with `startTime`/`endTime`, then advance the window. Keep each token's request volume within the rate limit (next section).

***

### 20.4 Rate Limits

The external API is rate-limited:

> **20 requests per minute** across the `/v1/external` API.

This limit applies to the external API as a whole (it isn't tracked per individual token), so coordinate your jobs if several processes share access. Build in backoff and pacing so a bulk sync stays under the limit — combined with the 1,000-sessions-per-request page size, 20 requests/minute is enough to move a large volume of sessions steadily.

***

### 20.5 What the API Doesn't Include

To plan integrations accurately, know the boundaries. These **don't exist**:

* **No other endpoints.** The only public endpoint is **list sessions** (section 20.3). There's **no API** for funnels, segments, segment stats, dashboards/cards, events, or full-text session search.
* **No programmatic data export.** CSV export is a **UI-only** feature (from dashboard cards, capped at 10,000 rows — \[Chapter 9, section 9.8]); there's no export-via-API.
* **No developer webhooks.** FullSession doesn't push events to your endpoints. Outbound automation goes through **Zapier** and the **Slack alert hook** ([Chapters 15](https://claude.ai/epitaxy/local_f5f6ba49-6bd2-4e30-b58d-b88360e08610) & [19](https://claude.ai/epitaxy/local_f5f6ba49-6bd2-4e30-b58d-b88360e08610)) — neither of which uses API tokens.
* **No granular scopes, token expiry, regeneration, or last-used tracking** (section 20.2).
* **No in-app API reference or public OpenAPI/Swagger spec.** Use this chapter as the reference for the available endpoint.

#### A note on the internal Dev Tools page

You may see a `Settings → Dev Tools` page referenced in the app. It's an **internal FullSession support/impersonation tool**, not a customer-facing developer feature — regular accounts don't have access to it, and it's unrelated to API tokens.

> **The big picture** — FullSession's API is small and read-only: generate a **site-scoped token** under **Settings → API Tokens** (copy it once — it's shown only once and never expires), then call the single **`GET /v1/external/sessions/{customerId}/{siteId}`** endpoint with `Authorization: Bearer fus_…`, paging via `startAfter` at up to **1,000 sessions per request** and **20 requests/minute**. For sending data *in*, use the **tracker SDK**; for tool connections, use **Integrations**; for automation, use **Zapier/alerts** — none of which are part of this API.

***

> **Next up:** \[Chapter 21 — Privacy, Security & Compliance] covers what FullSession records and how to control it — masking, excluded users, IP and recording rules, and data retention.


# 21. FullSession MCP Server

The **FullSession MCP server** lets an AI assistant — Claude Desktop, Cursor, or any MCP-compatible client — query your FullSession data directly in conversation. Instead of clicking through the app or writing API calls, you can ask *"which pages had the most rage clicks last week?"* or *"summarize what this user did before they dropped off,"* and your assistant fetches the answer from your live FullSession account.

MCP (Model Context Protocol) is an open standard for connecting AI assistants to external data sources. FullSession ships a hosted MCP endpoint, so there's nothing to install or run yourself.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FoFyxCNEfkZXF35jqlgfq%2Fimage.png?alt=media&amp;token=baef896a-8a1e-41c9-b691-c12068b57040" alt=""><figcaption></figcaption></figure>

***

### 21.1 What the MCP Server Is

The MCP server is a **query and action layer** over your FullSession account. Once connected, your assistant can:

* Search and summarize **session recordings**
* Analyze **heatmaps**, element interactions, and form performance
* Read **funnel** conversion and drop-off data
* Review **Lift AI** goals and recommendations
* Pull **site-wide health overviews** and group-by analytics
* Read **dashboards** and compute ad-hoc charts — metrics, trends, breakdowns, page rankings, feedback, and page flows
* **Create and manage** segments, funnels, saved heatmaps, dashboards, and charts

It sees the same data you see in the app, scoped to the same sites and permissions as your user account.

#### How it differs from the REST API

Both let you get data out of FullSession, but they suit different jobs:

|              | **REST API** ([Chapter 20](/api-developer-tools)) | **MCP server** (this chapter)                                              |
| ------------ | ------------------------------------------------- | -------------------------------------------------------------------------- |
| **Consumer** | Your own code                                     | An AI assistant                                                            |
| **Auth**     | API token (`Bearer fus_…`)                        | Your FullSession login, via OAuth                                          |
| **Surface**  | One endpoint (list sessions)                      | 48 tools across sessions, heatmaps, funnels, Lift AI, dashboards, and more |
| **Best for** | Pipelines, syncs, scheduled jobs                  | Ad-hoc investigation and analysis in conversation                          |

> If you want to *build* something on your data, use the REST API. If you want to *ask questions* about your data, use MCP — it exposes far more of the product.

***

### 21.2 Connecting Your AI Client

Connecting takes one URL and a browser login. There's no API key to copy or config file to hand-edit.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FIrCB1zPLLGsZLzENvglh%2Fimage.png?alt=media&amp;token=feef41c5-3590-4b70-a148-cc54c652aaa2" alt=""><figcaption></figcaption></figure>

#### Steps

1. In your MCP client (Claude Desktop, Cursor, etc.), open its **connectors / MCP servers** settings.
2. Add the FullSession MCP endpoint:

{% code overflow="wrap" %}

```
https://app.fullsession.io/mcp
```

{% endcode %}

3. The client will prompt you to authorize. A browser window opens to the **standard FullSession login**.
4. Sign in with your normal FullSession credentials — including **SSO**, if your organization uses it ([Chapter 18](/sso)).
5. Approve the connection. You're returned to your client, now connected.

#### What happens behind the scenes

FullSession implements **OAuth 2.1 with Dynamic Client Registration**, so your client discovers and registers itself automatically — you never paste a client ID or secret. Login is delegated to FullSession's existing identity provider, which is why SSO works out of the box.

Once authorized, your client holds a **short-lived access token** (refreshed automatically) tied to your user account.

> **Your login, your access.** The connection authenticates *as you*. It can reach exactly the sites your account can reach — no more. If you don't have access to a site in the app, your assistant can't query it either.

#### Verifying the connection

Ask your assistant to run **`whoami`**, or simply ask *"which FullSession sites can you see?"* It should return your email and the sites available to you — a quick confirmation that auth worked and that you're pointed at the right account.

***

### 21.3 Tool Reference

The server exposes **48 tools** grouped by area: **30 read tools** that query your data and **18 write tools** that create, change, or delete things in your account. You don't call these directly — your assistant picks the right one from your question — but knowing what exists tells you what you can ask for.

Write tools are marked in the tables below as **write** (adds something new or makes a reversible change) or **destructive** (deletes, or overwrites a definition with no way to recover the old one). See [section 21.5](#read-and-write-tools) for how they're safeguarded.

#### Identity & sites

| Tool                    | What it does                                                                                                                                                       |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **`whoami`**            | Returns the authenticated account and its accessible sites — useful for debugging auth                                                                             |
| **`list_sites`**        | Lists sites you can access, mapping each **URL → site ID**                                                                                                         |
| **`get_site_overview`** | A one-call health summary: sessions, unique visitors, average duration and page count, rage/dead/error click totals, and top landing pages, countries, and devices |

> **Multi-site tip** — if your account has several sites, name the site by its **URL** in your question. Your assistant will resolve it to the right site ID via `list_sites`.

#### Segments

| Tool                                 | What it does                                                                                        |
| ------------------------------------ | --------------------------------------------------------------------------------------------------- |
| **`get_segments`**                   | Lists your saved **segments** ([Chapter 11](/segments)) and the fields each filters on              |
| **`generate_segment_from_prompt`**   | Turns a plain-language audience description into a segment filter definition — a preview, not saved |
| **`create_segment`** *(write)*       | Saves a new named segment on a site                                                                 |
| **`update_segment`** *(destructive)* | Replaces a segment's title, description, and filters                                                |
| **`delete_segment`** *(destructive)* | Permanently deletes a segment                                                                       |

**`get_segments`** can filter by a name substring and returns up to **100 segments per page** with a cursor. Each segment is flagged if it can be used as the audience for `get_page_heatmap`, so heatmap numbers match what the dashboard shows for that segment.

**`generate_segment_from_prompt`** takes a description like *"mobile users from paid search who rage-clicked on checkout"* and returns a filter definition built with the same generator the app uses — it knows your site's custom events and attributes. Nothing is saved; you can review it, apply it in the segment builder, or pass it on to `create_segment`.

**`create_segment`** expects filters produced by `generate_segment_from_prompt` rather than hand-written ones. Before saving, it runs the real filter → query conversion and **rejects filters that don't resolve to anything**, so you don't end up with a segment that silently matches zero sessions.

**`update_segment`** is a **full replace**, not a partial edit — title, description, and filters are all overwritten. To rename a segment, your assistant re-sends the current filters from `get_segments`. **`delete_segment`** removes the segment permanently; any alert, dashboard, or Lift AI goal built on it loses that reference.

#### Sessions

| Tool                     | What it does                                                                         |
| ------------------------ | ------------------------------------------------------------------------------------ |
| **`search_sessions`**    | Finds sessions matching filters, with frustration-signal counts and **replay links** |
| **`get_session`**        | Fetches one session's metadata, signal digest, and a chronological **timeline**      |
| **`aggregate_sessions`** | Groups sessions by a dimension and returns a metric per group                        |
| **`get_user_sessions`**  | A cross-session profile for one identified user, plus their session history          |

**`search_sessions`** supports a rich filter set — browser, OS, device (Desktop/Mobile/Tablet), country, city, landing page, visited URL, referrer, user ID, email, session duration, page count — plus the frustration flags **has rage clicks / dead clicks / error clicks / JS errors / network errors / abandoned form**. Results can be sorted by **start time, duration, rage clicks, or errors**, and return up to **50 sessions per page** with a cursor for the next page.

**`get_session`** returns a summary and timeline by default (the cheapest answer to *"what happened here?"*), and can optionally include raw **pages, errors, clicks, network, forms, inactivity, custom events,** and **feedback** sections when you need detail.

**`aggregate_sessions`** groups by **country, city, device, browser, OS, landing page, exit page, referrer, or user**, and reports **session count, average duration, total rage clicks, total errors,** or **sessions with errors** — optionally **compared against the previous period**, so you can ask what changed.

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F6ReMmX9BnQw8ULYKQHG7%2Fimage.png?alt=media&amp;token=dc9f6fa5-89b4-4b8a-b307-de45936beb6f" alt=""><figcaption></figcaption></figure>

#### Heatmaps & clicks

| Tool                                 | What it does                                                                                                           |
| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------- |
| **`get_page_heatmap`**               | Aggregated interaction data for a page in **clicks**, **scroll**, or **movement** mode                                 |
| **`get_element_interactions`**       | Deep-dive one element (by CSS selector or visible text) — stats plus the sessions where it was rage/dead/error clicked |
| **`get_form_analytics`**             | Per-form impressions, completion, and abandonment rates                                                                |
| **`compare_pages_by_frustration`**   | Ranks pages site-wide by rage/dead/error clicks, with affected-session counts                                          |
| **`get_heatmaps`**                   | Lists your **saved heatmap views** — the page/device/segment/time-range combinations bookmarked in the app             |
| **`create_heatmap`** *(write)*       | Saves a page/device/segment/time-range combination as a named heatmap view                                             |
| **`update_heatmap`** *(write)*       | Changes one or more fields of a saved heatmap view                                                                     |
| **`delete_heatmap`** *(destructive)* | Permanently deletes a saved heatmap view                                                                               |

These mirror the heatmap features in [Chapter 8](/heatmaps), but in queryable form — `compare_pages_by_frustration` in particular is a fast way to ask *"where is my site hurting most?"* without opening a heatmap per page.

**`get_page_heatmap`** can be narrowed to a **device** and a saved **segment**; in **clicks** mode it ranks elements by frustration, in **scroll** mode it returns depth milestones and fold data, and in **movement** mode it returns mouse density zones and hotspots. **`get_element_interactions`** reports what share of the page's sessions interacted with the element and lists the sessions where it was rage/dead/error clicked, paginated with replay links. **`get_form_analytics`** works at the form level — field-by-field breakdowns aren't recorded.

Saved heatmap views are bookmarks, not data: **`get_heatmaps`** tells you what's saved, and your assistant computes the numbers with `get_page_heatmap` using the same page, device, segment, and window. **`create_heatmap`** takes a title, a page path (with `*` wildcards), a device (**desktop, tablet, or mobile**), a base segment (or **Everyone**), a time range — either a relative window like *"last 30 days"* or fixed start/end dates — and optionally a funnel to scope it to sessions that reached that funnel. **`update_heatmap`** is a **partial** edit: fields you don't mention stay as they are. **`delete_heatmap`** removes only the saved view; the underlying session data is untouched.

#### Funnels

| Tool                                    | What it does                                                                                   |
| --------------------------------------- | ---------------------------------------------------------------------------------------------- |
| **`list_funnels`**                      | Funnels on a site, with step names, base segment, and processing status                        |
| **`get_funnel_analysis`**               | Per-step users, drop-off, and median effort, plus overall conversion                           |
| **`get_funnel_sessions`**               | Sessions that **dropped at** or **converted through** a step, with replay links                |
| **`generate_funnel_steps_from_prompt`** | Turns a plain-language, numbered list of steps into a funnel definition — a preview, not saved |
| **`create_funnel`** *(write)*           | Saves a new funnel and starts its initial processing                                           |
| **`update_funnel`** *(destructive)*     | Replaces a funnel's name, base segment, and steps                                              |
| **`delete_funnel`** *(destructive)*     | Permanently deletes a funnel and its computed results                                          |

`get_funnel_analysis` can **break down** results by country, device, browser, or OS, or **compare saved segments** against the funnel's audience — the same analysis described in [Chapter 12](/funnels). `get_funnel_sessions` can also be narrowed to a saved segment; it works on single-session funnels.

**`generate_funnel_steps_from_prompt`** works best with **numbered steps**, each naming one thing that happened — *"step 1: visited /pricing, step 2: clicked Start trial, step 3: visited /thank-you"*. Steps can be page visits (exact or *"any page under /product/"*), clicks (including rage/dead/error clicks), form interactions, errors, or your site's **custom events** by their exact name, and can carry inline conditions such as *"when the device is mobile"*. By default all steps must happen in one session; it can also build **multi-session** funnels that follow a user across visits. It returns the step names for you to confirm, plus the definition to save.

**`create_funnel`** takes a name, a base segment (or **Everyone**), and the generated steps, plus optional default breakdown and up to **4 comparison segments**. Because it can only shape-check the steps, confirm the step order before saving. **`update_funnel`** is a **full replace** of name, segment, and steps. **`delete_funnel`** removes the funnel along with its precomputed results.

#### Lift AI

| Tool                              | What it does                                                                                  |
| --------------------------------- | --------------------------------------------------------------------------------------------- |
| **`list_ai_goals`**               | Your Lift AI goals, each with its latest conversion prediction                                |
| **`get_ai_recommendations`**      | A goal's recommendations — what to fix, rationale, page, step range, and predicted lift       |
| **`get_recommendation_sessions`** | The evidence sessions behind a recommendation, split by affected/unaffected and converted/not |

This makes Lift AI's findings ([Chapter 14](/lift-ai)) conversational — you can ask your assistant to summarize the top recommendations and explain the evidence.

**`list_ai_goals`** can filter by status, funnel, prediction confidence, or KPI, and flags goals with a run still in progress. **`get_ai_recommendations`** can be narrowed to a step range or a minimum predicted lift, and includes the latest run summary alongside each recommendation's 2×2 evidence counts. **`get_recommendation_sessions`** returns the sessions behind those counts, with replay links.

#### Dashboards & charts

| Tool                                       | What it does                                                                                 |
| ------------------------------------------ | -------------------------------------------------------------------------------------------- |
| **`list_dashboards`**                      | Dashboards you can see on a site, with their charts and grid layouts                         |
| **`get_dashboard`**                        | One dashboard's full definition — each chart's type, what it measures, and its position      |
| **`get_dashboard_data`**                   | Runs every chart on a dashboard for a time window and returns the numbers the app would show |
| **`list_cards`**                           | The site's **chart library** — every saved chart, whether or not it's on a dashboard         |
| **`get_metric`**                           | Computes a single number (total or average of a measure) — like a **metric** card            |
| **`get_trend`**                            | Computes a measure over time — like a **timeseries** card                                    |
| **`get_breakdown`**                        | Computes a measure grouped by a dimension — like a **breakdown** card                        |
| **`get_page_ranking`**                     | Ranks pages by views or load time — like a **pages** card                                    |
| **`get_feedback_snapshot`**                | Summarizes feedback sentiment and scores per widget — like a **feedback** card               |
| **`get_page_flow`**                        | Maps how users move between pages — like a **sankey** card                                   |
| **`create_dashboard`** *(write)*           | Creates a dashboard, optionally filled with new and/or existing charts in one step           |
| **`update_dashboard`** *(write)*           | Changes a dashboard's name, description, or privacy                                          |
| **`delete_dashboard`** *(destructive)*     | Deletes a dashboard — its charts stay in the library                                         |
| **`create_card`** *(write)*                | Saves a new chart to the library, optionally placing it on a dashboard                       |
| **`update_card`** *(write)*                | Changes a saved chart's title, description, type, or definition                              |
| **`delete_card`** *(destructive)*          | Deletes a chart from the library and from every dashboard showing it                         |
| **`add_card_to_dashboard`** *(write)*      | Places an existing library chart on a dashboard                                              |
| **`remove_card_from_dashboard`** *(write)* | Takes a chart off a dashboard — it stays in the library and on other dashboards              |

These tools cover the dashboards and charts described in [Chapter 9](/dashboards) and [Charts](/dashboards/charts). **`get_dashboard_data`** is the quickest way to ask *"what does my weekly KPI dashboard say?"* — it defaults to the last 7 days, or any window you name.

The six **ad-hoc chart tools** (`get_metric`, `get_trend`, `get_breakdown`, `get_page_ranking`, `get_feedback_snapshot`, `get_page_flow`) compute a chart on the fly **without saving anything**, so your assistant can answer a question — or preview a chart before adding it to a dashboard. They share one vocabulary:

* **Measures** — sessions, unique users, identified/anonymous users, events, active time, duration, pages per session, clicks, rage/dead/error clicks, page load time, abandoned forms, feedback counts, and error totals (all errors, or by kind: error logs, uncaught exceptions, unhandled rejections, XHR errors, response errors). Numeric measures can be aggregated as **sum, average, median, or a percentile**.
* **Dimensions** (for grouping) — browser and version, country, region, city, device, OS, screen size, page, landing page, exit page, referrer, user ID, clicked element (selector or text), and error details such as the error message or failing request's URL, method, and status.
* **Series** — optionally scope a chart to a subset of sessions (for example *device is mobile*, *country is Germany*, *landing page starts with /blog*), or define up to **5 named series** to compare side by side.

**`get_trend`** can add a **previous-period comparison** or split into one line per dimension value (top 5 by default, up to 50); it picks hourly/daily/weekly/monthly buckets automatically from the window length. **`get_breakdown`** returns up to **50 buckets**. **`get_page_ranking`** ranks any visited, landing, or exit pages by **most viewed** or **slowest**. **`get_feedback_snapshot`** shows current sentiment (**overview**) or sentiment over time (**trends**), for all feedback widgets or one ([Chapter 13](/feedback-surveys)). **`get_page_flow`** shows **2–10 journey steps** with **2–10 pages per step**.

**`create_dashboard`** can create a dashboard and place up to **15 charts** in one call — new charts, existing library charts, or both — and can make the dashboard **private** to you. Charts are laid out automatically on the dashboard's 3-column grid unless a position is given. Chart titles don't carry a time window, since the window is chosen when the dashboard is viewed.

A chart can sit on several dashboards at once, so edits and deletes behave differently:

* **`update_card`** changes the chart **everywhere it appears**. Only the fields you mention change, but a new chart definition replaces the old one entirely.
* **`remove_card_from_dashboard`** only takes the chart off one dashboard — reversible with `add_card_to_dashboard`.
* **`delete_card`** removes the chart from the library **and every dashboard**.
* **`delete_dashboard`** removes the dashboard but keeps its charts in the library.

***

### 21.4 What You Can Ask

The value of MCP is that you describe the question in plain language and let the assistant choose the tools. Some patterns that work well:

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FrjhOqZk1KEZ3UwtB8DIR%2Fimage.png?alt=media&amp;token=d49cc3f1-910b-4dd8-b51a-6c6a818fb102" alt=""><figcaption></figcaption></figure>

#### Triage and investigation

* *"Which pages had the most rage clicks in the last 7 days?"*
* *"Find sessions from mobile users in Germany that hit JavaScript errors yesterday."*
* *"Walk me through what happened in this session"* (paste a session link or ID)
* *"What did user <jane@example.com> do across her last few visits?"*

#### Analysis and trends

* *"Give me a health overview of my site for the past week."*
* *"Group last month's sessions by device and show how error rates changed vs. the previous month."*
* *"Rank my pages by dead clicks and tell me which ones affect the most sessions."*

#### Conversion work

* *"Show me the checkout funnel's drop-off by step, broken down by device."*
* *"Pull sessions where people dropped between step 2 and step 3, and summarize what they had in common."*
* *"Summarize my Lift AI recommendations and which have the highest predicted lift."*

#### Reporting

* *"What does my Weekly KPIs dashboard say for the last 30 days?"*
* *"Chart daily sessions by device over the last month, compared with the previous period."*
* *"Which landing pages are the slowest to load?"*
* *"Show me how visitors move through the site after landing on the home page."*

#### Building and managing

* *"Create a segment for mobile users from paid search who rage-clicked on checkout."*
* *"Set up a funnel: step 1 visited /pricing, step 2 clicked Start trial, step 3 visited /welcome."*
* *"Save a mobile heatmap of /pricing for the last 30 days."*
* *"Build me a dashboard with total sessions, errors by browser, and the top exit pages."*

Your assistant should show you what it's about to create or change and ask before saving — see [section 21.5](#read-and-write-tools).

#### Chaining is where it shines

The real advantage is multi-step work: an assistant can rank pages by frustration, pick the worst one, pull the element-level breakdown, then fetch and summarize a few affected sessions — a sequence that would take a dozen clicks in the app.

> **Tip** — results include **replay links** back into the FullSession app. When your assistant surfaces an interesting session, open the link to watch it yourself ([Chapter 6](/the-session-player)). Treat the assistant's summary as a fast triage layer, and the recording as the source of truth.

***

### 21.5 Limits, Safeguards & Privacy

#### Read and write tools

The MCP server includes both **read tools** (querying sessions, heatmaps, funnels, Lift AI, and dashboard data) and **write tools** (actions that create or modify data in your account). Write tools respect the same role-based permissions as the FullSession app — your assistant can only take actions your account is permitted to perform.

| Kind            | Tools                                                                                                                                                                                              | What to expect                                                                                         |
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| **Read**        | All `whoami`, `list_*`, `get_*`, `search_*`, `aggregate_*`, and `compare_*` tools, plus the two `generate_*` tools                                                                                 | Never change anything. The `generate_*` tools draft a definition but save nothing.                     |
| **Write**       | `create_segment`, `create_funnel`, `create_heatmap`, `update_heatmap`, `create_dashboard`, `update_dashboard`, `create_card`, `update_card`, `add_card_to_dashboard`, `remove_card_from_dashboard` | Add something new, or make a change that only touches the fields given or can be undone.               |
| **Destructive** | `delete_segment`, `delete_funnel`, `delete_heatmap`, `delete_dashboard`, `delete_card`, `update_segment`, `update_funnel`                                                                          | Delete data, or **fully replace** a segment or funnel definition — the old version can't be recovered. |

Every write tool's description tells the assistant that it changes data and to **confirm with you first**; destructive tools require that you've explicitly confirmed the specific item by name. Some clients add their own approval prompt before any write. Either way, read what your assistant proposes before you say yes.

#### Time windows

| Behavior           | Detail                                                                                                                                       |
| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------- |
| **Maximum window** | **90 days**. A longer request is automatically clamped to the most recent 90 days, and the response says so.                                 |
| **Default window** | Most tools default to a recent window (commonly the last 7 days; session search defaults to the last 24 hours) when you don't specify dates. |

If you want a specific period, say so in your question — *"in October"* or *"the last 30 days."*

#### Result caps and pagination

Tools return bounded pages rather than everything at once: **up to 50 sessions** per search page, **up to 50 groups** per aggregation (the remainder folded into an "other" bucket), **up to 100 segments** per page, **up to 50 buckets** per ad-hoc breakdown, and capped items per section when fetching a single session. Each response carries a cursor, so your assistant can page for more when it needs to.

These caps keep responses fast and readable — but be aware that a question like *"list every session this month"* will be answered in pages, not in one dump.

#### Access scope

Access is bound to **your user account**: your customer account and the sites you're permitted to see. There's currently **one permission scope** for the connection — a connected client can use all available tools, rather than a subset you choose per tool.

#### Managing connections

> **There's no in-app screen yet for viewing or revoking connected MCP clients.** If you need a connection revoked — for example, a device you no longer use — contact FullSession support. Disconnecting the server in your AI client also stops it from being used from that machine.

Note also that the MCP endpoint is **not** covered by the REST API's rate limit ([Chapter 20, section 20.4](/api-developer-tools)) — the two are separate paths.

#### Privacy considerations

Because MCP hands session data to an AI assistant, apply the same care you'd apply to any tool that reads production data:

* **Your masking rules still apply.** Data excluded or masked at recording time ([Chapter 22 — Privacy, Security & Compliance](/privacy-security-compliance)) was never captured, so it can't be surfaced here either. Masking is your first line of defense.
* **Session data can contain personal information** — emails, names, page content, custom attributes. Be deliberate about which assistants and workspaces you connect, and follow your organization's policy on sending customer data to AI tools.
* **Connect as the right user.** Because access follows your account, connecting from a highly privileged account grants the assistant broad reach. If your organization uses custom roles ([Chapter 16](/team-account-management)), consider connecting from an account scoped to the sites that actually need analysis.

> **The big picture** — the FullSession MCP server turns your account into a queryable and actionable interface for AI assistants. Connect once with your normal FullSession login (SSO included), and your assistant gains 48 tools spanning sessions, segments, heatmaps, funnels, Lift AI, and dashboards — bounded by a **90-day window**, paginated results, and your own site permissions. It's the conversational counterpart to the REST API: ask questions in plain language, get answers with replay links back into the app.

***

> **Next up:** [Chapter 22 — Privacy, Security & Compliance](/privacy-security-compliance) covers what FullSession records and how to control it — the masking and exclusion rules that govern everything the API and MCP server can surface.

***

<br>


# 22. Privacy, Security & Compliance

FullSession records real user sessions, so controlling **what** gets captured is essential. This chapter covers the privacy tools FullSession provides — masking and excluding content, IP and geolocation controls, excluding internal users, and managing the data you send — plus an honest account of FullSession's security posture and where your own responsibilities lie.

Most of these controls live under **Settings → Privacy Rules**, **Settings → Excluded Users**, and **Settings → Custom Attributes**, each gated by its own permissions (\[Chapter 16 — Team & Account Management]).

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FBJbmnzS4bxeHWc7R2NTk%2Fimage.png?alt=media&amp;token=f6b2b0b5-9d3a-452e-9b38-b1ddb5e0704c" alt="FullSession Privacy Rules panel showing element masking."><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FvuWCepG393jC3Xcr6hI3%2Fimage.png?alt=media&amp;token=9cf43abd-16bb-411b-aec0-8ea7e5c3cecd" alt="FullSession privacy settings showing IP collection, session length limits, and page recording rules."><figcaption></figcaption></figure></div>

***

### 22.1 What FullSession Records — and the Privacy Toolkit

FullSession's tracker reconstructs what a visitor saw and did: the page's DOM and styles, mouse movement, clicks, scrolls, navigation, console and network activity, and any identity, events, or attributes you choose to send ([Chapters 3](https://claude.ai/epitaxy/local_f5f6ba49-6bd2-4e30-b58d-b88360e08610)–[7](https://claude.ai/epitaxy/local_f5f6ba49-6bd2-4e30-b58d-b88360e08610)).

Because that includes whatever text is on the page, FullSession gives you controls to keep sensitive content out:

| Control                        | What it does                           | Where                                                                                                        |
| ------------------------------ | -------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| **Element recording rules**    | Mask or exclude specific page elements | Settings → Privacy Rules                                                                                     |
| **IP Address Collection**      | Stop collecting visitor IPs            | Settings → Privacy Rules                                                                                     |
| **Lon/Lat recording**          | Stop collecting precise geolocation    | Settings → Element Tracking                                                                                  |
| **Total session length limit** | Cap how long a session records         | Settings → Privacy Rules                                                                                     |
| **Page recording rules**       | Stop recording certain URLs            | Settings → Privacy Rules ([Chapter 7](https://claude.ai/epitaxy/local_f5f6ba49-6bd2-4e30-b58d-b88360e08610)) |
| **Excluded emails**            | Stop recording specific people         | Settings → Excluded Users                                                                                    |
| **Custom attributes**          | Review/remove the data you send        | Settings → Custom Attributes                                                                                 |

#### The Talk to User chat widget

If you use [Talk to User](/talk-to-user), the chat widget is recorded like any other element on the page. You'll see the chat panel replayed inside a session, and what a visitor types into it is captured by the recorder, subject to the masking rules in section 22.2. The conversation transcript is still kept separately with the conversation in the inbox. Two consequences worth knowing:<br>

<figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FSGWoJTja5WaHS7FXhugp%2Fimage.png?alt=media&amp;token=7e5caf76-7350-4d75-a9ca-5f9f1eedb461" alt="" width="347"><figcaption></figcaption></figure>

* Anything a visitor types into the chat — including personal details they volunteer — is captured in the session recording just like other page text, so make sure your masking rules (section 22.2) cover the widget if it collects sensitive fields. It's also kept in the conversation transcript, stored separately from the session.
* If you turn on **Ask for name and email before the first message**, you are collecting those details deliberately. Treat them as you would any other contact data you gather — and remember they may also appear in the recording since the widget isn't excluded.

> **The most important takeaway of this chapter:** by default, FullSession **masks all input fields** automatically — but it does **not** mask other on-page text. If your pages display sensitive data outside of input fields, you must add masking rules. Read the next section carefully.

***

### 22.2 Masking & Excluding Page Elements

**Element recording rules** are your primary privacy tool — *"Mask or fully exclude specific DOM elements so their content is never sent to FullSession."* You target an element by CSS selector and choose how it's treated.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2F8JTg2L77sq49tqLp6mKY%2Fimage.png?alt=media&amp;token=88698a2e-4f4d-4b5b-ba79-0f31549c38ce" alt="FullSession element recording rule showing a CSS selector with Exclude, Mask, and Unmask actions."><figcaption></figcaption></figure></div>

#### The three actions

| Action                       | Effect                                           | What's captured                                                               |
| ---------------------------- | ------------------------------------------------ | ----------------------------------------------------------------------------- |
| **Exclude element entirely** | The element is omitted completely from recording | Nothing — it isn't in the recording at all                                    |
| **Mask element**             | Text is hidden                                   | Text is omitted, but interactions and change events are still captured        |
| **Unmask element**           | The element is fully captured                    | All text, interactions, and change events — an exception within a masked area |

**Exclude** is the strongest (the element doesn't exist in the replay); **Mask** preserves the layout and interaction signals while hiding the actual text; **Unmask** is used to *re-enable* a specific element inside a broader masked region.

#### What's protected out of the box

FullSession ships with four **built-in, non-editable** masking rules that protect the most common sensitive fields automatically:

* `input` — all input fields
* `input[type=password]` — password fields
* `input[type=hidden]` — hidden inputs
* `[autocomplete*=cc-]` — credit-card fields

These can't be removed.

#### ⚠️ Non-input on-page text is captured by default

> **Input fields are masked automatically**, but **other on-page text is NOT masked by default.** FullSession captures text that visitors see on the page unless you add a rule. **If your pages display other sensitive information outside of input fields** — names, emails, addresses, phone numbers, account numbers, health or financial data shown as plain text — **you must add masking or exclusion rules for those elements.** Don't assume sensitive data outside inputs is hidden automatically.

#### Adding a rule

1. Go to **Settings → Privacy Rules → Element recording rules**.
2. Add a rule with:
   * **Selector** *(required)* — the CSS selector for the element(s), e.g. `.account-number` or `#ssn-field`.
   * **Action** — Exclude, Mask, or Unmask.
   * **Rule Exception Element Selectors** *(optional)* — selectors to *exclude from* this rule.
   * **Note** *(optional)* — context for your team.
3. Save. New rules apply to sessions going forward.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FComkHK5qEbsUMgH2wkBL%2Fimage.png?alt=media&amp;token=757a8304-d578-4a35-aea3-1a8f8fc159bc" alt="FullSession mask rule creation showing a sensitive field hidden while user interactions continue to be recorded."><figcaption></figcaption></figure></div>

#### Discovering elements to mask

If you're unsure which elements on your site may be exposing PII, the AI-powered **Suggest Rules** feature can scan a set of recorded sessions and propose selectors automatically — see \[Chapter 7, section 7.3] for how to start a scan and review suggestions.

> **Tip** — coordinate with engineering to add stable hooks (a class or `data-` attribute) to sensitive elements, and review masking after any site redesign so a markup change doesn't expose newly sensitive content. Masking is also covered from the configuration angle in \[Chapter 7, section 7.3].

#### AI Recommended Rules

If you're not sure which elements to target, the **Recommended Rules** tab (next to Element recording rules in Privacy Rules settings) can help. It scans a selection of already-recorded sessions with AI and proposes candidate selectors for elements containing likely PII — names, emails, payment data, government IDs, and more. Evidence previews are always redacted; no raw PII is shown. See \[Chapter 7, section 7.3] for how to review, accept, and dismiss recommendations.

***

### 22.3 IP, Geolocation & Recording Scope

#### IP Address Collection

A simple toggle controls whether IPs are stored: *"Choose whether visitor IP addresses are collected alongside session data."*

* **On** — IP and the geolocation derived from it are collected.
* **Off** — IP addresses are not collected. (Location detail that depends on IP is correspondingly reduced.)

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FzoeTY2gLdJFPBRynsPHp%2Fimage.png?alt=media&amp;token=6a24a865-1368-499e-8593-ff87165f10ea" alt="FullSession IP Address Collection setting showing the toggle to disable storing visitor IP addresses."><figcaption></figcaption></figure></div>

#### Precise geolocation (Lon/Lat)

Separately, under **Settings → Element Tracking → Data Recording Rules**, the **Lon/Lat Recording** toggle controls whether precise longitude/latitude coordinates are recorded. With it **disabled**, FullSession falls back to coarser IP-based location only.

The same panel includes a toggle for recording **frustration signals on short text elements**, letting you tune how much per-session detail is captured.

#### Limiting recording length

The **Total Session Length Recording Rule** caps how long a single session records: *"Set a maximum recording duration — sessions that exceed it are automatically stopped."*

* Toggle it on, enter a value, and choose **Seconds** or **Minutes**.
* The maximum is **2 minutes (120 seconds)**; the default is **no limit**.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FVvqBA5NDIdOPZoohZT1Q%2Fimage.png?alt=media&amp;token=4e4b8dc4-eb1a-4361-9d40-e26dbcc4a634" alt="FullSession session-length limit setting showing automatic recording stop after the configured session duration cap is reached."><figcaption></figcaption></figure></div>

#### Limiting which pages record

To keep entire pages out of recording (e.g. an account or admin area), use **Page recording rules** — covered in \[Chapter 7, section 7.2].

***

### 22.4 Excluding Internal Users

To keep your own team's testing out of your data, use **Excluded Users** (**Settings → Excluded Users**) — *"Block specific email addresses from being recorded — useful for excluding internal team traffic."*

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FPfMYPR5NmTlQ0cy6LALZ%2Fimage.png?alt=media&amp;token=98923855-88ac-4c61-b001-68bc8a7884ad" alt="FullSession Excluded Emails list showing email addresses that are excluded from session recording."><figcaption></figcaption></figure></div>

#### How it works

* Click **Add Email** and enter an address (e.g. `qa@yourcompany.com`).
* When a visitor is **identified** (\[Chapter 4 — Identifying Users]) with a matching email, their **entire session is excluded** from recording and processing — it's never sent, and doesn't count toward your quota.
* You can edit or remove entries at any time.

Exclusion is by **email**, so it relies on the user being identified with that email. For broader patterns, see how identification and exclusion work together in \[Chapter 4, section 4.4].

> **Exclusion happens at recording time and can't be undone.** An excluded session is never captured, so you can't retrieve it later. If you need to record your own sessions for debugging, remove yourself from the list temporarily.

***

### 22.5 Custom Attributes & Avoiding Sensitive Data

The **Custom Attributes** page (**Settings → Custom Attributes**) lets you *"View and manage custom properties passed via your JS snippet."* It lists every attribute you've sent through the tracker (\[Chapter 4, section 4.3]), with its name and type, and lets you **delete** ones you no longer want.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FYKmLynR41eU0pMnynCPy%2Fimage.png?alt=media&amp;token=52e555ea-46f4-4415-938b-58870e5a03b1" alt="FullSession Custom Attributes page showing site-sent properties with options to review and delete attributes that should not be collected."><figcaption></figcaption></figure></div>

#### A privacy checkpoint

Because attributes are data **you** choose to send, this page is a useful audit point:

* **Review** what's being sent — make sure no attribute is carrying sensitive PII it shouldn't (e.g. don't send raw government IDs or full payment details as attributes).
* **Delete** attributes that are unnecessary or were sent by mistake.
* Remember attribute **values must be strings** (\[Chapter 4, section 4.3]), and that whatever you send becomes searchable across the app — so send only what you genuinely need.

> **Tip** — keep identity to what you need (the built-in `name`/`email` on `identify`, plus a stable user ID), and avoid putting sensitive personal data into custom attributes or custom-event properties in the first place.

***

### 22.6 Data Retention & Deletion

#### How long sessions are kept

Recorded sessions are retained for a period determined by your **plan** (see \[Chapter 5, section 5.7] and \[Chapter 17 — Billing & Subscriptions]). Retention isn't a per-site setting you configure — it follows your plan.

#### Automatic clean-up

FullSession automatically removes sessions that have little value or have aged out, for reasons such as **no recorded events**, **missing page data**, a **deletion rule**, an **expired** session, or **manual deletion**. This keeps your data focused on sessions worth reviewing.

#### Deleting a specific person's data

> **There is no self-service "delete this user's data" / right-to-erasure button in the app.** If you need to erase a specific individual's recorded data (for example, to fulfill a data-subject request), this isn't something you can do yourself in the settings — work with FullSession to action it. Plan your processes accordingly.

***

### 22.7 Compliance & Security — and What's Your Responsibility

It's important to be clear about what FullSession **provides** versus what **you** must handle.

#### What FullSession provides

* **Privacy controls** — masking/exclusion, IP-off, geolocation-off, excluded emails, session-length and page limits (this chapter and [Chapter 7](https://claude.ai/epitaxy/local_f5f6ba49-6bd2-4e30-b58d-b88360e08610)).
* **Access security** — role-based access control ([Chapter 16](https://claude.ai/epitaxy/local_f5f6ba49-6bd2-4e30-b58d-b88360e08610)), **SSO/SAML** ([Chapter 18](https://claude.ai/epitaxy/local_f5f6ba49-6bd2-4e30-b58d-b88360e08610)), and an **audit log** of administrative actions (\[Chapter 16, section 16.6]).
* **Encryption** — customer data is encrypted in transit and at rest.

#### What FullSession does *not* provide (you handle these)

Be explicit with your own privacy/legal teams — the following are **not** built-in product features:

* **No consent-management / cookie-consent UI** inside FullSession. If your jurisdiction requires consent before recording, **gate the tracker yourself** — for example, only load the snippet (or fire the GTM tag) after the visitor accepts analytics consent (\[Chapter 3, section 3.2]).
* **No data-residency / region-selection** options.
* **No in-app DPA, privacy-policy, or consent-record** management.
* **No "Do Not Track" honoring, visitor opt-out widget, or automatic anonymization** toggle.
* **No self-service data erasure** (section 22.6).

> **Your responsibility checklist** — mask sensitive elements (22.2), decide on IP/geolocation collection (22.3), exclude internal users (22.4), avoid sending sensitive data as attributes (22.5), gate recording behind consent if required, and route any data-subject/erasure requests to FullSession.

> **The big picture** — FullSession gives you concrete tools to control capture: **Exclude/Mask/Unmask** element rules (with built-in protection for all input fields as well as password, hidden, and credit-card fields specifically — *non-input on-page text is captured unless you mask it*), an AI-powered **Suggest Rules** scan to help identify what needs covering, an **IP toggle**, a **Lon/Lat toggle**, a **session-length cap**, **page rules**, and **excluded emails**, plus a **Custom Attributes** audit page. Access is secured with **RBAC, SSO, audit logs, and encryption**. But consent management, data residency, anonymization, DNT/opt-out, and self-service erasure are **not** product features — so handle consent and data-subject requests through your own processes and with FullSession directly.

***

> **Next up:** \[Chapter 17 — Billing & Subscriptions] covers plans, member-seat limits, and the subscription controls referenced throughout this chapter.


# 23. Talk to User

**Talk to User** puts a live chat widget on your site and gives your team an inbox to answer it from. A visitor opens the chat bubble, asks a question, and the conversation lands in FullSession — where you reply, assign it, and close it when it's done.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FaPcIRyLRj10eiZqwkFuM%2Fimage.png?alt=media&amp;token=b51618b4-867e-490b-baa2-26da9c031985" alt=""><figcaption></figcaption></figure></div>

What makes it different from a standalone chat tool is what sits underneath it: every conversation is linked to the visitor's **session recording**. Instead of asking "can you describe what happened?", you watch the failed checkout, the rage-clicked button, or the form field that rejected them — then answer.<br>

> Talk to User is gated by permissions (viewing the inbox, replying, and changing the widget settings are separate). If you don't see an action described below, your role may not include it. See section 23.10.

***

### 23.1 How it works

There are two halves to the feature:

* **The widget** — a chat bubble rendered on your own site by the FullSession tracker you already have installed. There is no second script to add.<br>

  <div align="left" data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FjQPCMVDpMXpAgNE8IVzt%2Fimage.png?alt=media&amp;token=2a5a52bc-040c-4241-af6a-3756359e5d2f" alt="" width="293"><figcaption></figcaption></figure></div>
* **The inbox** — the **Talk to User** page in FullSession, where your team reads and answers what visitors send.<br>

  <div align="left" data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FMUoDnL0KFI1XfZwTxTcJ%2Fimage.png?alt=media&amp;token=57235c80-196e-42e8-b4a8-7f3256e47cae" alt="" width="563"><figcaption></figcaption></figure></div>

Messages travel live in both directions. A visitor sees your reply without refreshing, and a new visitor message appears in the inbox without you reloading the page.

The widget is recorded like any other element on the page: you'll see the chat panel replayed inside a session, and what a visitor types into it is captured by the recorder — subject to the same masking rules as other inputs ([Chapter 22](/privacy-security-compliance)). The conversation transcript is still kept separately in the inbox, so the same conversation is available both as a replay and as a transcript.

***

### 23.2 Turning the widget on

Go to **Talk to User → Widget settings**.

The **Chat widget** switch at the top of the page controls everything below it. Off is the default: no site shows the widget until you turn it on.

> Turning it off hides the widget everywhere immediately. **Existing conversations stay in the inbox either way** — nothing is deleted, and you can still read and reply to threads that were already open.

Settings are **per site**. If you have several sites in FullSession, switch to the site you want before changing anything — each one has its own widget, its own appearance, and its own conversations.

The settings page shows a **live preview** beside the form. It updates as you type, so you can see the effect of a colour or a title before saving.<br>

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FMsHXIKYjM0sQGviVRy4c%2Fimage.png?alt=media&amp;token=541ea027-b71a-4ec3-b1e9-56a066a9ab1b" alt=""><figcaption></figcaption></figure></div>

***

### 23.3 Appearance

Everything in this section controls how the widget looks to your visitors.

| Setting               | What it does                                                                            | Default        |
| --------------------- | --------------------------------------------------------------------------------------- | -------------- |
| **Logo**              | Your logo, shown beside the title in the chat header                                    | None           |
| **Header title**      | The heading at the top of the chat panel                                                | `Chat with us` |
| **Launcher position** | Which corner the chat bubble sits in — bottom right or bottom left                      | Bottom right   |
| **Accent colour**     | The launcher bubble, the header bar, and the visitor's own message bubbles              | `#4C6FFF`      |
| **Text colour**       | The foreground painted **on top of** the accent — header text, launcher icon, send icon | `#FFFFFF`      |

#### Logo

Drag an image onto the upload area, or click to browse.

* **PNG, JPEG or WebP**, up to **256KB**
* The logo applies **as soon as you pick it** — unlike the other fields, it isn't held until you press Save
* **Replace** swaps it, **Remove** clears it
* Leave it empty and the header shows the title on its own

The logo is displayed on a white plate in the chat header, so it stays legible whatever accent colour you choose.

> **SVG files aren't accepted.** An SVG can carry scripts, and the image is served back from a FullSession domain — so only raster formats are allowed.

#### Text colour is a separate setting on purpose

White text is unreadable on a pale brand colour. Rather than guessing, **Text colour** lets you set the foreground explicitly. If you pick a light accent, set a dark text colour to match.

***

### 23.4 The conversation

#### Welcome message

The first thing a visitor sees when they open the chat, before they've typed anything. Default: `Hi! How can we help?`

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FyRmglKsZ876SWDGs5vrD%2Fimage.png?alt=media&amp;token=e5612b78-ba41-4abc-8d98-b2100ba55d32" alt=""><figcaption></figcaption></figure></div>

#### Ask for name and email before the first message

Off by default. When on, the visitor is asked for their **name and email** before they can send anything.

* It's a trade-off: you get a way to follow up after they leave, at the cost of some people not starting a conversation at all.
* The email is validated before the chat opens.
* When it's off, visitors chat anonymously — you'll still see them identified if your site calls the tracker's `identify` method (see [Identifying Users](/identifying-users)).

***

### 23.5 Availability

By default the widget is **always available** and the away message never appears.

Turn on **Limit the widget to specific hours** to define a schedule:

* **Timezone** — the schedule is evaluated in **this** timezone, not the visitor's. A visitor in Tokyo asking at 09:00 their time sees the away message if your team in New York is asleep.
* **Hours** — set one or more windows per day. A day with no window is closed all day.
* **Away message** — shown in the chat header outside those hours. Default: `We're away right now — leave a message and we'll get back to you.`<br>

  <div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FpOsU4Tb1mZXWMqgUmqCv%2Fimage.png?alt=media&amp;token=7928dafa-2510-49f8-94bf-4f11c63c2864" alt="" width="353"><figcaption></figcaption></figure></div>

> **Visitors can still send messages when you're away.** The away message sets expectations; it doesn't disable the chat. Anything sent outside hours lands in the inbox exactly as it would during them.

***

### 23.6 Pages — where the widget appears

By default the widget appears on **every page** of your site. The **Pages** section narrows that.

Each rule is either **Show** or **Hide**, plus a URL pattern.

#### How the rules combine

1. **Any `Hide` match wins.** If a page matches a hide rule, the widget never appears there — regardless of any show rule.
2. **Adding any `Show` rule turns the widget into an allowlist.** From that point the widget appears *only* on pages matching a show rule.
3. **No rules at all** means every page.

So "everywhere except checkout" is a single `Hide` rule. "Only on pricing and docs" is two `Show` rules.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FdvzJ5FBstWdkxBOChpla%2Fimage.png?alt=media&amp;token=e660e45c-190d-4de4-a7a9-bf9eff790f24" alt=""><figcaption></figcaption></figure></div>

#### Writing patterns

Patterns are written the way you'd write your own URLs. All three of these mean the same thing:

```
https://shop.example.com/pricing
www.shop.example.com/pricing
/pricing
```

`*` is the only wildcard:

| Pattern            | Matches                                      |
| ------------------ | -------------------------------------------- |
| `/pricing`         | The pricing page exactly                     |
| `/pricing*`        | `/pricing`, `/pricing/teams`, `/pricing?x=1` |
| `/blog/*/comments` | A comments page under any blog post          |
| `*`                | Everything                                   |

***

### 23.7 The AI assistant (optional)

Off by default. When on, a visitor opening the chat is asked **"How would you like to chat?"** and can pick **Chat with our AI assistant** or **Talk to a person**.

<div align="left" data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FggdIfKZ8WeHurL0b3YkD%2Fimage.png?alt=media&amp;token=5f2e11e2-5e1e-4332-804c-4b4a846a0cf0" alt="" width="254"><figcaption></figcaption></figure></div>

#### What the assistant can answer

The assistant answers using **your own MCP server** — the tools you publish there are the only things it can look up. Order status, delivery policy, account details: whatever your server exposes, it can answer; anything else, it can't.

* **MCP server URL** is required, and must be **https**. Without one the AI option can't be turned on.
* The URL is validated when you save.

> See [FullSession MCP Server](/mcp-server) for background on MCP. The server configured here is **yours**, not FullSession's — it's how the assistant reaches your data.

#### Handing over to a person

A visitor is never trapped with the assistant. They can **ask for a person at any time**, and the conversation escalates into the normal inbox.

The handover is also automatic when it needs to be:

* If the assistant doesn't respond, the visitor is offered a person.
* If the assistant isn't available at all, the visitor is connected to a person.

#### In the inbox

AI replies are recorded in the transcript and clearly marked as coming from the assistant, **not** from a colleague. When an agent picks up an escalated conversation, they can see exactly what the visitor was already told.

***

### 23.8 What the visitor sees

* A chat bubble in the corner you configured, in your accent colour.
* Clicking it opens the panel: your logo and title, the welcome message, and a box to type in.
* Replies appear live, without a refresh.
* An unread count appears on the bubble if they've closed the panel and you've replied since.
* A discreet **Powered by FullSession** line at the foot of the panel.

The widget remembers a visitor's conversation across pages and across visits, so someone who returns the next day picks up the same thread rather than starting a new one.

If you close a conversation and the visitor writes again, the thread **reopens** — they aren't forced to start over.<br>

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FfzF9GoCt1o8P2lwk7qKn%2Fimage.png?alt=media&amp;token=e8ee0dd3-c9e5-4edb-85b5-baca580eccf0" alt=""><figcaption></figcaption></figure></div>

***

### 23.9 The inbox

**Talk to User** is a two-pane screen: conversations on the left, the selected conversation on the right.

#### Finding a conversation

Four tabs filter by status:

| Tab         | Shows                                                     |
| ----------- | --------------------------------------------------------- |
| **Open**    | Active conversations                                      |
| **Pending** | Ones you've parked — waiting on something before replying |
| **Closed**  | Resolved                                                  |
| **All**     | Everything                                                |

**Search** matches on visitor **name or email**.

Each row shows who it's from, a preview of the latest message, the status, and when it last moved. Conversations with messages you haven't read are marked with an unread count, and the list is ordered by most recent activity — a thread that just got a reply rises to the top.

#### Reading a conversation

The right pane shows the full transcript. Consecutive messages from the same sender within a few minutes are grouped together.

Alongside the messages you'll see **system notes** marking what happened to the thread — when it was assigned, closed, or reopened.

***

### 23.10 Replying and managing a conversation

#### Replying

Type in the box at the bottom and press **Enter** to send (**Shift + Enter** for a new line). Your reply appears in the transcript immediately and is delivered to the visitor live.

If a message fails to send it's marked **Not sent**, and you can retry it.

Messages are limited to **8,000 characters**.

<div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FPgmlKObY7XKCgddswmv8%2Fimage.png?alt=media&amp;token=57b88cf5-4cf4-4343-902d-93819c1894f5" alt="" width="563"><figcaption></figcaption></figure></div>

#### Assignment

The **first person to reply claims the conversation**. There's no queue to pick from and no assignment step before you can answer — replying is what assigns it, and a system note records who took it.

The transcript keeps showing who wrote each reply even if the conversation is reassigned later.

#### Closing and reopening

* **Close conversation** marks it resolved and moves it to the Closed tab.
* **Mark as pending** parks it without closing it.
* **Reopen** brings a closed conversation back.

> **Reopen isn't always available.** If the visitor has since started a newer conversation, their browser is bound to that one — anything sent to the old thread would never reach them. In that case Reopen is unavailable and you should reply on the newer conversation instead.

#### Watching the session

This is the part a standalone chat tool can't do.

* Individual visitor messages link to **the session that message was sent in** — a conversation resumed days later spans several sessions, so "watch what they were doing when they said this" is a different answer for different messages.<br>

  <div data-with-frame="true"><figure><img src="https://3931781085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjvxfJkYMGfMfN4qlzl0C%2Fuploads%2FIvwyfx1aeU4JouRpsZAn%2Fimage.png?alt=media&amp;token=ff34998f-cdeb-4bbe-81c6-aef3d07cae03" alt=""><figcaption></figcaption></figure></div>

***

### 23.11 Permissions

Three permissions control the feature:

| Permission             | Grants                                                                          |
| ---------------------- | ------------------------------------------------------------------------------- |
| `talk_to_user:view`    | See the **Talk to User** nav item and read conversations                        |
| `talk_to_user:respond` | Reply, assign, close, reopen, and delete conversations                          |
| `talk_to_user:manage`  | Open **Widget settings** and change anything on it, including the on/off switch |

Built-in roles get them as follows:

| Role      | view | respond | manage |
| --------- | ---- | ------- | ------ |
| **Owner** | ✓    | ✓       | ✓      |
| **Admin** | ✓    | ✓       | ✓      |
| **User**  | ✓    | ✓       | —      |

Like all FullSession permissions these are enforced **per site** — someone can answer conversations on one site and not see them on another. See [Team & Account Management](/team-account-management).

***

### 23.12 Limits & what it doesn't do

| Limit          | Value            |
| -------------- | ---------------- |
| Message length | 8,000 characters |
| Logo file size | 256KB            |
| Logo formats   | PNG, JPEG, WebP  |

**Not included today:**

* **No file attachments** — visitors and agents exchange text only.
* **No email notifications** when a visitor messages an offline team. Conversations wait in the inbox until someone opens it.
* **No canned replies or saved responses.**
* **No routing or assignment rules** — the first responder claims the thread; there's no round-robin or team-based routing.
* **No chat-specific reporting** — there are no built-in metrics for conversation volume, first-response time, or resolution time.
* **No visitor-facing help centre or article suggestions.**

> Talk to User covers the **live chat** use case. If you're using another tool primarily for chat, this replaces it; if you rely on that tool's help centre, product tours, or ticketing, those aren't part of this feature.

***

### 23.13 Related

* [Feedback & Surveys](/feedback-surveys) — one-way, single-question widgets for collecting structured feedback. Use those to *ask*; use Talk to User to *converse*.
* [Identifying Users](/identifying-users) — call `identify` from your site and conversations show a real name instead of an anonymous visitor.
* [The Session Player](/the-session-player) — where the "watch the session" links take you.
* [FullSession MCP Server](/mcp-server) — background on MCP, relevant if you enable the AI assistant.


# New Features

The latest features and improvements in FullSession.

### Talk to User: live chat, with the session behind it

*New · August 22, 2026*

**Talk to User** adds a live chat widget to your site and an inbox to answer it from — no second script to install, since it's drawn by the FullSession tracker you already have.

* Chat with visitors in real time; replies land without a refresh on either side
* Every conversation links to the visitor's **session recording** — watch what they were doing when they wrote, instead of asking them to describe it
* Match your brand: logo, header title, accent and text colours, launcher corner, with a live preview
* Control where it appears with **show/hide page rules**, and when, with **office hours** in your timezone
* Optionally offer an **AI assistant** backed by your own MCP server — visitors can ask for a person at any time

[Open Talk to User](https://app.fullsession.io/talk-to-user) · [Read the docs](https://docs.fullsession.io/talk-to-user)

### Suggest Rules: AI-powered masking suggestions

*New · August 20, 2026*

The new **Suggest Rules** button on **Settings → Privacy Rules → Element recording rules** helps Owners and Admins discover which page elements may contain PII, without having to inspect the DOM manually.

Select a set of already-recorded sessions, start an analysis run, and the agent scans DOM snapshots to find elements likely to hold sensitive data — names, email addresses, phone numbers, addresses, payment card data, and more. When the scan finishes, each proposed rule is listed with its suggested CSS selector, recommended action (mask or exclude), detected PII type, confidence level, and redacted evidence. Raw PII is never displayed. Accept, edit, or dismiss each suggestion individually, or use bulk **Accept all** / **Dismiss all**. Accepted suggestions become real element recording rules applied to new sessions going forward.

[Open Charts](https://app.fullsession.io/settings/privacy-rules) · [Read the docs](https://docs.fullsession.io/recording-rules-and-element-tracking)

### Charts: manage your chart library in one place

*New · July 30, 2026*

The new **Charts** page gives you a centralized library for building and managing reusable chart cards, independent of any specific dashboard:

* Browse and search all your charts in one paginated list
* Start from a chart template or build from scratch — using the same builder as Dashboards
* Edit a chart once and the update is reflected on every dashboard it appears in
* Delete charts with a confirmation that warns you of any dashboards affected

[Open Charts](https://app.fullsession.io/charts) · [Read the docs](https://docs.fullsession.io/charts)

### Conversion heatmap: funnel metrics per element

*New · July 29, 2026*

Heatmaps can now be linked to a funnel. When a funnel is attached, the **Top Elements report** gains three per-element columns:

* **Funnel finished** — how many sessions that interacted with this element completed the funnel
* **Funnel total** — total sessions that interacted with this element
* **Funnel conversion rate** — the share that went on to finish the funnel

This lets you answer *"which elements on this page are most associated with users completing my checkout (or onboarding, or sign-up) flow?"* — directly from the heatmap, without any cross-referencing. Set the funnel when creating or editing a heatmap.

[Read the docs](https://docs.fullsession.io/heatmaps)

### Meet the FullSession AI Assistant

*New · July 20, 2026*

Get instant answers about FullSession without leaving the app. The new AI assistant is backed by our product documentation and can:

* Explain features and concepts
* Guide you step by step through workflows
* Troubleshoot installation and tracking issues
* Recommend best practices for your setup

Open it any time from **Documentation** in the sidebar and ask in plain language — every answer links to the related documentation pages.

[Ask the AI assistant](https://app.fullsession.io/ai-help) · [Browse the documentation](https://docs.fullsession.io/)

### Dashboards: your metrics, your layout

*New · May 17, 2026*

The new **Dashboards** page lets you build fully customizable dashboards on top of your session data:

* Start from prebuilt, role-based templates or an empty canvas
* Combine metric, time-series, breakdown, pages and session cards
* Filter every card by segment, date range and device
* Drill down from any number straight into the sessions behind it

![Dashboards](https://docs.fullsession.io/~gitbook/image?url=https%3A%2F%2F3931781085-files.gitbook.io%2F~%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjvxfJkYMGfMfN4qlzl0C%252Fuploads%252Fu2VSjMMGpOQ3406vDkIZ%252Fimage.png%3Falt%3Dmedia%26token%3D00409463-78c1-4176-a03a-96af9f33f862\&width=768\&dpr=3\&quality=100\&sign=a87625e5\&sv=2)

[Read the docs](https://docs.fullsession.io/dashboards) · [Open Dashboards](https://app.fullsession.io/dashboards)


