Home >Web Front-end >JS Tutorial >Setup Mixpanel Analytics in a NextJS Application
Analytics is crucial for any profitable application, whether it’s a small application with 100 users or a large application with 10,000 users.
Understanding your users is one of the most critical things. And mixpanel is one of the best tools to do that.
Today, we will learn how to integrate and start mixpanel tracking.
I assume you already have a NextJS project setup. Also, create a new Mixpanel account from here (If you haven’t already).
Keep in mind that I am showing for NextJS but it’s applicable for any ReactJS app too.
Then, install the dependency
npm install mixpanel-browser
First, add the following environment variable
NEXT_PUBLIC_MIXPANEL_TOKEN="YOUR_TOKEN_HERE"
Now, you can get the mixpanel token from your project’s dashboard.
Then go to Settings -> Project Settings
Then grab the Project Token and add it in the environment file.
Create a file named mixpanel.ts and add the following code
import mixpanel from 'mixpanel-browser'; // Define event names as constants to prevent typos export const ANALYTICS_EVENTS = { PAGE_VIEW: 'Page View', BUTTON_CLICK: 'Button Click', FORM_SUBMIT: 'Form Submit', USER_SIGNED_IN: 'User Signed In', USER_SIGNED_UP: 'User Signed Up', USER_SIGNED_OUT: 'User Signed Out', // ... other events }; // Initialize mixpanel const MIXPANEL_TOKEN = process.env.NEXT_PUBLIC_MIXPANEL_TOKEN; if (MIXPANEL_TOKEN) { mixpanel.init(MIXPANEL_TOKEN, { debug: process.env.NODE_ENV === 'development', track_pageview: true, persistence: 'localStorage', ignore_dnt: true, }); }
So, initialize the mixpanel as high as possible in your component tree.
Now, after you add the configuration, it’s time to add some reusable functions to track mixpanel events.
So add the following code in the same file:
export const MixpanelAnalytics = { track: <T extends Record<string, any>>( eventName: string, properties?: T & CommonEventProperties ) => { try { if (MIXPANEL_TOKEN) { mixpanel.track(eventName, { ...properties, timestamp: Date.now(), path: typeof window !== 'undefined' ? window.location.pathname : undefined, }); } } catch (error) { console.error('Error tracking event:', error); } }, pageView: (pageName: string, properties?: Record<string, any>) => { try { if (MIXPANEL_TOKEN) { MixpanelAnalytics.track(ANALYTICS_EVENTS.PAGE_VIEW, { page: pageName, ...properties, }); } } catch (error) { console.error('Error tracking page view:', error); } } };
If you analyze these 2 functions above
This function is used to track any kind of event.
For example, if you want to track a user, click a button to visit an external website. Maybe for affiliate calculation
You can do the following:
MixpanelAnalytics.track("VISIT_WEBSITE", { website_name: name, website_url: website, visit_count: (mixpanel.get_property('total_website_visits') ?? 0) + 1, });
This is a pretty straightforward method to track every page view inside your application.
Now remember — when we initialized mixpanel, we already told it to track page views:
mixpanel.init(MIXPANEL_TOKEN, { track_pageview: true, << HERE ...others });
So this custom tracking is only for more detailed analysis.
Now, tracking clicks is cool and all, but many times, it’s not enough.
Maybe you want to track specific users. Maybe you want to know who is doing what. Maybe you are creating a funnel to analyze user behavior.
For these scenarios,mixpanel provides 2 functions.
identify
reset
So, on a high level, after a user logs in, you can call
mixpanel.identify("whatever identified you want (usually email or userid)")
And on logout, you can reset it
mixpanel.reset()
Now you can also add additional context or details about your users using the people.set() method
For example,
npm install mixpanel-browser
There are some additional methods like append, union, increment etc., to handle more scenarios, but skip them as they are not the focus of this article. You can read more here
Now, in many applications (especially public sites) — it’s not mandatory to log in to see the contents.
But how do we track those people if they don’t log in?
To handle all these scenarios, let’s create two more utility functions.
NEXT_PUBLIC_MIXPANEL_TOKEN="YOUR_TOKEN_HERE"
So you can track your known and unknown users with this.
An example usage can look like the following: In one of the root files — (layout.tsx file in app router, _app.tsx in pages router)
Add the following
import mixpanel from 'mixpanel-browser'; // Define event names as constants to prevent typos export const ANALYTICS_EVENTS = { PAGE_VIEW: 'Page View', BUTTON_CLICK: 'Button Click', FORM_SUBMIT: 'Form Submit', USER_SIGNED_IN: 'User Signed In', USER_SIGNED_UP: 'User Signed Up', USER_SIGNED_OUT: 'User Signed Out', // ... other events }; // Initialize mixpanel const MIXPANEL_TOKEN = process.env.NEXT_PUBLIC_MIXPANEL_TOKEN; if (MIXPANEL_TOKEN) { mixpanel.init(MIXPANEL_TOKEN, { debug: process.env.NODE_ENV === 'development', track_pageview: true, persistence: 'localStorage', ignore_dnt: true, }); }
So this will initialize the user appropriately when they visit the site.
You can gather data and assign it to this particular user going forward.
Now comes the fun part. Notice the following code and update it according to your needs.
export const MixpanelAnalytics = { track: <T extends Record<string, any>>( eventName: string, properties?: T & CommonEventProperties ) => { try { if (MIXPANEL_TOKEN) { mixpanel.track(eventName, { ...properties, timestamp: Date.now(), path: typeof window !== 'undefined' ? window.location.pathname : undefined, }); } } catch (error) { console.error('Error tracking event:', error); } }, pageView: (pageName: string, properties?: Record<string, any>) => { try { if (MIXPANEL_TOKEN) { MixpanelAnalytics.track(ANALYTICS_EVENTS.PAGE_VIEW, { page: pageName, ...properties, }); } } catch (error) { console.error('Error tracking page view:', error); } } };
In the above function we are tracking the particular user’s profile with the tracking data and also making sure that we are counting their visits to the particular website as well.
Cool right?
When working with analytics — it’s very important to keep the data consistent.
So, make sure to add proper types for analytics events.
For example
Never use plain strings for event names.
MixpanelAnalytics.track("VISIT_WEBSITE", { website_name: name, website_url: website, visit_count: (mixpanel.get_property('total_website_visits') ?? 0) + 1, });
For events payload, make sure to use consistent structure by using types
mixpanel.init(MIXPANEL_TOKEN, { track_pageview: true, << HERE ...others });
Always maintain consistent user properties across sessions.
mixpanel.identify("whatever identified you want (usually email or userid)")
Otherwise, down the road, the data will be useless.
Remember to handle analytics initialization properly in your client-side components.
Also, ensure that sensitive user data is handled appropriately according to your privacy policy and data protection regulations.
Hope you learned something new today.
Have a great day!
The above is the detailed content of Setup Mixpanel Analytics in a NextJS Application. For more information, please follow other related articles on the PHP Chinese website!