| name | posthog-analytics |
| description | PostHog analytics and session replay integration for React Native mobile apps. Use when adding event tracking, understanding session replay behavior, or troubleshooting analytics setup. |
PostHog Analytics & Session Replay
What's Already Configured
The bootstrap includes a complete PostHog setup with:
- Session Replay - Records user sessions with privacy protections
- Automatic Screen Tracking - Tracks navigation automatically via
ScreenTracker component
- Event Tracking - Ready to use via
usePostHog() hook
- Privacy Controls - Text inputs and images are masked by default
Files Involved
| File | Purpose |
|---|
lib/posthog.ts | Configuration with session replay plugin |
app/_layout.tsx | PostHogProvider wrapper and ScreenTracker component |
app.json | PostHog plugin registration |
.env.example | Environment variable template |
How Session Replay Works
What Gets Recorded
- ✅ Screen views and navigation
- ✅ Touch interactions (taps, swipes)
- ✅ UI changes and animations
- ✅ Network requests (with
captureNetworkTelemetry: true)
- ✅ Console logs (with
captureLog: true)
Privacy Protections
- 🔒 Text inputs masked - All form inputs show as
****
- 🔒 Images masked - Photos and avatars are blurred/hidden
- 🔒 Sensitive data protected - No actual typed content recorded
Recording Behavior
- Starts automatically when app launches
- Continues throughout the session
- Stops when app is closed/backgrounded
- Each session is a separate replay in PostHog dashboard
- Data is compressed and sent in batches (not real-time)
Data Usage
- ~100-500KB per minute of usage
- Throttled to 1 second intervals (
throttleDelayMs: 1000)
- Only captures visual changes, not full video
Configuration Options
All settings are in lib/posthog.ts:
| Setting | Default | Purpose |
|---|
maskAllTextInputs | true | Hide all text input content |
maskAllImages | true | Blur/hide all images |
captureLog | true | Include console logs in replay |
captureNetworkTelemetry | true | Track API calls |
throttleDelayMs | 1000 | Snapshot interval (milliseconds) |
captureNativeAppLifecycleEvents | true | Track app open/close/background |
Using PostHog in Your App
Track Custom Events
Import the hook and use it anywhere:
import { usePostHog } from 'posthog-react-native';
const posthog = usePostHog();
posthog?.capture('button_pressed', {
button_name: 'checkout',
screen: 'product_detail',
});
Identify Users
Set user identity (typically after login):
posthog?.identify(userId, {
email: user.email,
plan: 'premium',
});
Reset on Logout
Clear user identity:
posthog?.reset();
Set User Properties
Update user metadata:
posthog?.setPersonProperties({
credits: 100,
subscription_status: 'active',
});
Environment Variables
Required for PostHog to work:
EXPO_PUBLIC_POSTHOG_KEY=phc_your_project_key
EXPO_PUBLIC_POSTHOG_HOST=https://eu.i.posthog.com
If not set, PostHog is automatically disabled with a console warning.
Rebuild Required
PostHog session replay uses native modules. After configuration changes to app.json, you must rebuild:
npx expo prebuild --clean
npx expo run:ios
Or with EAS:
eas build --profile development-client --platform ios
Viewing Data in PostHog
Session Replays
- Go to PostHog → Session Replay
- Click on a session to watch the replay
- See timeline of events, network calls, and console logs
Events
- Go to PostHog → Events
- See all captured events:
$screen - Automatic screen views
$pageview - Navigation tracking
- Custom events you capture
Users
- Go to PostHog → Persons
- See identified users with their properties
- View their session history and events
Common Issues
"Waiting for events" in Dashboard
Cause: App hasn't been rebuilt after configuration changes
Fix: Run npx expo prebuild --clean and rebuild the app
No Session Replay
Cause: Session replay requires native modules to be rebuilt
Fix: Clean rebuild with npx expo prebuild --clean
Events Not Appearing
Cause: PostHog API key not set or app not rebuilt
Fix:
- Verify
EXPO_PUBLIC_POSTHOG_KEY is set in environment
- Rebuild the app
- Wait 1-2 minutes (there can be a delay)
Privacy Concerns
Cause: Default settings mask all inputs and images
Fix: Adjust maskAllTextInputs and maskAllImages in lib/posthog.ts if you need to see more data (consider privacy implications)
Automatic Screen Tracking
The ScreenTracker component in app/_layout.tsx automatically tracks all screen views using Expo Router's navigation hooks. No manual tracking needed for navigation.
When to Use PostHog
- Product Analytics - Understand user behavior and feature usage
- Debugging - Watch session replays to see exactly what users experienced
- Feature Flags - A/B testing and gradual rollouts (requires additional setup)
- User Feedback - Combine with support tickets to see what happened
- Conversion Funnels - Track user journeys through your app
Performance Impact
- Minimal CPU overhead (snapshots are throttled)
- Network usage: ~100-500KB per minute
- Battery impact: Negligible
- Storage: Data is sent to PostHog, not stored locally
Best Practices
- Always mask sensitive data - Keep
maskAllTextInputs: true for production
- Track meaningful events - Don't over-track; focus on key user actions
- Identify users after login - Enables user-specific analysis
- Reset on logout - Prevents data leakage between users
- Use properties - Add context to events for better analysis
- Test in development - Verify events appear before deploying
Reference