Skip to content

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

  1. System Events
  2. User Engagement Events
  3. Navigation Events
  4. Scroll & Visibility Events
  5. Video Interaction Events
  6. Form Events
  7. Blog Analytics Events
  8. Session Quality Events
  9. Content Engagement Events
  10. 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.


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.


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.


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.


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.


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',
});


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:

  1. UTM Parameters (if present in URL)
  2. utm_source
  3. utm_medium
  4. utm_campaign
  5. utm_term
  6. utm_content

  7. Attribution Data

  8. referrer - Referring website
  9. landing_page - First page visited

  10. Session Context

  11. Stored in localStorage for session persistence
  12. Survives page reloads

Implementation Notes

  • 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 page property 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.