Skip to main content
Version: 2023.3

Tracking Manager

The Tracking Manager enables e-commerce transaction tracking for e-commerce websites built with the framework. Due to different tracker implementations, it supports different tracking services.

Current implementations of trackers are

  • Google Tag Manager (GTM): \\Pimcore\Bundle\EcommerceFrameworkBundle\Tracking\Tracker\GoogleTagManager
  • Google Analytics Classic: \Pimcore\Bundle\EcommerceFrameworkBundle\Tracking\Tracker\Analytics\Ecommerce
  • Google Analytics Universal: \Pimcore\Bundle\EcommerceFrameworkBundle\Tracking\Tracker\Analytics\UniversalEcommerce
  • Google Analytics Enhanced E-Commerce: \Pimcore\Bundle\EcommerceFrameworkBundle\Tracking\Tracker\Analytics\EnhancedEcommerce

Supported Tracking Actions

The Tracking Manager supports several tracking actions that can be used. These tracking actions are delegated to the trackers.

  • Product Impression
    • Tracks product impression
    • $trackingManager->trackProductImpression($product)
  • Product View
    • Tracks product view (of detail page)
    • $trackingManager->trackProductView($product)
  • Category View
    • Tracks a category page view
    • $trackingManager->trackCategoryPageView($category)
  • Cart Product Action Add
    • Tracks action for adding product to cart
    • $trackingManager->trackCartProductActionAdd($cart, $product, $quantity)
  • Cart Product Action Remove
    • Tracks action for removing product from cart
    • $trackingManager->trackProductActionRemove($cart, $product, $quantity)
  • Cart Update
    • Tracks a generic cart update for trackers not supporting add/remove. This can be sent on every cart list or cart change.
    • $trackingManager->trackProductActionRemove($cart, $product, $quantity)
  • Checkout
    • Tracks start of checkout with first step
    • $trackingManager->trackCheckout($cart)
  • Checkout Step
    • Tracks checkout step
    • $trackingManager->trackCheckoutStep($step, $cart, $stepNumber, $checkoutOption)
  • Checkout Complete
    • Tracks checkout complete
    • $trackingManager->trackCheckoutComplete($order)

There are 2 deprecated actions which are still supported by should be replaced with their new counterparts:

  • Product Action Add (use trackCartProductActionAdd instead)
    • Tracks action for adding product to cart
    • $trackingManager->trackProductActionAdd($product, $quantity)
  • Product Action Remove (use trackCartProductActionRemove instead)
    • Tracks action for removing product from cart
    • $trackingManager->trackProductActionRemove($product, $quantity)

Be aware: Depending on the used tracking service some of these actions might not be available. If so, the tracking action is ignored for this tracker.


The configuration takes place in the pimcore_ecommerce_framework.tracking_manager config section. If no TrackingItemBuilder is configured, the TrackingItemBuilder will fall back to the default implementation \Pimcore\Bundle\EcommerceFrameworkBundle\Tracking\TrackingItemBuilder. Further information about TrackingItemBuilder see below.

# tracking manager - define which trackers (e.g. Google Analytics Universal Ecommerce) are active and should
# be called when you track something via TrackingManager
# service ID of tracking manager - the following is the default value and can be omitted
tracking_manager_id: Pimcore\Bundle\EcommerceFrameworkBundle\Tracking\TrackingManager

# enable the core enhanced_ecommerce tracker with default options
enabled: true

# use already defined enhanced ecommerce tracker
id: Pimcore\Bundle\EcommerceFrameworkBundle\Tracking\Tracker\Analytics\EnhancedEcommerce

# options vary by tracker implementation
template_prefix: App:Tracking/analytics/enhanced

# service id for item builder
item_builder_id: App\Ecommerce\Tracking\TrackingItemBuilder

# List of assortment and checkout tenants where this tracker should be activated for.

# Add list of assortment tenants where the tracker should be activated for. Empty array means activated for all tenants.
assortment: []

# Add list of checkout tenants where the tracker should be activated for. Empty array means activated for all tenants.
checkout: []

Tracking Manager With Tenants

The Tracking Manager supports tenants in a different way than the other framework modules. While with the other modules, the tenant configuration takes place on the highest level of configuration and each configuration is only valid for one tenant, the tenant configuration in the tracking manager takes place within the trackers them self. There a list of assortment and checkout tenants for which the tracker should be enabled can be provided (see configuration above).

If nothing is set or an empty array is provided, the tracker is active for all tenants.

Working with Tracking Manager

For utilizing the Tracking Manager, just call the corresponding methods of the TrackingManager in your controller. The framework does the rest (adding necessary code snippets to your view, etc.).

See the following examples

Product Impression


namespace App\Controller;

use Knp\Component\Pager\PaginatorInterface;
use Pimcore\Bundle\EcommerceFrameworkBundle\Tracking\TrackingManager;
use Pimcore\Controller\FrontendController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class ShopController extends FrontendController
public function listAction(Request $request, TrackingManager $trackingManager, PaginatorInterface $paginator): Response
// ...
$paginator = $paginator->paginate($products, $request->get('page', 1));

foreach ($paginator as $product) {

// ...



use Pimcore\Bundle\EcommerceFrameworkBundle\Tracking\TrackingManager;

class CheckoutController extends AbstractCartAware
public function startCheckoutAction(TrackingManager $trackingManager) {

Project Specific Data

Adding project specific data to tracking items by extending the TrackingItemBuilder class. The extending class has to be defined as service and configured on the tracker configuration (see above).

Example for Additional Data in Product Impressions

Define a custom item builder:


use Pimcore\Bundle\EcommerceFrameworkBundle\Model\ProductInterface;
use Pimcore\Bundle\EcommerceFrameworkBundle\Tracking\ProductImpressionInterface;

class TrackingItemBuilder extends \Pimcore\Bundle\EcommerceFrameworkBundle\Tracking\TrackingItemBuilder
private static int $impressionPosition = 0;

public function buildProductImpressionItem(ProductInterface $product): ProductImpression
$item = parent::buildProductImpressionItem($product);




return $item;

And define it as service:

App\Ecommerce\Tracking\TrackingItemBuilder: ~

Google Documentation Enhanced E-Commerce