React Router V7 declarative mode
Contents
This guide walks you through setting up PostHog for React Router V7 in declarative mode. If you're using React Router in another mode, find the guide for that mode in the React Router page. If you're using React with another framework, go to the React integration guide.
- 1
Install client-side SDKs
RequiredFirst, you'll need to install
posthog-jsand@posthog/reactusing your package manager. These packages allow you to capture client-side events. - 2
Add your environment variables
RequiredAdd your environment variables to your
.env.localfile and to your hosting provider (e.g. Vercel, Netlify, AWS). You can find your project API key and host in your project settings. If you're using Vite, includingVITE_PUBLIC_in their names ensures they are accessible in the frontend..env.local - 3
Add the PostHogProvider to your app
RequiredIn declarative mode, you'll need to wrap your
BrowserRouterwith thePostHogProvidercontext. This passes an initialized PostHog client to your app.src/main.tsxThis initializes PostHog and passes it to your app through the
PostHogProvidercontext.TypeError: Cannot read properties of undefined
If you see the error
TypeError: Cannot read properties of undefined (reading '...')this is likely because you tried to call a posthog function when posthog was not initialized (such as during the initial render). On purpose, we still render the children even if PostHog is not initialized so that your app still loads even if PostHog can't load.To fix this error, add a check that posthog has been initialized such as:
ReactTypescript helps protect against these errors.
Verify client-side events are captured
CheckpointConfirm that you can capture client-side events and see them in your PostHog projectAt this point, you should be able to capture client-side events and see them in your PostHog project. This includes basic events like page views and button clicks that are autocaptured.
You can also try to capture a custom event to verify it's working. You can access PostHog in any component using the
usePostHoghook.TSXYou should see these events in a minute or two in the activity tab.
- 4
Access PostHog methods
RequiredOn the client-side, you can access the PostHog client using the
usePostHoghook. This hook returns the initialized PostHog client, which you can use to call PostHog methods. For example:TSXFor a complete list of available methods, see the posthog-js documentation.
- 5
Identify your user
RecommendedNow that you can capture basic client-side events, you'll want to identify your user so you can associate users with captured events.
Generally, you identify users when they log in or when they input some identifiable information (e.g. email, name, etc.). You can identify users by calling the
identifymethod on the PostHog client:TSXPostHog automatically generates anonymous IDs for users before they're identified. When you call identify, a new identified person is created. All previous events tracked with the anonymous ID link to the new identified distinct ID, and all future captures on the same browser associate with the identified person.
- 6
Create an error boundary
RecommendedPostHog can capture exceptions thrown in your app through an error boundary. PostHog provides a
PostHogErrorBoundarycomponent that you can use to capture exceptions. You can wrap your app with this component to capture exceptions.TSXThis automatically captures exceptions thrown in your React Router app using the
posthog.captureException()method. - 7
Tracking element visibility
RecommendedThe
PostHogCaptureOnViewedcomponent enables you to automatically capture events when elements scroll into view in the browser. This is useful for tracking impressions of important content, monitoring user engagement with specific sections, or understanding which parts of your page users are actually seeing.The component wraps your content and sends a
$element_viewedevent to PostHog when the wrapped element becomes visible in the viewport. It only fires once per component instance.Basic usage:
ReactWith custom properties:
You can include additional properties with the event to provide more context:
ReactTracking multiple children:
Use
trackAllChildrento track each child element separately. This is useful for galleries or lists where you want to know which specific items were viewed:ReactWhen
trackAllChildrenis enabled, each child element sends its own event with achild_indexproperty indicating its position.Custom intersection observer options:
You can customize when elements are considered "viewed" by passing options to the
IntersectionObserver:ReactThe component passes all other props to the wrapper
div, so you can add styling, classes, or other HTML attributes as needed. - 8
Set up server-side analytics
RecommendedNow that you've set up PostHog for React Router V7 in declarative mode, you can continue to set up server-side analytics. You can find our other SDKs in the SDKs page.
To help PostHog track your user sessions across the client and server, you'll need to add the
__add_tracing_headers: ['your-backend-domain1.com', 'your-backend-domain2.com', ...]option to your PostHog initialization:TSXThis adds the
X-POSTHOG-DISTINCT-IDandX-POSTHOG-SESSION-IDheaders to your requests, which you can later use on the server-side. - 9
Next steps
RecommendedNow that you've set up PostHog for React Router, you can start capturing events and exceptions in your app.
To get the most out of PostHog, you should familiarize yourself with the following:
- PostHog Web SDK docs: Learn more about the PostHog Web SDK and how to use it on the client-side.
- PostHog Node SDK docs: Learn more about the PostHog Node SDK and how to use it on the server-side.
- Identify users: Learn more about how to identify users in your app.
- Group analytics: Learn more about how to use group analytics in your app.
- PostHog AI: After capturing events, use PostHog AI to help you understand your data and build insights.
- Feature flags and experiments: Feature flag and experiment setup is the same as React. You can find more details in the React integration guide.