Abandoned Cart Tracking Showing Zero

Hello Matomo Community,

I have multiple e-commerce sites built on Joomla with VirtueMart, and I am using Matomo’s e-commerce tracking. All aspects of the e-commerce tracking are working well, including orders and cart updates. However, I am consistently seeing a count of zero for abandoned carts across all sites.

Here’s what I’ve done so far:

  • Implemented trackEcommerceCartUpdate for tracking cart updates.
  • Used trackEcommerceOrder to track completed purchases.
  • Confirmed that all tracking functions are firing correctly on respective pages.

Despite these steps, abandoned carts are not appearing in my reports. Could there be something specific within Joomla or VirtueMart that may require an additional setup or configuration? Or might I be missing an essential setting in Matomo?

I’m attaching the tracking code I’m using for your reference:

[Insert your tracking code here]

Any insights into possible causes or troubleshooting steps for this issue would be highly appreciated.

My code is:

<!-- Měřicí kód Matomo -->
<script>
  var _paq = window._paq = window._paq || [];
  var cartUpdated = false;
  var cartContents = [];
  var cartTotalValue = 0;
  var purchaseCompleted = false;

  // Nastavení domény pro cookies
  _paq.push(["setCookieDomain", "*.lukysipy.cz"]);
  _paq.push(['enableHeartBeatTimer', 15]);

  // Sledování přidání a odebrání položek do košíku
  // Pro každou položku košíku by měl být vygenerován push addEcommerceItem, a to i produkty, které nebyly aktualizovány aktuálním kliknutím „Přidat do košíku.
  _paq.push(['addEcommerceItem',
    "{{ product_sku }}", // (Povinné) productSKU
    "{{ product_name }}", // (Volitelné) productName
    "{{ category_name }}", // (Volitelné) productCategory
    {{ product_final_price }}, // (Doporučená) cena
    {{ product_quantity }} // (Volitelné, výchozí 1) množství
  ]);

  // Předejte celkovou hodnotu košíku jako číselný parametr
  _paq.push(['trackEcommerceCartUpdate', {{ order_subtotal }}]); 

  // Sledování kliknutí na důležitá tlačítka
  document.addEventListener('DOMContentLoaded', function() {
    var checkoutButton = document.querySelector('.checkout-button');
    if (checkoutButton) {
      checkoutButton.addEventListener('click', function() {
        _paq.push(['trackEvent', 'Button', 'Click', 'Checkout']);
      });
    }

    var continueShoppingButton = document.querySelector('.continue-shopping-button');
    if (continueShoppingButton) {
      continueShoppingButton.addEventListener('click', function() {
        _paq.push(['trackEvent', 'Button', 'Click', 'Continue Shopping']);
      });
    }
  });

  // Sledování maximální dosažené hloubky posouvání na stránce
let maxScrollDepth = 0;
let hasScrolled = false;

window.addEventListener('scroll', function() {
  var currentDepth = (window.scrollY + window.innerHeight) / document.documentElement.scrollHeight * 100;
  hasScrolled = true; // Zaznamenává, že uživatel provedl rolování

  if (currentDepth > maxScrollDepth) {
    maxScrollDepth = currentDepth;
  }
});

// Odeslání maximální dosažené hloubky při opuštění stránky
window.addEventListener('beforeunload', function() {
  if (!hasScrolled) {
    // Zaznamenání 0 % pokud nedošlo k žádnému rolování
    _paq.push(['trackEvent', 'Scroll', 'Depth', '0%']);
  } else {
    if (maxScrollDepth >= 90) {
      _paq.push(['trackEvent', 'Scroll', 'Depth', '90%']);
    } else if (maxScrollDepth >= 75) {
      _paq.push(['trackEvent', 'Scroll', 'Depth', '75%']);
    } else if (maxScrollDepth >= 50) {
      _paq.push(['trackEvent', 'Scroll', 'Depth', '50%']);
    } else if (maxScrollDepth >= 25) {
      _paq.push(['trackEvent', 'Scroll', 'Depth', '25%']);
    } else if (maxScrollDepth > 0) {
      _paq.push(['trackEvent', 'Scroll', 'Depth', '10%']);
    }
  }
});

  // Kontrola, zda byl košík opuštěn
  window.addEventListener('beforeunload', function() {
    if (cartUpdated && !purchaseCompleted) {
      _paq.push(['setCustomDimension', 3, 'Abandoned']);
      cartContents.forEach(function(item) {
        _paq.push(['trackEvent', 'Cart', 'Abandoned Item', item.name, item.price * item.quantity]);
      });
      _paq.push(['trackEvent', 'Cart', 'Abandoned Total Value', 'Total', cartTotalValue]);
      console.log('Opuštěný košík: ', cartContents);
    }
  });

  // Inicializace času stráveného na stránce
  window.startTime = new Date().getTime();

  // Přidání sledování hloubky procházení stránek pomocí sessionStorage
  if (sessionStorage) {
    var pageCount = sessionStorage.getItem('pageCount') || 0;
    pageCount++;
    sessionStorage.setItem('pageCount', pageCount);
    _paq.push(['setCustomVariable', 1, 'Page Count', pageCount, 'visit']);
  }

  // Zaznamenání zobrazení stránky
  _paq.push(['trackPageView']);
  _paq.push(['enableLinkTracking']);

  // Konfigurace a inicializace sledovacího skriptu Matomo
  (function() {
    var u="//www.lukysipy.cz/matomo-52j5gg54kljhg/";
    _paq.push(['setTrackerUrl', u + 'matomo.php']);
    _paq.push(['setSiteId', '1']);
    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
    g.async=true; g.src=u + 'matomo.js'; s.parentNode.insertBefore(g,s);
  })();
</script>
<noscript>
  <p><img src="//www.lukysipy.cz/matomo-52j5gg54kljhg/matomo.php?idsite=1&rec=1" style="border:0;" alt="" /></p>
</noscript>
<!-- Konec měřicího kódu Matomo -->

Thank you in advance for your help!

Best regards, Martin