:monkey_face: Search analytics made easy

:tangerine: Battle-tested at Instacart

  • view searches in real-time
  • track conversions week over week
  • monitor the performance of top searches

See it in action

Works with Rails 3.1+ and any search engine, including Elasticsearch, Sphinx, and Solr

:cupid: An amazing companion to Searchkick

Get Started

Add this line to your application’s Gemfile:

gem "searchjoy"

And run the generator. This creates a migration to store searches.

rails generate searchjoy:install
rake db:migrate

Next, add the dashboard to your config/routes.rb.

mount Searchjoy::Engine, at: "admin/searchjoy"

Be sure to protect the endpoint in production - see the Authentication section for ways to do this.

Track Searches

Track searches by creating a record in the database.

  search_type: "Item", # typically the model name
  query: "apple",
  results_count: 12

With Searchkick, you can use the track option to do this automatically. "apple", track: true

If you want to track more attributes, add them to the searchjoy_searches table. Then, pass the values to the track option. "apple", track: {user_id: 1, source: "web"}

It’s that easy.

Track Conversions

First, choose a conversion metric. At Instacart, an item added to the cart from the search results page counts as a conversion.

Next, when a user searches, keep track of the search id. With Searchkick, you can get the id with

When a user converts, find the record and call convert.

search = Searchjoy::Search.find params[:id]

Better yet, record the model that converted.

item = Item.find params[:item_id]


Don’t forget to protect the dashboard in production.

Basic Authentication

Set the following variables in your environment or an initializer.



authenticate :user, lambda{|user| user.admin? } do
  mount Searchjoy::Engine, at: "admin/searchjoy"


Time Zone

To change the time zone, create an initializer config/initializers/searchjoy.rb with:

Searchjoy.time_zone = "Pacific Time (US & Canada)" # defaults to

Top Searches

Change the number of top searches shown with:

Searchjoy.top_searches = 500 # defaults to 100

Live Conversions

Show the conversion name in the live stream.

Searchjoy.conversion_name = proc{|model| }


  • customize views
  • group similar queries
  • track pagination, facets, sorting, etc


Everyone is encouraged to help improve this project. Here are a few ways you can help: