feat(analytics): retire Rybbit and add SEO/GEO discovery tracking
Document Umami as the sole analytics platform, remove Rybbit proxy and tracker code, and classify public page traffic with discovery_channel for adm SEO/GEO dashboards. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,142 @@
|
||||
import test from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import vm from 'node:vm';
|
||||
|
||||
import {
|
||||
appendDiscoveryPropagationParams,
|
||||
buildInlineDiscoveryResolverScript,
|
||||
classifyDiscoveryTrafficSource,
|
||||
DISCOVERY_QUERY_PARAM,
|
||||
DISCOVERY_SOURCE_QUERY_PARAM,
|
||||
} from './mindspace-analytics-discovery.mjs';
|
||||
|
||||
test('classifies common SEO referrers', () => {
|
||||
assert.deepEqual(
|
||||
classifyDiscoveryTrafficSource({
|
||||
referrer: 'https://www.google.com/search?q=demo',
|
||||
}),
|
||||
{
|
||||
discovery_channel: 'seo',
|
||||
discovery_source: 'google',
|
||||
referrer_host: 'google.com',
|
||||
},
|
||||
);
|
||||
assert.deepEqual(
|
||||
classifyDiscoveryTrafficSource({
|
||||
referrer: 'https://www.baidu.com/s?wd=demo',
|
||||
}),
|
||||
{
|
||||
discovery_channel: 'seo',
|
||||
discovery_source: 'baidu',
|
||||
referrer_host: 'baidu.com',
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
test('classifies common GEO referrers', () => {
|
||||
assert.deepEqual(
|
||||
classifyDiscoveryTrafficSource({
|
||||
referrer: 'https://chatgpt.com/c/abc',
|
||||
}),
|
||||
{
|
||||
discovery_channel: 'geo',
|
||||
discovery_source: 'chatgpt',
|
||||
referrer_host: 'chatgpt.com',
|
||||
},
|
||||
);
|
||||
assert.deepEqual(
|
||||
classifyDiscoveryTrafficSource({
|
||||
referrer: 'https://www.perplexity.ai/search/demo',
|
||||
}),
|
||||
{
|
||||
discovery_channel: 'geo',
|
||||
discovery_source: 'perplexity',
|
||||
referrer_host: 'perplexity.ai',
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
test('prefers explicit discovery query params for iframe propagation', () => {
|
||||
assert.deepEqual(
|
||||
classifyDiscoveryTrafficSource({
|
||||
discoveryChannel: 'seo',
|
||||
discoverySource: 'google',
|
||||
referrer: 'https://m.tkmind.cn/u/alice/pages/demo',
|
||||
pageHost: 'm.tkmind.cn',
|
||||
}),
|
||||
{
|
||||
discovery_channel: 'seo',
|
||||
discovery_source: 'google',
|
||||
referrer_host: 'm.tkmind.cn',
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
test('falls back to server referrer hint when browser referrer is same-origin', () => {
|
||||
assert.deepEqual(
|
||||
classifyDiscoveryTrafficSource({
|
||||
referrer: 'https://m.tkmind.cn/u/alice/pages/demo',
|
||||
pageHost: 'm.tkmind.cn',
|
||||
}),
|
||||
{
|
||||
discovery_channel: 'direct',
|
||||
discovery_source: 'direct',
|
||||
referrer_host: '',
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
test('appendDiscoveryPropagationParams only propagates seo or geo channels', () => {
|
||||
const seoUrl = appendDiscoveryPropagationParams('/u/alice/pages/demo?view=raw', {
|
||||
discovery_channel: 'seo',
|
||||
discovery_source: 'google',
|
||||
});
|
||||
assert.match(seoUrl, new RegExp(`${DISCOVERY_QUERY_PARAM}=seo`));
|
||||
assert.match(seoUrl, new RegExp(`${DISCOVERY_SOURCE_QUERY_PARAM}=google`));
|
||||
|
||||
const directUrl = appendDiscoveryPropagationParams('/u/alice/pages/demo?view=raw', {
|
||||
discovery_channel: 'direct',
|
||||
discovery_source: 'direct',
|
||||
});
|
||||
assert.equal(directUrl, '/u/alice/pages/demo?view=raw');
|
||||
});
|
||||
|
||||
test('inline discovery resolver matches server-side classification from referrer hint', () => {
|
||||
const result = vm.runInNewContext(
|
||||
`(${buildInlineDiscoveryResolverScript('https://www.google.com/search?q=demo')})()`,
|
||||
{
|
||||
URL,
|
||||
URLSearchParams,
|
||||
location: {
|
||||
hostname: 'm.tkmind.cn',
|
||||
search: '',
|
||||
},
|
||||
document: { referrer: '' },
|
||||
},
|
||||
);
|
||||
assert.deepEqual(JSON.parse(JSON.stringify(result)), {
|
||||
discovery_channel: 'seo',
|
||||
discovery_source: 'google',
|
||||
referrer_host: 'google.com',
|
||||
});
|
||||
});
|
||||
|
||||
test('inline discovery resolver reads propagated query params inside iframe', () => {
|
||||
const result = vm.runInNewContext(
|
||||
`(${buildInlineDiscoveryResolverScript('')})()`,
|
||||
{
|
||||
URL,
|
||||
URLSearchParams,
|
||||
location: {
|
||||
hostname: 'm.tkmind.cn',
|
||||
search: '?view=raw&memind_discovery=geo&memind_discovery_source=chatgpt',
|
||||
},
|
||||
document: { referrer: 'https://m.tkmind.cn/u/alice/pages/demo' },
|
||||
},
|
||||
);
|
||||
assert.deepEqual(JSON.parse(JSON.stringify(result)), {
|
||||
discovery_channel: 'geo',
|
||||
discovery_source: 'chatgpt',
|
||||
referrer_host: '',
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user