Gets and sets a unique user id
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const getUUID = () => { | |
const COOKIE_NAME = "gbuuid"; | |
const COOKIE_DAYS = 400; // 400 days is the max cookie duration for chrome | |
// use the browsers crypto.randomUUID if set | |
const genUUID = () => { | |
if(window?.crypto?.randomUUID) return window.crypto.randomUUID(); | |
return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c => | |
(c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) | |
); | |
} | |
const getCookie = (name) => { | |
let value = `; ${document.cookie}`; | |
let parts = value.split(`; ${name}=`); | |
if (parts.length === 2) return parts.pop().split(';').shift(); | |
} | |
const setCookie = (name, value) => { | |
var d = new Date(); | |
d.setTime(d.getTime() + 24*60*60*1000*COOKIE_DAYS); | |
document.cookie = name + "=" + value + ";path=/;expires=" + d.toGMTString(); | |
} | |
// get the existing UUID from cookie if set, otherwise create one and store it in the cookie | |
if(getCookie(COOKIE_NAME)) return getCookie(COOKIE_NAME); | |
const uuid = genUUID(); | |
setCookie(COOKIE_NAME, uuid); | |
return uuid; | |
} | |
// minified version: | |
const getUUID=()=>{let $="gbuuid",e=()=>window.crypto.randomUUID?window.crypto.randomUUID():"10000000-1000-4000-8000-100000000000".replace(/[018]/g,$=>($^crypto.getRandomValues(new Uint8Array(1))[0]&15>>$/4).toString(16)),t=$=>{let e=`; ${document.cookie}`.split(`; ${$}=`);if(2===e.length)return e.pop().split(";").shift()},r=($,e)=>{var t=new Date;t.setTime(t.getTime()+3456e7),document.cookie=$+"="+e+";path=/;expires="+t.toGMTString()};if(t($))return t($);let i=e();return r($,i),i}; | |
// Basic usage: | |
console.log(getUUID()); | |
// GrowthBook usage with GA4: | |
<script> | |
(function() { | |
// Wait for the SDK to load before starting GrowthBook | |
if (window.growthbook) { | |
startGrowthbook(); | |
} else { | |
document.querySelector("#growthbook-sdk").addEventListener("load", startGrowthbook); | |
} | |
function startGrowthbook() { | |
if (!window.growthbook) return; | |
const getUUID=()=>{let $="gbuuid",e=()=>window.crypto.randomUUID?window.crypto.randomUUID():"10000000-1000-4000-8000-100000000000".replace(/[018]/g,$=>($^crypto.getRandomValues(new Uint8Array(1))[0]&15>>$/4).toString(16)),t=$=>{let e=`; ${document.cookie}`.split(`; ${$}=`);if(2===e.length)return e.pop().split(";").shift()},r=($,e)=>{var t=new Date;t.setTime(t.getTime()+3456e7),document.cookie=$+"="+e+";path=/;expires="+t.toGMTString()};if(t($))return t($);let i=e();return r($,i),i}; | |
let gbuuid = getUUID(); | |
let gb = new growthbook.GrowthBook({ | |
apiHost: "https://cdn.growthbook.io", | |
clientKey: "sdk-abcd1234", | |
// TODO: Add decryptionKey if using encryption | |
attributes: { | |
id: gbuuid | |
}, | |
trackingCallback: function(experiment, result) { | |
// track with GA4, for example: | |
gtag("event", "experiment_viewed", { | |
event_category: "experiment", | |
experiment_id: experiment.key, | |
variation_id: result.variationId, | |
gb_user_id: gbuuid, | |
}); | |
} | |
}); | |
// TODO: Instrument DOM with AB test logic | |
gb.loadFeatures().then(function() { | |
// if you want to do anything after GB loads | |
}); | |
} | |
})(); | |
</script> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment