diff --git a/__tests__/__snapshots__/index.js.snap b/__tests__/__snapshots__/index.js.snap
index 18663275..416655e0 100644
--- a/__tests__/__snapshots__/index.js.snap
+++ b/__tests__/__snapshots__/index.js.snap
@@ -387,5 +387,11 @@ Object {
     "delay": [Function],
     "formatDuration": [Function],
   },
+  "tracking": Object {
+    "default": undefined,
+    "event": [Function],
+    "init": [Function],
+    "pageView": [Function],
+  },
 }
 `;
diff --git a/config/webpack/default.js b/config/webpack/default.js
index 4872dd72..3ef26273 100644
--- a/config/webpack/default.js
+++ b/config/webpack/default.js
@@ -19,6 +19,7 @@ module.exports = {
     'moment-duration-format',
     'react',
     'react-dom',
+    'react-ga',
     'redux',
     'redux-actions',
     'isomorphic-fetch',
diff --git a/package.json b/package.json
index b5a3500b..e9067a4e 100644
--- a/package.json
+++ b/package.json
@@ -21,6 +21,7 @@
     "url": "git+https://github.com/topcoder-platform/topcoder-react-lib.git"
   },
   "scripts": {
+    "prepare": "npm run build",
     "build": "npm run clean && npm run build:dev && npm run build:prod",
     "build:dev": "./node_modules/.bin/webpack --env=development --progress --profile --colors --display-optimization-bailout",
     "build:dev:watch": "npm run clean && ./node_modules/.bin/webpack --env=development --progress --profile --colors --watch --display-optimization-bailout",
@@ -31,7 +32,7 @@
     "lint:js": "./node_modules/.bin/eslint --ext .js,.jsx .",
     "test": "npm run lint && npm run jest"
   },
-  "version": "0.15.0",
+  "version": "0.16.0",
   "dependencies": {
     "auth0-js": "^6.8.4",
     "config": "^3.2.0",
@@ -44,6 +45,7 @@
     "qs": "^6.5.2",
     "react": "^16.4.1",
     "react-dom": "^16.4.1",
+    "react-ga": "^2.7.0",
     "react-redux": "^6.0.1",
     "redux": "^3.7.2",
     "redux-actions": "^2.4.0",
diff --git a/src/index.js b/src/index.js
index 78103660..b8c4c79f 100644
--- a/src/index.js
+++ b/src/index.js
@@ -12,5 +12,5 @@ export { actions } from './actions';
 export { services } from './services';
 
 export {
-  challenge, logger, errors, tc, time, mock, submission,
+  challenge, logger, errors, tc, time, mock, submission, tracking,
 } from './utils';
diff --git a/src/utils/index.js b/src/utils/index.js
index 6a6387a4..d0212e21 100644
--- a/src/utils/index.js
+++ b/src/utils/index.js
@@ -8,6 +8,7 @@ import * as mock from './mock';
 import * as errors from './errors';
 import * as filter from './challenge/filter';
 import * as submission from './submission';
+import * as tracking from './tracking';
 
 const challenge = {
   filter,
@@ -21,4 +22,5 @@ export {
   mock,
   errors,
   submission,
+  tracking,
 };
diff --git a/src/utils/tracking.js b/src/utils/tracking.js
new file mode 100644
index 00000000..57bc15d8
--- /dev/null
+++ b/src/utils/tracking.js
@@ -0,0 +1,45 @@
+/* global window */
+
+import ReactGA from 'react-ga';
+
+const TRACKING_NAME = 'tracking';
+
+/**
+ * init - Init Google Analytics tracking
+ * @param {string} userId
+ */
+export const init = (userId) => {
+  ReactGA.initialize([{
+    trackingId: 'UA-161803421-1',
+    gaOptions: {
+      name: TRACKING_NAME,
+      userId,
+    },
+  }], {
+    alwaysSendToDefaultTracker: false,
+  });
+};
+
+/**
+ * pageView - Track page view
+ */
+export const pageView = () => {
+  ReactGA.pageview(window.location.pathname
+                   + window.location.search, [TRACKING_NAME]);
+};
+
+/**
+ * event - Add custom tracking event.
+ * @param {string} category
+ * @param {string} action
+ * @param {string} label
+ */
+export const event = (category, action, label) => {
+  ReactGA.event({
+    category,
+    action,
+    label,
+  }, [TRACKING_NAME]);
+};
+
+export default undefined;