Skip to content

Commit 36a2aff

Browse files
authored
gtag: add ads conversion tracking (tldraw#6460)
### Change type - [ ] `bugfix` - [ ] `improvement` - [ ] `feature` - [ ] `api` - [x] `other`
1 parent b8fe199 commit 36a2aff

3 files changed

Lines changed: 28 additions & 1 deletion

File tree

apps/analytics/src/analytics.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,12 @@ export default function Analytics() {
7676
anonymize_ip: true,
7777
},
7878
})
79+
80+
// Add Google Ads configuration if present
81+
if (window.TL_GOOGLE_ADS_ID) {
82+
ReactGA.gtag('config', window.TL_GOOGLE_ADS_ID)
83+
}
84+
7985
ReactGA.send('pageview')
8086
}
8187

@@ -192,6 +198,12 @@ export function track(name: string, data?: { [key: string]: any }) {
192198
ReactGA.event(name, data)
193199
}
194200

201+
export function gtag(...args: any[]) {
202+
if (storedHasConsent !== 'opted-in') return
203+
// @ts-ignore - ReactGA.gtag accepts variable arguments
204+
ReactGA.gtag(...args)
205+
}
206+
195207
export function PrivacySettings() {
196208
const hasConsent: CookieConsent =
197209
Cookies.get('allowTracking') === 'true' ? 'opted-in' : 'opted-out'

apps/analytics/src/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react'
22
import { createRoot } from 'react-dom/client'
3-
import Analytics, { identify, page, PrivacySettings, track } from './analytics'
3+
import Analytics, { gtag, identify, page, PrivacySettings, track } from './analytics'
44
import styles from './styles.css?inline'
55

66
// Inject styles
@@ -25,8 +25,10 @@ declare global {
2525
page(): void
2626
identify(userId: string, properties?: { [key: string]: any }): void
2727
track(name: string, data?: { [key: string]: any }): void
28+
gtag(...args: any[]): void
2829
}
2930
TL_GA4_MEASUREMENT_ID: string | undefined
31+
TL_GOOGLE_ADS_ID?: string
3032
Reo: any
3133
posthog: any
3234
}
@@ -47,4 +49,5 @@ window.tlanalytics = {
4749
page,
4850
identify,
4951
track,
52+
gtag,
5053
}

apps/docs/app/analytics.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { useEffect } from 'react'
66
export default function Analytics() {
77
useEffect(() => {
88
window.TL_GA4_MEASUREMENT_ID = process.env.NEXT_PUBLIC_GA4_MEASUREMENT_ID
9+
window.TL_GOOGLE_ADS_ID = process.env.NEXT_PUBLIC_GOOGLE_ADS_ID
910
}, [])
1011

1112
useEffect(() => {
@@ -15,6 +16,15 @@ export default function Analytics() {
1516
const copiedText = window.getSelection()?.toString() || ''
1617
const isInstall = copiedText.trim() === 'npm install tldraw'
1718
track('docs.copy.code-block', { isInstall })
19+
20+
// Track Google Ads conversion for code block copies
21+
if (window.tlanalytics?.gtag) {
22+
window.tlanalytics.gtag('event', 'conversion', {
23+
send_to: 'AW-17268182782/qIuDCMnhl_EaEP6djqpA',
24+
value: 1.0,
25+
currency: 'USD',
26+
})
27+
}
1828
}
1929
}
2030
document.addEventListener('copy', handleCopy)
@@ -42,8 +52,10 @@ declare global {
4252
tlanalytics: {
4353
openPrivacySettings(): void
4454
track(name: string, data?: { [key: string]: any }): void
55+
gtag(...args: any[]): void
4556
}
4657
TL_GA4_MEASUREMENT_ID: string | undefined
58+
TL_GOOGLE_ADS_ID?: string
4759
posthog: any
4860
}
4961
}

0 commit comments

Comments
 (0)