Redux middleware for sending analytics to Keen IO.
npm install --save redux-keen
import keenAnalytics from 'redux-keen';
import Keen from 'keen-js';
let keenClient = new Keen({ projectId: 'YOUR_PROJECT_ID', writeKey: 'YOUR_WRITE_KEY' });
let keenMiddleware = keenAnalytics(keenClient);
The default export is a function requiring keen-js client instance. This function returns a middleware function, that can be applied using applyMiddleware
from Redux.
If it receives an action whose meta
property contains an analytics
property with non-empty collection
property, it will record the event in the Keen IO analytics.
An action that should be recorded to analytics MUST
- have an
analytics
property inside itsmeta
property - have a
collection
property inside itsanalytics
property
and MAY
- have an
event
property inside itsanalytics
property
The required collection
property inside the analytics
specifies the Keen IO event collection.
The optional event
property inside the analytics
contains the data of the Keen IO event.
{
type: ADD_TO_SHOPPING_CART,
payload: item,
meta: {
analytics: {
collection: "add_item_to_shopping_cart"
}
}
}
{
type: ADD_TO_SHOPPING_CART,
payload: item,
meta: {
analytics: {
collection: "add_item_to_shopping_cart",
event: {
item: {
title: item.title,
itemId: item.itemId
}
}
}
}
}
When setting up analytics with Keen IO, we often want to send some common data (hereinafter referred to as globals
) with each event (e.g. device information, geolocation, authenticated user, etc.).
The default function that creates keenMiddleware accepts an optional third parameter getGlobals
.
If provided, getGlobals
must be a function returning a javascript object. It is called everytime the middleware intercepts a an action with valid analytics property.
let keenMiddleware = keenAnalytics(projectId, writeKey, getGlobals);
The redux state is passed as parameter to the provided function. You can use it for example for getting the authenticated user information (see the example bellow).
function getLocationPayload() {
return {
ip_address: '${keen.ip}',
keen: {
addons: [
{
name: 'keen:ip_to_geo',
input: {
ip: 'ip_address'
},
output: 'ip_geo_info'
}
]
}
};
}
function getUserPayload(state) {
const { isSignedIn, user } = state.session;
if (!isSignedIn) {
return {};
}
let userGlobals = {
user: {
name: `${user.firstName} ${user.lastName}`,
userId: user.profileId
}
};
return userGlobals;
}
export default function getGlobals(state) {
const location = getLocationPayload();
const user = getUserPayload(state);
return {
...location,
...user
};
}
If getGlobals
provided the globals are sent by the middleware with each event, even when the action has a valid analytics
property with the event
property omitted.