PostHog Analytics Events Documentation¶
This document provides a comprehensive list of all PostHog tracking events implemented in the Jadu Landing application.
Overview¶
The application uses a custom analyticsService that abstracts PostHog implementation. All events automatically include:
- UTM Parameters: utm_source, utm_medium, utm_campaign, utm_term, utm_content
- Attribution Data: referrer, landing_page
- Session Context: Automatically enriched by the analytics service
Key Files:
- Analytics Service: src/lib/analytics.service.ts
- PostHog Provider: src/lib/providers/posthog.provider.ts
Table of Contents¶
- System Events
- User Engagement Events
- Navigation Events
- Scroll & Visibility Events
- Video Interaction Events
- Form Events
- Blog Analytics Events
- Session Quality Events
- Content Engagement Events
- OTT Play Contest Events
System Events¶
$pageview¶
Type: PostHog Built-in Event
Triggered: On page load and navigation
Location: src/lib/providers/posthog.provider.ts
Properties:
- $current_url (string) - Current page URL
- All UTM parameters automatically included
Description: Automatically tracked by PostHog. Manually triggered in the provider to respect cookie consent.
User Engagement Events¶
cta_clicked¶
Triggered: When any CTA button is clicked
Location: src/app/_components/shared/ctaButton.tsx
Properties:
- button_text (string) - Text displayed on the button
- context (string) - Where the button appears (e.g., "hero", "footer", "section_name")
- page (string) - Current page path
- destination (string) - Target URL or action
- current_scroll_percent (number) - Scroll position when clicked
- time_on_page_seconds (number) - Time spent on page before click
Description: Tracks all CTA button clicks across the site. Critical for measuring conversion funnel entry points and understanding which CTAs perform best.
Usage Example:
analyticsService.track('cta_clicked', {
button_text: 'Sign up for early access',
context: 'hero',
page: '/home',
destination: '#signup-section',
current_scroll_percent: 15,
time_on_page_seconds: 45
});
signup_scroll_initiated¶
Triggered: When user clicks button to scroll to signup section
Location: src/app/page.tsx
Properties:
- page (string) - Current page path
- section (string) - Where scroll was initiated from (e.g., "hero")
Description: Tracks when users actively navigate to the signup form, indicating high intent.
Navigation Events¶
nav_item_clicked¶
Triggered: When navigation menu item is clicked
Location: src/app/_components/layout/navMenu.tsx
Properties:
- destination (string) - Target URL/href
- label (string) - Navigation item label text
- location (string) - "header" or "mobile_menu"
- page (string) - Current page path
Description: Tracks navigation clicks in both header and mobile menu to understand user navigation patterns.
logo_clicked¶
Triggered: When site logo is clicked
Location: src/app/_components/layout/appbar.tsx, src/app/_components/layout/navMenu.tsx
Properties:
- current_page (string) - Page where logo was clicked
- location (string) - "header", "mobile_menu", or "footer"
Description: Tracks logo clicks to measure brand engagement and navigation patterns.
footer_link_clicked¶
Triggered: When footer links are clicked (social or legal)
Location: src/app/_components/layout/footer.tsx, src/app/_components/shared/followJadu.tsx
Properties:
- link_type (string) - "social" or "legal"
- destination (string) - Target URL
- platform (string) - Social platform name (for social links)
- section (string) - "footer" or "follow_jadu"
- page (string) - Current page path (for legal links)
Description: Tracks footer link engagement including social media and legal page links.
Scroll & Visibility Events¶
scroll_depth¶
Triggered: At 25%, 50%, 75%, and 100% scroll depth milestones
Location: src/app/page.tsx
Properties:
- depth (number) - Scroll depth percentage (25, 50, 75, or 100)
- page (string) - Current page path
Description: Measures user engagement by tracking scroll depth. Each milestone tracked once per session.
video_carousel_visible¶
Triggered: When video carousel enters viewport
Location: src/app/page.tsx
Properties:
- page (string) - Current page path
Description: Tracks when users scroll to the video carousel section.
hover_videos_visible¶
Triggered: When hover videos grid becomes visible
Location: src/app/page.tsx
Properties:
- page (string) - Current page path
- device (string) - "mobile" or "desktop"
Description: Tracks when hover videos section enters viewport, differentiated by device type.
promotional_video_visible¶
Triggered: When promotional video becomes at least 10% visible
Location: src/app/_components/video/videoPlayer.tsx
Properties:
- page (string) - Current page path
Description: Tracks video visibility in viewport. Triggered once per session.
Video Interaction Events¶
video_muted¶
Triggered: When user mutes the promotional video
Location: src/app/_components/video/videoPlayer.tsx
Properties:
- video_name (string) - "promotional_video"
- page (string) - Current page path
Description: Tracks when users manually mute the video.
video_unmuted¶
Triggered: When user unmutes the promotional video
Location: src/app/_components/video/videoPlayer.tsx
Properties:
- video_name (string) - "promotional_video"
- page (string) - Current page path
Description: Tracks when users manually unmute the video.
promotional_video_played¶
Triggered: When promotional video starts playing
Location: src/app/_components/video/videoPlayer.tsx
Properties:
- autoplay (boolean) - Whether video started automatically
- page (string) - Current page path
Description: Tracks when the main promotional video begins playback.
promotional_video_progress¶
Triggered: At 25%, 50%, 75%, and 100% video completion
Location: src/app/_components/video/videoPlayer.tsx
Properties:
- progress (number) - Progress percentage (25, 50, 75, or 100)
- time_watched_seconds (number) - Total time watched
- is_muted (boolean) - Whether video is currently muted
- page (string) - Current page path
Description: Tracks video viewing progress to measure engagement with promotional content.
video_carousel_paused¶
Triggered: When user hovers over video carousel (pausing auto-scroll)
Location: src/app/_components/video/videoCarousel.tsx
Properties:
- video_index (number) - Index of video being viewed
- time_visible_seconds (number) - Time carousel was visible before pause
- page (string) - Current page path
Description: Tracks when users pause the carousel to view specific content.
video_carousel_resumed¶
Triggered: When user stops hovering (carousel resumes)
Location: src/app/_components/video/videoCarousel.tsx
Properties:
- pause_duration_seconds (number) - How long carousel was paused
- page (string) - Current page path
Description: Tracks carousel resume and interaction duration.
hover_video_revealed¶
Triggered: When user hovers over a video thumbnail to reveal it
Location: src/app/_components/video/hoverVideosGrid.tsx
Properties:
- video_index (number) - Index of video revealed
- device (string) - "desktop" (hover only works on desktop)
- page (string) - Current page path
Description: Tracks which videos users are most interested in viewing.
Form Events¶
signup_form_started¶
Triggered: When user first interacts with signup form
Location: src/app/_components/signupForm/_signupForm.tsx
Properties:
- page (string) - Current page path
Description: Marks the beginning of form interaction. Sets localStorage flag for CTA context tracking.
signup_form_field_focused¶
Triggered: When user focuses on any form field
Location: src/app/_components/signupForm/_signupForm.tsx
Properties:
- field_name (string) - Name of the focused field
Description: Tracks which fields users interact with, helping identify form UX issues.
signup_form_field_blurred¶
Triggered: When user leaves a form field
Location: src/app/_components/signupForm/_signupForm.tsx
Properties:
- field_name (string) - Name of the field
- has_value (boolean) - Whether field has content when blurred
- time_spent_seconds (number) - Time spent in the field
- field_order (number) - Order in which field was interacted with
Description: Detailed field interaction tracking for UX optimization.
signup_form_validation_error¶
Triggered: When form validation fails
Location: src/app/_components/signupForm/_signupForm.tsx
Properties:
- field_name (string) - Field that failed validation
- error_type (string) - Type of validation error (e.g., "email_invalid")
- attempt_number (number) - Submission attempt number
Description: Tracks validation errors to identify problematic form fields.
signup_form_submitted¶
Triggered: When user submits the signup form
Location: src/app/_components/signupForm/_signupForm.tsx
Properties:
- has_social_media (boolean) - Whether user provided social media links
- has_published_work (boolean) - Whether user provided published work links
- social_media_count (number) - Number of social media links provided
- published_work_count (number) - Number of published work links provided
- time_spent_seconds (number) - Time spent filling out form
Description: Tracks form submission attempts with context about completeness.
signup_form_success¶
Triggered: When form submission succeeds
Location: src/app/_components/signupForm/_signupForm.tsx
Properties:
- email (string) - User's email address
- has_social_media (boolean) - Whether social media was provided
- has_published_work (boolean) - Whether published work was provided
- social_media_count (number) - Number of social media links
- published_work_count (number) - Number of published work links
- time_to_complete_seconds (number) - Total time to complete form
Description: Critical conversion event - successful signup completion.
signup_form_error¶
Triggered: When form submission fails due to error
Location: src/app/_components/signupForm/_signupForm.tsx
Properties:
- error_message (string) - Error message from submission
- time_spent_seconds (number) - Time spent before error
Description: Tracks technical errors during form submission.
signup_form_abandoned¶
Triggered: When user leaves page with incomplete form
Location: src/app/_components/signupForm/_signupForm.tsx
Properties:
- last_field_touched (string) - Last field user interacted with
- fields_completed (array) - List of completed field names
- time_spent_seconds (number) - Time spent on form before abandoning
- completion_percentage (number) - Estimated form completion percentage
Description: Tracks form abandonment to identify drop-off points in the signup funnel.
Blog Analytics Events¶
blog_post_viewed¶
Triggered: When blog post page loads
Location: src/app/_components/blog/blogAnalytics.tsx
Properties:
- post_slug (string) - Blog post URL slug
- post_title (string) - Blog post title
- category (string) - Post category
Description: Tracks blog post views for content analytics.
blog_post_read_completion¶
Triggered: At 25%, 50%, 75%, and 100% scroll depth on blog posts
Location: src/app/_components/blog/blogAnalytics.tsx
Properties:
- post_slug (string) - Blog post URL slug
- completion_percentage (number) - Read completion (25, 50, 75, or 100)
- time_spent_seconds (number) - Time spent reading
Description: Measures blog content engagement and reading depth.
blog_share_clicked¶
Triggered: When blog post share button is clicked
Location: src/app/_components/blog/shareButton.tsx
Properties:
- post_slug (string) - Blog post URL slug
- post_title (string) - Blog post title
- share_url (string) - URL being shared
Description: Tracks content sharing to measure virality and engagement.
Session Quality Events¶
page_exit¶
Triggered: When user leaves the page (beforeunload)
Location: src/app/page.tsx
Dashboard: User Behavior & UX Dashboard
Properties:
- time_on_page_seconds (number) - Total time spent on page
- scroll_depth_reached (number) - Maximum scroll depth reached
- interactions_count (number) - Number of interactions on page
- reached_signup_form (boolean) - Whether user scrolled to signup
- page (string) - Page being exited
Description: Tracks session quality metrics when users leave the page. This event is visualized in the User Behavior & UX Dashboard with 4 key insights: - ⏱️ Average Time on Page - 📊 Exit by Scroll Depth - 🎯 Signup Form Reach Rate - 👆 Average User Interactions
Use Cases: - Compare engagement between converters vs. non-converters - Identify bounce patterns (users who leave quickly) - Understand correlation between scroll depth and time on page - Measure signup form reach effectiveness
$rageclick (PostHog Built-in)¶
Type: PostHog Autocapture Event
Triggered: Automatically when user rapidly clicks same element
Description: Indicates user frustration - no manual tracking needed.
$dead_click (PostHog Built-in)¶
Type: PostHog Autocapture Event
Triggered: Automatically when user clicks non-interactive element
Description: Indicates potential UX issues - no manual tracking needed.
Content Engagement Events¶
section_viewed¶
Triggered: When major page sections enter viewport
Location: src/app/page.tsx
Properties:
- section_name (string) - Name of section (e.g., "why_jadu", "no_monthly_fees", "join_revolution")
- time_to_view_seconds (number) - Time from page load to viewing section
- scroll_depth_at_view (number) - Scroll depth when section viewed
Description: Tracks when users view important content sections, helping understand content effectiveness.
OTT Play Contest Events¶
All OTT Play Contest events include page_section: "ottplay_contest" to distinguish them from other pages. Use PostHog's automatic $current_url or $pathname properties to filter by specific contest page.
scroll_depth (Contest Pages)¶
Triggered: At 25%, 50%, 75%, and 100% scroll depth milestones on contest pages
Location: src/app/ottplaycontest/page.tsx, src/app/ottplaycontest/rules/page.tsx
Properties:
- depth (number) - Scroll depth percentage (25, 50, 75, or 100)
- page_section (string) - Always "ottplay_contest"
- All UTM parameters automatically included
Description: Measures user engagement on contest pages by tracking scroll depth. Each milestone tracked once per session. Same event name as home page scroll tracking but distinguished by page_section property.
Usage Example:
analyticsService.track('scroll_depth', {
depth: 50,
page_section: 'ottplay_contest'
});
section_viewed (Contest Main Page)¶
Triggered: When major sections enter viewport on contest main page
Location: src/app/ottplaycontest/page.tsx
Properties:
- section_name (string) - Name of section: "video", "timeline", or "features"
- page_section (string) - Always "ottplay_contest"
- All UTM parameters automatically included
Description: Tracks when users view important content sections on the contest main page (video background, timeline, creative tools features). Helps understand which contest content engages users most.
Usage Example:
analyticsService.track('section_viewed', {
section_name: 'timeline',
page_section: 'ottplay_contest',
});
page_exit (Contest Pages)¶
Triggered: When user leaves contest pages (beforeunload)
Location: src/app/ottplaycontest/page.tsx, src/app/ottplaycontest/rules/page.tsx
Properties:
- time_on_page_seconds (number) - Total time spent on page
- scroll_depth_reached (number) - Maximum scroll depth reached
- page_section (string) - Always "ottplay_contest"
- All UTM parameters automatically included
Description: Tracks session quality metrics when users leave contest pages. Same event name as home page exit tracking but distinguished by page_section property. Critical for understanding contest page engagement.
Usage Example:
analyticsService.track('page_exit', {
time_on_page_seconds: 120,
scroll_depth_reached: 75,
page_section: 'ottplay_contest',
});
rules_link_clicked¶
Triggered: When user clicks links within contest rules content
Location: src/constants/contestConstants.tsx
Properties:
- link_type (string) - Type of link clicked:
- "submission_form" - Contest submission form link
- "privacy_policy_ottplay" - OTTplay privacy policy link
- "privacy_policy_jadu" - Studio Jadu privacy policy link
- page_section (string) - Always "ottplay_contest"
- All UTM parameters automatically included
Description: Tracks engagement with important links in contest rules, including submission form and privacy policies. Helps measure conversion intent and compliance awareness.
Usage Example:
analyticsService.track('rules_link_clicked', {
link_type: 'submission_form',
page_section: 'ottplay_contest',
});
cta_clicked (Contest CTAs)¶
Triggered: When contest-specific CTA buttons are clicked
Location: src/app/_components/shared/ctaButton.tsx (used in contest pages)
Properties:
- button_text (string) - Text on button (e.g., "Submit your pitch", "Contest rules")
- context (string) - Button context (e.g., "ottplay-hero", "ottplay-contest-rules")
- page (string) - Current page path
- destination (string) - Target URL or action
- current_scroll_percent (number) - Scroll position when clicked
- time_on_page_seconds (number) - Time spent on page before click
- All UTM parameters automatically included
Description: Tracks CTA button clicks on contest pages. Same event as general CTA tracking but can be filtered by context containing "ottplay" prefix. Critical for measuring contest conversion funnel.
Note: While this event doesn't include page_section directly (it's a shared component), you can filter contest CTAs by:
- context contains "ottplay"
- $pathname starts with "/ottplaycontest"
Contest Event Filtering Examples¶
All Contest Events:
page_section = "ottplay_contest"
Main Contest Page Only:
page_section = "ottplay_contest" AND $pathname = "/ottplaycontest"
Rules Page Only:
page_section = "ottplay_contest" AND $pathname = "/ottplaycontest/rules"
Contest Events with UTM Source:
page_section = "ottplay_contest" AND utm_source IS SET
Contest Scroll Depth Events:
event = "scroll_depth" AND page_section = "ottplay_contest"
User Identification¶
identify()¶
Method: analyticsService.identify(userId, traits)
Location: src/lib/analytics.service.ts
Parameters:
- userId (string) - Unique user identifier
- traits (object) - Optional user properties
Description: Associates events with a specific user. Call this after user signup or login.
Usage Example:
analyticsService.identify('user_123', {
email: 'user@example.com',
plan: 'creator',
signup_date: '2024-01-15'
});
Event Naming Convention¶
All custom events follow these conventions:
- Snake_case: All event names use lowercase with underscores
- Action-based: Events describe user actions (e.g., cta_clicked, form_submitted)
- Specific: Events are specific enough to be actionable
- Consistent: Similar events follow similar naming patterns
Examples:
- ✅ signup_form_submitted
- ✅ video_carousel_paused
- ❌ submit (too generic)
- ❌ SignupFormSubmitted (wrong case)
PostHog Configuration¶
Environment Variables¶
NEXT_PUBLIC_POSTHOG_KEY=<your-project-key>
NEXT_PUBLIC_POSTHOG_HOST=https://app.posthog.com
Analytics Service Features¶
The analyticsService automatically enriches all events with:
- UTM Parameters (if present in URL)
utm_sourceutm_mediumutm_campaignutm_term-
utm_content -
Attribution Data
referrer- Referring website-
landing_page- First page visited -
Session Context
- Stored in localStorage for session persistence
- Survives page reloads
Implementation Notes¶
Cookie Consent¶
- PostHog initialization respects cookie consent
- Manual pageview tracking ensures compliance
- Session recording disabled until consent given
Performance¶
- Events batched by PostHog automatically
- No performance impact on page load
- Intersection Observer API used for visibility tracking
Testing¶
- All events include
pageproperty for easy filtering - Use PostHog's "Live Events" view to verify tracking
- Test in incognito mode to simulate new users
Total Events Tracked¶
Custom Events: 37 unique event types (includes 5 contest-specific events) PostHog Built-in Events: $pageview, $rageclick, $dead_click, $autocapture Total Properties Tracked: 55+ unique property fields
Last Updated¶
Date: 2026-02-12
Version: 2.1
Maintained by: Engineering Team
Quick Reference¶
| Event Category | Event Count | Key Events |
|---|---|---|
| User Engagement | 2 | cta_clicked, signup_scroll_initiated |
| Navigation | 3 | nav_item_clicked, logo_clicked, footer_link_clicked |
| Scroll & Visibility | 4 | scroll_depth, video_carousel_visible, hover_videos_visible, promotional_video_visible |
| Video Interaction | 7 | video_muted, video_unmuted, promotional_video_played, promotional_video_progress, video_carousel_paused, video_carousel_resumed, hover_video_revealed |
| Form Events | 8 | signup_form_started, signup_form_field_focused, signup_form_field_blurred, signup_form_validation_error, signup_form_submitted, signup_form_success, signup_form_error, signup_form_abandoned |
| Blog Analytics | 3 | blog_post_viewed, blog_post_read_completion, blog_share_clicked |
| Session Quality | 2 | page_exit, section_viewed |
| OTT Play Contest | 5 | scroll_depth, section_viewed, page_exit, rules_link_clicked, cta_clicked |
Note: Some events (like scroll_depth, section_viewed, page_exit, cta_clicked) are used across multiple pages but distinguished by properties like page_section or context and can be used with $pageurl for more filtering.
Contact¶
For questions about analytics implementation or to request new tracking events, contact the engineering team.