What
Add a step property to the onboarding_skipped PostHog event so we can see exactly which step the user was on when they clicked "Skip."
Why
Right now the skip event fires with no metadata:
// frontend/src/components/OnboardingDialog.tsx, line 464
capture('onboarding_skipped');
We know from PostHog data that 79 of 120 users skip onboarding each month (66% skip rate), and we've confirmed through funnel analysis that the GitHub CLI setup step is where most users bail — but we had to infer this manually by comparing event counts across onboarding_started, onboarding_github_cli_setup_started, and onboarding_github_cli_ready.
With a step property on the skip event, future data pulls will immediately show which step is causing skips without manual funnel analysis.
Where
File: frontend/src/components/OnboardingDialog.tsx
The onboarding dialog has these states (starting at line 552):
detecting — "Checking your setup..." spinner (line 545-549)
ghReady — happy path, "Start developing with Pane" (line 554)
!gitInstalled — "Git Required" (line 625)
!ghInstalled — "GitHub CLI Required" with install link (line 637)
gitInstalled but not ghReady — "Connect GitHub for Pane" with terminal auth (line 652)
The skip button is rendered in the ModalFooter at line 714/721 and calls handleSkip at line 463.
How
Change handleSkip to pass the current step as a property:
const handleSkip = async () => {
let currentStep = 'unknown';
if (step === 'detecting') {
currentStep = 'detecting';
} else if (!env) {
currentStep = 'detecting';
} else if (env.ghReady) {
currentStep = 'ready';
} else if (!env.gitInstalled) {
currentStep = 'git_required';
} else if (!env.ghInstalled) {
currentStep = 'gh_install_required';
} else {
currentStep = 'gh_auth_required';
}
capture('onboarding_skipped', { step: currentStep });
await markOnboardingComplete();
onClose();
};
The step values should match the UI states:
| Value |
What the user sees |
detecting |
"Checking your setup..." spinner |
ready |
Happy path (unlikely to skip here, but possible) |
git_required |
"Git Required" + install link |
gh_install_required |
"GitHub CLI Required" + install link |
gh_auth_required |
"Connect GitHub for Pane" + terminal auth |
How to verify
- Build and run Pane locally
- Clear the onboarding preference so the dialog shows: in dev tools, run
await window.electron.invoke('preferences:set', 'onboarding_repo_setup', '') (or delete the preference)
- Relaunch — onboarding dialog should appear
- Click "Skip" at different steps
- Check PostHog (or the dev console network tab for the capture call) — the
onboarding_skipped event should now include a step property matching the table above
Expected result in PostHog
After this ships, a PostHog query like:
SELECT properties.step, count()
FROM events
WHERE event = 'onboarding_skipped'
AND timestamp >= now() - interval 30 day
GROUP BY properties.step
ORDER BY count() DESC
Should show something like:
gh_auth_required: 45
gh_install_required: 25
detecting: 5
git_required: 3
ready: 1
This tells us immediately where the friction is without needing to cross-reference multiple events.
What
Add a
stepproperty to theonboarding_skippedPostHog event so we can see exactly which step the user was on when they clicked "Skip."Why
Right now the skip event fires with no metadata:
We know from PostHog data that 79 of 120 users skip onboarding each month (66% skip rate), and we've confirmed through funnel analysis that the GitHub CLI setup step is where most users bail — but we had to infer this manually by comparing event counts across
onboarding_started,onboarding_github_cli_setup_started, andonboarding_github_cli_ready.With a
stepproperty on the skip event, future data pulls will immediately show which step is causing skips without manual funnel analysis.Where
File:
frontend/src/components/OnboardingDialog.tsxThe onboarding dialog has these states (starting at line 552):
detecting— "Checking your setup..." spinner (line 545-549)ghReady— happy path, "Start developing with Pane" (line 554)!gitInstalled— "Git Required" (line 625)!ghInstalled— "GitHub CLI Required" with install link (line 637)gitInstalledbut not ghReady — "Connect GitHub for Pane" with terminal auth (line 652)The skip button is rendered in the
ModalFooterat line 714/721 and callshandleSkipat line 463.How
Change
handleSkipto pass the current step as a property:The step values should match the UI states:
detectingreadygit_requiredgh_install_requiredgh_auth_requiredHow to verify
await window.electron.invoke('preferences:set', 'onboarding_repo_setup', '')(or delete the preference)onboarding_skippedevent should now include astepproperty matching the table aboveExpected result in PostHog
After this ships, a PostHog query like:
Should show something like:
This tells us immediately where the friction is without needing to cross-reference multiple events.