Skip to content

Commit 459ad5a

Browse files
jahoomaclaude
andcommitted
Fire codebuff.referrer_attributed analytics from root layout
Adds a ReferrerTracker to the codebuff root layout so any signed-in user who passed through /referrals/<code> gets attributed via PostHog (with \$set_once) on whatever page they eventually land on. Split the localStorage key so the tracker and the /onboard welcome card don't race to clear each other. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent f55d295 commit 459ad5a

5 files changed

Lines changed: 28 additions & 2 deletions

File tree

common/src/constants/analytics-events.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ export enum AnalyticsEvent {
6262
ONBOARD_PAGE_RUN_COMMAND_COPIED = 'onboard_page.run_command_copied',
6363
ONBOARD_PAGE_INSTALL_COMMAND_COPIED = 'onboard_page.install_command_copied',
6464

65+
// Web - Creator Attribution
66+
CODEBUFF_REFERRER_ATTRIBUTED = 'codebuff.referrer_attributed',
67+
6568
// Web - Install Dialog
6669
INSTALL_DIALOG_CD_COMMAND_COPIED = 'install_dialog.cd_command_copied',
6770
INSTALL_DIALOG_RUN_COMMAND_COPIED = 'install_dialog.run_command_copied',

web/src/app/layout.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { Footer } from '@/components/footer'
77
import { LayoutWrapper } from '@/components/layout-wrapper'
88
import { Navbar } from '@/components/navbar/navbar'
99
import QueryProvider from '@/components/providers/query-client-provider'
10+
import { ReferrerTracker } from '@/components/referral/referrer-tracker'
1011
import { ThemeProvider } from '@/components/theme-provider'
1112
import { Toaster } from '@/components/ui/toaster'
1213
import { siteConfig } from '@/lib/constant'
@@ -66,6 +67,7 @@ export default function RootLayout({
6667
<SessionProvider>
6768
<QueryProvider>
6869
<PostHogProvider>
70+
<ReferrerTracker />
6971
<Navbar />
7072
<div className="flex-grow">
7173
<LayoutWrapper>{children}</LayoutWrapper>

web/src/components/onboard/welcome-card.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ export function WelcomeCard({
1616
const [referrer, setReferrer] = useState<string | null>(null)
1717

1818
useEffect(() => {
19-
const stored = localStorage.getItem('codebuff_referrer')
19+
const stored = localStorage.getItem('codebuff_referrer_display')
2020
if (stored) {
2121
setReferrer(stored)
22-
localStorage.removeItem('codebuff_referrer')
22+
localStorage.removeItem('codebuff_referrer_display')
2323
}
2424
}, [])
2525

web/src/components/referral/persist-referrer.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export function PersistReferrer({ referrer }: { referrer: string }) {
66
useEffect(() => {
77
if (referrer) {
88
localStorage.setItem('codebuff_referrer', referrer)
9+
localStorage.setItem('codebuff_referrer_display', referrer)
910
}
1011
}, [referrer])
1112

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
'use client'
2+
3+
import { AnalyticsEvent } from '@codebuff/common/constants/analytics-events'
4+
import posthog from 'posthog-js'
5+
import { useEffect } from 'react'
6+
7+
export function ReferrerTracker() {
8+
useEffect(() => {
9+
const referrer = localStorage.getItem('codebuff_referrer')
10+
if (referrer) {
11+
posthog.capture(AnalyticsEvent.CODEBUFF_REFERRER_ATTRIBUTED, {
12+
referrer,
13+
$set_once: { codebuff_referrer: referrer },
14+
})
15+
localStorage.removeItem('codebuff_referrer')
16+
}
17+
}, [])
18+
19+
return null
20+
}

0 commit comments

Comments
 (0)