Traffic quality
„Traffic-Qualität über Zeit“ answers how interested your visits are and whether that changes – in total and per source (Besucher › Qualität, the split „Interesse“ in Überblick and the Pulse card „Qualität Deiner Besucher“). It reads the relevance score of every visit and the Leads list: leads never come from the score. Counting words, channel groups, the measuring start and small-cell protection are explained in Visitors and traffic.
Tiers
One dictionary everywhere. Labels and bounds come from the project's relevance model; the defaults:
| Band key | Score (default) | Label | In sentences and on Pulse |
|---|---|---|---|
cold | under 10 | Nicht interessiert | not on Pulse |
curious | 10 to 29 | Neugierig | not on Pulse |
engaged | 30 to 59 | Interessiert | part of „ernsthaft interessiert“ |
hot | 60 and more, the score tier lead (90+) included | Heiß | „davon heiß“ |
engaged_plus | 30 and more | Ernsthaft interessiert | the headline number |
hot_plus | 60 and more | davon heiß | |
| Leads | the Leads list, attributed by the header model („Letzter Klick“ by default) | Leads (shop: Käufe) | Leads |
| Kontaktversuche | leadCounting.contacts | off by default | tooltip only |
- The lowest tier was called „Kalt“ before 22 October 2026; it is „Nicht interessiert“ everywhere now
(dashboard, app, CSV, reports, MCP). The API values never changed: the tier keys of the
relevance model stay
cold,interested,engaged,hot,lead, and the band keys of these routes arecold,curious,engaged,hot. A model that stored a former default label („Kalt“, „Interessiert“ for 10 to 29, „Engagiert“, „Lead“) shows the current words; own labels still win. - Two filters:
relevance_band=cold|curious|engaged|hot(exclusive bands from the model) and the olderrelevance_tier(a tier key of the model) – both next tomin_relevance. - Exclusive bands appear only in stacked and 100 % views, where they add up to the visits. Headline numbers, lines, Pulse and sentences use the cumulative values (30+, 60+). Tables use nested columns („Ernsthaft interessiert“, „davon heiß“) and never a separate „Interessiert“ column, because a hidden „davon heiß“ could otherwise be recovered by subtraction.
- The unit is always visits: „73 Besuche waren ernsthaft interessiert“.
- A change of the relevance model inside the range is annotated („Bewertung geändert am …“) and makes comparisons across it „Vergleich unsicher“.
Honest-chart rules
Shared by Pulse, Qualität, Überblick, the app and MCP. Thresholds are the QUALITY_* constants of
@3x/core/insights.
| Rule | Value |
|---|---|
| Axis start | the measuring start; today is dotted and left out of rolling sums |
| Day resolution | per series, only if at least 50 % of the daily buckets reach kMin |
| Rolling | 7-day sums from day 7 after the measuring start, labelled „gleitend über 7 Tage“ |
| Weekly | ranges over 90 days, or series that fail both rules above; lines only from 3 complete weeks |
| Shares | per day by default (week over 90 days or on request, rolling 7 days on request); your own dashboard draws every day as a 100 % bar, days under 30 visits pale, hidden parts as „< 3“ placeholders; published shares (API, MCP, CSV, reports, share links) keep denominator ≥ 30 visits and numerator ≥ cellSuppress |
| Small bands | if Heiß is under cellSuppress on more than half of the days, Interessiert and Heiß are drawn as one band „Ernsthaft interessiert“ with „Wöchentlich zeigen“ |
| Leads | exempt from kMin on your own dashboard; dropped under the health preset, in share links and reports |
| Dual axis | never: small multiples, or one axis for one unit |
| Comparative words | each source needs at least 30 visits per period |
Clients never smooth: web, app and MCP read rolling7 from the API.
The API
GET /v1/projects/{project}/traffic/quality?preset=14d
GET /v1/projects/{project}/traffic/quality?from=2026-10-15&to=2026-10-21&channel_group=paid
GET /v1/projects/{project}/traffic/quality?compare_by=channel&values=meta,google_ads,google_organic| Parameter | Meaning |
|---|---|
| filter | the analytics filter |
bucket | day (default up to 90 days), week, or rolling7 (day buckets, the rolling series as the primary view) |
with | leads (default) and/or contacts (Kontaktversuche) |
compare | previous (default) or previous_year |
compare_by | „Quellen vergleichen“: channel_group, channel, utm_campaign, ad, utm_source, utm_medium, entry_page, device |
values | 2 to 4 values of compare_by, comma separated |
| Field | Content |
|---|---|
meta | measuring start, today, kMin, cellSuppress, health preset, comparisonUnsafe, the tier bounds, labels and InfoTip |
stage | Q0 to Q5, see Stages |
series[] | per bucket: visits, published bands, sums (engaged_plus, hot_plus, curious_plus), leads, contacts, shares, day quality |
seriesMeta | per series the bucket actually used, the fallback reason and whether Heiß is merged |
rolling7[], blocks[] | rolling 7-day windows and complete 7-day blocks |
kpis | ernsthaft interessiert, davon heiß, leads, leads per 100 seriously interested visits, cost per seriously interested visit (ad sources only) – now and before |
ladder | the chain „Vom Besuch zum Lead“: visits › mindestens neugierig › ernsthaft interessiert › davon heiß, leads split off |
table | „Qualität nach Quelle“ with published cells and footer |
compare | Quellen vergleichen (with compare_by) |
change, headline_de | the change engine for engaged_plus and the h1 of the tab |
Every count is a published cell (value, suppressed, rounded, unsplit); read
Small cells before you compute anything from them. MCP:
traffic_quality; analytics_timeseries also accepts split=relevance_band.
Ladder
„Vom Besuch zum Lead“ is a real chain: each step is part of the step before (cumulative thresholds 10+, 30+, 60+), with absolute deltas and links to the visits behind it. Leads stand apart in a dashed tile „aus Deiner Leads Liste, nicht aus den Punkten“, because a lead is a person from your Leads list and not a score. In the first week the ladder replaces the chart.
Comparing sources
„Quellen vergleichen“ puts up to 4 values of one dimension side by side over time.
- Default: the top 3 values with at least 30 visits in the current period (in the same order on desktop and phone).
- A value with 30 visits in only one of the two periods can be added, and is drawn hollow; values under 30 in both periods are listed disabled with their reason („Zu wenig Besuche (7)“); a fifth value is disabled („Höchstens 4 Quellen“).
- A window under 30 visits is a hollow point with a dashed segment; a window with fewer than 3 seriously interested visits is a hatched marker at the baseline and no line.
- The comparison sentence appears only when every value has at least 30 visits in both periods. Otherwise the answer names why („Kein Vergleichssatz, weil … in den letzten 7 Tagen nur 9 Besuche hatte.“) and offers a swap back to the default set.
- Metrics: share seriously interested (default), share hot, leads per 100 visits, the count, cost per seriously interested visit (sources with ad costs), or all tiers of one source.
Table by source
„Qualität nach Quelle“ is a tree Kanalgruppe › Kanal › Kampagne › Anzeige with Werbung and Ohne Werbung on top. Columns: Besuche · Nicht interessiert · Neugierig · Ernsthaft interessiert · davon heiß · share seriously interested · change in points · Leads · Leads pro 100 ernsthaft Interessierte · cost per seriously interested visit · trend. Rows under 30 visits are not split („zu wenig Besuche“), free rows read „keine Werbekosten“ in the cost column, and the change reads „ab …“ while the comparison period lies before the measuring start.
Example (a sample project, one week, published values):
| Quelle | Besuche | Nicht int. | Neugierig | Ernsthaft int. | davon heiß |
|---|---|---|---|---|---|
| Werbung | 985 | 802 | 125 | 58 | ≈ 25 |
| › Meta | 976 | ≈ 800 | 121 | ≈ 55 | 25 |
| › Google Ads | 9 | – | – | – | – |
| Ohne Werbung | 197 | 125 | 57 | 15 | < 3 |
| › Direkt | 155 | ≈ 115 | ≈ 35 | 7 | < 3 |
Meta is rounded because Werbung minus Meta would otherwise reveal Google Ads' single interested visit; Werbung „davon heiß“ is rounded because Alle minus Werbung would reveal Ohne Werbung's „< 3“.
Stages
The Pulse card and the tab grow with the data (complete days since the measuring start):
| Stage | Condition | Pulse | Qualität tab |
|---|---|---|---|
| Q0 | no data, or relevance scoring off | no card | setup card |
| Q1 | under 7 days, or under 100 visits or under 10 seriously interested visits in the last 7 days | no card; one line in the Besucher block | from 3 days: daily bands and ladder |
| Q2 | 7 to 13 days, gates met | the ladder without deltas | bands per day, Heiß and Leads as totals |
| Q3 | 14 days and both periods ≥ kMin seriously interested | rows with deltas, rolling sparklines, sentence, source switch | rolling lines, compare |
| Q4 | 21 days | menu „Pro Woche“ | weekly lines, 100 % stack |
| Q5 | 42 days | sparklines with the usual band | usual band, anomaly dots |
Pulse card
pulse.get (MCP pulse_get) returns quality, the card „Qualität Deiner Besucher“: the stage, the
next stage date, the periods now and before, three rows – „ernsthaft interessiert“, „davon heiß“ and
„Leads pro 100 ernsthaft Interessierte“ (the Leads KPI card above already shows the lead count;
a plain Leads or Käufe row only appears without that card) – 8 rolling points per row, the change
sentence and the source switch „Alle | Werbung | Ohne Werbung“.
- A channel group is offered only with at least 30 visits and 10 seriously interested visits in both periods; at most 3 groups. Single channels are not offered on the card – use „… vergleichen ›“, which opens compare mode with the default set.
- The choice is stored per person on the server (preference
pulseQualitySource), so web and app show the same segment; a segment that falls under its gate falls back to Alle. - Counts open the visits behind them; the lead row opens the Leads list only with
leads:summary.
Related
- Visitors and traffic
- Relevance score
- Pulse and counting rules
- Leads – lead target and projection