Skip to content

PostHog Events Reference

All custom PostHog events tracked in the account app. Each event uses the trackEvent() helper from services/analyticsService.ts.

Naming convention: category:object_action (lowercase, snake_case, present-tense verbs).

Note: Autocapture is enabled, so $pageview, $pageleave, and raw $autocapture clicks are captured automatically. The custom events below layer richer, funnel-ready data on top of that — they are not a replacement for autocapture.


Home Events

home:profile_button_click

Purpose Fired when the user clicks the "Go to Profile" CTA on the home banner. Measures intent to view/edit the profile from the home page.
Properties none
Files components/home/homeBanner.tsx (Go to Profile <Link>)
Purpose Fired when the user clicks a carousel arrow on the Jadu Originals row. Measures carousel engagement and browse direction.
Properties direction: 'prev' / 'next'
Files components/home/jaduOriginals.tsx (carousel ◀ / ▶ arrows)

home:original_show_click

Purpose Fired when the user clicks a Jadu Original show card (opens the show's external link). Use to find the most-clicked shows.
Properties show_title: string, is_in_production: boolean
Files components/home/jaduOriginals.tsx (ShowCard external <a>)

home:tutorial_click

Purpose Fired when the user clicks a "Learn Visual Storytelling" tutorial card (opens YouTube). Use to find the most-watched tutorials.
Properties tutorial_id: string, tutorial_title: string
Files components/home/learnVisualStorytelling.tsx (TutorialCard external <a>)

Profile Events

profile:edit_button_click

Purpose Fired when the user clicks "Edit profile" on the profile view page. Top of the profile-edit funnel.
Properties none
Files components/profile/profileHeroSection.tsx (Edit profile <Link>)

profile:featured_work_click

Purpose Fired when the user clicks a featured-work link card on their profile (opens external link). Measures which featured links get traffic.
Properties platform: string, link_title: string, link_url: string
Files components/profile/profileFeaturedWork.tsx (featured-work <a> cards)

profile:badge_click

Purpose Fired when the user clicks a badge (opens the badge detail dialog). Use to gauge interest in earned vs. unearned badges.
Properties badge_id: string, badge_label: string, is_earned: boolean
Files components/profile/profileBadges.tsx (ProfileBadgeItem button)

Profile Edit Events

profile_edit:save_submit

Purpose Fired when the user clicks "Save changes" (before the API responds). Measures save-attempt volume — compare against success/fail to understand error rates.
Properties link_count: number of valid links, name_set: boolean, creator_type: string, effort_level: string, creator_stage: string
Files app/(auth)/profile/edit/page.tsx (handleSave)

profile_edit:save_success

Purpose Primary profile activation event. Fired after a successful profile save. Use for completion funnels and to see what users actually configure.
Properties link_count, name_set, creator_type, effort_level, creator_stage (same as save_submit)
Files app/(auth)/profile/edit/page.tsx (handleSave success)

profile_edit:save_fail

Purpose Fired when a profile save fails. Compare against save_submit to understand error rates.
Properties none
Files app/(auth)/profile/edit/page.tsx (handleSave catch block)
Purpose Fired when the user adds a new (empty) featured-work link row. Measures intent to add links.
Properties none
Files app/(auth)/profile/edit/page.tsx (addLink)
Purpose Fired when the user removes a featured-work link row. had_value distinguishes removing a real link from clearing an empty placeholder.
Properties had_value: boolean — whether the removed row had a non-empty value, platform: string | null — domain of the removed link (e.g. youtube.com)
Files app/(auth)/profile/edit/page.tsx (removeLink)

profile_edit:avatar_open

Purpose Fired when the user opens the avatar picker dialog. Pair with avatar_change to measure open → change completion.
Properties none
Files app/(auth)/profile/edit/page.tsx (onAvatarClick)

profile_edit:avatar_change

Purpose Fired when the user selects a new avatar in the picker (clicks "Save changes" in the dialog).
Properties none
Files app/(auth)/profile/edit/page.tsx (AvatarPickerDialog onSave)

profile_edit:cover_open

Purpose Fired when the user opens the cover-image picker dialog. Pair with cover_change.
Properties none
Files app/(auth)/profile/edit/page.tsx (onCoverClick)

profile_edit:cover_change

Purpose Fired when the user selects a new cover image in the picker (clicks "Save changes" in the dialog).
Properties none
Files app/(auth)/profile/edit/page.tsx (CoverPickerDialog onSave)

profile_edit:preference_change

Purpose Fired when the user changes a creative-preference dropdown. Use to measure which preferences get set and to what values.
Properties field: 'creator_type' / 'effort_level' / 'creator_stage', value: the selected option value
Files app/(auth)/profile/edit/page.tsx (CreativePreferencesSection onChange handlers)

Quest Events

quest:page_viewed

Purpose Fired once when the quest challenge page reaches the ready state. Top of the quest funnel — use to measure unique visitors to the challenge.
Properties quest_id: string
Files app/(auth)/quest/page.tsx (on state.phase === 'ready')

quest:generation_started

Purpose Fired when the user submits a new generation (both first attempt and confirmed re-generate via dialog). Top of the generation funnel.
Properties quest_id: string, generation_number: number (1-indexed position in the entry's generation list)
Files components/quest/questWhatToDo.tsx (generate button + same-inputs confirm dialog)

quest:generation_completed

Purpose Fired the first time a generation's status is observed as completed. Measures generation success rate.
Properties quest_id: string, generation_id: string
Files components/quest/generationsList.tsx (polling effect, deduplicated via useRef<Set>)

quest:generation_failed

Purpose Fired the first time a generation's status is observed as failed. Use to monitor failure rates.
Properties quest_id: string, generation_id: string
Files components/quest/generationsList.tsx (polling effect, deduplicated via useRef<Set>)

quest:video_downloaded

Purpose Fired when the user downloads a completed generation video. Measures post-generation engagement.
Properties quest_id: string, generation_id: string
Files components/quest/generationsList.tsx (download button)

quest:video_previewed

Purpose Fired when the user clicks the play button on a generation video preview.
Properties quest_id: string, generation_id: string
Files components/quest/generationsList.tsx (play button)

quest:submission_started

Purpose Fired when the user clicks "Submit" on the submission form (before the API responds). Top of the submission funnel.
Properties quest_id: string, platform_count: number (how many social platform URLs were filled in)
Files components/quest/submissionForm.tsx (handleSubmit)

quest:submission_completed

Purpose Primary quest conversion event. Fired after a successful submission API call.
Properties quest_id: string, platforms: string[] (e.g. ['youtube', 'instagram'])
Files components/quest/submissionForm.tsx (handleSubmit success)

quest:prompt_guide_opened

Purpose Fired when the user opens the Prompt Guide dialog. Measures engagement with the prompt-writing help resource.
Properties quest_id: string
Files components/quest/questWhatToDo.tsx (PromptGuide onOpen prop)

quest:faq_opened

Purpose Fired when the user expands an FAQ accordion item. Use to find which questions are most common.
Properties quest_id: string, faq_question: string (the question text used as the accordion value)
Files components/quest/questFaq.tsx (Accordion onValueChange)

quest:assets_downloaded

Purpose Fired when the user downloads reference assets — the full ZIP, or a single asset from its character sheet. Distinguish the two by asset_count: the bundle reports how many it zipped, a single pull reports 1 and names it in asset_id. Counting raw volume as "bundle downloads" therefore overstates it; filter on asset_count.
Properties quest_id: string, asset_count: number (Quest 3), asset_id: string (Quest 3, single asset only)
Files components/quest/assetLibrary.tsx (handleDownloadAll), components/shared/quest/questDownloadAllAssets.tsx (handleDownloadAll), components/quest3/quest3CharacterSheetDialog.tsx (handleDownload)

quest:asset_selected

Purpose Fired when the user toggles a reference asset on or off. Use to see which assets get selected most.
Properties quest_id: string, asset_id: string, action: 'add' / 'remove'
Files components/quest/questWhatToDo.tsx (onToggle callback)

User Identification

On login (any path: magic-link verify, OTP, password, or a restored session), the user is identified in PostHog so autocapture and custom events attach to a stable identity.

distinct_id user.id (stable — not email, which can change)
Person properties email, name
Files components/jaduAuthWrapper.tsx (AuthInner — on authState === AUTHENTICATED)

On logout or account switch, resetUser() (posthog.reset()) starts a fresh anonymous session so the next user's events are not attributed to the previous distinct_id.

Site File
Logout button components/sidebar.tsx (handleLogout)
Account switch via magic link app/verify/page.tsx (different-account branch)

Event → Page Map (Quick Reference)

Page Events fired
Home (/) home:profile_button_click, home:originals_carousel_click, home:original_show_click, home:tutorial_click
Profile (/profile) profile:edit_button_click, profile:featured_work_click, profile:badge_click
Edit profile (/profile/edit) profile_edit:save_submit, profile_edit:save_success, profile_edit:save_fail, profile_edit:link_add, profile_edit:link_remove, profile_edit:avatar_open, profile_edit:avatar_change, profile_edit:cover_open, profile_edit:cover_change, profile_edit:preference_change
Quest (/quest) quest:page_viewed, quest:generation_started, quest:generation_completed, quest:generation_failed, quest:video_downloaded, quest:video_previewed, quest:submission_started, quest:submission_completed, quest:prompt_guide_opened, quest:faq_opened, quest:assets_downloaded, quest:asset_selected

Key Funnels

Profile Edit Completion Funnel

profile:edit_button_click
  → profile_edit:save_submit
    → profile_edit:save_success

Quest Submission Funnel

quest:page_viewed
  → quest:generation_started
    → quest:generation_completed
      → quest:submission_started
        → quest:submission_completed

Avatar / Cover Change Funnel

profile_edit:avatar_open
  → profile_edit:avatar_change
profile_edit:cover_open
  → profile_edit:cover_change

Dashboard Ideas

Metric How to compute in PostHog
Quest unique visitors quest:page_viewed → unique users, breakdown by quest_id
Generation success rate quest:generation_completed / quest:generation_started
Generation failure rate quest:generation_failed / quest:generation_started
Submission conversion rate quest:submission_completed / quest:page_viewed
Most common submission platforms quest:submission_completed → breakdown by platforms
Most-selected assets quest:asset_selected where action = 'add' → breakdown by asset_id
Prompt guide engagement quest:prompt_guide_opened / quest:page_viewed
Most-asked FAQ questions quest:faq_opened → breakdown by faq_question
Most-clicked Jadu Originals home:original_show_click → breakdown by show_title
Most-watched tutorials home:tutorial_click → breakdown by tutorial_title
Carousel usage home:originals_carousel_click → count, breakdown by direction
Profile save completion rate profile_edit:save_success / profile_edit:save_submit
Creative preference distribution profile_edit:save_success → breakdown by creator_type / effort_level / creator_stage
Avg links per profile profile_edit:save_success → avg of link_count
Most-clicked featured platforms profile:featured_work_click → breakdown by platform