diff --git a/app/lib/LevelSetupManager.coffee b/app/lib/LevelSetupManager.coffee index 4913760c8..425d0288b 100644 --- a/app/lib/LevelSetupManager.coffee +++ b/app/lib/LevelSetupManager.coffee @@ -78,14 +78,14 @@ module.exports = class LevelSetupManager extends CocoClass @inventoryModal.didReappear() @inventoryModal.onShown() @inventoryModal.setHero(e.hero) - window.tracker?.trackEvent 'Play Level Modal', Action: 'Choose Inventory', ['Google Analytics'] + window.tracker?.trackEvent 'Choose Inventory', category: 'Play Level', ['Google Analytics'] onChooseHeroClicked: -> @options.parent.openModalView(@heroesModal) @heroesModal.render() @heroesModal.didReappear() @inventoryModal.endHighlight() - window.tracker?.trackEvent 'Play Level Modal', Action: 'Choose Hero', ['Google Analytics'] + window.tracker?.trackEvent 'Change Hero', category: 'Play Level', ['Google Analytics'] onInventoryModalPlayClicked: -> @navigatingToPlay = true diff --git a/app/lib/Tracker.coffee b/app/lib/Tracker.coffee index 18b1ce7ac..1aef64f75 100644 --- a/app/lib/Tracker.coffee +++ b/app/lib/Tracker.coffee @@ -25,18 +25,29 @@ module.exports = class Tracker console.log 'Going to track visit for', "/#{url}" if debugAnalytics analytics.pageview "/#{url}" - trackEvent: (event, properties, includeProviders=null) => - console.log 'Would track analytics event:', event, properties if debugAnalytics + trackEvent: (action, properties, includeProviders=null) => + # 'action' is a string + # Google Analytics properties format: {category: 'Account', label: 'Premium', value: 50 } + # https://segment.com/docs/integrations/google-analytics/#track + # https://developers.google.com/analytics/devguides/collection/gajs/eventTrackerGuide#Anatomy + # Mixpanel properties format: whatever you want unlike GA + # https://segment.com/docs/integrations/mixpanel/ + console.log 'Would track analytics event:', action, properties if debugAnalytics return unless me and @isProduction and analytics? and not me.isAdmin() - console.log 'Going to track analytics event:', event, properties if debugAnalytics + console.log 'Going to track analytics event:', action, properties if debugAnalytics properties = properties or {} context = {} + + # TODO: Restrict providers, if given includeProviders + # TODO: This method may not work anymore, because it is not referenced in the segment.io docs + # TODO: Can double check in Mixpanel + # TODO: https://segment.com/docs/api/tracking/track/ if includeProviders context.providers = {'All': false} for provider in includeProviders context.providers[provider] = true - event.label = properties.label if properties.label - analytics?.track event, properties, context + + analytics?.track action, properties, context trackTiming: (duration, category, variable, label, samplePercentage=5) -> # https://developers.google.com/analytics/devguides/collection/gajs/gaTrackingTiming diff --git a/app/views/HomeView.coffee b/app/views/HomeView.coffee index 18ff30fa6..4e631702c 100644 --- a/app/views/HomeView.coffee +++ b/app/views/HomeView.coffee @@ -15,7 +15,7 @@ module.exports = class HomeView extends RootView constructor: -> super() - window.tracker?.trackEvent 'Homepage', Action: 'Loaded' + window.tracker?.trackEvent 'Homepage Loaded', category: 'Homepage', ['Google Analytics'] if not me.get('hourOfCode') and @getQueryVariable 'hour_of_code' @setUpHourOfCode() elapsed = (new Date() - new Date(me.get('dateCreated'))) @@ -41,7 +41,7 @@ module.exports = class HomeView extends RootView @playSound 'menu-button-click' e.preventDefault() e.stopImmediatePropagation() - window.tracker?.trackEvent 'Homepage', Action: 'Play' + window.tracker?.trackEvent 'Click Play', category: 'Homepage' window.open '/play', '_blank' afterInsert: -> diff --git a/app/views/game-menu/InventoryModal.coffee b/app/views/game-menu/InventoryModal.coffee index 3f7bfb16b..e70960c4f 100644 --- a/app/views/game-menu/InventoryModal.coffee +++ b/app/views/game-menu/InventoryModal.coffee @@ -428,7 +428,7 @@ module.exports = class InventoryModal extends ModalView hasGoneFullScreenOnce = true @updateConfig => @trigger? 'play-click' - window.tracker?.trackEvent 'Play Level Modal', Action: 'Play', ['Google Analytics'] + window.tracker?.trackEvent 'Inventory Play', category: 'Play Level', ['Google Analytics'] updateConfig: (callback, skipSessionSave) -> sessionHeroConfig = @options.session.get('heroConfig') ? {} diff --git a/app/views/kinds/RootView.coffee b/app/views/kinds/RootView.coffee index a51045be5..35510fd1c 100644 --- a/app/views/kinds/RootView.coffee +++ b/app/views/kinds/RootView.coffee @@ -47,7 +47,7 @@ module.exports = class RootView extends CocoView logoutAccount: -> Backbone.Mediator.publish("auth:logging-out") - window.tracker?.trackEvent 'Homepage', Action: 'Log Out' if @id is 'home-view' + window.tracker?.trackEvent 'Log Out', category:'Homepage', ['Google Analytics'] if @id is 'home-view' logoutUser($('#login-email').val()) showWizardSettingsModal: -> @@ -57,18 +57,18 @@ module.exports = class RootView extends CocoView onClickSignupButton: -> AuthModal = require 'views/modal/AuthModal' - window.tracker?.trackEvent 'Homepage', Action: 'Signup Modal' if @id is 'home-view' + window.tracker?.trackEvent 'Sign Up', category: 'Homepage', ['Google Analytics'] if @id is 'home-view' @openModalView new AuthModal {mode: 'signup'} onClickLoginButton: -> AuthModal = require 'views/modal/AuthModal' - window.tracker?.trackEvent 'Homepage', Action: 'Login Modal' if @id is 'home-view' + window.tracker?.trackEvent 'Login', category: 'Homepage', ['Google Analytics'] if @id is 'home-view' @openModalView new AuthModal {mode: 'login'} onClickAnchor: (e) -> return if @destroyed anchorText = e?.currentTarget?.text - window.tracker?.trackEvent 'Homepage', Action: anchorText, ['Google Analytics'] if @id is 'home-view' and anchorText + window.tracker?.trackEvent anchorText, category: 'Homepage', ['Google Analytics'] if @id is 'home-view' and anchorText @toggleModal e onOpenModalView: (e) -> diff --git a/app/views/play/WorldMapView.coffee b/app/views/play/WorldMapView.coffee index 50c3f68ed..71661cbba 100644 --- a/app/views/play/WorldMapView.coffee +++ b/app/views/play/WorldMapView.coffee @@ -70,7 +70,7 @@ module.exports = class WorldMapView extends RootView @hadEverChosenHero = me.get('heroConfig')?.thangType @listenTo me, 'change:purchased', -> @renderSelectors('#gems-count') @listenTo me, 'change:spent', -> @renderSelectors('#gems-count') - window.tracker?.trackEvent 'World Map', Action: 'Loaded', ['Google Analytics'] + window.tracker?.trackEvent 'Loaded World Map', category: 'World Map', ['Google Analytics'] # If it's a new player who didn't appear to come from Hour of Code, we register her here without setting the hourOfCode property. elapsed = (new Date() - new Date(me.get('dateCreated'))) @@ -192,12 +192,12 @@ module.exports = class WorldMapView extends RootView levelElement = $(e.target).parents('.level') levelID = levelElement.data('level-id') @startLevel levelElement - window.tracker?.trackEvent 'World Map', Action: 'Play Level', levelID: levelID, ['Google Analytics'] + window.tracker?.trackEvent 'Clicked Level', category: 'World Map', levelID: levelID, ['Google Analytics'] onClickStartLevel: (e) -> levelElement = $(e.target).parents('.level-info-container') @startLevel levelElement - window.tracker?.trackEvent 'World Map', Action: 'Play Level', levelID: levelElement.data('level-id'), ['Google Analytics'] + window.tracker?.trackEvent 'Clicked Start Level', category: 'World Map', levelID: levelElement.data('level-id'), ['Google Analytics'] startLevel: (levelElement) -> @setupManager?.destroy() diff --git a/app/views/play/level/PlayLevelView.coffee b/app/views/play/level/PlayLevelView.coffee index e9e26ad55..08a791ccc 100644 --- a/app/views/play/level/PlayLevelView.coffee +++ b/app/views/play/level/PlayLevelView.coffee @@ -110,7 +110,7 @@ module.exports = class PlayLevelView extends RootView setTimeout f, 100 else @load() - application.tracker?.trackEvent 'Started Level Load', level: @levelID, label: @levelID, ['Google Analytics'] + application.tracker?.trackEvent 'Started Level Load', category: 'Play Level', level: @levelID, label: @levelID, ['Google Analytics'] setLevel: (@level, givenSupermodel) -> @supermodel.models = givenSupermodel.models @@ -135,9 +135,8 @@ module.exports = class PlayLevelView extends RootView @loadEndTime = new Date() loadDuration = @loadEndTime - @loadStartTime console.debug "Level unveiled after #{(loadDuration / 1000).toFixed(2)}s" - application.tracker?.trackEvent 'Finished Level Load', level: @levelID, label: @levelID, loadDuration: loadDuration, ['Google Analytics'] + application.tracker?.trackEvent 'Finished Level Load', category: 'Play Level', label: @levelID, level: @levelID, loadDuration: loadDuration, ['Google Analytics'] application.tracker?.trackTiming loadDuration, 'Level Load Time', @levelID, @levelID - application.tracker?.trackEvent 'Play Level', Action: 'Loaded', levelID: @levelID # CocoView overridden methods ############################################### @@ -338,7 +337,7 @@ module.exports = class PlayLevelView extends RootView if @options.realTimeMultiplayerSessionID? Backbone.Mediator.publish 'playback:real-time-playback-waiting', {} @realTimeMultiplayerContinueGame @options.realTimeMultiplayerSessionID - application.tracker?.trackEvent 'Play Level', Action: 'Start Level', levelID: @levelID + application.tracker?.trackEvent 'Started Level', category:'Play Level', levelID: @levelID playAmbientSound: -> return if @ambientSound @@ -421,6 +420,7 @@ module.exports = class PlayLevelView extends RootView victoryTime = (new Date()) - @loadEndTime if victoryTime > 10 * 1000 # Don't track it if we're reloading an already-beaten level application.tracker?.trackEvent 'Saw Victory', + category: 'Play Level' level: @level.get('name') label: @level.get('name') application.tracker?.trackTiming victoryTime, 'Level Victory Time', @levelID, @levelID, 100 @@ -438,12 +438,12 @@ module.exports = class PlayLevelView extends RootView @tome.reloadAllCode() Backbone.Mediator.publish 'level:restarted', {} $('#level-done-button', @$el).hide() - application.tracker?.trackEvent 'Confirmed Restart', level: @level.get('name'), label: @level.get('name') + application.tracker?.trackEvent 'Confirmed Restart', category: 'Play Level', level: @level.get('name'), label: @level.get('name') onInfiniteLoop: (e) -> return unless e.firstWorld @openModalView new InfiniteLoopModal() - application.tracker?.trackEvent 'Saw Initial Infinite Loop', level: @level.get('name'), label: @level.get('name') + application.tracker?.trackEvent 'Saw Initial Infinite Loop', category: 'Play Level', level: @level.get('name'), label: @level.get('name') onPlayNextLevel: -> nextLevelID = @getNextLevelID()