How to track users across products on PostHog

intermediate 8 min read Updated 2026-03-18
Quick Answer

Track users across products in PostHog by using consistent user identification with the same distinct_id across all products and enabling cross-domain tracking. Set up shared user properties and configure proper alias events to merge user journeys.

Prerequisites

  • PostHog account with multiple products
  • Admin access to PostHog projects
  • Understanding of user identification concepts
  • Access to product codebases for SDK implementation

Step-by-Step Instructions

1

Configure Cross-Domain Tracking

Navigate to Project SettingsWebsite & App in your PostHog dashboard. Enable Cross-domain tracking and add all your product domains to the Authorized domains list. This ensures PostHog can track users as they move between different product websites.
Include all subdomains and different top-level domains where your products are hosted
2

Implement Consistent User Identification

In each product's PostHog SDK implementation, use the same distinct_id for the same user. Call posthog.identify('user_123') with identical user IDs across all products. Use a shared user identifier like email address, database ID, or UUID that exists across your product ecosystem.

posthog.identify('user@example.com', {
  email: 'user@example.com',
  product_suite: 'enterprise'
})
Hash sensitive identifiers like email addresses for privacy while maintaining consistency
3

Set Up Shared User Properties

Define consistent user properties across all products in Data ManagementProperties. Create shared properties like user_tier, signup_date, and company_id. Ensure all products send the same property names and value formats when identifying users.
Create a centralized user properties schema document to maintain consistency across development teams
4

Configure Product-Specific Events

Create events that include a product_name or source_product property to distinguish which product generated each event. In each product, add this context to all events:

posthog.capture('button_clicked', {
  button_name: 'signup',
  product_name: 'product_a',
  page_url: window.location.href
})
5

Set Up User Aliases for Account Merging

When users sign up or log in across different products, use posthog.alias() to connect anonymous sessions with identified users. Call posthog.alias('new_distinct_id') before posthog.identify() to merge user timelines from different products into a single user journey.
Only call alias() once per user to avoid creating duplicate profiles
6

Create Cross-Product Funnels and Insights

In Insights, create funnels that span multiple products by filtering events with product_name properties. Use Cohorts to segment users who have used multiple products. Set up retention analysis to see how users move between products over time.
Use the 'All Events' view with product filters to visualize complete user journeys
7

Monitor Data Quality with Person Profiles

Go to Persons in your PostHog dashboard to verify user tracking is working correctly. Check individual person profiles to ensure events from all products appear under single user profiles. Look for proper event attribution and consistent user properties across products.
Set up alerts for duplicate user profiles which may indicate identification issues

Common Issues & Troubleshooting

Users appear as separate profiles across products

Check that you're using identical distinct_id values across products. Verify posthog.identify() is called with the same identifier in all product implementations. Use posthog.alias() to merge existing duplicate profiles.

Cross-domain tracking not working

Ensure all domains are added to Authorized domains in Project Settings. Verify PostHog SDK is initialized with the same project API key across all products. Check that third-party cookie blocking isn't preventing cross-domain functionality.

Events missing product context

Add product_name or similar properties to all events in each product. Review your event tracking implementation to ensure consistent property naming. Use PostHog's Live Events view to verify properties are being sent correctly.

User properties not syncing between products

Call posthog.identify() with complete user properties in each product, not just the user ID. Ensure property names and formats are identical across products. Check that user property updates in one product include calls to PostHog to sync the changes.

Prices mentioned in this guide are pulled from current plan data and may change. Always verify on the official PostHog website before purchasing.