From 5a1063d7f22569b6cbefd0d1ad6f6569d97f1afa Mon Sep 17 00:00:00 2001 From: Roo Code Date: Tue, 4 Nov 2025 07:56:40 +0000 Subject: [PATCH 1/2] fix: add event_callback pattern to Google Ads conversion tracking - Add event_callback to trackGoogleAdsConversion() to ensure conversion ping completes before navigation - Update CTA button handlers to prevent default navigation and pass target URL - Add fallback timeout for reliability in case callback does not fire - Improve documentation with usage examples --- .../src/app/reviewer/ReviewerContent.tsx | 10 ++++-- .../src/lib/analytics/google-ads.ts | 31 +++++++++++++++++-- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/apps/web-roo-code/src/app/reviewer/ReviewerContent.tsx b/apps/web-roo-code/src/app/reviewer/ReviewerContent.tsx index 3f5a1cf12a01..8425f727d93a 100644 --- a/apps/web-roo-code/src/app/reviewer/ReviewerContent.tsx +++ b/apps/web-roo-code/src/app/reviewer/ReviewerContent.tsx @@ -127,7 +127,10 @@ export function ReviewerContent() { href={EXTERNAL_LINKS.CLOUD_APP_SIGNUP_PRO} target="_blank" rel="noopener noreferrer" - onClick={trackGoogleAdsConversion} + onClick={(e) => { + e.preventDefault() + trackGoogleAdsConversion(EXTERNAL_LINKS.CLOUD_APP_SIGNUP_PRO) + }} className="flex w-full items-center justify-center"> Start 14-day Free Trial @@ -281,7 +284,10 @@ export function ReviewerContent() { href={EXTERNAL_LINKS.CLOUD_APP_SIGNUP_PRO} target="_blank" rel="noopener noreferrer" - onClick={trackGoogleAdsConversion} + onClick={(e) => { + e.preventDefault() + trackGoogleAdsConversion(EXTERNAL_LINKS.CLOUD_APP_SIGNUP_PRO) + }} className="flex items-center justify-center"> Start 14-day Free Trial diff --git a/apps/web-roo-code/src/lib/analytics/google-ads.ts b/apps/web-roo-code/src/lib/analytics/google-ads.ts index 29ced92e99ea..09fa6f8b50c7 100644 --- a/apps/web-roo-code/src/lib/analytics/google-ads.ts +++ b/apps/web-roo-code/src/lib/analytics/google-ads.ts @@ -3,15 +3,40 @@ */ /** - * Track a Google Ads conversion event - * This should only be called after user consent has been given + * Track a Google Ads conversion event with optional navigation callback + * This ensures the conversion ping completes before navigation occurs + * + * @param targetUrl - Optional URL to navigate to after conversion is tracked + * + * @example + * // Track conversion and navigate + * trackGoogleAdsConversion("https://app.roocode.com") + * + * @example + * // Track conversion without navigation + * trackGoogleAdsConversion() */ -export function trackGoogleAdsConversion() { +export function trackGoogleAdsConversion(targetUrl?: string) { if (typeof window !== "undefined" && window.gtag) { + // Callback to handle navigation after conversion tracking + const callback = () => { + if (targetUrl) { + window.location.href = targetUrl + } + } + window.gtag("event", "conversion", { send_to: "AW-17391954825/VtOZCJe_77MbEInXkOVA", value: 10.0, currency: "USD", + event_callback: callback, }) + + // Fallback timeout in case event_callback doesn't fire (network issues, etc.) + // This ensures navigation still happens even if tracking fails + setTimeout(callback, 1000) + } else if (targetUrl) { + // If gtag is not available, navigate immediately + window.location.href = targetUrl } } From e532fadbfc523a797b2fdd4921720dce3d4f5bc2 Mon Sep 17 00:00:00 2001 From: Roo Code Date: Tue, 4 Nov 2025 08:02:17 +0000 Subject: [PATCH 2/2] fix: update PrFixerContent to use event_callback pattern - Apply same event_callback pattern to PR Fixer CTA buttons - Fixes TypeScript errors from updated trackGoogleAdsConversion signature --- apps/web-roo-code/src/app/pr-fixer/PrFixerContent.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/web-roo-code/src/app/pr-fixer/PrFixerContent.tsx b/apps/web-roo-code/src/app/pr-fixer/PrFixerContent.tsx index 285a28e6f6eb..48bb5abaa6a9 100644 --- a/apps/web-roo-code/src/app/pr-fixer/PrFixerContent.tsx +++ b/apps/web-roo-code/src/app/pr-fixer/PrFixerContent.tsx @@ -112,7 +112,10 @@ export function PrFixerContent() { href={EXTERNAL_LINKS.CLOUD_APP_SIGNUP_PRO} target="_blank" rel="noopener noreferrer" - onClick={trackGoogleAdsConversion} + onClick={(e) => { + e.preventDefault() + trackGoogleAdsConversion(EXTERNAL_LINKS.CLOUD_APP_SIGNUP_PRO) + }} className="flex w-full items-center justify-center"> Start 14-day Free Trial @@ -225,7 +228,10 @@ export function PrFixerContent() { href={EXTERNAL_LINKS.CLOUD_APP_SIGNUP_PRO} target="_blank" rel="noopener noreferrer" - onClick={trackGoogleAdsConversion} + onClick={(e) => { + e.preventDefault() + trackGoogleAdsConversion(EXTERNAL_LINKS.CLOUD_APP_SIGNUP_PRO) + }} className="flex items-center justify-center"> Start 14-day Free Trial