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 keyScore (default)LabelIn sentences and on Pulse
coldunder 10Nicht interessiertnot on Pulse
curious10 to 29Neugierignot on Pulse
engaged30 to 59Interessiertpart of „ernsthaft interessiert“
hot60 and more, the score tier lead (90+) includedHei߄davon heiߓ
engaged_plus30 and moreErnsthaft interessiertthe headline number
hot_plus60 and moredavon heiß
Leadsthe Leads list, attributed by the header model („Letzter Klick“ by default)Leads (shop: Käufe)Leads
KontaktversucheleadCounting.contactsoff by defaulttooltip 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 are cold, 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 older relevance_tier (a tier key of the model) – both next to min_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.

RuleValue
Axis startthe measuring start; today is dotted and left out of rolling sums
Day resolutionper series, only if at least 50 % of the daily buckets reach kMin
Rolling7-day sums from day 7 after the measuring start, labelled „gleitend über 7 Tage“
Weeklyranges over 90 days, or series that fail both rules above; lines only from 3 complete weeks
Sharesper 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 bandsif 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“
Leadsexempt from kMin on your own dashboard; dropped under the health preset, in share links and reports
Dual axisnever: small multiples, or one axis for one unit
Comparative wordseach 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
ParameterMeaning
filterthe analytics filter
bucketday (default up to 90 days), week, or rolling7 (day buckets, the rolling series as the primary view)
withleads (default) and/or contacts (Kontaktversuche)
compareprevious (default) or previous_year
compare_by„Quellen vergleichen“: channel_group, channel, utm_campaign, ad, utm_source, utm_medium, entry_page, device
values2 to 4 values of compare_by, comma separated
FieldContent
metameasuring start, today, kMin, cellSuppress, health preset, comparisonUnsafe, the tier bounds, labels and InfoTip
stageQ0 to Q5, see Stages
series[]per bucket: visits, published bands, sums (engaged_plus, hot_plus, curious_plus), leads, contacts, shares, day quality
seriesMetaper series the bucket actually used, the fallback reason and whether Heiß is merged
rolling7[], blocks[]rolling 7-day windows and complete 7-day blocks
kpisernsthaft interessiert, davon heiß, leads, leads per 100 seriously interested visits, cost per seriously interested visit (ad sources only) – now and before
ladderthe 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
compareQuellen vergleichen (with compare_by)
change, headline_dethe 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):

QuelleBesucheNicht int.NeugierigErnsthaft int.davon heiß
Werbung98580212558≈ 25
› Meta976≈ 800121≈ 5525
› Google Ads9––––
Ohne Werbung1971255715< 3
› Direkt155≈ 115≈ 357< 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):

StageConditionPulseQualität tab
Q0no data, or relevance scoring offno cardsetup card
Q1under 7 days, or under 100 visits or under 10 seriously interested visits in the last 7 daysno card; one line in the Besucher blockfrom 3 days: daily bands and ladder
Q27 to 13 days, gates metthe ladder without deltasbands per day, Heiß and Leads as totals
Q314 days and both periods ≥ kMin seriously interestedrows with deltas, rolling sparklines, sentence, source switchrolling lines, compare
Q421 daysmenu „Pro Woche“weekly lines, 100 % stack
Q542 dayssparklines with the usual bandusual 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.