Răsfoiți Sursa

converted all analytics to use new google analytics, removing mixpanel
and heap. Not tracking subscriptions or cancelations yet.

Henry Oswald 12 ani în urmă
părinte
comite
f2069c6208
27 a modificat fișierele cu 21 adăugiri și 236 ștergeri
  1. 0 69
      services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee
  2. 0 2
      services/web/app/coffee/Features/Editor/EditorController.coffee
  3. 0 4
      services/web/app/coffee/Features/Referal/ReferalAllocator.coffee
  4. 1 1
      services/web/app/coffee/Features/Subscription/LimitationsManager.coffee
  5. 0 2
      services/web/app/coffee/Features/Subscription/SubscriptionBackgroundTasks.coffee
  6. 0 3
      services/web/app/coffee/Features/Subscription/SubscriptionHandler.coffee
  7. 0 1
      services/web/app/coffee/controllers/UserController.coffee
  8. 0 3
      services/web/app/coffee/infrastructure/ExpressLocals.coffee
  9. 0 6
      services/web/app/views/homepage/home.jade
  10. 1 47
      services/web/app/views/layout.jade
  11. 1 3
      services/web/app/views/project/editor.jade
  12. 5 6
      services/web/app/views/referal/bonus.jade
  13. 2 1
      services/web/app/views/subscriptions/new.jade
  14. 1 2
      services/web/app/views/subscriptions/plans.jade
  15. 0 5
      services/web/app/views/user/register.jade
  16. 0 4
      services/web/config/settings.development.coffee
  17. 0 26
      services/web/public/coffee/ab_testing.coffee
  18. 3 3
      services/web/public/coffee/analytics/AnalyticsManager.coffee
  19. 1 1
      services/web/public/coffee/editor/Document.coffee
  20. 0 3
      services/web/public/coffee/home.coffee
  21. 1 1
      services/web/public/coffee/ide.coffee
  22. 1 1
      services/web/public/coffee/ide/ConnectionManager.coffee
  23. 4 4
      services/web/public/coffee/project-members/ProjectMembersManager.coffee
  24. 0 6
      services/web/test/UnitTests/coffee/Editor/EditorControllerTests.coffee
  25. 0 13
      services/web/test/UnitTests/coffee/Referal/ReferalAllocatorTests.coffee
  26. 0 8
      services/web/test/UnitTests/coffee/Subscription/SubscriptionBackgroundTasksTests.coffee
  27. 0 11
      services/web/test/UnitTests/coffee/Subscription/SubscriptionHandlerTests.coffee

+ 0 - 69
services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee

@@ -1,69 +0,0 @@
-Settings = require 'settings-sharelatex'
-if Settings.analytics?.mixpanel?
-	Mixpanel = require("mixpanel").init(Settings.analytics.mixpanel.token)
-else
-	Mixpanel = null
-logger = require "logger-sharelatex"
-async = require 'async'
-
-module.exports = AnalyticsManager =
-
-	track: (user, event, properties, callback = (error)->) ->
-		properties.distinct_id = @getDistinctId user
-		properties.mp_name_tag = user.email if user.email?
-		logger.log user_id: properties.distinct_id, event: event, properties: properties, "tracking event"
-		Mixpanel?.track event, properties
-		callback()
-
-	set: (user, properties, callback = (error)->) ->
-		properties["$first_name"] = user.first_name if user.first_name?
-		properties["$last_name"] = user.last_name if user.last_name?
-		properties["$email"] = user.email if user.email?
-		Mixpanel?.people.set @getDistinctId(user), properties
-		callback()
-
-	increment: (user, property, amount, callback = (error)->) ->
-		Mixpanel?.people.increment @getDistinctId(user), property, amount
-		callback()
-
-	# TODO: Remove this one month after the ability to start free trials was removed
-	trackFreeTrialExpired: (user, callback = (error)->) ->
-		async.series [
-			(callback) => @track user, "free trial expired", {}, callback
-			(callback) => @set user, { free_trial_expired_at: new Date() }, callback
-		], callback
-
-	trackSubscriptionStarted: (user, plan_code, callback = (error)->) ->
-		async.series [
-			(callback) => @track user, "subscribed", plan_code: plan_code, callback
-			(callback) => @set user, { plan_code: plan_code, subscribed_at: new Date() }, callback
-		], callback
-
-	trackSubscriptionCancelled: (user, callback = (error)->) ->
-		async.series [
-			(callback) => @track user, "cancelled", callback
-			(callback) => @set user, { cancelled_at: new Date() }, callback
-		], callback
-
-	trackLogIn: (user, callback = (error)->) ->
-		async.series [
-			(callback) => @track user, "logged in", {}, callback
-			(callback) => @set user, { last_logged_id: new Date() }, callback
-		], callback
-
-	trackOpenEditor: (user, project, callback = (error)->) ->
-		async.series [
-			(callback) => @set user, { last_opened_editor: new Date() }, callback
-			(callback) => @increment user, "editor_opens", 1, callback
-		], callback
-
-	trackReferral: (user, referal_source, referal_medium, callback = (error) ->) ->
-		async.series [
-			(callback) =>
-				@track user, "Referred another user", { source: referal_source, medium: referal_medium }, callback
-			(callback) =>
-				@track user, "Referred another user via #{referal_source}", { medium: referal_medium }, callback
-		], callback
-
-	getDistinctId: (user) -> user.id || user._id || user
-

+ 0 - 2
services/web/app/coffee/Features/Editor/EditorController.coffee

@@ -12,7 +12,6 @@ LimitationsManager = require("../Subscription/LimitationsManager")
 AuthorizationManager = require("../Security/AuthorizationManager")
 AuthorizationManager = require("../Security/AuthorizationManager")
 AutomaticSnapshotManager = require("../Versioning/AutomaticSnapshotManager")
 AutomaticSnapshotManager = require("../Versioning/AutomaticSnapshotManager")
 VersioningApiHandler = require("../Versioning/VersioningApiHandler")
 VersioningApiHandler = require("../Versioning/VersioningApiHandler")
-AnalyticsManager = require("../Analytics/AnalyticsManager")
 EditorRealTimeController = require("./EditorRealTimeController")
 EditorRealTimeController = require("./EditorRealTimeController")
 settings = require('settings-sharelatex')
 settings = require('settings-sharelatex')
 slReqIdHelper = require('soa-req-id')
 slReqIdHelper = require('soa-req-id')
@@ -47,7 +46,6 @@ module.exports = EditorController =
 							if error? or !canAccess
 							if error? or !canAccess
 								callback new Error("Not authorized")
 								callback new Error("Not authorized")
 							else
 							else
-								AnalyticsManager.trackOpenEditor user, project
 								client.join(project_id)
 								client.join(project_id)
 								client.set("project_id", project_id)
 								client.set("project_id", project_id)
 								client.set("owner_id", project.owner_ref._id)
 								client.set("owner_id", project.owner_ref._id)

+ 0 - 4
services/web/app/coffee/Features/Referal/ReferalAllocator.coffee

@@ -1,6 +1,5 @@
 logger = require('logger-sharelatex')
 logger = require('logger-sharelatex')
 User = require('../../models/User').User
 User = require('../../models/User').User
-AnalyticsManager = require("../Analytics/AnalyticsManager")
 SubscriptionLocator = require "../Subscription/SubscriptionLocator"
 SubscriptionLocator = require "../Subscription/SubscriptionLocator"
 Settings = require "settings-sharelatex"
 Settings = require "settings-sharelatex"
 
 
@@ -15,9 +14,6 @@ module.exports = ReferalAllocator =
 			return callback(error) if error?
 			return callback(error) if error?
 			return callback(new Error("user not found")) if !user? or !user._id?
 			return callback(new Error("user not found")) if !user? or !user._id?
 
 
-			# Can be backgrounded
-			AnalyticsManager.trackReferral user, referal_source, referal_medium
-			
 			if referal_source == "bonus"
 			if referal_source == "bonus"
 				User.update query, {
 				User.update query, {
 					$push:
 					$push:

+ 1 - 1
services/web/app/coffee/Features/Subscription/LimitationsManager.coffee

@@ -38,8 +38,8 @@ module.exports =
 	userHasSubscription: (user, callback = (err, hasSubscription, subscription)->) ->
 	userHasSubscription: (user, callback = (err, hasSubscription, subscription)->) ->
 		logger.log user_id:user._id, "checking if user has subscription"
 		logger.log user_id:user._id, "checking if user has subscription"
 		SubscriptionLocator.getUsersSubscription user._id, (err, subscription)->
 		SubscriptionLocator.getUsersSubscription user._id, (err, subscription)->
-			logger.log user:user, subscription:subscription, "checking if user has subscription"
 			hasValidSubscription = subscription? and subscription.recurlySubscription_id? and subscription?.state != "expired"
 			hasValidSubscription = subscription? and subscription.recurlySubscription_id? and subscription?.state != "expired"
+			logger.log user:user, hasValidSubscription:hasValidSubscription, subscription:subscription, "checking if user has subscription"
 			callback err, hasValidSubscription, subscription
 			callback err, hasValidSubscription, subscription
 
 
 	userHasFreeTrial: (user, callback = (err, hasFreeTrial, subscription)->) ->
 	userHasFreeTrial: (user, callback = (err, hasFreeTrial, subscription)->) ->

+ 0 - 2
services/web/app/coffee/Features/Subscription/SubscriptionBackgroundTasks.coffee

@@ -2,7 +2,6 @@ async = require 'async'
 logger = require 'logger-sharelatex'
 logger = require 'logger-sharelatex'
 SubscriptionUpdater = require("./SubscriptionUpdater")
 SubscriptionUpdater = require("./SubscriptionUpdater")
 SubscriptionLocator = require("./SubscriptionLocator")
 SubscriptionLocator = require("./SubscriptionLocator")
-AnalyticsManager = require("../Analytics/AnalyticsManager")
 
 
 module.exports = SubscriptionBackgroundJobs =
 module.exports = SubscriptionBackgroundJobs =
 	# TODO: Remove this one month after the ability to start free trials was removed
 	# TODO: Remove this one month after the ability to start free trials was removed
@@ -15,7 +14,6 @@ module.exports = SubscriptionBackgroundJobs =
 				do (subscription) =>
 				do (subscription) =>
 					downgrades.push	(cb) =>
 					downgrades.push	(cb) =>
 						logger.log subscription: subscription, "downgrading free trial"
 						logger.log subscription: subscription, "downgrading free trial"
-						AnalyticsManager.trackFreeTrialExpired subscription.admin_id
 						SubscriptionUpdater.downgradeFreeTrial(subscription, cb)
 						SubscriptionUpdater.downgradeFreeTrial(subscription, cb)
 			async.series downgrades, (error) -> callback(error, subscriptions)
 			async.series downgrades, (error) -> callback(error, subscriptions)
 
 

+ 0 - 3
services/web/app/coffee/Features/Subscription/SubscriptionHandler.coffee

@@ -2,7 +2,6 @@ RecurlyWrapper = require("./RecurlyWrapper")
 Settings = require "settings-sharelatex"
 Settings = require "settings-sharelatex"
 User = require('../../models/User').User
 User = require('../../models/User').User
 logger = require('logger-sharelatex')
 logger = require('logger-sharelatex')
-AnalyticsManager  = require '../Analytics/AnalyticsManager'
 SubscriptionUpdater = require("./SubscriptionUpdater")
 SubscriptionUpdater = require("./SubscriptionUpdater")
 LimitationsManager = require('./LimitationsManager')
 LimitationsManager = require('./LimitationsManager')
 EmailHandler = require("../Email/EmailHandler")
 EmailHandler = require("../Email/EmailHandler")
@@ -15,7 +14,6 @@ module.exports =
 			return callback(error) if error?
 			return callback(error) if error?
 			SubscriptionUpdater.syncSubscription recurlySubscription, user._id, (error) ->
 			SubscriptionUpdater.syncSubscription recurlySubscription, user._id, (error) ->
 				return callback(error) if error?
 				return callback(error) if error?
-				AnalyticsManager.trackSubscriptionStarted user, recurlySubscription?.plan?.plan_code
 				callback()
 				callback()
 
 
 	updateSubscription: (user, plan_code, callback)->
 	updateSubscription: (user, plan_code, callback)->
@@ -33,7 +31,6 @@ module.exports =
 			if hasSubscription
 			if hasSubscription
 				RecurlyWrapper.cancelSubscription subscription.recurlySubscription_id, (error) ->
 				RecurlyWrapper.cancelSubscription subscription.recurlySubscription_id, (error) ->
 					return callback(error) if error?
 					return callback(error) if error?
-					AnalyticsManager.trackSubscriptionCancelled user
 					emailOpts =
 					emailOpts =
 						to: user.email
 						to: user.email
 						first_name: user.first_name
 						first_name: user.first_name

+ 0 - 1
services/web/app/coffee/controllers/UserController.coffee

@@ -9,7 +9,6 @@ newsLetterManager = require('../managers/NewsletterManager')
 dropboxHandler = require('../Features/Dropbox/DropboxHandler')
 dropboxHandler = require('../Features/Dropbox/DropboxHandler')
 userRegistrationHandler = require('../Features/User/UserRegistrationHandler')
 userRegistrationHandler = require('../Features/User/UserRegistrationHandler')
 metrics = require('../infrastructure/Metrics')
 metrics = require('../infrastructure/Metrics')
-AnalyticsManager = require('../Features/Analytics/AnalyticsManager')
 ReferalAllocator = require('../Features/Referal/ReferalAllocator')
 ReferalAllocator = require('../Features/Referal/ReferalAllocator')
 AuthenticationManager = require("../Features/Authentication/AuthenticationManager")
 AuthenticationManager = require("../Features/Authentication/AuthenticationManager")
 AuthenticationController = require("../Features/Authentication/AuthenticationController")
 AuthenticationController = require("../Features/Authentication/AuthenticationController")

+ 0 - 3
services/web/app/coffee/infrastructure/ExpressLocals.coffee

@@ -95,7 +95,6 @@ module.exports = (app)->
 
 
 	app.use (req, res, next)->
 	app.use (req, res, next)->
 		if req.session.user?
 		if req.session.user?
-			res.locals.mixpanelId = req.session.user._id
 			res.locals.user =
 			res.locals.user =
 				email: req.session.user.email
 				email: req.session.user.email
 				first_name: req.session.user.first_name
 				first_name: req.session.user.first_name
@@ -106,9 +105,7 @@ module.exports = (app)->
 			if req.session.justLoggedIn
 			if req.session.justLoggedIn
 				res.locals.justLoggedIn = true
 				res.locals.justLoggedIn = true
 				delete req.session.justLoggedIn
 				delete req.session.justLoggedIn
-		res.locals.mixpanelToken = Settings.analytics?.mixpanel?.token
 		res.locals.gaToken       = Settings.analytics?.ga?.token
 		res.locals.gaToken       = Settings.analytics?.ga?.token
-		res.locals.heapToken     = Settings.analytics?.heap?.token
 		res.locals.tenderUrl     = Settings.tenderUrl
 		res.locals.tenderUrl     = Settings.tenderUrl
 		next()
 		next()
 
 

+ 0 - 6
services/web/app/views/homepage/home.jade

@@ -60,11 +60,5 @@ block content
 	include ../general/social-footer
 	include ../general/social-footer
 	include ../general/small-footer
 	include ../general/small-footer
 
 
-	.container
-		.row
-			.span12(style="text-align:right; margin-bottom:20px")
-				a(href="https://mixpanel.com/f/partner")
-					img(src="//cdn.mxpnl.com/site_media/images/partner/badge_light.png",alt="Mobile Analytics")
-			
 
 
 
 

+ 1 - 47
services/web/app/views/layout.jade

@@ -16,59 +16,13 @@ html(itemscope, itemtype='http://schema.org/Product')
 
 
 		- if (typeof(gaToken) != "undefined")
 		- if (typeof(gaToken) != "undefined")
 			script(type='text/javascript')
 			script(type='text/javascript')
-				var _gaq = _gaq || [];
-				_gaq.push(['_setAccount', '#{gaToken}']);
-				_gaq.push(['_trackPageview']);
-		
-				(function() {
-					var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
-					ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
-					var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
-				})();
-
-				// this is the new google analytics https://developers.google.com/analytics/devguides/collection/analyticsjs/
 				(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
 				(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
 				(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
 				(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
 				m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
 				m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
 				})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
 				})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
-
-				ga('create', '#{gaToken}', 'auto');
+				ga('create', '#{gaToken}', 'sharelatex.com');
 				ga('send', 'pageview');
 				ga('send', 'pageview');
 
 
-		- if (typeof(mixpanelToken) != "undefined")
-			script(type="text/javascript")
-				(function(c,a){window.mixpanel=a;var b,d,h,e;b=c.createElement("script");
-				b.type="text/javascript";b.async=!0;b.src=("https:"===c.location.protocol?"https:":"http:")+
-				'//cdn.mxpnl.com/libs/mixpanel-2.2.min.js';d=c.getElementsByTagName("script")[0];
-				d.parentNode.insertBefore(b,d);a._i=[];a.init=function(b,c,f){function d(a,b){
-				var c=b.split(".");2==c.length&&(a=a[c[0]],b=c[1]);a[b]=function(){a.push([b].concat(
-				Array.prototype.slice.call(arguments,0)))}}var g=a;"undefined"!==typeof f?g=a[f]=[]:
-				f="mixpanel";g.people=g.people||[];h=['disable','track','track_pageview','track_links',
-				'track_forms','register','register_once','unregister','identify','alias','name_tag',
-				'set_config','people.set','people.increment','people.track_charge','people.append'];
-				for(e=0;e<h.length;e++)d(g,h[e]);a._i.push([b,c,f])};a.__SV=1.2;})(document,window.mixpanel||[]);
-				mixpanel.init("#{mixpanelToken}");
-
-			- if (typeof(justRegistered) != "undefined" && justRegistered)
-				script(type="text/javascript")
-					mixpanel.alias("#{mixpanelId}");
-					mixpanel.track("registered");
-					mixpanel.name_tag("#{user.email}");
-					mixpanel.people.set({
-						$email: "#{user.email}",
-						$first_name: "#{user.first_name}",
-						$last_name: "#{user.last_name}",
-						$created: new Date(#{Date.now()})
-					});
-
-			- if (typeof(mixpanelId) != "undefined")
-				script(type="text/javascript")
-					mixpanel.identify("#{mixpanelId}");
-
-			- if (typeof(justLoggedIn) != "undefined" && justLoggedIn)
-				script(type="text/javascript")
-					mixpanel.track("Logged in");
-				
 		script
 		script
 			window.csrfToken = "#{csrfToken}";
 			window.csrfToken = "#{csrfToken}";
 
 

+ 1 - 3
services/web/app/views/project/editor.jade

@@ -56,9 +56,7 @@ block content
 		};
 		};
 
 
 	script(type='text/javascript')
 	script(type='text/javascript')
-		if (typeof(mixpanel) != "undefined") {
-			mixpanel.track('Opened Editor', { project_id: window.userSettings.project_id });
-		}
+		ga('send', 'event', 'editor-interaction', 'editor-opened')
 
 
 	- locals.supressDefaultJs = true
 	- locals.supressDefaultJs = true
 	- var fingerprintedPath = fingerprint(jsPath+'libs/pdf.worker.js')
 	- var fingerprintedPath = fingerprint(jsPath+'libs/pdf.worker.js')

+ 5 - 6
services/web/app/views/referal/bonus.jade

@@ -118,21 +118,20 @@ block content
 
 
 	script(type="text/javascript")
 	script(type="text/javascript")
 		$(function() {
 		$(function() {
-			mixpanel.track("Viewed referral page");
 			$(".twitter").click(function() {
 			$(".twitter").click(function() {
-				mixpanel.track("Clicked Bonus Referral Button", { medium: "twitter" });
+				ga('send', 'event', 'referal-button', 'clicked', "twitter")
 			});
 			});
 			$(".email").click(function() {
 			$(".email").click(function() {
-				mixpanel.track("Clicked Bonus Referral Button", { medium: "email" });
+				ga('send', 'event', 'referal-button', 'clicked', "email")
 			});
 			});
 			$(".facebook").click(function() {
 			$(".facebook").click(function() {
-				mixpanel.track("Clicked Bonus Referral Button", { medium: "facebook" });
+				ga('send', 'event', 'referal-button', 'clicked', "facebook")
 			});
 			});
 			$(".google-plus").click(function() {
 			$(".google-plus").click(function() {
-				mixpanel.track("Clicked Bonus Referral Button", { medium: "google_plus" });
+				ga('send', 'event', 'referal-button', 'clicked', "google-plus")
 			});
 			});
 			$(".link").click(function() {
 			$(".link").click(function() {
-				mixpanel.track("Clicked Bonus Referral Button", { medium: "direct" });
+				ga('send', 'event', 'referal-button', 'clicked', "direct-link")
 			});
 			});
 		});
 		});
 
 

+ 2 - 1
services/web/app/views/subscriptions/new.jade

@@ -9,7 +9,8 @@ block content
 	#subscribeForm.box Loading subscription form...
 	#subscribeForm.box Loading subscription form...
 
 
 	script(type="text/javascript")
 	script(type="text/javascript")
-		mixpanel.track("Page Viewed", { name: "payment_form", plan: "#{plan_code}" })
+		ga('send', 'event', 'pageview', 'payment_form', "#{plan_code}")
+
 
 
 	script(type="text/javascript")
 	script(type="text/javascript")
 		Recurly.config(!{recurlyConfig})
 		Recurly.config(!{recurlyConfig})

+ 1 - 2
services/web/app/views/subscriptions/plans.jade

@@ -163,5 +163,4 @@ block content
 		include ../general/small-footer
 		include ../general/small-footer
 		link(rel='stylesheet', href='/brand/plans.css?fingerprint='+fingerprint('/brand/mainStyle.css'))	
 		link(rel='stylesheet', href='/brand/plans.css?fingerprint='+fingerprint('/brand/mainStyle.css'))	
 
 
-		script
-			mixpanel.track("Page Viewed", { name: "plans" })
+

+ 0 - 5
services/web/app/views/user/register.jade

@@ -35,8 +35,3 @@ block content
 
 
 	include ../general/small-footer
 	include ../general/small-footer
 
 
-	script
-		mixpanel.track("Page Viewed", { name: "register" })
-		$('#registerButton').click(function(){
-			mixpanel.track("registerpage.registerd")
-		})

+ 0 - 4
services/web/config/settings.development.coffee

@@ -146,12 +146,8 @@ module.exports =
 	# Fill in your unique token from various analytics services to enable
 	# Fill in your unique token from various analytics services to enable
 	# them.
 	# them.
 	# analytics:
 	# analytics:
-	# 	mixpanel:
-	# 		token: ""
 	# 	ga:
 	# 	ga:
 	# 		token: ""
 	# 		token: ""
-	# 	heap:
-	# 		token: ""
 	# 
 	# 
 	# ShareLaTeX's help desk is provided by tenderapp.com
 	# ShareLaTeX's help desk is provided by tenderapp.com
 	# tenderUrl: ""
 	# tenderUrl: ""

+ 0 - 26
services/web/public/coffee/ab_testing.coffee

@@ -1,26 +0,0 @@
-define [], () ->
-	chooseOption = (testName, option1, option2, callback = (error, option) ->) ->
-		if Math.random() < 0.5
-			option = option1
-		else
-			option = option2
-
-		loaded = false
-		do initTest = ->
-			return if loaded
-			if mixpanel?.get_property?
-				attributes = {}
-				attributes[testName] = option
-				mixpanel?.register_once( attributes )
-				mixpanel?.people.set( attributes )
-				loaded = true
-				callback null, mixpanel?.get_property( testName )
-			else
-				setTimeout(initTest, 300)
-
-		fallback = () ->
-			return if loaded
-			loaded = true
-			callback null, option1
-		setTimeout fallback, 1500
-	

+ 3 - 3
services/web/public/coffee/analytics/AnalyticsManager.coffee

@@ -5,12 +5,12 @@ define () ->
 				@updateCount ||= 0
 				@updateCount ||= 0
 				@updateCount++
 				@updateCount++
 				if @updateCount == 100
 				if @updateCount == 100
-					mixpanel?.track("Updated doc multiple times in one session", project_id: @ide.project.id)
+					ga('send', 'event', 'editor-interaction', 'multi-doc-update')
 
 
 			@ide.pdfManager.on "compile:pdf", () =>
 			@ide.pdfManager.on "compile:pdf", () =>
 				@compileCount ||= 0
 				@compileCount ||= 0
 				@compileCount++
 				@compileCount++
 				if @compileCount == 1
 				if @compileCount == 1
-					mixpanel?.track("Compiled project at least once in one session", project_id: @ide.project.id)
+					ga('send', 'event', 'editor-interaction', 'single-compile')
 				if @compileCount == 3
 				if @compileCount == 3
-					mixpanel?.track("Compiled project multiple times in one session", project_id: @ide.project.id)
+					ga('send', 'event', 'editor-interaction', 'multi-compile')

+ 1 - 1
services/web/public/coffee/editor/Document.coffee

@@ -144,7 +144,7 @@ define [
 
 
 		_onError: (error) ->
 		_onError: (error) ->
 			console.error "ShareJS error", error
 			console.error "ShareJS error", error
-			heap?.track "shareJsError", { error: (error.message or error), transport: ide.socket.socket.transport.name }
+			ga('send', 'event', 'error', "shareJsError", "#{error.message} - #{ide.socket.socket.transport.name}" )
 			@ide.socket.disconnect()
 			@ide.socket.disconnect()
 			@doc?.clearInflightAndPendingOps()
 			@doc?.clearInflightAndPendingOps()
 			@_cleanUp()
 			@_cleanUp()

+ 0 - 3
services/web/public/coffee/home.coffee

@@ -3,6 +3,3 @@ define [
 	"forms"
 	"forms"
 ], ()->
 ], ()->
 	$(document).ready ()->
 	$(document).ready ()->
-		mixpanel?.track_links(".signup-now", "homepage.signup-now")
-		$('#registerButton').click ->
-			 mixpanel?.track("homepage.register-now")

+ 1 - 1
services/web/public/coffee/ide.coffee

@@ -218,7 +218,7 @@ define [
 			return if @timeOut?
 			return if @timeOut?
 			@clearTimeout()
 			@clearTimeout()
 			@timeOut = setTimeout((=>
 			@timeOut = setTimeout((=>
-				heap?.track "savingShown"
+				ga('send', 'event', 'editor-interaction', 'notification-shown', "saving")
 				$("#savingProblems").show()
 				$("#savingProblems").show()
 			), 1000)
 			), 1000)
 
 

+ 1 - 1
services/web/public/coffee/ide/ConnectionManager.coffee

@@ -15,7 +15,7 @@ define [
 				@connected = false
 				@connected = false
 				@ide.trigger "disconnect"
 				@ide.trigger "disconnect"
 				setTimeout(=>
 				setTimeout(=>
-					mixpanel?.track("disconnected")
+					ga('send', 'event', 'editor-interaction', 'disconnect')
 				, 2000)
 				, 2000)
 
 
 				if !@forcedDisconnect
 				if !@forcedDisconnect

+ 4 - 4
services/web/public/coffee/project-members/ProjectMembersManager.coffee

@@ -274,7 +274,7 @@ define [
 						  "caption=My LaTeX project (#{@ide.project.get("name")}) is available online on ShareLaTeX&" +
 						  "caption=My LaTeX project (#{@ide.project.get("name")}) is available online on ShareLaTeX&" +
 						  "redirect_uri=#{window.sharelatex.siteUrl}&" +
 						  "redirect_uri=#{window.sharelatex.siteUrl}&" +
 						  "display=popup"
 						  "display=popup"
-					mixpanel?.track("Project Shared", { method: "facebook" })
+					ga('send', 'event', 'editor-interaction', 'project-shared', "facebook")
 					window.open(
 					window.open(
 						url
 						url
 						""
 						""
@@ -284,7 +284,7 @@ define [
 		postToTwitter: () ->
 		postToTwitter: () ->
 			@ensurePublic (error, success) =>
 			@ensurePublic (error, success) =>
 				if success
 				if success
-					mixpanel?.track("Project Shared", { method: "twitter" })
+					ga('send', 'event', 'editor-interaction', 'project-shared', "twitter")
 					window.open(
 					window.open(
 						"https://www.twitter.com/share/?text=Check out my online LaTeX Project: #{@ide.project.get("name")}&url=#{encodeURIComponent(@url("t"))}"
 						"https://www.twitter.com/share/?text=Check out my online LaTeX Project: #{@ide.project.get("name")}&url=#{encodeURIComponent(@url("t"))}"
 						""
 						""
@@ -294,7 +294,7 @@ define [
 		postToGoogle: () ->
 		postToGoogle: () ->
 			@ensurePublic (error, success) =>
 			@ensurePublic (error, success) =>
 				if success
 				if success
-					mixpanel?.track("Project Shared", { method: "google_plus" })
+					ga('send', 'event', 'editor-interaction', 'project-shared', "google-plus")
 					window.open(
 					window.open(
 						"https://plus.google.com/share?url=#{encodeURIComponent(@url("gp"))}"
 						"https://plus.google.com/share?url=#{encodeURIComponent(@url("gp"))}"
 						""
 						""
@@ -304,7 +304,7 @@ define [
 		shareUrl: () ->
 		shareUrl: () ->
 			@ensurePublic (error, success) =>
 			@ensurePublic (error, success) =>
 				if success
 				if success
-					mixpanel?.track("Project Shared", { method: "url" })
+					ga('send', 'event', 'editor-interaction', 'project-shared', "url")
 					Modal.createModal
 					Modal.createModal
 						el: $(
 						el: $(
 							"<p>You can share you project with your friends and colleagues via this URL:</p>" +
 							"<p>You can share you project with your friends and colleagues via this URL:</p>" +

+ 0 - 6
services/web/test/UnitTests/coffee/Editor/EditorControllerTests.coffee

@@ -42,7 +42,6 @@ describe "EditorController", ->
 		@VersioningApiHandler =
 		@VersioningApiHandler =
 			enableVersioning : sinon.stub().callsArg(1)
 			enableVersioning : sinon.stub().callsArg(1)
 		@client = new MockClient()
 		@client = new MockClient()
-		@AnalyticsManager = {}
 
 
 		@settings = 
 		@settings = 
 			apis:{thirdPartyDataStore:{emptyProjectFlushDelayMiliseconds:0.5}}
 			apis:{thirdPartyDataStore:{emptyProjectFlushDelayMiliseconds:0.5}}
@@ -65,7 +64,6 @@ describe "EditorController", ->
 			'../../handlers/ProjectHandler' : @ProjectHandler
 			'../../handlers/ProjectHandler' : @ProjectHandler
 			"../Versioning/AutomaticSnapshotManager" : @AutomaticSnapshotManager
 			"../Versioning/AutomaticSnapshotManager" : @AutomaticSnapshotManager
 			"../Versioning/VersioningApiHandler" : @VersioningApiHandler
 			"../Versioning/VersioningApiHandler" : @VersioningApiHandler
-			"../Analytics/AnalyticsManager" : @AnalyticsManager
 			'../../models/Project' : Project: @Project
 			'../../models/Project' : Project: @Project
 			"settings-sharelatex":@settings
 			"settings-sharelatex":@settings
 			'../Dropbox/DropboxProjectLinker':@dropboxProjectLinker
 			'../Dropbox/DropboxProjectLinker':@dropboxProjectLinker
@@ -84,7 +82,6 @@ describe "EditorController", ->
 			@ProjectGetter.getProjectWithoutDocLines = sinon.stub().callsArgWith(1, null, @project)
 			@ProjectGetter.getProjectWithoutDocLines = sinon.stub().callsArgWith(1, null, @project)
 			@ProjectGetter.populateProjectWithUsers = sinon.stub().callsArgWith(1, null, @project)
 			@ProjectGetter.populateProjectWithUsers = sinon.stub().callsArgWith(1, null, @project)
 			@AuthorizationManager.setPrivilegeLevelOnClient = sinon.stub()
 			@AuthorizationManager.setPrivilegeLevelOnClient = sinon.stub()
-			@AnalyticsManager.trackOpenEditor = sinon.stub()
 
 
 		describe "when authorized", ->
 		describe "when authorized", ->
 			beforeEach ->
 			beforeEach ->
@@ -120,9 +117,6 @@ describe "EditorController", ->
 				@VersioningApiHandler.enableVersioning.calledWith(@project)
 				@VersioningApiHandler.enableVersioning.calledWith(@project)
 					.should.equal true
 					.should.equal true
 
 
-			it "should track the event", ->
-				@AnalyticsManager.trackOpenEditor.calledWith(@user, @project).should.equal true
-
 		describe "when not authorized", ->
 		describe "when not authorized", ->
 			beforeEach ->
 			beforeEach ->
 				@AuthorizationManager.getPrivilegeLevelForProject =
 				@AuthorizationManager.getPrivilegeLevelForProject =

+ 0 - 13
services/web/test/UnitTests/coffee/Referal/ReferalAllocatorTests.coffee

@@ -9,7 +9,6 @@ describe 'Referal allocator', ->
 	beforeEach ->
 	beforeEach ->
 		@ReferalAllocator = SandboxedModule.require modulePath, requires:
 		@ReferalAllocator = SandboxedModule.require modulePath, requires:
 			'../../models/User': User: @User = {}
 			'../../models/User': User: @User = {}
-			"../Analytics/AnalyticsManager": @AnalyticsManager = {}
 			"../Subscription/SubscriptionLocator": @SubscriptionLocator = {}
 			"../Subscription/SubscriptionLocator": @SubscriptionLocator = {}
 			"settings-sharelatex": @Settings = {}
 			"settings-sharelatex": @Settings = {}
 			'logger-sharelatex':
 			'logger-sharelatex':
@@ -27,7 +26,6 @@ describe 'Referal allocator', ->
 				@referal_source = "bonus"
 				@referal_source = "bonus"
 				@User.update = sinon.stub().callsArgWith 3, null
 				@User.update = sinon.stub().callsArgWith 3, null
 				@User.findOne = sinon.stub().callsArgWith 1, null, { _id: @user_id }
 				@User.findOne = sinon.stub().callsArgWith 1, null, { _id: @user_id }
-				@AnalyticsManager.trackReferral = sinon.stub()
 				@ReferalAllocator.assignBonus = sinon.stub().callsArg 1
 				@ReferalAllocator.assignBonus = sinon.stub().callsArg 1
 				@ReferalAllocator.allocate @referal_id, @new_user_id, @referal_source, @referal_medium, @callback
 				@ReferalAllocator.allocate @referal_id, @new_user_id, @referal_source, @referal_medium, @callback
 
 
@@ -46,11 +44,6 @@ describe 'Referal allocator', ->
 					.calledWith( referal_id: @referal_id )
 					.calledWith( referal_id: @referal_id )
 					.should.equal true
 					.should.equal true
 			
 			
-			it "should track the referral", ->
-				@AnalyticsManager.trackReferral
-					.calledWith({ _id: @user_id }, @referal_source, @referal_medium)
-					.should.equal true
-
 			it "shoudl assign the user their bonus", ->
 			it "shoudl assign the user their bonus", ->
 				@ReferalAllocator.assignBonus
 				@ReferalAllocator.assignBonus
 					.calledWith(@user_id)
 					.calledWith(@user_id)
@@ -64,7 +57,6 @@ describe 'Referal allocator', ->
 				@referal_source = "public_share"
 				@referal_source = "public_share"
 				@User.update = sinon.stub().callsArgWith 3, null
 				@User.update = sinon.stub().callsArgWith 3, null
 				@User.findOne = sinon.stub().callsArgWith 1, null, { _id: @user_id }
 				@User.findOne = sinon.stub().callsArgWith 1, null, { _id: @user_id }
-				@AnalyticsManager.trackReferral = sinon.stub()
 				@ReferalAllocator.assignBonus = sinon.stub().callsArg 1
 				@ReferalAllocator.assignBonus = sinon.stub().callsArg 1
 				@ReferalAllocator.allocate @referal_id, @new_user_id, @referal_source, @referal_medium, @callback
 				@ReferalAllocator.allocate @referal_id, @new_user_id, @referal_source, @referal_medium, @callback
 
 
@@ -76,11 +68,6 @@ describe 'Referal allocator', ->
 					.calledWith( referal_id: @referal_id )
 					.calledWith( referal_id: @referal_id )
 					.should.equal true
 					.should.equal true
 			
 			
-			it "should track the referral", ->
-				@AnalyticsManager.trackReferral
-					.calledWith({ _id: @user_id }, @referal_source, @referal_medium)
-					.should.equal true
-
 			it "should not assign the user a bonus", ->
 			it "should not assign the user a bonus", ->
 				@ReferalAllocator.assignBonus.called.should.equal false
 				@ReferalAllocator.assignBonus.called.should.equal false
 
 

+ 0 - 8
services/web/test/UnitTests/coffee/Subscription/SubscriptionBackgroundTasksTests.coffee

@@ -9,14 +9,12 @@ describe "SubscriptionBackgroundTasks", ->
 		@Settings = defaultPlanCode:
 		@Settings = defaultPlanCode:
 			collaborators: 13
 			collaborators: 13
 			versioning: true
 			versioning: true
-		@AnalyticsManager = {}
 		@SubscriptionUpdater = {}
 		@SubscriptionUpdater = {}
 
 
 		@SubscriptionBackgroundTasks = SandboxedModule.require modulePath, requires:
 		@SubscriptionBackgroundTasks = SandboxedModule.require modulePath, requires:
 			"./SubscriptionLocator"         : @SubscriptionLocator
 			"./SubscriptionLocator"         : @SubscriptionLocator
 			"./SubscriptionUpdater"			: @SubscriptionUpdater
 			"./SubscriptionUpdater"			: @SubscriptionUpdater
 			"settings-sharelatex"           : @Settings
 			"settings-sharelatex"           : @Settings
-			"../Analytics/AnalyticsManager" : @AnalyticsManager
 			"logger-sharelatex"				: log:->
 			"logger-sharelatex"				: log:->
 
 
 	describe 'downgradeExpiredFreeTrials', ->
 	describe 'downgradeExpiredFreeTrials', ->
@@ -27,7 +25,6 @@ describe "SubscriptionBackgroundTasks", ->
 			]
 			]
 			@SubscriptionUpdater.downgradeFreeTrial = sinon.stub().callsArg(1)
 			@SubscriptionUpdater.downgradeFreeTrial = sinon.stub().callsArg(1)
 			@SubscriptionLocator.expiredFreeTrials = sinon.stub().callsArgWith(0, null, @subscriptions)
 			@SubscriptionLocator.expiredFreeTrials = sinon.stub().callsArgWith(0, null, @subscriptions)
-			@AnalyticsManager.trackFreeTrialExpired = sinon.stub()
 			@callback = sinon.stub()
 			@callback = sinon.stub()
 			@SubscriptionBackgroundTasks.downgradeExpiredFreeTrials(@callback)
 			@SubscriptionBackgroundTasks.downgradeExpiredFreeTrials(@callback)
 
 
@@ -36,11 +33,6 @@ describe "SubscriptionBackgroundTasks", ->
 			for subscription in @subscriptions
 			for subscription in @subscriptions
 				@SubscriptionUpdater.downgradeFreeTrial.calledWith(subscription).should.equal true
 				@SubscriptionUpdater.downgradeFreeTrial.calledWith(subscription).should.equal true
 
 
-		it "should track each downgrade", ->
-			@AnalyticsManager.trackFreeTrialExpired.callCount.should.equal @subscriptions.length
-			for subscription in @subscriptions
-				@AnalyticsManager.trackFreeTrialExpired.calledWith(subscription.admin_id).should.equal true
-
 		it "should return the subscriptions in the callback", ->
 		it "should return the subscriptions in the callback", ->
 			@callback.called.should.equal true
 			@callback.called.should.equal true
 			@callback.args[0][1].should.deep.equal @subscriptions
 			@callback.args[0][1].should.deep.equal @subscriptions

+ 0 - 11
services/web/test/UnitTests/coffee/Subscription/SubscriptionHandlerTests.coffee

@@ -44,11 +44,6 @@ describe "Subscription Handler sanboxed", ->
 			cancelSubscription: sinon.stub().callsArgWith(1)
 			cancelSubscription: sinon.stub().callsArgWith(1)
 			reactivateSubscription: sinon.stub().callsArgWith(1)
 			reactivateSubscription: sinon.stub().callsArgWith(1)
 
 
-		@AnalyticsManager = 
-			trackSubscriptionCancelled: sinon.stub()
-			trackSubscriptionStarted: sinon.stub()
-			trackFreeTrialStarted: sinon.stub()
-
 		@SubscriptionUpdater = 
 		@SubscriptionUpdater = 
 			syncSubscription: sinon.stub().callsArgWith(2)
 			syncSubscription: sinon.stub().callsArgWith(2)
 			startFreeTrial: sinon.stub().callsArgWith(1)
 			startFreeTrial: sinon.stub().callsArgWith(1)
@@ -64,7 +59,6 @@ describe "Subscription Handler sanboxed", ->
 			"settings-sharelatex": @Settings
 			"settings-sharelatex": @Settings
 			'../../models/User': User:@User
 			'../../models/User': User:@User
 			'./SubscriptionUpdater': @SubscriptionUpdater
 			'./SubscriptionUpdater': @SubscriptionUpdater
-			'../Analytics/AnalyticsManager': @AnalyticsManager
 			"logger-sharelatex":{log:->}
 			"logger-sharelatex":{log:->}
 			'./LimitationsManager':@LimitationsManager
 			'./LimitationsManager':@LimitationsManager
 			"../Email/EmailHandler":@EmailHandler
 			"../Email/EmailHandler":@EmailHandler
@@ -148,11 +142,6 @@ describe "Subscription Handler sanboxed", ->
 				@RecurlyWrapper.cancelSubscription.called.should.equal true
 				@RecurlyWrapper.cancelSubscription.called.should.equal true
 				@RecurlyWrapper.cancelSubscription.calledWith(@subscription.recurlySubscription_id).should.equal true
 				@RecurlyWrapper.cancelSubscription.calledWith(@subscription.recurlySubscription_id).should.equal true
 
 
-			it "should track the cancellation", ->
-				@AnalyticsManager.trackSubscriptionCancelled
-					.calledWith(@user)
-					.should.equal true
-
 			it "should send a cancellation email", ->
 			it "should send a cancellation email", ->
 				@EmailHandler.sendEmail.calledWith("canceledSubscription", {to:@user.email, first_name:@user.first_name}).should.equal true
 				@EmailHandler.sendEmail.calledWith("canceledSubscription", {to:@user.email, first_name:@user.first_name}).should.equal true