diff --git a/src/hooks/useSettings.ts b/src/hooks/useSettings.ts index e7588e8b1e..a2f9faafc1 100644 --- a/src/hooks/useSettings.ts +++ b/src/hooks/useSettings.ts @@ -10,6 +10,7 @@ import { queryKeys } from "@/lib/queryKeys"; const TELEMETRY_CONSENT_KEY = "dyadTelemetryConsent"; const TELEMETRY_USER_ID_KEY = "dyadTelemetryUserId"; +const DYAD_PRO_STATUS_KEY = "dyadProStatus"; export function isTelemetryOptedIn() { return window.localStorage.getItem(TELEMETRY_CONSENT_KEY) === "opted_in"; @@ -19,6 +20,10 @@ export function getTelemetryUserId(): string | null { return window.localStorage.getItem(TELEMETRY_USER_ID_KEY); } +export function isDyadProUser(): boolean { + return window.localStorage.getItem(DYAD_PRO_STATUS_KEY) === "true"; +} + let isInitialLoad = false; export function useSettings() { @@ -121,4 +126,9 @@ function processSettingsForTelemetry(settings: UserSettings) { } else { window.localStorage.removeItem(TELEMETRY_USER_ID_KEY); } + // Store Pro status for telemetry sampling + window.localStorage.setItem( + DYAD_PRO_STATUS_KEY, + hasDyadProKey(settings) ? "true" : "false", + ); } diff --git a/src/renderer.tsx b/src/renderer.tsx index 2269c1dbdd..5836d38dae 100644 --- a/src/renderer.tsx +++ b/src/renderer.tsx @@ -4,7 +4,11 @@ import { router } from "./router"; import { RouterProvider } from "@tanstack/react-router"; import { PostHogProvider } from "posthog-js/react"; import posthog from "posthog-js"; -import { getTelemetryUserId, isTelemetryOptedIn } from "./hooks/useSettings"; +import { + getTelemetryUserId, + isTelemetryOptedIn, + isDyadProUser, +} from "./hooks/useSettings"; // Initialize i18next before any rendering import "./i18n"; @@ -87,6 +91,20 @@ const posthogClient = posthog.init( event.properties["$ip"] = null; } + // For non-Pro users, only send 10% of events (but always send errors) + if (!isDyadProUser()) { + const isErrorEvent = + event?.event === "$exception" || + event?.event?.toLowerCase().includes("error") || + event?.properties?.$exception_type || + event?.properties?.error; + + if (!isErrorEvent && Math.random() > 0.1) { + console.debug("Non-Pro user: sampling out event", event?.event); + return null; + } + } + console.debug( "Telemetry opted in - UUID:", telemetryUserId,