From 974c076e8654a4be58142c5acdebe70d53be7358 Mon Sep 17 00:00:00 2001 From: Paulo Castellano Date: Thu, 2 Jul 2026 09:21:31 -0300 Subject: [PATCH] fix(tracking): fire begin_checkout when onboarding checkout starts trackBeginCheckout was defined but never called, so the begin_checkout (GTM/dataLayer) and checkout.started (PostHog) events never fired. Wire it into the onboarding Connect submit handler, before the redirect to Stripe, and pass the workspace plan from the controller so the event carries plan name + interval. --- .../Controllers/App/OnboardingController.php | 6 ++++++ resources/js/pages/onboarding/Connect.vue | 6 ++++++ .../Onboarding/OnboardingControllerTest.php | 16 ++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/app/Http/Controllers/App/OnboardingController.php b/app/Http/Controllers/App/OnboardingController.php index 80475a77..e78a502f 100644 --- a/app/Http/Controllers/App/OnboardingController.php +++ b/app/Http/Controllers/App/OnboardingController.php @@ -150,9 +150,15 @@ public function connect(Request $request): Response|RedirectResponse 'network' => $platform->network(), ])->values(); + $plan = Plan::where('slug', Slug::Workspace)->firstOrFail(); + return Inertia::render('onboarding/Connect', [ 'platforms' => $platforms, 'accounts' => SocialAccountResource::collection($accounts)->resolve(), + 'plan' => [ + 'name' => $plan->name, + 'interval' => 'monthly', + ], ]); } diff --git a/resources/js/pages/onboarding/Connect.vue b/resources/js/pages/onboarding/Connect.vue index 4b9e914a..80ae728a 100644 --- a/resources/js/pages/onboarding/Connect.vue +++ b/resources/js/pages/onboarding/Connect.vue @@ -9,14 +9,18 @@ import NetworkConnectGrid, { type ConnectedAccount, } from '@/components/accounts/NetworkConnectGrid.vue'; import { Button } from '@/components/ui/button'; +import { useTracking } from '@/composables/useTracking'; const props = defineProps<{ platforms: AvailablePlatform[]; accounts: ConnectedAccount[]; + plan: { name: string; interval: string }; }>(); const form = useForm({}); +const { trackBeginCheckout } = useTracking(); + const hasConnected = computed((): boolean => props.accounts.length > 0); const submit = (): void => { @@ -24,6 +28,8 @@ const submit = (): void => { return; } + trackBeginCheckout({ name: props.plan.name, interval: props.plan.interval }); + form.post(checkout.url()); }; diff --git a/tests/Feature/Onboarding/OnboardingControllerTest.php b/tests/Feature/Onboarding/OnboardingControllerTest.php index 5f25e6aa..21c00f74 100644 --- a/tests/Feature/Onboarding/OnboardingControllerTest.php +++ b/tests/Feature/Onboarding/OnboardingControllerTest.php @@ -263,6 +263,22 @@ function subscribeOnboardingAccount(Account $account): void ); }); +test('connect passes the workspace plan so the client can fire begin_checkout', function () { + $this->user->update(['persona' => Persona::Agency->value, 'goals' => [Goal::SaveTime->value]]); + onboardingWorkspace($this->user); + + $plan = Plan::where('slug', Slug::Workspace)->firstOrFail(); + + $response = $this->actingAs($this->user->fresh())->get(route('app.onboarding.connect')); + + $response->assertOk(); + $response->assertInertia(fn ($page) => $page + ->component('onboarding/Connect') + ->where('plan.name', $plan->name) + ->where('plan.interval', 'monthly') + ); +}); + test('connect offers a single linkedin card and no standalone linkedin page card', function () { $this->user->update(['persona' => Persona::Agency->value, 'goals' => [Goal::SaveTime->value]]); onboardingWorkspace($this->user);