Documentation
Coming from another tool
Reading the reports
Count what matters
Machine access
Where they came from, decided by evidence.
Eleven channels with a strict order of proof, campaigns grouped by currency, referrers kept visible even when unknown, AI assistants as their own channel, Google's search terms beside them, and the Geo and Tech pair.
Channels: one verdict per visit
Every visit gets exactly one of eleven channels, decided once, from the visit's earliest event, so a paid click identifier on the landing page cannot put the same visit in paid and organic on the same day. The order of evidence is part of the contract:
- Paid signals beat organic referrers. An explicit paid medium or paid click evidence wins over where the visit appeared to come from.
- Assistant sources beat search. A visit from ChatGPT, Claude, Perplexity, Gemini, or Copilot is AI traffic, not search, and is classified ahead of it.
- Meta's sharing markers prove nothing by themselves. fbclid rides on organic sharing too, so it never makes a visit paid social without explicit paid evidence beside it.
- Direct is the final fallback, never a guess. An order without landing context reports as unattributed rather than direct, because empty evidence is not evidence of anything.
The rules live in code and are the same for every site, which is what makes two sites' channel reports comparable.
Campaigns
Campaigns groups visits by the utm_campaign their visit opened with, with untagged traffic kept as its own row rather than hidden. With the ecommerce module on, each campaign row carries net revenue attributed to that campaign by the orders' supplied context, grouped per currency, and a row limit is applied inside each currency separately so one alphabetically early currency cannot hide another.
Tag the addresses you send out with the campaign links builder: it offers exactly the five fields the collector reads, so nothing you compose is silently dropped.
The Terms and ad content table switches between utm_term and utm_content, with visitor days, pageviews, search and export. Select a campaign to narrow it, or select a term to apply that segment across reports. Empty values stay visible; imported counts keep their source. This table shows traffic for the selected range, and does not reconstruct traffic from order-only filters.
For Google Ads, utm_term={keyword} records the advertiser keyword Google matched when one is available. It is not the person's search query. Keywordless ads can leave it empty. Numeric campaign IDs stay IDs, and combined ad group, creative, match type and device tags stay one ad content value. Costs and Google Ads account data require a separate integration; adding a suffix does not supply them.
To send confirmed sales back to Google Ads, use Google Ads conversions under Tools. That export requires the order's raw GCLID and actual sale time from your commerce integration. UTM keywords describe the campaign; they cannot replace the click ID for a conversion import.
Referrers and AI traffic
The referrers report keeps the raw referring hostname, and where the catalog knows the host, adds who runs it and what kind of source it is. An unknown host stays visible as a referral rather than vanishing into other: the interesting referrer is usually the one nobody expected.
AI traffic has its own screen because it behaves like neither search nor social: an assistant sends few visits with unusual intent, and folding them into search would hide a channel that is growing under everyone. The privacy rule from the tracker applies here too: only the referring host is ever kept, never the path or query of the page somebody came from.
Search terms, from Google Search Console
Kehai keeps only the host a visit came from, never the rest of the address, so it cannot see what somebody typed into Google before they clicked. Google can. Connect the site's Search Console property and the Referrers screen gains a Search terms card: the queries Google sent you, with clicks, impressions, click-through rate, and average position, broken down by query, page, country, or device, over the same date range as the rest of the screen.
Three things to know before you read it:
- These are Google's numbers, in Google's definitions. A click is a click on Google's results page as Google counted it, an impression is a listing Google showed, and neither is a Kehai visit. The card says so in its header, and nothing on it is ever added to a figure above it. Expect the clicks to differ from the visits the referrer rows count: some clicks never load the page, some visits arrive without a referrer.
- Google runs about two days behind. A day is finalized around two days after it ends, so the newest days on the card are empty until Google publishes them. Kehai pulls once a day and re-reads the last three finalized days each time, so a day Google revises is replaced rather than counted twice. Google also cuts its days in Pacific time whatever your site's time zone, and Kehai stores the day as Google reports it.
- Position is where your listing sat, averaged over impressions. 1 is the top result. Kehai averages it the way Google does, weighted by how often the listing was shown, so a day with three impressions does not weigh as much as a day with three thousand. Google withholds rare queries from every report, so the rows never add up to the totals above them.
To connect, open Settings, then Search Console. Connect the Google account that can read the property: Google asks you to allow Search Console access and nothing else. Pick the property from the list Google answers with, and choose how far back the first pull reads: 90 days, 6 months, 12 months, or 16 months, which is as far back as Google answers at all. Kehai reads one day per request, so 90 days take a minute or two and 16 months about ten. A span longer than your site's retention is cut to the days that would stay, and the screen says so before you choose. You can widen the history later with Pull more history, which reads only the older days you do not have yet and never re-reads what is there. Country and device filters narrow the card. A page or channel filter does not apply to Google's rows, and the card says so rather than showing the whole site under a filtered heading.
With comparison on, the card compares the way every other report does: Google's window against Google's previous window of the same length, never against anything Kehai counted. Clicks and impressions change as a percentage, click-through rate in percentage points, and average position as a plain difference, where a fall is drawn as good because a lower position is a higher place on the page. Each row shows how its clicks moved, and a row Google did not report in the earlier window is marked new. Because Google finalizes a day about two days after it ends, a range that runs past the newest finalized day is compared up to that day, against the same number of days before it, and the card says which day Google's rows end on and how many days the comparison covers.
Geo and Tech
The audience pair. Geo answers countries, regions, and cities. Tech answers browsers, operating systems, and, under Window width, how wide the browser window was, in seven buckets whose bounds are real CSS breakpoints, so the answer reads straight into your stylesheet. The window, not the screen: somebody with a large monitor and the browser on half of it is a narrow reader, and the layout that has to work is the one they see. Days with no recorded width, imported history among them, are left out rather than counted as zero.
Both follow one honesty rule worth knowing: the ten visible leaders are never presented as the total. The headline above the table is computed over the complete population, ten thousand cities included, and the table pages and searches through the whole long tail rather than cutting it off where the screen ends. A country is stored as a code the intake derived and then the address was discarded. A city is as precise as it gets, and no more precise than that.