Integration Docs
Alternative Integrations

Alternative Integrations

Below are alternative methods for adding tracking to your site, if the default is not possible. Always replace ###### in the examples with your site id, e.g., as its registered with

#Load the tracker via JavaScript

Use this method when you can't add custom HTML to your templates, or if your tag management system only allows JavaScript.

The following code dynamically creates an HTML <script> element, then loads the tracker in the standard way:

(function(d) {
    var b = d.body;
    var e = d.createElement('script'); = 'parsely-cfg';
    e.src = '//';

#Load the tracker in an iframe element

Use this method if you are unable to insert the tracker directly into the HTML markup of your pages, and must instead insert it into an iFrame:

First, on your server create a file called parsely.html with the following markup:

<!DOCTYPE html>
<html lang="en">
<!-- START Include: Standard -->
<script id="parsely-cfg" src="//"></script>
<!-- END Include: Standard -->

Then, add an iframe element to all the trackable pages, with the src pointing to that HTML file.

<iframe name="parsely_tag" src="/path/to/parsely.html" style="display: none" width="0" height="0" tabindex="-1"></iframe>

The parsely.html file should be accessible on the same protocol (http/https), domain, and port as the page which contains the iframe itself or the JavaScript will fail to execute due to cross-site scripting limitations.

#The Enhanced JavaScript Snippet

In many integration contexts, it's easy to set up the basic integration to configure tracking after it has loaded. In some other contexts, getting the relative load order of various components right is more difficult. Integrations based on Google Tag Manager are one context in which this issue can arise.

For such situations, provides an "enhanced" JavaScript snippet that provides an abstraction over the timing of the tracker's load sequence. To use the enhanced snippet, replace the Basic integration code on your webpage with the following (replacing ###### with your site id, e.g.

<script type="text/javascript">(function(){
var parsely=window.PARSELY=window.PARSELY||{};if(parsely._snippetVersion="1.0.0",!parsely.loaded)if(parsely._snippetInvoked)try{window.console&&console.error&&console.error("Parsely snippet included twice")}catch(e){}else{parsely._snippetInvoked=!0,parsely._stubs={onStart:[]},parsely._buildStub=function(e){return function(){parsely._stubs[e].push(arguments)}};for(var curStub in parsely._stubs)parsely._stubs.hasOwnProperty(curStub)&&(parsely[curStub]=parsely._buildStub(curStub))}parsely._load=function(e,s){s=void 0===s?"":s;var r=document.createElement("script");"parsely-cfg",r.type="text/javascript",r.async=!0,r.setAttribute("data-parsely-site",e),r.src="//"+s+"/keys/"+e+"/p.js",document.body.appendChild(r)};

// users: put your site id (aka apikey) in the call to _load() here (example: parsely._load(""))

This allows you to perform setup and configuration in PARSELY.onStart. For example, you might disable autotracking and then call trackPageView directly:

<script type="text/javascript">!(function(){
PARSELY.onStart(function() {
    PARSELY.autotrack = false;

When using the enhanced snippet, calls to onStart should be included on your webpage immediately after the snippet.

The enhanced snippet is only supported in tracker versions above 1.6.0. If you're unsure of your tracker version, contact

#Configure the tracker to always use browser localStorage instead of cookies

By default, the tracker uses cookies to keep track of visitors and sessions. However, this data can be stored in each browser's window.localStorage instead.

To use localStorage instead of cookies, simply make sure PARSELY.use_localstorage = true prior to loading the tracker, as in this example:

    window.PARSELY = window.PARSELY || {
        // ... other Parsely configuration options
        use_localstorage: true
        // ... other Parsely configuration options

<!-- START Include -->
<!-- ...insert the tracker code here... -->
<!-- END Include -->

One major limitation of localStorage is that, unlike cookies, data does not persist across subdomains. This means that if your site spans multiple subdomains (such as and, cookies can use the same visitor and session data as a user navigates between them, but localStorage cannot. That difference would result in higher visitor counts and more new visitors in the dashboard and API when using localStorage.

The tracker automatically uses localStorage in browsers such as Safari where cookie expiration would otherwise prevent accurate data collection. No additional configuration is required for this behavior.

Ready to get started with



rocket emoji