From 2df9942b05ebd6940e6408eacaa859ae1ef00939 Mon Sep 17 00:00:00 2001 From: Charis Lam <26616127+charislam@users.noreply.github.com> Date: Tue, 6 Oct 2026 08:24:07 -0400 Subject: [PATCH] fix(studio): gate free tier region exposure on form visibility and track per org Only fire free_tier_general_region_experiment_exposed when the region selector is actually visible (can create, creation not disabled, free project limit check settled), and dedupe by org slug so switching orgs re-fires. --- .../ProjectCreation/ProjectCreationForm.tsx | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/apps/studio/components/interfaces/ProjectCreation/ProjectCreationForm.tsx b/apps/studio/components/interfaces/ProjectCreation/ProjectCreationForm.tsx index 9edd66ef487..a1aa4b508e0 100644 --- a/apps/studio/components/interfaces/ProjectCreation/ProjectCreationForm.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/ProjectCreationForm.tsx @@ -234,10 +234,8 @@ export const ProjectCreationForm = ({ // form state carried over from the free plan. To avoid this, we set a // default instance size in this case. const instanceSize = canChooseInstanceSize ? (watchedInstanceSize ?? sizes[0]) : undefined - const { data: membersExceededLimit = [] } = useFreeProjectLimitCheckQuery( - { slug }, - { enabled: isFreePlan } - ) + const { data: membersExceededLimit = [], isLoading: isLoadingFreeProjectLimit } = + useFreeProjectLimitCheckQuery({ slug }, { enabled: isFreePlan }) const hasMembersExceedingFreeTierLimit = membersExceededLimit.length > 0 const freePlanWithExceedingLimits = isFreePlan && hasMembersExceedingFreeTierLimit @@ -621,17 +619,25 @@ export const ProjectCreationForm = ({ track('project_creation_form_exposed', { surface }) }, [isOrganizationsSuccess, canCreateProject, currentOrg, track, surface]) - const hasTrackedFreeTierGeneralRegionExposed = useRef(false) - + const freeTierGeneralRegionExposedSlug = useRef(undefined) useEffect(() => { - if (hasTrackedFreeTierGeneralRegionExposed.current) return + if (!slug || freeTierGeneralRegionExposedSlug.current === slug) return if (isResolvingFreeTierGeneralRegionExperiment) return if (freeTierGeneralRegionExperimentVariant === undefined) return - hasTrackedFreeTierGeneralRegionExposed.current = true + if (!canCreateProject || projectCreationDisabled || isLoadingFreeProjectLimit) return + freeTierGeneralRegionExposedSlug.current = slug track('free_tier_general_region_experiment_exposed', { variant: freeTierGeneralRegionExperimentVariant, }) - }, [isResolvingFreeTierGeneralRegionExperiment, freeTierGeneralRegionExperimentVariant, track]) + }, [ + slug, + isResolvingFreeTierGeneralRegionExperiment, + freeTierGeneralRegionExperimentVariant, + canCreateProject, + projectCreationDisabled, + isLoadingFreeProjectLimit, + track, + ]) useEffect(() => { // Only set once to ensure compute credits dont change while project is being created