Mixpanel and KISSMetrics are both great tools to track how people interact with your site. At the core of these services is a simple Javascript API to track events:

kissmetrics.push(['record', 'My Event', {'My Property':'Value'}]); mixpanel.track('My Event', {'My Property': 'Value'});

At first glance, the Javascript seems so simple a third-party library is not waranted. However, in a Rails application, the thing we are most interested in tracking is the creation of resources. With Rails, there is not normally a "landing page" after you create a resource. So the only place we know when we have just successfully created a resource is in the controller itself.

def create @group = current_user.groups.build(params[:group]) if @group.save # track event here redirect_to @group else render action: "new" end end

But the standard pattern in Rails is to redirect to resource you have just successfuly created. So we don't actually want to add the Javascript to the current request, but the request that immediately follows. The event tracker gem lets us do this. It provides a track_event that will dynamically insert the tracking Javascript into the next html page the user views.

Event Tracker Usage

Add the gem to your Gemfile

gem 'event_tracker'

Add your keys in config/application.rb

config.event_tracker.mixpanel_key = "YOUR_KEY" config.event_tracker.kissmetrics_key = "YOUR_KEY"

Specify an around_filter where you want to enable the services

class ApplicationController < ActionController::Base around_filter :append_event_tracking_tags end

Optionally identify the users to the services

class ApplicationController < ActionController::Base def mixpanel_distinct_id current_visitor_id end def mixpanel_name_tag current_user && current_user.email end def kissmetrics_identity current_user && current_user.email end end

In your controllers or views start tracking!

track_event("Event Name", optional_property: "value") register_properties(name: "value")

Event Tracker Method Mapping

event_tracker mixpanel kissmetrics track_event track record register_properties register set mixpanel_name_tag name_tag - mixpanel_people_set people.set - mixpanel_alias alias -

For more details, see the source on github.

FAQ

KISSmetrics / Mixpanel already have a Ruby library. Why should I use this instead of just calling the library directly?

Making a request to an API within a request is a bad idea, as the response to the user will be blocked until the request completes. While it is possible to use something like DelayedJob to process the API calls outside of the request, this adds additional complexity. By just using JavaScript, the user's browser does all the work for us. The JavaScript API's automatically handle things such as managing user identities, tracking additional properties based on the user's browser, and so on, which the Ruby library does not provide.

I'm using Devise. How can I track when a user signs up?

Subclass your own RegistrationsController and overwrite the new and create methods like the following.