• Stars
    star
    133
  • Rank 272,600 (Top 6 %)
  • Language
    TypeScript
  • Created over 6 years ago
  • Updated almost 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Add a GDPR-friendly Google Analytics opt-in/opt-out button to your site

Trackless

Let your users opt-out of Google Analytics

Google Analytics is super-useful, but lots of people don't like being tracked. The GDPR says that users should be able to choose whether they share personal information. This script lets you easily give your site visitors a way of opting-out of Google Analytics tracking. This preference is stored in the browser's localStorage.

Tracking is disabled by setting window['ga-disable-GA_TRACKING_ID'] = true;, as documented here. This needs to be done before the Google Analytics call is made, so the script should be loaded before the Google Analytics script.

How to use

npm GitHub issues

The script can either be loaded as a module if you are using a bundler, or directly from a script tag.

To load as a package, install from NPM:

npm install trackless

or

yarn add trackless

Then in your source file:

import { Trackless } from "trackless";

const trackless = new Trackless({ trackingID: "MY_TRACKING_ID" });
trackless.bindElements();

When loading from a script tag, place it in the head before your GA tag. We use the same method as GA for loading asynchronously, so its safe to load it in the head. You can either load it directly from unpkg.com, or download the UMD file and host it yourself.

<script async src="//unpkg.com/trackless@1"></script>
<script>
    window.TracklessQueue = window.TracklessQueue || [];
    TracklessQueue.push(
        function (Trackless) {
            new Trackless({ trackingID: "MY_TRACKING_ID" }).bindElements();
        }
    )
</script>

By default it binds to all elements with the class "trackless". You can change this by passing a different selector to bindElements(). e.g. bindElements("button.optOut") will bind to all buttons with the class "optOut". You can click any bound element to toggle the preference. This will automatically update the setting in localStorage, as well as the label for itself and all other bound elements. For checkboxes, it updates the checked value. For other <input> elements it sets the value property. For all other elements, it sets the innerText.

Demo

API

Options

The following options can be assed to the constructor. All fields are optional, except trackingID.

Param Type Default Description
trackingID string - Your Google Analytics tracking ID. e.g. GA-XX-XXXXX
optOutText string "Don't track me" The text prompting the user to opt out.
optInText string "Enable tracking" The text prompting the user to opt in.
initialOptOut boolean false Initial opt-out value if no preference is stored.
overrideOptOut boolean false Override opt-out value. If true, sets the stored preference to the initialOptOut value. Use this if, for example, you have a logged-in user and want to sync the preference between devices.
callback Function - Called when opt-out value is changed. Passed the new opt-out value.
invertCheckbox boolean false Invert the behaviour of checkboxes. By default, a checkbox is checked if the user is not opted-out. Set this to true so that it is checked if the user is opted-out.

The Trackless object

constructor(options)

Param Type Description
options Options An options object.

bindElements(selectors)

Adds onClick listeners to the selected elements, and sets their value according to the current preferences.

Param Type Description
selectors string The selectors of the elements to bind. Default is ".trackless", i.e. any element with class="trackless"

unBindAllElements()

Unbinds all previously bound elements.

setPreference(optOut)

Sets the opt-out preference, stores the value in localStorage, and updates all elements. If callback() is set then it is invoked with the new value.

Param Type Description
optOut boolean The optOut value

static processQueue(queue)

Used by the async loader to run queued commands. You shouldn't need to use this yourself unless you are handling your own queue. It should be an array of functions, which are passed the Trackless class. The UMD file looks for a window.TracklessQueue array, which it passes to this when the script has loaded. If you are loading it as a module you won't get this behaviour, so if you need async processing then this is the way to implement it.

Trackless.processQueue(window.TracklessQueue);
Param Type Description
queue array An array of callbacks. These are passed the Trackless class as the only argument.

FAQ

  • Does this stop the Analytics script from loading? No. The script still loads. However because the opt-out flag is set, Google does not set a cookie or track the visit.
  • Should I default to opted-out? I am not a lawyer, but if you want to be totally sure then yes, pass initialOptOut: true in the options and it will default to opted-out, and not track the user unless they positively opt in.
  • Is this required by the GDPR? I am not a lawyer. Google allows you to anonymise IP addresses in Analytics (which you should absolutely do), but it still tracks the user via a client ID. It could certainly be argued that this is PII (and I expect some lawyers will be doing just that).

More Repositories

1

unpic-img

Multi-framework responsive image component
TypeScript
585
star
2

unpic

Universal image CDN translator
TypeScript
103
star
3

unpic-placeholder

Pure-CSS image placeholders
TypeScript
65
star
4

php-edge

Run PHP in WebAssembly on Netlify Edge Functions
TypeScript
58
star
5

react-artboard

A realistic paint component
TypeScript
55
star
6

canvas-paint-tool

Realistic canvas paint tool
JavaScript
53
star
7

og-edge

Generate Open Graph images with Deno and Netlify Edge Functions, no framework needed.
TypeScript
50
star
8

socket-io-actionscript

Socket.IO Actionscript 3 client
ActionScript
35
star
9

chalkstream

chalkstream
TypeScript
30
star
10

clevrlib

CLEVR Actionscript Library
ActionScript
15
star
11

php-stateless-cookies

Implements secure stateless cookies and user accounts.
PHP
11
star
12

vanilla-stream

React streaming with no meta-framework
TypeScript
9
star
13

sse-demo

Demo of server-sent events with Netlify Edge Functions
HTML
7
star
14

logarithmic-slider

Logarithmic UISlider subclass
Objective-C
6
star
15

get-pixels

๐ŸŒˆ ๐Ÿฆ• Get the decoded pixel data from a JPG or PNG image
TypeScript
6
star
16

netligraph

TypeScript
6
star
17

airbed

Lightweight CouchDB client library for Adobe AIR
ActionScript
6
star
18

daneel

Template for an OpenAI chat bot app, built with React, Tailwind and TypeScript
TypeScript
4
star
19

remix-on-netlify

TypeScript
4
star
20

gatsby-plugin-static-image

TypeScript
3
star
21

localized-time

TypeScript
3
star
22

avalon

This repository was created by Gatsby Cloud
JavaScript
2
star
23

use-pwned-passwords

React custom hook to check passwords against the HaveIBeenPwned API
TypeScript
2
star
24

babel-jsx-utils

Utilities for working with Babel and JSX
TypeScript
2
star
25

aerian-headless-lightning

PHP
1
star
26

gatsby-sanity-benchmark

JavaScript
1
star
27

cdp-edge-inject

TypeScript
1
star
28

tweetdelete

JavaScript
1
star
29

using-static-images

JavaScript
1
star
30

shopp-google-checkout-currency-convert

A Shopp payment gateway with automatic currency conversion
1
star
31

departures

Live UK station departures and arrivals boards
TypeScript
1
star
32

adas-bake

Gatsby starter for a Contentful project.
JavaScript
1
star
33

ascorbic.github.com

HTML
1
star
34

vendor

Vendor submodules
1
star
35

doctrine-tracker

Just a tracker for the Doctrine svn server, so I can add it as a submodule in my /vendor/ project
PHP
1
star
36

gatsby-starter-rendering-modes

JavaScript
1
star
37

create-test

TypeScript
1
star
38

generate-fake-cms-data

TypeScript
1
star
39

gatsby-4-test-site

JavaScript
1
star