Mixpanel React Native SDK
Mixpanel React Native SDK is the official open-source library for integrating Mixpanel analytics into React Native applications, supporting both iOS and Android platforms. It acts as a wrapper around Mixpanel's native SDKs and enables robust offline tracking capabilities. The current stable version is 3.3.0, with frequent minor and patch releases to include enhancements, security updates, and bug fixes, indicating an active development cadence. A key differentiator is its direct wrapping of native SDKs, ensuring consistency with native Mixpanel features, and its explicit support for data persistence via `async-storage` to handle offline scenarios reliably. It's designed for React Native v0.6+ and ships with TypeScript types.
Common errors
-
TypeError: Cannot read property 'getItem' of undefined
cause The `@react-native-async-storage/async-storage` dependency is missing or not correctly linked, which is required for data persistence.fixInstall `@react-native-async-storage/async-storage` and run `pod install` for iOS: `npm install @react-native-async-storage/async-storage && cd ios && pod install` -
Invariant Violation: 'main' has not been registered. This can happen if:
cause Common React Native setup issue, often related to the Metro bundler or app registration.fixEnsure your `index.js` or `index.ts` file correctly registers the root component. Also, try clearing the Metro bundler cache (`npm start --reset-cache`) and reinstalling node modules (`rm -rf node_modules && npm install`). -
Error: Mixpanel has not been initialized. Call init() before tracking.
cause Attempting to use Mixpanel tracking methods (`track`, `identify`, etc.) before calling `mixpanel.init()`.fixEnsure `mixpanel.init()` is called once, typically in a `useEffect` hook for functional components or `componentDidMount` for class components, before any tracking methods are invoked.
Warnings
- breaking As of v3.2.0, `@react-native-async-storage/async-storage` became a peer dependency. Your project must now explicitly install and manage this dependency. This change was implemented to avoid conflicts with frameworks like Expo.
- gotcha Versions prior to v3.0.9 had a bug where the distinct ID could sometimes be `<nil>`, leading to inconsistent tracking data.
- gotcha When using Xcode versions between 12.5 and 13.2.1, a known Swift compile issue could occur.
Install
-
npm install mixpanel-react-native -
yarn add mixpanel-react-native -
pnpm add mixpanel-react-native
Imports
- Mixpanel
const Mixpanel = require('mixpanel-react-native').Mixpanel;import { Mixpanel } from 'mixpanel-react-native'; - MixpanelInstance
import type { MixpanelInstance } from 'mixpanel-react-native'; - MixpanelProperties
import type { MixpanelProperties } from 'mixpanel-react-native';
Quickstart
import React, { useEffect } from 'react';
import { Button, SafeAreaView, Text, View } from 'react-native';
import { Mixpanel } from 'mixpanel-react-native';
const projectToken = process.env.MIXPANEL_PROJECT_TOKEN ?? 'YOUR_MIXPANEL_PROJECT_TOKEN'; // Replace with your Mixpanel project token
const trackAutomaticEvents = false;
const mixpanel = new Mixpanel(projectToken, trackAutomaticEvents);
export default function App() {
useEffect(() => {
mixpanel.init();
}, []);
const trackEvent = (eventName) => {
mixpanel.track(eventName, { source: 'React Native App', time: new Date().toISOString() });
console.log(`Tracked event: ${eventName}`);
};
const identifyUser = () => {
const userId = 'user123'; // Replace with actual user ID
mixpanel.identify(userId);
mixpanel.people.set({ '$first_name': 'Test', '$last_name': 'User', 'plan': 'Free' });
console.log(`Identified user: ${userId}`);
};
return (
<SafeAreaView style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<Text style={{ fontSize: 24, marginBottom: 20 }}>Mixpanel React Native Demo</Text>
<View style={{ gap: 10 }}>
<Button title="Track 'App Loaded'" onPress={() => trackEvent('App Loaded')} />
<Button title="Track 'Button Clicked'" onPress={() => trackEvent('Button Clicked')} />
<Button title="Identify User" onPress={identifyUser} />
<Button title="Reset Mixpanel" onPress={() => mixpanel.reset()} />
</View>
</SafeAreaView>
);
}