From 21b56d29224f91d2a765aab292fadebd764a329a Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Mon, 11 May 2026 10:31:04 -0700 Subject: [PATCH] add LLM channel logic --- public/intl/messages/en-US.json | 1 + src/components/messages.ts | 1 + src/lib/constants.ts | 11 +++++++++-- src/queries/sql/getChannelExpandedMetrics.ts | 5 +++++ src/queries/sql/getChannelMetrics.ts | 5 +++++ src/queries/sql/reports/getRevenueMetrics.ts | 5 +++++ 6 files changed, 26 insertions(+), 2 deletions(-) diff --git a/public/intl/messages/en-US.json b/public/intl/messages/en-US.json index 59093a073..48a66f895 100644 --- a/public/intl/messages/en-US.json +++ b/public/intl/messages/en-US.json @@ -180,6 +180,7 @@ "links": "Links", "location": "Location", "login": "Login", + "llm": "LLM", "logout": "Logout", "manage": "Manage", "manager": "Manager", diff --git a/src/components/messages.ts b/src/components/messages.ts index d600985db..e7fdad7e4 100644 --- a/src/components/messages.ts +++ b/src/components/messages.ts @@ -307,6 +307,7 @@ export const labels: Record = { affiliate: 'label.affiliate', email: 'label.email', sms: 'label.sms', + llm: 'label.llm', organicSearch: 'label.organic-search', organicSocial: 'label.organic-social', organicShopping: 'label.organic-shopping', diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 238897499..65220b1fb 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -326,16 +326,23 @@ export const SOCIAL_DOMAINS = [ export const SEARCH_DOMAINS = [ 'baidu.com', 'bing.com', - 'chatgpt.com', 'duckduckgo.com', 'ecosia.org', 'google.', 'msn.com', - 'perplexity.ai', 'search.brave.com', 'yandex.', ]; +export const LLM_DOMAINS = [ + 'chatgpt.com', + 'claude.ai', + 'copilot.microsoft.com', + 'gemini.google.com', + 'meta.ai', + 'perplexity.ai', +]; + export const SHOPPING_DOMAINS = [ 'alibaba.com', 'aliexpress.com', diff --git a/src/queries/sql/getChannelExpandedMetrics.ts b/src/queries/sql/getChannelExpandedMetrics.ts index c43e2544b..a09c08056 100644 --- a/src/queries/sql/getChannelExpandedMetrics.ts +++ b/src/queries/sql/getChannelExpandedMetrics.ts @@ -1,6 +1,7 @@ import clickhouse from '@/lib/clickhouse'; import { EMAIL_DOMAINS, + LLM_DOMAINS, PAID_AD_PARAMS, SEARCH_DOMAINS, SHOPPING_DOMAINS, @@ -88,6 +89,7 @@ async function relationalQuery( when ${toPostgresPositionClause('utm_medium', ['referral', 'app', 'link'])} then 'referral' when utm_medium ilike '%affiliate%' then 'affiliate' when utm_medium ilike '%sms%' or utm_source ilike '%sms%' then 'sms' + when ${toPostgresPositionClause('referrer_domain', LLM_DOMAINS)} then 'llm' when ${toPostgresPositionClause('referrer_domain', SEARCH_DOMAINS)} or utm_medium ilike '%organic%' then concat(prefix, 'Search') when ${toPostgresPositionClause('referrer_domain', SOCIAL_DOMAINS)} then concat(prefix, 'Social') when ${toPostgresPositionClause('referrer_domain', EMAIL_DOMAINS)} or utm_medium ilike '%mail%' then 'email' @@ -149,6 +151,9 @@ async function clickhouseQuery( when multiSearchAny(lower(utm_medium), ['referral', 'app','link']) != 0 then 'referral' when position(lower(utm_medium), 'affiliate') > 0 then 'affiliate' when position(lower(utm_medium), 'sms') > 0 or position(lower(utm_source), 'sms') > 0 then 'sms' + when multiSearchAny(lower(referrer_domain), [${toClickHouseStringArray( + LLM_DOMAINS, + )}]) != 0 then 'llm' when multiSearchAny(lower(referrer_domain), [${toClickHouseStringArray( SEARCH_DOMAINS, )}]) != 0 or position(lower(utm_medium), 'organic') > 0 then concat(prefix, 'Search') diff --git a/src/queries/sql/getChannelMetrics.ts b/src/queries/sql/getChannelMetrics.ts index da28c0492..b11f4cd5e 100644 --- a/src/queries/sql/getChannelMetrics.ts +++ b/src/queries/sql/getChannelMetrics.ts @@ -1,6 +1,7 @@ import clickhouse from '@/lib/clickhouse'; import { EMAIL_DOMAINS, + LLM_DOMAINS, PAID_AD_PARAMS, SEARCH_DOMAINS, SHOPPING_DOMAINS, @@ -57,6 +58,7 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) { when ${toPostgresLikeClause('utm_medium', ['referral', 'app', 'link'])} then 'referral' when utm_medium ilike '%affiliate%' then 'affiliate' when utm_medium ilike '%sms%' or utm_source ilike '%sms%' then 'sms' + when ${toPostgresLikeClause('referrer_domain', LLM_DOMAINS)} then 'llm' when ${toPostgresLikeClause('referrer_domain', SEARCH_DOMAINS)} or utm_medium ilike '%organic%' then concat(prefix, 'Search') when ${toPostgresLikeClause('referrer_domain', SOCIAL_DOMAINS)} then concat(prefix, 'Social') when ${toPostgresLikeClause('referrer_domain', EMAIL_DOMAINS)} or utm_medium ilike '%mail%' then 'email' @@ -102,6 +104,9 @@ async function clickhouseQuery( when multiSearchAny(lower(utm_medium), ['referral', 'app','link']) != 0 then 'referral' when position(lower(utm_medium), 'affiliate') > 0 then 'affiliate' when position(lower(utm_medium), 'sms') > 0 or position(lower(utm_source), 'sms') > 0 then 'sms' + when multiSearchAny(lower(referrer_domain), [${toClickHouseStringArray( + LLM_DOMAINS, + )}]) != 0 then 'llm' when multiSearchAny(lower(referrer_domain), [${toClickHouseStringArray( SEARCH_DOMAINS, )}]) != 0 or position(lower(utm_medium), 'organic') > 0 then concat(prefix, 'Search') diff --git a/src/queries/sql/reports/getRevenueMetrics.ts b/src/queries/sql/reports/getRevenueMetrics.ts index 6553d2e09..0ed43911c 100644 --- a/src/queries/sql/reports/getRevenueMetrics.ts +++ b/src/queries/sql/reports/getRevenueMetrics.ts @@ -1,6 +1,7 @@ import clickhouse from '@/lib/clickhouse'; import { EMAIL_DOMAINS, + LLM_DOMAINS, PAID_AD_PARAMS, SEARCH_DOMAINS, SHOPPING_DOMAINS, @@ -210,6 +211,7 @@ async function relationalQuery( when ${toPostgresLikeClause('utm_medium', ['referral', 'app', 'link'])} then 'referral' when utm_medium ilike '%affiliate%' then 'affiliate' when utm_medium ilike '%sms%' or utm_source ilike '%sms%' then 'sms' + when ${toPostgresLikeClause('referrer_domain', LLM_DOMAINS)} then 'llm' when ${toPostgresLikeClause('referrer_domain', SEARCH_DOMAINS)} or utm_medium ilike '%organic%' then concat(prefix, 'Search') when ${toPostgresLikeClause('referrer_domain', SOCIAL_DOMAINS)} then concat(prefix, 'Social') when ${toPostgresLikeClause('referrer_domain', EMAIL_DOMAINS)} or utm_medium ilike '%mail%' then 'email' @@ -402,6 +404,9 @@ async function clickhouseQuery( when multiSearchAny(lower(utm_medium), ['referral', 'app','link']) != 0 then 'referral' when position(lower(utm_medium), 'affiliate') > 0 then 'affiliate' when position(lower(utm_medium), 'sms') > 0 or position(lower(utm_source), 'sms') > 0 then 'sms' + when multiSearchAny(lower(referrer_domain), [${toClickHouseStringArray( + LLM_DOMAINS, + )}]) != 0 then 'llm' when multiSearchAny(lower(referrer_domain), [${toClickHouseStringArray( SEARCH_DOMAINS, )}]) != 0 or position(lower(utm_medium), 'organic') > 0 then concat(prefix, 'Search')