:+1: - a few thoughts, though they're by no means deal breakers:

* You're creating a global `shop` object if one doesn't exist, but then you're defining `shop` (line 3) as a local. If this code was wrapped in an IIFE, you'd be creating two objects which could be potentially tricky to diagnose. One way around this is to initialize the object (`window.shop = window.shop || {}`) then add properties and functions to it below, like `shop.init = function(){...}` (no `var` keyword). Added benefit: no need to use commas to separate properties. Alternatively, you could add properties to the shop's prototype like `shop.prototype.init = function(){...}`, but that may add unnecessary complexity
* Personally, I like to reserve `el` for a single element like [Backbone does](http://backbonejs.org/#View-el). That may just be preference though
* I appreciate the DOM caching - 'tis good practice, though there's a few other selectors throughout. Maybe stuff all of them into your DOM cache object (`el` currently)?

All in all though, I feel this is much more extensible and readable :)