# Screens and clicks

- URL: https://getroomi.com/docs/screens
- Built: 2026-10-26

With a viewer's yes, the room can show you what they did inside your demo: the
screens they opened, in order and for how long, and what they clicked there.
This page covers who is asked and how, what is logged and what never is, how to
keep parts of your demo out of it, and how long it is kept.

Screens and clicks come with the Pro, Team and Enterprise plans. On Free the
app shows where they would be, with invented rows, and nothing is logged.
Heatmaps, scroll reach and funnels come with every plan that has screens and
clicks; export comes with Team and Enterprise.
Replays come with Team and Enterprise.

## Turning it on

Each project has a setting, **What viewers do in the demo**, in its
**Settings** tab: **Off**, or **Screens and clicks**.

Before it can be turned on, your workspace needs a privacy contact: an email
address where viewers can ask you about their data. The room shows it to every
viewer it asks. You give it once, in the same panel, and it serves every
project in the workspace. Once it is given, screens and clicks are on for every
project unless you turn a project off.

Whatever you choose, every viewer is still asked, and nothing is logged for a
viewer who says no.

From Claude, `demo_recording` reads the setting, and `set_demo_recording` and
`set_privacy_contact` change it, each rehearsing first and changing nothing
until you say yes.
`screen_heatmap`, `funnels` and `export_insight` read what is below, and
`set_funnel` and `delete_funnel` change your funnels, rehearsing first in the
same way ([MCP tools](https://getroomi.com/docs/mcp#screen-heatmap)).
`replays` and `replay_timeline` read the replays, and `delete_replay` deletes
one, rehearsing first ([MCP tools](https://getroomi.com/docs/mcp#replays)).

## What the viewer is asked

On a private link, the room asks before the viewer goes in, on the same page as
"Are you Priya?":

> **Can Northwind also see what you click in the demo?**
>
> - Yes — the screens I open and what I click
> - No thanks — I can still see everything in the room
>
> It helps Northwind see what interested you. You can stop at any time from the
> top of the room.

Neither answer is chosen for them, and they cannot go in without choosing one.
Below the two "Are you Priya?" answers, on a line of its own: "By entering,
you accept Roomi's viewer terms", with a link to how their data is
used. Someone who said who they were before the question existed meets it on
its own, under "Before you go in", before anything is logged.

You cannot change these words, choose an answer for the viewer, hide the
question, or require a yes to enter. That is deliberate: a yes that was not
freely given is not consent.

The question is asked once in each session, as "Are you Priya?" is
([Sessions](https://getroomi.com/docs/running#sessions)), and a no is not asked again in that
session. A yes given to an earlier wording is asked once more before anything
more is logged.

The room does not ask, and logs nothing inside the demo:

- when the viewer's browser sends Global Privacy Control or Do Not Track. The
  top of the room says "Clicks not shared (your browser asked us not to)";
- at a public Community address;
- in **Preview as viewer**, or in `roomi dev`.

## In the room

While a viewer is sharing, the top of the room says "Northwind sees your
clicks", next to their name, with **Stop** beside it. Stop takes effect at
once. **Stop, and delete what was recorded** also deletes what was logged of
their clicks on that link, from every visit, then and there. A viewer who said
no can share them later from the same place. You have no setting that hides
this control.

## What is logged

For each screen of the demo the viewer opens:

- the screen, by its path, and its title;
- when they opened it, how long it was in front of them, and how long of that
  they were using it;
- how far down they scrolled;
- which frame the room showed it in (phone, tablet, laptop or screen).

On each screen:

- **clicks**, by the element clicked: its role (a button, a link, a tab) and its
  label, as your demo names it. A burst of three or more clicks in one place
  within a second is a **rage click**. A click after which nothing on the page
  changed, the address did not change and no window opened is a **dead click**:
  "nothing changed on the page" is exactly what it measures;
- **fields**: that a field was used, how long, whether it was changed, and
  whether it was left empty;
- **forms**: that one was sent, and whether it was valid;
- that the viewer moved into a frame embedded in your demo, and nothing about
  that frame.

The labels, titles and paths are your demo's own words, and the app marks
them "reported by the demo".

### Once the viewer has typed

A demo often puts what a viewer typed back on the page: a to-do becomes a
button, a search term goes into the address, a name into the title. So once a
viewer has typed anything into your demo, on that page or an earlier one, no
words that appeared after it are taken as yours:

- an element added or changed after typing is logged with no label, and its id
  and classes are left out of where it is;
- the page's title is not kept if it changed after typing;
- a part of the address the page never showed or linked to before typing is
  kept as `:text`, so `/search/acme` becomes `/search/:text`;
- on a page loaded after typing, none of its words are kept, only the screens
  the demo showed or linked to before it.

A static build gets one thing back. When a viewer clicks something drawn
after they typed, or on a page loaded after it, or opens a screen whose title
changed, the script sends no words: it sends a fingerprint of each one, made with a random key for that
screen view. Roomi's platform fingerprints every word in your
build's own files (its HTML, JavaScript and text files) with the same key, and
keeps the label only if every word in it is one of yours, spelt from your
files. A word the viewer typed is kept only if your build already has it, and
a fingerprint that matches none of your words is thrown away. A demo that runs
in a container has no files we read, so nothing it draws after typing is ever
named.

To keep a name for something your demo draws after typing, give it one
yourself: `data-roomi-label="Add task"` on an element, and
`data-roomi-screen` for a screen (below). Those are always kept, as you wrote
them, so never put what a viewer typed in them.

What your demo reports is your demo's own code. The script never reads a
field, but a demo written to copy what was typed into a label, or to post its
own messages to the room, can put it there. Don't: the terms you accept as a
publisher forbid a demo that keeps or sends what viewers type.

## What is never logged

These are rules no setting turns off:

- what is typed into any field, its length, or which keys were pressed;
- password fields, card fields (`autocomplete="cc-…"`) and one-time codes: not
  even a click or a focus on them;
- the clipboard, or what is selected;
- a query string, or a fragment that is not a route (`#/settings` is kept,
  `#section-2` is not);
- anything from another origin, including frames inside your demo;
- the viewer's network address, browser or location.

The script that does it reports only to the room. It never talks to
Roomi's platform, and the room checks every message before anything
is kept.

## Leaving parts of the demo out

Two attributes, in your demo's own markup:

- `data-roomi-mask` on an element, or anything around it: its clicks are still
  counted, but its label is never kept, and the app shows it as hidden.
- `data-roomi-ignore`: nothing at all is logged on it or inside it.

To name a screen yourself, rather than by its path or the page's title, put
`data-roomi-screen="Pricing"` on an element of it. To name an element, put
`data-roomi-label="Download tariff"` on it.

Without touching the demo, you can give CSS selectors in the setting's **Parts
of the demo to leave out**: one list to hide the words on, one to log nothing
on. Masks can also go in pitch.json, under `privacy.mask`, so they travel with
the build; the app shows them, and adds its own.

## Heatmaps and scroll reach

**Analytics**, **Clicks**, **Heatmap** draws where viewers clicked on one
screen, over Roomi's own picture of it: the more clicks in a place,
the stronger its mark, and a dead click has a mark of its own. Choose the
screen, the build, the device (**Phone**, **Tablet** or **Computer**) and the
range. Beside the picture:

- **Most clicked on** the screen: its elements, ranked, the top five numbered
  on the picture;
- **How far down they read**: of the viewers who opened the screen on that
  device, how many reached a half, three quarters and the bottom of it.

The marks are counts of clicks in small areas of the page, with how many
viewers made them; no single click, and nobody's name, is drawn. A click is
drawn only over a picture taken at the same width as the page it was made on,
so a phone's layout never lands on a computer's. The clicks that cannot be
drawn are still in the ranked list, and the app says how many there are and
why: made at another width, below the bottom of the picture, or logged before
widths were kept.

**Each click**, **Rage and dead** and **Table** are the same clicks as lists.
**Table** can show **Across builds**: each element by its role and label, with
its clicks in each of your ten newest builds, so you can see whether the same
button is still being clicked in vain. An element with no label, or a hidden
one (`data-roomi-mask`), is never matched across builds; it stays in each
build's own list.

## Pictures of each screen

The pictures are taken in your own browser, in **Preview as viewer**: each
screen you open there is pictured from its top, at the width the preview lays
it out at, once the page has settled. The preview says so while it does it. A
picture is never taken in a viewer's browser. Each is filed under the member
whose preview took it, and Preview as viewer logs nothing else about you.

- The demo's fields are drawn empty in the picture, whatever you typed into
  them in your preview.
- Only the build the preview shows is pictured, so nothing is pictured for a
  build until someone previews it.
- Each device is its own picture: choose the phone frame in the preview to
  picture a screen for phones.
- To take a screen again, open it again in a preview an hour or more after its
  last picture: the newest picture of a screen at that width replaces the one
  before. Within the hour, the picture already taken stands.

It is a drawing of the page, not a screenshot of your screen, so a canvas, a
video or a frame from another site can come out blank. A demo whose
Content-Security-Policy refuses the room's script from `'self'` is not
pictured at all. With no picture of a screen, the heatmap shows its ranked
list alone, and says how to take one.

Pictures are shown only to your workspace, each fetched by its own id, and
never at an address anyone else can open.

## Funnels

A funnel counts how many viewers went through steps you choose, in order,
within one visit. **Analytics**, **Funnels** shows each step: how many reached
it, their share of those who started, how many went no further, and the
median time to the next step; for those who stopped, where they went next and
who they are.

A step is one of:

- a screen of the demo, by its path or its name;
- an element on a screen, by its role and label, so a funnel still counts
  after a rebuild changes its classes (an element with no label cannot be a
  step);
- a step of the [tour](https://getroomi.com/docs/story);
- a next step a viewer chose at the end.

Each viewer counts once, at the furthest step any of their visits reached. A
funnel with a screen or an element in it counts only the visits where the
viewer said yes to sharing their clicks; one made only of tour steps and next
steps counts every visit, since those are the room's own events.

When the live build has a tour of two or more steps, **The tour** is a funnel
already made for you. **Edit steps** on it saves a copy as a funnel of your
own. Pro has 3 funnels in each project, and Team and
Enterprise have no limit; the tour's funnel does not count.

Saving or deleting a funnel shows what it would count first, and changes
nothing until you confirm.

## Export

On Team and Enterprise, **Export (CSV)** on **Screens**, **Clicks**, **Table**,
**Fields** and **Funnels** downloads that table as a spreadsheet file, for one
build. An export is counts under your demo's own labels: it has no column
naming a viewer. A label that starts with `=`, `+`, `-` or `@` is written with
an apostrophe in front, so a spreadsheet shows it as text and never runs it.

## Replays

On Team and Enterprise, a visit's replay lays out the screens the viewer
opened and what they clicked there, in order and in time, over
Roomi's own pictures of the build. It is drawn from the screens and
clicks above. Nothing more is captured for it: there is no video of the
viewer's screen, and what they typed is never in it. Where they used a field,
the replay marks the field "used · not recorded". Time they spent on the
room's pages, on their phone, or with the demo out of sight is shown as not
recorded, and idle time is skipped.

Open one from the viewer's visit, **Replay visit**, or from **Analytics**,
**Replays**. A picture cannot show a hover or a menu that was open, and a
screen with no picture at the viewer's width is shown as a plain panel with
its events.

A replay opens for 30 days from the visit on Team and
90 days on Enterprise, then no longer. A replay
past its time does not come back, even after a change of plan.

**Delete this replay** deletes it for everyone in your workspace, and anyone
who can change the room's settings can do it. It deletes the replay, not the
visit: the viewer's screens and clicks stay in their journey for the rest of
their 12 months. A viewer who chooses **Stop, and delete what was recorded**
in the room leaves no replay at all.

## If it logs nothing

The room adds its script to each page of your demo from the demo's own origin,
as it does for the tour. A Content-Security-Policy of your own that does not
allow scripts from `'self'` blocks it, and nothing inside the demo is logged.

Nested frames of the demo's own origin are not logged yet, and nor is a demo
opened on a phone outside the room.

## How long it is kept

- Each viewer's screens and clicks are kept for 12 months from the visit, then
  counted into daily totals per screen and per element, which name nobody, and
  deleted. Your plan's history window only hides them sooner.
- When a viewer asks from the room, theirs on that link are deleted at once.
- When you delete a project, its screens and clicks, totals included, are
  deleted within 30 days.
- The record of what each viewer was asked and what they answered is kept for
  two years.
- Pictures of the screens are kept with the project and deleted within 30 days
  of your deleting it.
- A replay opens for 30 days from the visit on Team and
  90 days on Enterprise, unless you delete it
  sooner ([Replays](#replays)).

Where a visit has none, its journey says "Clicks not recorded on this visit",
never why. See [Analytics and the pipeline](https://getroomi.com/docs/analytics#activity-and-journeys)
for where screens and clicks appear, and [Security and
privacy](https://getroomi.com/docs/security#about-your-viewers) for what the platform holds.

> [!NOTE]
> Every workspace starts on Free, and moves to Pro or Team whenever you like, in Settings, Billing. Sign in at app.getroomi.com with GitHub or Google, then add the connector to Claude at https://mcp.getroomi.com/mcp, or run the CLI with npx @getroomi/cli. These pages describe the connector, the CLI, pitch.json, the app and the room as they are.
