diff --git a/src/assets/svg/gosquared.svg b/src/assets/svg/gosquared.svg
new file mode 100644
index 00000000..36bc2a14
--- /dev/null
+++ b/src/assets/svg/gosquared.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/lib/providers/gosquared/README.md b/src/lib/providers/gosquared/README.md
new file mode 100644
index 00000000..6c029450
--- /dev/null
+++ b/src/lib/providers/gosquared/README.md
@@ -0,0 +1,12 @@
+
+
+# GoSquared
+__homepage__: [www.gosquared.com](https://www.gosquared.com/)
+__docs__: [gosquared.com/docs](https://gosquared.com/docs)
+__import__: `import { Angulartics2GoSquared } from 'angulartics2/gosquared';`
+
+## Setup
diff --git a/src/lib/providers/gosquared/gosquared.spec.ts b/src/lib/providers/gosquared/gosquared.spec.ts
new file mode 100644
index 00000000..b92ccbeb
--- /dev/null
+++ b/src/lib/providers/gosquared/gosquared.spec.ts
@@ -0,0 +1,114 @@
+import {
+ fakeAsync,
+ inject,
+ ComponentFixture,
+ TestBed,
+} from '@angular/core/testing';
+
+import { Angulartics2 } from 'angulartics2';
+import { advance, createRoot, RootCmp, TestModule } from '../../test.mocks';
+import { Angulartics2GoSquared } from './gosquared';
+
+jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000;
+declare var window: any;
+
+describe('Angulartics2GoSquared', () => {
+ let fixture: ComponentFixture;
+ let _gs: any;
+
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ imports: [TestModule],
+ providers: [Angulartics2GoSquared]
+ });
+
+ window._gs = _gs = jasmine.createSpy('_gs');
+ const provider: Angulartics2GoSquared = TestBed.get(Angulartics2GoSquared);
+ provider.startTracking();
+ });
+
+ it('should track pages', fakeAsync(
+ inject(
+ [Angulartics2, Angulartics2GoSquared],
+ (
+ angulartics2: Angulartics2,
+ angulartics2GoSquared: Angulartics2GoSquared
+ ) => {
+ fixture = createRoot(RootCmp);
+ angulartics2.pageTrack.next({ path: '/abc' });
+ advance(fixture);
+ expect(_gs).toHaveBeenCalledWith('track', '/abc');
+ }
+ )
+ ));
+
+ it('should track events', fakeAsync(
+ inject(
+ [Angulartics2, Angulartics2GoSquared],
+ (
+ angulartics2: Angulartics2,
+ angulartics2GoSquared: Angulartics2GoSquared
+ ) => {
+ fixture = createRoot(RootCmp);
+ angulartics2.eventTrack.next({
+ action: 'do',
+ properties: { category: 'cat' }
+ });
+ advance(fixture);
+ expect(_gs).toHaveBeenCalledWith('event', 'do', {
+ category: 'cat'
+ });
+ }
+ )
+ ));
+
+ it('should set user properties', fakeAsync(
+ inject(
+ [Angulartics2, Angulartics2GoSquared],
+ (
+ angulartics2: Angulartics2,
+ angulartics2GoSquared: Angulartics2GoSquared
+ ) => {
+ fixture = createRoot(RootCmp);
+ angulartics2.setUserProperties.next({
+ id: '1',
+ email: '1',
+ first_name: 'John',
+ last_name: 'Doe'
+ });
+ advance(fixture);
+ expect(_gs).toHaveBeenCalledWith('identify', {
+ id: '1',
+ email: '1',
+ first_name: 'John',
+ last_name: 'Doe'
+ });
+ }
+ )
+ ));
+
+ it('should set user properties once', fakeAsync(
+ inject(
+ [Angulartics2, Angulartics2GoSquared],
+ (
+ angulartics2: Angulartics2,
+ angulartics2GoSquared: Angulartics2GoSquared
+ ) => {
+ fixture = createRoot(RootCmp);
+ angulartics2.setUserPropertiesOnce.next({
+ id: '1',
+ email: '1',
+ first_name: 'John',
+ last_name: 'Doe'
+ });
+ advance(fixture);
+ expect(_gs).toHaveBeenCalledWith('identify', {
+ id: '1',
+ email: '1',
+ first_name: 'John',
+ last_name: 'Doe'
+ });
+ }
+ )
+ ));
+});
diff --git a/src/lib/providers/gosquared/gosquared.ts b/src/lib/providers/gosquared/gosquared.ts
new file mode 100644
index 00000000..da8d727a
--- /dev/null
+++ b/src/lib/providers/gosquared/gosquared.ts
@@ -0,0 +1,56 @@
+import { Injectable } from '@angular/core';
+
+import { Angulartics2 } from 'angulartics2';
+
+declare var _gs: any;
+
+@Injectable({ providedIn: 'root' })
+export class Angulartics2GoSquared {
+ constructor(private angulartics2: Angulartics2) {
+ this.angulartics2.setUserProperties.subscribe(x =>
+ this.setUserProperties(x),
+ );
+ this.angulartics2.setUserPropertiesOnce.subscribe(x =>
+ this.setUserProperties(x),
+ );
+ }
+
+ startTracking(): void {
+ this.angulartics2.pageTrack
+ .pipe(this.angulartics2.filterDeveloperMode())
+ .subscribe(x => this.pageTrack(x.path));
+ this.angulartics2.eventTrack
+ .pipe(this.angulartics2.filterDeveloperMode())
+ .subscribe(x => this.eventTrack(x.action, x.properties));
+ }
+
+ pageTrack(path: string) {
+ try {
+ _gs('track', path);
+ } catch (e) {
+ if (!(e instanceof ReferenceError)) {
+ throw e;
+ }
+ }
+ }
+
+ eventTrack(action: string, properties: any) {
+ try {
+ _gs('event', action, properties);
+ } catch (e) {
+ if (!(e instanceof ReferenceError)) {
+ throw e;
+ }
+ }
+ }
+
+ setUserProperties(properties: any) {
+ try {
+ _gs('identify', properties);
+ } catch (e) {
+ if (!(e instanceof ReferenceError)) {
+ throw e;
+ }
+ }
+ }
+}
diff --git a/src/lib/providers/gosquared/package.json b/src/lib/providers/gosquared/package.json
new file mode 100644
index 00000000..b3167bbb
--- /dev/null
+++ b/src/lib/providers/gosquared/package.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "../../../../node_modules/ng-packagr/package.schema.json",
+ "name": "angulartics2/gosquared",
+ "description": "The gosquared module",
+ "homepage": "https://angulartics.github.io/angulartics2/",
+ "author": "Ben White (http://github.com/benjackwhite)",
+ "repository": "angulartics/angulartics2",
+ "license": "MIT",
+ "ngPackage": {
+ "lib": {
+ "entryFile": "gosquared.ts",
+ "umdModuleIds": {
+ "angulartics2": "angulartics2"
+ }
+ },
+ "dest": "../../../../dist/packages-dist/gosquared"
+ }
+}