React Native
Installation
Install the SDK
npm install phase-analyticsbun add phase-analyticsyarn add phase-analyticspnpm add phase-analyticsInstall Required Peer Dependencies
Phase Analytics requires the following React Native packages to function properly:
npm install @react-native-async-storage/async-storage @react-native-community/netinfo react-native-device-info react-native-localize @react-navigation/nativebun add @react-native-async-storage/async-storage @react-native-community/netinfo react-native-device-info react-native-localize @react-navigation/nativeyarn add @react-native-async-storage/async-storage @react-native-community/netinfo react-native-device-info react-native-localize @react-navigation/nativepnpm add @react-native-async-storage/async-storage @react-native-community/netinfo react-native-device-info react-native-localize @react-navigation/nativeThese dependencies are required for the SDK to work correctly. The SDK uses:
@react-native-async-storage/async-storage- Local storage for offline event queuing@react-native-community/netinfo- Network state monitoringreact-native-device-info- Device information collectionreact-native-localize- Locale and timezone detection@react-navigation/native- Automatic screen tracking (only needed if usingtrackNavigation)
Install iOS Dependencies
For iOS, install CocoaPods dependencies:
cd ios && pod installGet Your API Key
- Sign in to Phase Dashboard
- Create a new project or select an existing one
- Open API Keys tab
- Copy your API Key (starts with
phase_)
Setup
Wrap your app with the PhaseProvider component to initialize the SDK:
import { PhaseProvider } from 'phase-analytics/react-native';
import { NavigationContainer } from '@react-navigation/native';
export default function App() {
return (
<NavigationContainer>
<PhaseProvider apiKey="phase_xxx">
<YourApp />
</PhaseProvider>
</NavigationContainer>
);
}The PhaseProvider only initializes the SDK. You must call Phase.identify() before tracking events.
Configuration
The PhaseProvider component accepts the following props:
Prop
Type
Usage
Identify User
Required: Call Phase.identify() before using any other methods. This registers the device and starts a session.
import { Phase } from 'phase-analytics/react-native';
import { useEffect } from 'react';
export default function App() {
useEffect(() => {
// Initialize analytics - no PII collected by default
Phase.identify();
}, []);
return <YourApp />;
}Privacy by default:
- No personal data is collected without explicit properties
- Device ID is auto-generated and stored locally
- Only technical metadata is collected (OS version, platform, locale)
Adding custom properties:
You can optionally attach user properties. Important: If you add PII (personally identifiable information), ensure you have proper user consent:
// After user login and consent
await Phase.identify({
user_id: '123',
plan: 'premium',
beta_tester: true
});
// ⚠️ If adding PII, get consent first
const hasConsent = await customGetUserConsent();
if (hasConsent) {
await Phase.identify({
email: '[email protected]',
name: 'John Doe'
});
}Properties must be primitives: string, number, boolean, or null.
Track Events
Track custom events with optional parameters. Note: Phase.identify() must be called first.
// Event without parameters
Phase.track('app_opened');
// Event with parameters
Phase.track('purchase_completed', {
amount: 99.99,
currency: 'USD',
product_id: 'premium_plan'
});Event naming rules:
- Alphanumeric characters, underscores (
_), hyphens (-), periods (.), and forward slashes (/) - 1-256 characters
- Examples:
purchase,user.signup,payment/success
Event parameters:
- Must be primitives:
string,number,boolean, ornull
Automatic Screen Tracking
Enable automatic screen tracking by setting trackNavigation to true and passing a navigationRef:
import { PhaseProvider } from 'phase-analytics/react-native';
import { NavigationContainer, useNavigationContainerRef } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
const Stack = createNativeStackNavigator();
export default function App() {
const navigationRef = useNavigationContainerRef();
return (
<NavigationContainer ref={navigationRef}>
<PhaseProvider
apiKey="phase_xxx"
trackNavigation={true}
navigationRef={navigationRef}
>
<Stack.Navigator>
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Settings" component={SettingsScreen} />
</Stack.Navigator>
</PhaseProvider>
</NavigationContainer>
);
}How it works:
- Requires
navigationReffromuseNavigationContainerRef()hook - Pass the ref to both
NavigationContainerandPhaseProvider - Automatically tracks screen views on navigation state changes
- Screen names are converted from route names
- Works with nested navigators and dynamic routes
Important: The navigationRef must be passed to both NavigationContainer and PhaseProvider for automatic tracking to work.
Type Reference
DeviceProperties
Custom user/device attributes passed to Phase.identify():
Prop
Type
EventParams
Event parameters passed to Phase.track():
Prop
Type
How It Works
Offline Support
Events are queued locally using @react-native-async-storage/async-storage when offline. The queue automatically syncs when connection is restored.
Privacy
- No personal data is collected by default
- Device IDs are generated locally and stored persistently
- Geolocation is resolved server-side from IP address (disable with properties)
- All data collection is optional via configuration
Performance
- Offline events are batched and sent asynchronously
- Network state is monitored via
@react-native-community/netinfo - Failed requests retry with exponential backoff
- Maximum batch size: 1000 events