Vue-multianalytics
A VueJS multianalytics tool
About
At Glovo we need to track a lot of events. And not in only one platform, but a few. That is why we needed vue-multianalytics, a simple plugin that allows you to track any event in multiple platforms at the same time.
This plugin has been inspired by the awesome library vue-ua, so a big thank you to it. If you want to just have Google Analytics, you should use vue-ua instead of vue-multianalytics.
Configuration
A typical npm install vue-multianalytics -s
will be enough to download it.
To start using it, you need to add the plugin in your main .js entry
import VueMultianalytics from 'vue-multianalytics'
let gaConfig = {
appName: 'Test',
appVersion: '0.1',
trackingId: 'YOUR_UA',
debug: true,
}
let mixpanelConfig = {
token: 'YOUR_TOKEN'
}
Vue.use(VueMultianalytics, {
modules: {
ga: gaConfig,
mixpanel: mixpanelConfig
}
})
Tracking
Once the configuration is completed, you can access the vue-multianalytics instance in your components like that :
this.$ma.trackEvent(params, excludedModules)
ExcludedModules
You can easily exclude modules from being fired by an event adding them to the excludedModules array. This is per-event based, so feel free to use them as you want
let excludedModules = ['mixpanel']
this.$ma.trackEvent(params, excludedModules)
this.$ma.trackEvent(params, ['mixpanel', 'ga'])
this.$ma.trackEvent(params)
VueRouter integration
vue-multianalytics can be integrated with vue-router to track each new screen view on router change.
To use this feature, you just need to pass your vue-router
instance in the params property as vueRouter.
import VueMultianalytics from 'vue-multianalytics'
import VueRouter from 'vue-router'
const router = new VueRouter(...)
let mixpanelConfig = {
token: 'YOUR_TOKEN'
}
Vue.use(VueMultianalytics, {
modules: {
mixpanel: mixpanelConfig
},
routing: {
vueRouter: router,
preferredProperty: 'name',
ignoredViews: ['homepage'],
ignoredModules: ['ga']
}
})
This feature will generate the view name according to a priority rule:
- If you have defined a meta field in your route named
analytics
const homeRoute = {
path: '/home',
name: 'home',
meta: {analytics: 'ThisWillBeTheName'}
}
- If you define a
preferredProperty
in your vue-multianalytics params, that params will be the used as screen name. Possible params are: name
, path
, fullPath
. - If nothing is provided
path
will be used.
If you want to ignore some routes, just specify then in the ignoredViews
param.
Custom Plugin
Usually you don't want to call directly the library, but call an interface first to manipulate the data before.
if (a === condition1) {
this.$ma.trackEvent({action: 'User click'})
} else {
this.$ma.trackError({description: 'Fatal error'})
}
if (b === condition1) {
this.$ma.trackEvent({action: 'User click'})
}
this.$mam.onUserClick(a)
this.$mam.onUserClick(b)
To do it so, you just need to create a mixin to act as an interface with the vue-multianalytics.
Mixin
Just create a module that exports a function accepting as a parameter the analytics library:
export default function (multianalytics) {
return {
onUserClick (input) {
if (input === true) {
multianalytics.trackEvent({action: 'User click'})
} else {
multianalytics.trackError({description: 'Fatal error'})
}
}
}
}
You can define inside all the methods that you want and call all the library api from the parameter received.
Binding
You just need to pass the mixin as the third parameter when you initialize the plugin
import VueMultianalytics from 'vue-multianalytics'
import analyticsMixin from './analyticsMixin.js'
Vue.use(VueMultianalytics, {
modules: {
ga: gaConfig
}
}, analyticsMixin)
Usage
Everything is already set, you can now call your mixin methods from anywhere in your vue application using this.$mam
(instead of this.$ma
).
export default {
data () {
},
methods: {
bannerClick (input) {
this.$mam.onUserClick(input)
}
}
}
API
trackView({viewName})
this.$ma.trackView({screenName: 'Homepage'})
trackEvent({category = 'Event', action, label = null, value = null})
this.$ma.trackEvent({category: 'Click', action: 'Homepage Click', label: 'Great', value: ''})
addTransaction({id, affiliation = '', revenue = 0, shipping = 0, tax = 0, currency = 'USD'})
this.$ma.addTransaction({
id: 1234,
affiliation: 'Acme Clothing',
revenue: 11.99,
shipping: 5,
tax: 1.29
})
addItem({id, name, sku, category, price = 0, quantity = 1})
this.$ma.addItem({
id: 123,
name: 'Fluffy Pink Bunnies',
sku: 'DD23444',
category: 'Party Toys',
price: '11.99',
quantity: '1'
})
trackTransaction()
this.$ma.trackTransaction()
clearTransactions()
this.$ma.clearTransactions()
identify()
this.$ma.identify({userId: 12345, options: {newUser: true}})
reset()
this.$ma.reset()
setAlias(alias)
this.$ma.setAlias('user1234@test.com')
setUsername(name)
this.$ma.setUsername('user1234@test.com')
setUserProperties(properties)
this.$ma.setUserProperties({userId: '12345', name: 'John'})
setUserPropertiesOnce(properties)
this.$ma.setUserPropertiesOnce({userId: '12345', name: 'John'})
incrementUserProperties(properties)
this.$ma.incrementUserProperties({loginCount: 1, pagesPrinted: 5})
setSuperProperties(properties)
this.$ma.setSuperProperties({platform: 'Mobile'})
setSuperPropertiesOnce(properties)
this.$ma.setSuperPropertiesOnce({platform: 'Mobile'})
Modules
Currently, supported modules are the following
Google Analytics
Name: ga
Config:
appName: 'Test',
appVersion: '0.1',
trackingId: 'YOUR_UA',
ecommerce: true,
debug: true
Supported Events: trackView
, trackEvent
, trackException
, addTransaction
, addItem
, trackTransaction
, clearTransactions
, setUsername
, trackTiming
Mixpanel
Name: mixpanel
Config:
token: 'YOUR_TOKEN'
config: {}
debug: true
Supported Events: trackView
, trackEvent
, setAlias
, setUsername
, setUserProperties
, setUserPropertiesOnce
, incrementUserProperties
, setSuperPropertiesOnce
, setSuperProperties
, setSuperPropertiesOnce
Facebook Pixel
Name: facebook
Config:
token: 'YOUR_TOKEN'
debug: true
Supported Events: trackView
, trackEvent
Segment
Name: segment
Config:
token: 'YOUR_TOKEN'
debug: true
Supported Events: trackView
, trackEvent
, setAlias
, setUserProperties
, setSuperProperties
MParticle
Name: mparticle
Config:
token: 'YOUR_TOKEN'
debug: true
Supported Events: trackView
, trackEvent
, setAlias
, setUserProperties
, setSuperProperties
Custom Modules
You can now add your own custom modules simply by calling
VueMultianalytics.addCustomModule(name, Module)
Example:
class OwnModule extends BasicModule {
init() {
}
trackView ({viewName}) {
if (this.config.debug) {
logDebug(viewName)
}
myowntrack("Page Viewed", { "page": viewName })
}
}
import Vue from 'vue'
import VueMultianalytics from 'vue-multianalytics'
import OwnModule from 'OwnModule.js'
VueMultianalytics.addCustomModule('ownModule', OwnModule)
Vue.use(VueMultianalytics, {
modules: {
ownModule: { }
}
})
Thanks @anteriovieira for the suggestion
Todo
Demo 👍Further integration with mixpanel 👍Ecommerce support 👍Own module 👍- New events:
registerSuperproperties, alias, timedEvents - New modules:
segment, mparticle appboy, kissmetrics? - Tests
License
MIT