Skip to main content

Screen tracking for analytics

Unlike React Navigation, Expo Router always has access to a URL. This means screen tracking is as easy as the web.

  1. Create a higher-order component that observes the currently selected URL
  2. Track the URL in your analytics provider
File System
app/
_layout.js # This Layout wraps all other routes
...
app/_layout.js
import { useEffect } from "react";
import { usePathname, useGlobalSearchParams, Slot } from "expo-router";

export default function Layout() {
const pathname = usePathname();
const params = useGlobalSearchParams();

// Track the location in your analytics provider here.
useEffect(() => {
analytics.track({ pathname, params });
}, [pathname, params]);

// Export all the children routes in the most basic way.
return <Slot />;
}

Now when the user changes routes, the analytics provider will be notified.

Migrating from React Navigation​

React Navigation's screen tracking guide cannot make the same assumptions about the navigation state that Expo Router can. As a result, the implementation requires the use of onReady and onStateChange callbacks. Avoid using these methods if possible as the root <NavigationContainer /> is not directly exposed and allows cascading in Expo Router.