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()