Heatmaps and the page map
Verhalten › Seiten › a page opens the page map („Seitenkarte“): an image of your page (the snapshot, rebuilt in a sandbox without any of your page's scripts) with one layer of real behaviour on top. Every number comes from counted signals of real visits – nothing is estimated from a sample model.
Layers
| Layer | Shows | Built from |
|---|---|---|
| Klicks | Where people click, per element and as a density layer | click target, position relative to the element |
| Scrolltiefe | How far down people get; the fold of each device class | scroll depth and viewport height |
| Aufmerksamkeit | Where people stay (dwell time per band of the page) | scroll path every 500 ms, section visibility |
| Frust | Rage clicks (several fast clicks on one spot), dead clicks (no reaction), U-turns | derived in the browser from the clicks |
| Ranking | Elements by clicks, share, conversion rate of the clickers and lift (Wilson interval) | clicks joined to leads – leads count people, not events |
| Geld | Ad spend and cost per click on each element (money map) | clicks of paid visits × cost of the ad the visit came from; needs ads:read |
The device switch (Handy / Tablet / Desktop) changes the snapshot and the data together – phone clicks are never painted onto the desktop layout. Vergleich puts two segments side by side (for example converted vs. not converted, Meta vs. Google, version vs. version) and shows the per-element difference.
Minimum counts and suppressed cells
Heatmaps and every other aggregate follow two thresholds that you set in Einstellungen › Datenschutz & Erfassung:
- Mindestmenge (kMin, default 5; at least 3, at least 10 under the health preset): below it a
view shows „Zu wenig Besuche (n < k)“ instead of data. The API answers with
met: false; MCP tools say so in words. - Zellen unterdrücken (cellSuppress, default 3): single cells, elements or places with fewer visits are hidden from grids, rankings, reports and share links, and the view says how many were hidden.
The data basis label
Every view shows its basis next to the numbers, e.g. „Basis: 1.240 Besuche · solange nicht
abgelehnt“ or „… · nur mit Zustimmung“. It names the capture mode
the data was collected under, and when the range mixes modes (because the mode was changed) it says
so. Reports and MCP answers carry the same basis object.
Mass replay and the board
Abspielen („mode=play“) replays all visits of a page at once on the session clock: a density
band of where people are, the median scroll position, who is still there, click clusters, exits
per section and reached goals. The board does the same for the top pages of the project as
tiles with flow arrows between them; „+5“ adds more pages. Both need the minimum count per tile.
inapp=1 in the page URL (API: inapp=true on …/behavior/mass and …/behavior/board) plays only
visits from in-app browsers (Instagram/Facebook webviews); the in-app report links there.
Auf der Seite below the board plays the same visits on the page itself, synced to the clock: the click heat builds up until the current second, clicks of the last moments pulse at their position (rage clicks ◆ red, dead clicks ■ grey), pointer trails from recordings glow and fade over the last seconds, the left edge shows where everybody looks and a red line the deepest point so far; the camera follows the median visitor, a strip on the right shows the whole page. Each layer can be switched off. Seconds below the minimum carry no positions; pointer trails need the permission „Aufnahmen ansehen“ and at least the minimum of recorded visits in that second. Exportieren there records the play as a 12-second clip (MP4 where the browser can, else WebM) or the current moment as PNG, in 9:16, 4:5 or 1:1 with the X3 logo and basis line, to download or share.
Patterns („Claude-Muster“)
Above a playlist of recordings (for example „Abbruch im Quiz“) X3 shows the strongest pattern of that playlist, counted deterministically from the visits in it – „7 von 9 steigen bei Frage 4 „Jahresumsatz“ aus“, the most common rage-click target, the section most visitors leave from. Rules:
- shown only from kMin visits in the playlist; a pattern needs at least 30 % of them and 2 visits;
- the line names n and the data basis and links to the matching visits („Belege ansehen“);
- „Claude fragen“ opens Claude with a ready prompt that uses the MCP tools below.
GET /v1/projects/{project}/behavior/patterns?playlist=quiz_drop (scope analytics:read);
MCP behavior_patterns.
Reports
| Report | Where | API |
|---|---|---|
| In-App-Browser per ad: frust, dead clicks, fold and stuck WhatsApp/form paths of Instagram/Facebook webviews against normal browsers of the same ad, with the spend on those visits | Quellen & Kampagnen (ad drill-down); one ad with its visits, device split, recordings, mass replay of the in-app visits and fixes: Verhalten › In-App-Browser (/behavior/inapp?ad=…, the target of the behavior_inapp_friction alert) | GET …/behavior/reports/inapp (ad= adds detail: devices, systems, entry pages, visits) |
| Reibungskosten: ad spend on visits with rage/dead clicks, U-turns or abandoned forms; leads counted as people; also a section of the weekly mail („Reibung hat Dich diese Woche ≈ 340 € Klickkosten gekostet“) | Pulse, weekly mail | GET …/behavior/reports/friction |
| Wirkung einer Änderung: CTA clicks and leads in equal windows before and after a new page version or deploy marker („Seit der Änderung am 12.10. +31 % Klicks auf den CTA, +2 Leads“) | Nachlegen, page map | GET …/behavior/reports/change-impact?page=/software |
| Kundenbericht (agencies): the month's page map aggregates and money map, no single visits, cells below cellSuppress hidden; as a revocable share link | Cockpit, weekly client mail | GET …/behavior/reports/client?month=2026-09, share links under …/behavior/reports/shares; the link itself opens GET /v1/share/behavior/{token} (public HTML page, aggregates only, noindex, revocable) |
All reports explain what is missing instead of showing empty numbers: without a connected ad
account there is no cost („Ohne Meta-Kosten keine Klickkosten – Werbekonto verbinden“, with the
link to the connect wizard), mixed account currencies are converted into the project currency, and
members without ads:read see the behaviour without the money.
Alerts
The behaviour rules join the project's alerts. They open and close themselves from the current numbers (with hysteresis, so they do not flicker), reopen as „erneut aufgetreten“, and respect „Erledigt“ unless the problem gets clearly worse.
| Rule | Opens when |
|---|---|
behavior_dead_click_spike | an element collects clearly more dead clicks than in the previous week |
behavior_cliff_cta | on phones most visitors never scroll down to the main CTA (from the snapshot) |
behavior_deploy_drop | CTA clicks or leads drop after a new page version |
behavior_inapp_friction | an ad's in-app browser visits have much more friction than its normal-browser visits |
recordings_cap_reached | the daily recording cap was reached (UTC day) |
snapshot_blocked | the page image could not be taken for 30 minutes (bot wall, login) – ask for an owner capture |
recordings_no_consents | recordings wait for a consent nobody gives (the banner probably lacks the purpose) |
Reading the click heat
- The heat is scaled to the typical element (90th percentile of the click density), not to the single most clicked one: one big CTA no longer makes every other click invisible. Thin areas are lifted (square-root scale), so a single click stays visible; white points mark where people clicked.
- The five most clicked elements are outlined with their share and clicks (the top one in lime).
- Clicks on elements that are missing in the page image (changed page, quiz step, menu) are drawn at the position on the page where they happened.
- Elements clicked by fewer visits than the project's minimum (default 5) are never shown alone. Their clicks are pooled by place into zones that together have at least that many visits (soft blobs without an element outline); what stays below the minimum even then is left out.
Export and share
Exportieren above the map downloads the layer as PNG: the whole page, or the social formats 1:1 (1080×1080), 4:5 (1080×1350) and 9:16 (1080×1920) with the hottest part of the page, headline, legend, basis line and the X3 logo. Teilen opens the share sheet of the device with the image (where the browser supports sharing files), else it downloads it. The image only contains aggregates: the page as the crawler saw it (no visitor input), cells under the cell minimum are left out, the page path without query.
API and MCP
- REST (scope
analytics:read):GET /v1/projects/{project}/behavior/heatmap,/heatmap/image(PNG,format=page|square|portrait|story),/compare,/mass,/board,/elements,/sessions,/patterns,/reports/*; snapshots under…/snapshots. Every endpoint takes the common filter pluspage,bp(m/t/d) and segment parameters. - MCP tools:
behavior_heatmap(a zone table, never raw points),behavior_heatmap_image(the same layer as PNG image),behavior_elements,behavior_mass_replay,behavior_visits,behavior_patterns,behavior_report. Prompts:why_not_converted,page_review,ad_vs_landing,deploy_check. Results above 150,000 characters are compacted with a note.