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.
This commit is contained in:
Charis Lam committed 2026-10-06 08:24:07 -04:00
1 parent 4b9080788f
commit 2df9942b05
1 file changed
+15 -9
@@ -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<string | undefined>(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