How to measure a FastCentrik store without own analytics cookies

Trackless is cookieless analytics for e-shops. It stores no own measurement identifier or analytics cookies in the visitor's browser. Because this connection runs through a browser snippet or pixel, assess the legal basis, cookie banner and whether the snippet should be gated by consent against the full site setup. There is no official FastCentrik add-on - in the current admin, measurement is inserted through Google Tag Manager: you save the GTM container ID in FastCentrik and add the Trackless snippets in GTM as custom HTML tags. Your data stays on our EU server and the first 30 days are free.

What to expect on FastCentrik
  • Trackless stores no own analytics cookies or measurement identifier, but this connection runs a browser snippet or pixel. Assess the legal basis, cookie banner and whether the snippet should be gated by consent against the full site setup.
  • Blocking: the tracking code runs in the browser - under aggressive blocking, some visits may be missed.
  • What it measures: visits and orders using the FastCentrik data layer on the thank-you page. When the data layer includes order items, Trackless separates product revenue from shipping and payment fees.

How it works

  • The tracking code runs in the browser, so under aggressive blocking of measurement scripts, some visits may be missed. In normal setups Trackless is not usually blocked; trends and source ratios remain meaningful.
  • Through Google Tag Manager. In FastCentrik you save only the GTM container ID; the Trackless code itself runs in GTM as a custom HTML tag on all pages. Conversions attach from the data layer on the thank-you page.
  • Your data stays yours. Measurement ends on our EU server; we do not share the data with advertising systems.

Step 1: Get your tracking token

Sign up at trackless.cz, log in and under My sites click Add site. Choose FastCentrik and Trackless will show you the tracking token - a string starting with tlc_. In GTM use the variant below, which creates the script dynamically and sets the token in the browser:

<script>
(function () {
    var s = document.createElement('script');
    s.async = true;
    s.src = 'https://c.trackless.cz/t.js';
    s.setAttribute('data-token', 'VAS_MERICI_TOKEN');
    document.head.appendChild(s);
})();
</script>

In regular HTML, <script async src="https://c.trackless.cz/t.js" data-token="..."> would be enough. On FastCentrik, however, the code is inserted through GTM, and in testing GTM could drop the data-token attribute from the external script in the final DOM. Dynamic insertion avoids that.

Step 2: Connect FastCentrik to Google Tag Manager

Open the FastCentrik admin, go to Settings -> Third-party applications -> Google Tag Manager and enter your GTM ID, for example GTM-XXXXXXX. If you do not have GTM yet, create a new web container in Google Tag Manager.

Only the container ID goes into FastCentrik. The Trackless snippets themselves are added in GTM as Custom HTML tags.

Create the traffic tag in GTM

  1. Open your GTM container and click Tags -> New -> Tag Configuration -> Custom HTML.
  2. Paste the base Trackless code from step 1, replace VAS_MERICI_TOKEN with the token from Trackless and name the tag for example Trackless - traffic.
  3. For this tag, set Triggering -> All Pages. It must run on every page of the store.
  4. Save the tag. You do not have to publish the container yet; first add the order tag in the next step.

This first tag measures visits. Orders are sent by the second tag from step 3.

Step 3: Add the order tag

FastCentrik says its Google Tag Manager integration inserts both the container and a data layer, including e-commerce data for Google Analytics on the order confirmation page. Some admin versions therefore may not show a separate checkbox. Paste the Trackless conversion code below into the second GTM tag:

<script>
(function () {
    window.trackless = window.trackless || function () {
        (window.trackless.q = window.trackless.q || []).push(arguments);
    };
    var sent = false;
    function num(x) {
        x = String(x == null ? '' : x).replace(/[^\d,.\-]/g, '');
        if (x.indexOf(',') > -1) { x = x.replace(/\./g, '').replace(',', '.'); }
        return Number(x) || 0;
    }
    function first(obj, keys) {
        if (!obj) { return null; }
        for (var i = 0; i < keys.length; i++) {
            if (obj[keys[i]] != null && obj[keys[i]] !== '') { return obj[keys[i]]; }
        }
        return null;
    }
    function lineTotal(items) {
        if (!items || !items.length) { return null; }
        var sum = 0;
        var found = false;
        for (var i = 0; i < items.length; i++) {
            var item = items[i] || {};
            var total = first(item, ['total', 'item_total', 'line_total', 'item_revenue', 'revenue', 'value']);
            if (total != null) {
                sum += num(total);
                found = true;
                continue;
            }
            var price = first(item, ['price', 'item_price', 'unitPrice', 'unit_price']);
            if (price == null) { continue; }
            var qty = first(item, ['quantity', 'qty', 'item_quantity']);
            qty = qty == null ? 1 : num(qty);
            if (!qty) { continue; }
            sum += num(price) * qty;
            found = true;
        }
        return found ? sum : null;
    }
    function order(entry) {
        if (!entry) { return null; }
        var isFastCentrikPurchase = entry.event === 'trackPurchase' || entry.transactionId != null;
        if (isFastCentrikPurchase && entry.transactionId != null && entry.transactionId !== '') {
            return {
                id: entry.transactionId,
                value: entry.transactionTotal,
                currency: entry.transactionCurrency || 'CZK',
                products: lineTotal(entry.transactionProducts),
                shipping: first(entry, ['transactionShipping', 'transactionShippingTotal', 'shipping'])
            };
        }
        if (entry.event === 'purchase' && entry.ecommerce && entry.ecommerce.transaction_id != null) {
            return {
                id: entry.ecommerce.transaction_id,
                value: entry.ecommerce.value,
                currency: entry.ecommerce.currency || 'CZK',
                products: lineTotal(entry.ecommerce.items || entry.items),
                shipping: first(entry.ecommerce, ['shipping', 'shipping_tax_excl', 'shipping_tax_incl'])
            };
        }
        if (entry[1] === 'purchase' && entry[2] && entry[2].transaction_id != null) {
            return {
                id: entry[2].transaction_id,
                value: entry[2].value,
                currency: entry[2].currency || 'CZK',
                products: lineTotal(entry[2].items),
                shipping: first(entry[2], ['shipping', 'shipping_tax_excl', 'shipping_tax_incl'])
            };
        }
        return null;
    }
    function handle(entry) {
        try {
            if (sent) { return; }
            var o = order(entry);
            if (!o || o.id == null || o.id === '') { return; }
            sent = true;
            var props = { type: 'order', id: String(o.id), value: num(o.value), currency: String(o.currency || 'CZK'), page_type: 'order' };
            if (o.products != null) {
                props.products_tax_excl = num(o.products);
                props.products_tax_incl = num(o.products);
            }
            if (o.shipping != null && o.shipping !== '') {
                props.shipping_tax_excl = num(o.shipping);
                props.shipping_tax_incl = num(o.shipping);
            }
            window.trackless('event', props);
        } catch (e) { /* nikdy neshodit dekovaci stranku */ }
    }
    function scan() {
        var dl = window.dataLayer || [];
        for (var i = 0; i < dl.length; i++) { handle(dl[i]); }
    }
    try {
        var dl = window.dataLayer = window.dataLayer || [];
        scan();
        var origPush = dl.push;
        dl.push = function () {
            for (var i = 0; i < arguments.length; i++) { handle(arguments[i]); }
            return origPush.apply(this, arguments);
        };
        if (document.readyState !== 'loading') { scan(); }
        else { document.addEventListener('DOMContentLoaded', scan); }
        window.addEventListener('load', scan);
    } catch (e) { /* nikdy neshodit dekovaci stranku */ }
})();
</script>

The code reads the order number and value from the FastCentrik data layer (transactionId / transactionTotal, or from the newer Google Analytics 4 purchase event). When transactionProducts or ecommerce.items is available, it sends product revenue separately so shipping and payment fees are not counted as product revenue. If the item list is not present in the data layer, Trackless falls back to the total order value like other simple client-side integrations.

Create the order tag in GTM

  1. Click Tags -> New -> Tag Configuration -> Custom HTML again, paste the conversion code from this step and name the tag for example Trackless - order.
  2. For the order tag, create a trigger Page View -> Some Page Views with the rule Page URL contains objednavka-dokoncena.
  3. Do not run the order tag on All Pages. It should fire only on the thank-you page after an order is completed.
  4. Save the tag. If you use Consent Mode or custom consent rules in GTM, configure both Trackless tags according to the legal assessment of the whole site.

After this step, GTM contains two tags: Trackless - traffic on all pages and Trackless - order only on the thank-you page.

Step 4: Check that measurement is running

In GTM, click Preview, open the store through preview mode and test both a regular page and a test order. If the tags fire correctly, publish the container through Submit / Publish.

  • GTM Preview: the base Trackless tag is in Tags Fired on all pages and the conversion tag only on /objednavka-dokoncena.
  • Console: the https://c.trackless.cz/t.js script must have a non-empty data-token. Use this check:
  • Network: filtering for trackless should show not only t.js being downloaded, but also another request to the Trackless endpoint. Downloading the script alone does not yet prove that measurement was sent.
  • DataLayer: on the thank-you page, check that window.dataLayer contains transactionId / transactionTotal and ideally also transactionProducts, or a purchase event with an ecommerce object and items.
[...document.scripts]
  .filter(s => s.src.includes('c.trackless.cz/t.js'))
  .map(s => ({
    src: s.src,
    token: s.getAttribute('data-token'),
    outerHTML: s.outerHTML
  }))

We have verified a real FastCentrik deployment: after the base tag was inserted dynamically through GTM, visits and an order arrived in Trackless. If the console check returns null for the token, the base tag is inserted incorrectly in GTM - use the dynamic code from step 1. If the token is present but Network shows no additional request or nothing appears in the Trackless app, check browser blocking, the shape of dataLayer, the conversion tag trigger, or whether the site/token selected in Trackless is correct.

What you'll measure

  • The tracking code runs in the browser, so under aggressive blocking of measurement scripts, some visits may be missed. In normal setups Trackless is not usually blocked; trends and source ratios remain meaningful.
  • Sources and channels: UTM parameters, referrers and Google Analytics 4-style channels - including visits from AI assistants.
  • Devices, browsers and operating systems.
  • Visitors' countries and languages.
  • Completed orders as conversions, including value, currency, order number and product revenue without shipping and payment fees when FastCentrik provides it separately in the data layer.

Limits, so you know what you're getting into

  • The tracking code runs in the browser, so under aggressive blocking of measurement scripts, some visits may be missed. In normal setups Trackless is not usually blocked; trends and source ratios remain meaningful.
  • The GTM variant can only read what FastCentrik places into the data layer on the thank-you page. When an item list is available, Trackless separates product revenue from shipping and payment fees; when it is not available, the total order value is used, similar to MioWeb. VAT breakdown, margins, refunds and full line items in Trackless require a server-side or API integration, not just the GTM snippet.
  • Also running a store on an open platform (PrestaShop, WooCommerce, Joomla / VirtueMart, OpenCart, Magento 2, Shopware 6 or Sylius)? Use our server-side modules there - they measure directly on the server, they do not depend on a browser snippet running, and depending on the platform can also handle orders, line items and margins.

Frequently asked questions

Do I need visitor consent or a cookie banner for Trackless?

There is no one-size-fits-all answer. Trackless stores no own measurement identifier or analytics cookies in the browser, but this connection runs a browser snippet or pixel. Assess the legal basis, cookie banner and whether the snippet should be gated by consent against the full site setup and the other tools you run.

Will the tracking code slow my store down?

No. The script is small and loads asynchronously (the async attribute), so it doesn't hold up page rendering. And if it fails to load, the store keeps working as if it weren't there.

Can I use Trackless together with Google Analytics 4?

Yes. Both can run side by side without affecting each other - Trackless even reads the same data layer FastCentrik prepares for Google. Expect different numbers: Trackless is less dependent on its own analytics cookies than client-side analytics, so it may record some visits that GA4 counts only partially or as modelled data when analytics cookies are rejected.

How much does Trackless cost?

The first 30 days are free. After that you pay by your store's order volume - see the pricing for exact figures.

Your site says "without JavaScript" - and this is JavaScript. How does that add up?

Our server-side modules and plugins for open platforms (PrestaShop, WordPress/WooCommerce, Joomla / VirtueMart, OpenCart, Magento 2, Shopware 6 and Sylius) measure directly on the store server without our own measurement JavaScript. On this platform the available route is a browser snippet or pixel. It sends the page URL, referrer, language and events to the Trackless endpoint; it stores no own cookies or measurement identifier. Visitor identity is computed on the server from the request. This limits own identifiers in the browser, but the legal assessment and any consent gating depend on the deployment.

Try it on your own store

Signing up takes a minute, pasting the code five more. The first 30 days cost nothing.

Try 30 days free See the live demo

← Back to the home page