KISSmetrics is a great tool and the Javascript API has some niceties that the Ruby API doesn't have, but sometimes it's nice to make decisions in the Rails controller or views. Smooch makes this possible while keeping most of the Javascript features.

Smooch allows you to:

  • Define a user's unique identifier and uses the API to associate it later if not logged in yet

  • Define A/B tests and makes the decision in your Ruby code

  • Record events in your Ruby code

  • Use the same code in your views for development a production but not KISSmetrics about development actions or for other reasons

  • Still use the Javascript API as before if you like

Example Usage


class ApplicationController < ActionController::Base
    kiss :current_user


def new
    km.record("Signup page viewed")
    if km.ab("Show faces in sidebar", ["yes", "no"]) == "yes"
        @profiles =
    @user =

def create
    @user =[:user])
        km.set("User zipcode", @user.zipcode)
        km.record("Signup converted")
        redirect_to @user
        render :new


<%= render 'faces', :users => @profiles if @profiles %>
<%= f.text_field :zipcode
<%= submit_tag km.ab("Signup Button Text", ["Go!", "Submit"]) %>


        <%= km.script %>


  apikey: kiss_metrics_api_key_here


km.script will report the data to KISSmetrics if there is a line in kissmetrics.yml for your environment. In the above example it would have reported the choices about showing faces in the sidebar and the button text as well as the conversion points noted. This would have all been correlated to the user's new id and have set the zipcode if they were successful in the signup.

You can also pass a boolean variable into the call as follows: km.script(tracking_metrics?)

We use this to opt-out site admins from our metrics for more relevant results.


Smooch replicates some of the A/B behaviors of the KISSmetrics library by using (it's own) cookies to remember decisions and be consistent.

For any given set of decisions made or events recorded/set, they are simply given to the Javascript API the next time the application layout is rendered. This will use either flash or in-memory depending on when the calls were made.

Several tactics used from other reporting libraries such as vanity.

Copyright (c) 2011 Brian Leonard, released under the MIT license