Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

mixpanel

mixpanel2.2mMIT0.18.1TypeScript support: included

A simple server-side API for mixpanel

mixpanel, analytics, api, stats

readme

Mixpanel-node

Build Status

This library provides many of the features in the official JavaScript mixpanel library. It is easy to use, and fully async. It is intended to be used on the server (it is not a client module). The in-browser client library is available at https://github.com/mixpanel/mixpanel-js.

Installation

npm install mixpanel

Quick Start

// grab the Mixpanel factory
var Mixpanel = require('mixpanel');

// create an instance of the mixpanel client
var mixpanel = Mixpanel.init('<YOUR_TOKEN>');

// initialize mixpanel client configured to communicate over http instead of https
var mixpanel = Mixpanel.init('<YOUR_TOKEN>', {
    protocol: 'http',
});

// turn off keepAlive (reestablish connection on each request)
var mixpanel = Mixpanel.init('<YOUR_TOKEN>', {
    keepAlive: false,
});

// pass the custom logger (default is console)
var mixpanel = Mixpanel.init('<YOUR_TOKEN>', {
    debug: true,
    logger: pinoLogger, // or bunyan, or any other logger that implements the same interface
});

// track an event with optional properties
mixpanel.track('my event', {
    distinct_id: 'some unique client id',
    as: 'many',
    properties: 'as',
    you: 'want'
});
mixpanel.track('played_game');

// set an IP address to get automatic geolocation info
mixpanel.track('my event', {ip: '127.0.0.1'});

// track an event with a specific timestamp (up to 5 days old;
// use mixpanel.import() for older events)
mixpanel.track('timed event', {time: new Date()});

// create or update a user in Mixpanel Engage
mixpanel.people.set('billybob', {
    $first_name: 'Billy',
    $last_name: 'Bob',
    $created: (new Date('jan 1 2013')).toISOString(),
    plan: 'premium',
    games_played: 1,
    points: 0
});

// create or update a user in Mixpanel Engage without altering $last_seen
// - pass option $ignore_time: true to prevent the $last_seen property from being updated
mixpanel.people.set('billybob', {
    plan: 'premium',
    games_played: 1
}, {
    $ignore_time: true
});

// set a user profile's IP address to get automatic geolocation info
mixpanel.people.set('billybob', {
    plan: 'premium',
    games_played: 1
}, {
    $ip: '127.0.0.1'
});

// set a user profile's latitude and longitude to get automatic geolocation info
mixpanel.people.set('billybob', {
    plan: 'premium',
    games_played: 1
}, {
    $latitude: 40.7127753,
    $longitude: -74.0059728
});

// set a single property on a user
mixpanel.people.set('billybob', 'plan', 'free');

// set a single property on a user, don't override
mixpanel.people.set_once('billybob', 'first_game_play', (new Date('jan 1 2013')).toISOString());

// increment a numeric property
mixpanel.people.increment('billybob', 'games_played');

// increment a numeric property by a different amount
mixpanel.people.increment('billybob', 'points', 15);

// increment multiple properties
mixpanel.people.increment('billybob', {'points': 10, 'games_played': 1});

// append value to a list
mixpanel.people.append('billybob', 'awards', 'Great Player');

// append multiple values to a list
mixpanel.people.append('billybob', {'awards': 'Great Player', 'levels_finished': 'Level 4'});

// merge value to a list (ignoring duplicates)
mixpanel.people.union('billybob', {'browsers': 'ie'});

// merge multiple values to a list (ignoring duplicates)
mixpanel.people.union('billybob', {'browsers': ['ie', 'chrome']});


// record a transaction for revenue analytics
mixpanel.people.track_charge('billybob', 39.99);

// clear a users transaction history
mixpanel.people.clear_charges('billybob');

// delete a user
mixpanel.people.delete_user('billybob');

// delete a user in Mixpanel Engage without altering $last_seen or resolving aliases
// - pass option $ignore_time: true to prevent the $last_seen property from being updated
// (useful if you subsequently re-import data for the same distinct ID)
mixpanel.people.delete_user('billybob', {$ignore_time: true, $ignore_alias: true});

// Create an alias for an existing distinct id
mixpanel.alias('distinct_id', 'your_alias');

// all functions that send data to mixpanel take an optional
// callback as the last argument
mixpanel.track('test', function(err) { if (err) throw err; });

// track multiple events at once
mixpanel.track_batch([
    {
        event: 'recent event',
        properties: {
            time: new Date(),
            distinct_id: 'billybob',
            gender: 'male'
        }
    },
    {
        event: 'another recent event',
        properties: {
            distinct_id: 'billybob',
            color: 'red'
        }
    }
]);

// import an old event
var mixpanel_importer = Mixpanel.init('valid mixpanel token', {
    secret: 'valid api secret for project'
});

// needs to be in the system once for it to show up in the interface
mixpanel_importer.track('old event', { gender: '' });

mixpanel_importer.import('old event', new Date(2012, 4, 20, 12, 34, 56), {
    distinct_id: 'billybob',
    gender: 'male'
});

// import multiple events at once
mixpanel_importer.import_batch([
    {
        event: 'old event',
        properties: {
            time: new Date(2012, 4, 20, 12, 34, 56),
            distinct_id: 'billybob',
            gender: 'male'
        }
    },
    {
        event: 'another old event',
        properties: {
            time: new Date(2012, 4, 21, 11, 33, 55),
            distinct_id: 'billybob',
            color: 'red'
        }
    }
]);

FAQ

Where is mixpanel.identify()?

mixpanel-node is a server-side library, optimized for stateless shared usage; e.g., in a web application, the same mixpanel instance is used across requests for all users. Rather than setting a distinct_id through identify() calls like Mixpanel client-side libraries (where a single Mixpanel instance is tied to a single user), this library requires you to pass the distinct_id with every tracking call. See https://github.com/mixpanel/mixpanel-node/issues/13.

How do I get or set superproperties?

See the previous answer: the library does not maintain user state internally and so has no concept of superproperties for individual users. If you wish to preserve properties for users between requests, you will need to load these properties from a source specific to your app (e.g., your session store or database) and pass them explicitly with each tracking call.

Tests

# in the mixpanel directory
npm install
npm test

Attribution/Credits

Heavily inspired by the original js library copyright Mixpanel, Inc. (http://mixpanel.com/)

Copyright (c) 2014-21 Mixpanel Original Library Copyright (c) 2012-14 Carl Sverre

Contributions from:

License

Released under the MIT license. See file called LICENSE for more details.

changelog

0.18.1 / 2025-03-12

  • add secret to config types (thanks gierschv)

0.18.0 / 2023-09-12

  • custom logger support (thanks iatsiuk)

0.17.0 / 2022-08-11

  • support sending timestamps with millisecond precision

0.16.0 / 2022-06-02

  • support automatic geolocation with geolocate option (thanks tmpvar)
  • send library version as property with events (thanks ArsalImam)

0.15.0 / 2022-05-20

  • use keepAlive by default for requests

0.14.0 / 2021-10-29

  • support $latitude and $longitude in profile operations (thanks wneild)

0.13.0 / 2020-09-04

  • support API Secret auth for imports and deprecate use of API Key

0.12.0 / 2020-08-31

  • https-proxy-agent upgrade to 5.0.0 to fix https.request patching and many subdependency upgrades (thanks veerabio)
  • dropped support for node 8

0.11.0 / 2019-11-26

  • add support for Groups API

0.10.3 / 2019-10-09

  • upgrade https-proxy-agent for security fix (thanks omrilotan)

0.10.2 / 2019-03-26

  • type definitions for people.unset (thanks bradleyayers)

0.10.1 / 2018-12-03

  • support configurable API path (thanks CameronDiver)

0.9.2 / 2018-05-22

  • add type declarations file (thanks mklopets)

0.9.1 / 2018-04-12

  • upgrade https-proxy-agent for security fix

0.9.0 / 2018-02-09

  • default to tracking over HTTPS (thanks jhermsmeier)

0.8.0 / 2017-11-28

0.7.0 / 2017-04-07

  • added track_batch for tracking multiple recent events per request (thanks cruzanmo)
  • support for routing requests through proxy server specified in env var HTTPS_PROXY or HTTP_PROXY (thanks colestrode)
  • dropped support for node 0.10 and 0.12

0.6.0 / 2017-01-03

  • support for time field in mixpanel.track() (thanks cruzanmo)

0.5.0 / 2016-09-15

  • optional https support (thanks chiangf)

0.4.1 / 2016-09-09

  • include $ignore_alias in permitted people modifiers (thanks Left47)

0.4.0 / 2016-02-09

  • allow optional modifiers in all people calls for $ignore_time, $ip, and $time fields

0.3.2 / 2015-12-10

  • correct $delete field in people.delete_user request (thanks godspeedelbow)

0.3.1 / 2015-08-06

  • added config option for API host (thanks gmichael225)

0.3.0 / 2015-08-06

  • added people.union support (thanks maeldur)

0.2.0 / 2015-04-14

  • added batch import support

0.1.1 / 2015-03-27

  • fixed callback behavior in track_charges when no properties supplied (thanks sorribas)

0.1.0 / 2015-03-20

  • updated URL metadata (thanks freeall)
  • updated dev dependencies
  • added builds for iojs, node 0.12, dropped support for node <0.10

0.0.20 / 2014-05-11

  • removed hardcoded port 80 for more flexibility (thanks zeevl)

0.0.19 / 2014.04.03

  • added people.append (thanks jylauril)

0.0.18 / 2013-08-23

  • added callback to alias (thanks to sandinmyjoints)
  • added verbose config option (thanks to sandinmyjoints)
  • added unset method (thanks to lukapril)

0.0.17 / 2013-08-12

  • added alias method (thanks to PierrickP)

0.0.16 / 2013-06-29

  • allow special key "ip" to be 0 in people.set (thanks to wwlinx)

0.0.15 / 2013-05-24

  • adds set once functionality to people (thanks to avoid3d)
  • $ignore_time in people.set (thanks to Rick Cotter)

0.0.14 / 2013-03-28

  • revert Randal's http only patch since Mixpanel indeed supports https.
  • handles the ip property in a property object properly for people calls

0.0.13 / 2013-03-25

  • force requests to go over http [reverted in 0.0.14]

0.0.12 / 2013-01-24

  • track_charge() no longer includes $time by default, rather it lets Mixpanel's servers set the time when they receive the transaction. This doesn't modify the ability for the user to pass in their own $time (for importing transactions).

0.0.11 / 2013-01-11

  • added track_charge() method which provides the ability to record user transactions for revenue analytics.
  • added clear_charges() method which provides the ability to remove a users transactions from Mixpanel
  • added tests for delete_user()

0.0.10 / 2012-11-26

  • added import() method which provides the ability to import events older than 5 days. Contributions from Thomas Watson Steen.

0.0.9 / 2012-11-15

  • removed time from properties sent to server. This is to ensure that UTC is always used. Mixpanel will set the correct time as soon as they receive the event.

0.0.8 / 2012-10-24

  • added mp_lib property, so people can segment by library

0.0.7 / 2012-01-05

  • added unit tests
  • people.increment() only prints error message if debug is true

0.0.6 / 2012-01-01

  • added engage support
    • people.set()
    • people.increment()
    • people.delete_user()
  • deprecated old constructor: require("mixpanel").Client(token)
  • added new constructor: require("mixpanel").init(token)