Real Time Ecommerce Analytics at Gilt Groupe<br />Michael Bryzek, CTO & Founder<br />Michael Nutt, Senior Engineer<br />Mo...
What is Gilt Groupe?<br />The world’s best brands at up to 70% off<br />Sales start every day at noon<br />Simple, luxurio...
What does noon look like in Tech?<br />
What does noon look like?<br />
MongoDB at Gilt Groupe<br />Real time analytics is a sweet spot for MongoDB<br />Two production examples we’ll share today...
Using MongoDB for Real Time Analytics<br />Goal: Improve conversion of our gifts section (www.gilt.com/gifts) by ensuring ...
Step 1: Data Capture<br /><ul><li>Java server speaks JSON/HTTP, writes to MongoDB
Each page view receive a list of every item on the page and its position via AJAX
Purchase data sent by background job post purchase</li></li></ul><li>Step 1: Data Capture<br />Storing Data in Java<br />_...
Step 2: Map<br />Calculate a score for each item based on page views, conversion, inventory, and merchandising input<br />...
Step 2: Reduce<br />Reduce is a passthrough<br />r = function( pid , values ){<br />    return values[0];<br />}<br />Map ...
Step 3: Update Transactional Systems<br /><ul><li>Mongo + server run on ec2
Send “scores” collection back to our primary data center, storing latest scores in our primary relational database
Gift items are always sorted by score – transactional system only needed an “order by score desc” clause</li></li></ul><li...
Tracking Pixels<br />/tracking.gif?events=&prop1=women&server=www.gilt.com&products=&pageName=sales%3A+women&channel=sale&...
Omniture<br />GILT<br />Data<br />Warehouse<br />Users<br />
Omniture<br />24 hours<br />later...<br />GILT<br />Data<br />Warehouse<br />Users<br />
Node.js<br />Asynchronous, evented web framework<br />http://nodejs.org<br />
var mongo = require(’lib/mongodb’);<br />var db = new mongo.Db('hummingbird', new mongo.Server('localhost', 27017, {}), {}...
DEMO<br />
Upcoming SlideShare
Loading in...5
×

Real time ecommerce analytics with MongoDB at Gilt Groupe (Michael Bryzek & Michael Nutt)

12,367

Published on

Published in: Technology
0 Comments
44 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
12,367
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
253
Comments
0
Likes
44
Embeds 0
No embeds

No notes for slide

Real time ecommerce analytics with MongoDB at Gilt Groupe (Michael Bryzek & Michael Nutt)

  1. 1. Real Time Ecommerce Analytics at Gilt Groupe<br />Michael Bryzek, CTO & Founder<br />Michael Nutt, Senior Engineer<br />Mongo SF - April 30, 2010<br />We’re hiring: michael@gilt.com<br />www.gilt.com/invite/michael<br />
  2. 2. What is Gilt Groupe?<br />The world’s best brands at up to 70% off<br />Sales start every day at noon<br />Simple, luxurious online experience<br />Relentless focus on the customer<br />. . . <br />A fast growing young company<br />
  3. 3.
  4. 4. What does noon look like in Tech?<br />
  5. 5. What does noon look like?<br />
  6. 6. MongoDB at Gilt Groupe<br />Real time analytics is a sweet spot for MongoDB<br />Two production examples we’ll share today at Gilt Groupe:<br />Selecting product to sell based on real time data<br />Hummingbird: Real time visualization of site traffic<br />
  7. 7. Using MongoDB for Real Time Analytics<br />Goal: Improve conversion of our gifts section (www.gilt.com/gifts) by ensuring good products are being promoted at the right time<br />Challenge: High traffic makes it hard to collect and analyze data in a scalable and fast way<br />Approach:<br />Capture data in real time in MongoDB<br />Analyze w/ Map Reduce<br />Update txn systems<br />Repeat<br />
  8. 8. Step 1: Data Capture<br /><ul><li>Java server speaks JSON/HTTP, writes to MongoDB
  9. 9. Each page view receive a list of every item on the page and its position via AJAX
  10. 10. Purchase data sent by background job post purchase</li></li></ul><li>Step 1: Data Capture<br />Storing Data in Java<br />_db = new Mongo().getDB("gifts");<br />_listing_visits = _db.getCollection("listing_visits");<br />--------------------------------------------------<br />BasicDBObject record = new BasicDBObject();<br />record.put("gift_product_look_guid", de.giftProductLookGuid);<br />record.put("product_look_guid", de.productLookGuid);<br />record.put("sale_id", info.saleId);<br />record.put("user_guid", info.userGuid);<br />record.put("subsite_id", info.subsiteId);<br />record.put("created_at", info.createdAt);<br />record.put("position", position);<br />_listing_visits.save(record);<br />
  11. 11. Step 2: Map<br />Calculate a score for each item based on page views, conversion, inventory, and merchandising input<br />m = function(){<br /> [snip]<br /> if ( hourly.visits > 0 && this.quantity_sold > 0 ) {<br /> var rate = this.quantity_sold / hourly.visits;<br /> points = parseInt(100*rate);<br /> v += points;<br /> explanation += "Conversion rate of " + points + "% ”;<br /> } else if ( hourly.visits == null || hourly.visits == 0 ) {<br /> v += 500;<br /> explanation += "Product has never been seen (500 points). ";<br /> }<br /> [snip]<br /> emit( { gift_product_look_guid : this._id }, <br /> { score : v,<br /> explanation : explanation}});<br />}<br />
  12. 12. Step 2: Reduce<br />Reduce is a passthrough<br />r = function( pid , values ){<br /> return values[0];<br />}<br />Map Reduce run every 15 minutes via CRON – results stored in a collection named “scores”<br />res = db.gift_product_looks.mapReduce( m , r , { out : "scores" } );<br />
  13. 13. Step 3: Update Transactional Systems<br /><ul><li>Mongo + server run on ec2
  14. 14. Send “scores” collection back to our primary data center, storing latest scores in our primary relational database
  15. 15. Gift items are always sorted by score – transactional system only needed an “order by score desc” clause</li></li></ul><li>Questions before we move on to Hummingbird?<br />
  16. 16. Tracking Pixels<br />/tracking.gif?events=&prop1=women&server=www.gilt.com&products=&pageName=sales%3A+women&channel=sale&prop4=sale+category+page&u=http%3A%2F%2Fwww.gilt.com%2Fsale%2Fwomen&guid=418237ca-2bc6-932e-84c2-d4f02d9fd5bf&gen=f&uid=25423567&cb=443460396<br />
  17. 17. Omniture<br />GILT<br />Data<br />Warehouse<br />Users<br />
  18. 18. Omniture<br />24 hours<br />later...<br />GILT<br />Data<br />Warehouse<br />Users<br />
  19. 19. Node.js<br />Asynchronous, evented web framework<br />http://nodejs.org<br />
  20. 20. var mongo = require(’lib/mongodb’);<br />var db = new mongo.Db('hummingbird', new mongo.Server('localhost', 27017, {}), {});<br />db.createCollection('visits', function(err, collection) {<br /> db.collection('visits', function(err, collection) {<br /> collection.insert(env);<br /> });<br />});<br />
  21. 21. DEMO<br />
  1. Gostou de algum slide específico?

    Recortar slides é uma maneira fácil de colecionar informações para acessar mais tarde.

×