Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enhanced Google Analytics 4 Integration and Ecommerce Tracking Improvements #3305

Merged
merged 21 commits into from
Jun 14, 2023
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
192 changes: 117 additions & 75 deletions app/code/core/Mage/GoogleAnalytics/Block/Ga.php
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,49 @@ protected function _getPageTrackingCode($accountId)
{
/** @var Mage_GoogleAnalytics_Helper_Data $helper */
$helper = $this->helper('googleanalytics');
if ($helper->isUseUniversalAnalytics()) {
if ($helper->isUseAnalytics4()) {
return $this->_getPageTrackingCodeAnalytics4($accountId);
} elseif ($helper->isUseUniversalAnalytics()) {
return $this->_getPageTrackingCodeUniversal($accountId);
} else {
return $this->_getPageTrackingCodeAnalytics($accountId);
}
}

/**
* Render regular page tracking javascript code
*
* @param string $accountId
* @return string
*/
protected function _getPageTrackingCodeAnalytics4($accountId)
{
$trackingCode = "
gtag('js', new Date());
";
fballiano marked this conversation as resolved.
Show resolved Hide resolved
if (!$this->helper('googleanalytics')->isDebugModeEnabled()) {
$trackingCode .= "
gtag('config', '{$this->jsQuoteEscape($accountId)}');
";
} else {
$trackingCode .= "
gtag('config', '{$this->jsQuoteEscape($accountId)}', {'debug_mode':true});
";
}

//add user_id
if ($this->helper('googleanalytics')->isUserIdEnabled() && Mage::getSingleton('customer/session')->isLoggedIn()) {
$customer = Mage::getSingleton('customer/session')->getCustomer();
$trackingCode.= "
gtag('set', 'user_id', '{$customer->getId()}');
";
fballiano marked this conversation as resolved.
Show resolved Hide resolved
}

if ($this->helper('googleanalytics')->isDebugModeEnabled()) {
Mage::log($trackingCode, Zend_Log::DEBUG, 'googleanalytics4.log', true);
}

return $this->_getPageTrackingCodeAnalytics($accountId);
return $trackingCode;
}

/**
Expand Down Expand Up @@ -202,51 +240,21 @@ protected function _getOrdersTrackingCodeAnalytics4()
$moduleName = $request->getModuleName();
$controllerName = $request->getControllerName();

//purchase events
$orderIds = $this->getOrderIds();
if (!empty($orderIds) && is_array($orderIds)) {
$collection = Mage::getResourceModel('sales/order_collection')
->addFieldToFilter('entity_id', ['in' => $orderIds]);
/** @var Mage_Sales_Model_Order $order */
foreach ($collection as $order) {
$orderData = [
'currency' => $order->getBaseCurrencyCode(),
'transaction_id' => $order->getIncrementId(),
'value' => number_format($order->getBaseGrandTotal(), 2),
'coupon' => strtoupper($order->getCouponCode()),
'shipping' => number_format($order->getBaseShippingAmount(), 2),
'tax' => number_format($order->getBaseTaxAmount(), 2),
'items' => []
];

/** @var Mage_Sales_Model_Order_Item $item */
foreach ($order->getAllVisibleItems() as $item) {
$orderData['items'][] = [
'item_id' => $item->getSku(),
'item_name' => $item->getName(),
'quantity' => $item->getQtyOrdered(),
'price' => $item->getBasePrice(),
'discount' => $item->getBaseDiscountAmount()
];
}
$result[] = "gtag('event', 'purchase', " . json_encode($orderData, JSON_THROW_ON_ERROR) . ");";
}
}

//Begin advanced eCommerce events
//product page
if ($moduleName == 'catalog' && $controllerName == 'product') {
$productViewed = Mage::registry('current_product');
$category = Mage::registry('current_category') ? Mage::registry('current_category')->getName() : false;
$eventData = [];
$eventData['currency'] = Mage::app()->getStore()->getCurrentCurrencyCode();
$eventData['value'] = number_format($productViewed->getFinalPrice(), 2);
$eventData['items'] = [];
$eventData['items'][] = [
'id' => $productViewed->getSku(),
'name' => $productViewed->getName(),
'item_id' => $productViewed->getSku(),
'item_name' => $productViewed->getName(),
'list_name' => 'Product Detail Page',
'brand' => $productViewed->getAttributeText('manufacturer'),
'category' => 'Products',
'item_brand' => $productViewed->getAttributeText('manufacturer'),
'item_category' => $category,
'price' => number_format($productViewed->getFinalPrice(), 2),
];

Expand All @@ -258,6 +266,8 @@ protected function _getOrdersTrackingCodeAnalytics4()
$layer = Mage::getSingleton('catalog/layer');
$category = $layer->getCurrentCategory();
$productCollection = clone $layer->getProductCollection();
$productCollection->addAttributeToSelect('sku');

$toolbarBlock = Mage::app()->getLayout()->getBlock('product_list_toolbar');
$pageSize = $toolbarBlock->getLimit();
$currentPage = $toolbarBlock->getCurrentPage();
Expand All @@ -271,15 +281,17 @@ protected function _getOrdersTrackingCodeAnalytics4()
$eventData['item_list_name'] = $category->getName();
$eventData['items'] = [];

foreach ($productCollection as $productViewed) {
$index = 1;
foreach ($productCollection as $key => $productViewed) {
$eventData['items'][] = [
'id' => $productViewed->getSku(),
'name' => $productViewed->getName(),
'list_name' => 'Product Detail Page',
'brand' => $productViewed->getAttributeText('manufacturer'),
'category' => 'Products',
'item_id' => $productViewed->getSku(),
'index' => $index,
'item_name' => $productViewed->getName(),
'item_brand' => $productViewed->getAttributeText('manufacturer'),
'item_category' => $productViewed->getCategory()->getName(),
'price' => number_format($productViewed->getFinalPrice(), 2),
];
$index++;
$eventData['value'] += $productViewed->getFinalPrice();
}
$eventData['value'] = number_format($eventData['value'], 2);
Expand All @@ -296,11 +308,9 @@ protected function _getOrdersTrackingCodeAnalytics4()
$eventData['value'] = number_format($_removedProduct->getFinalPrice(), 2);
$eventData['items'] = [];
$eventData['items'][] = [
'id' => $_removedProduct->getSku(),
'name' => $_removedProduct->getName(),
'list_name' => 'Product Detail Page',
'brand' => $_removedProduct->getAttributeText('manufacturer'),
'category' => 'Products',
'item_id' => $_removedProduct->getSku(),
'item_name' => $_removedProduct->getName(),
'item_brand' => $_removedProduct->getAttributeText('manufacturer'),
'price' => number_format($_removedProduct->getFinalPrice(), 2),
];
$result[] = "gtag('event', 'remove_from_cart', " . json_encode($eventData, JSON_THROW_ON_ERROR) . ");";
Expand All @@ -315,11 +325,9 @@ protected function _getOrdersTrackingCodeAnalytics4()
$eventData['value'] = number_format($_addedProduct->getFinalPrice(), 2);
$eventData['items'] = [];
$eventData['items'][] = [
'id' => $_addedProduct->getSku(),
'name' => $_addedProduct->getName(),
'list_name' => 'Product Detail Page',
'brand' => $_addedProduct->getAttributeText('manufacturer'),
'category' => 'Products',
'item_id' => $_addedProduct->getSku(),
'item_name' => $_addedProduct->getName(),
'item_brand' => $_addedProduct->getAttributeText('manufacturer'),
'price' => number_format($_addedProduct->getFinalPrice(), 2),
];
$result[] = "gtag('event', 'add_to_cart', " . json_encode($eventData, JSON_THROW_ON_ERROR) . ");";
Expand All @@ -333,15 +341,14 @@ protected function _getOrdersTrackingCodeAnalytics4()
$eventData['items'] = [];

foreach ($productCollection as $productInCart) {
$_product = Mage::getModel('catalog/product')->load($productInCart->getProductId());
$eventData['items'][] = [
'id' => $productInCart->getSku(),
'name' => $productInCart->getName(),
'list_name' => 'Product Detail Page',
'brand' => $productInCart->getAttributeText('manufacturer'),
'category' => 'Products',
'price' => number_format($productInCart->getFinalPrice(), 2),
'item_id' => $_product->getSku(),
'item_name' => $_product->getName(),
'item_brand' => $_product->getAttributeText('manufacturer'),
'price' => number_format($_product->getFinalPrice(), 2),
];
$eventData['value'] += $productInCart->getFinalPrice();
$eventData['value'] += $_product->getFinalPrice();
}
$eventData['value'] = number_format($eventData['value'], 2);
$result[] = "gtag('event', 'view_cart', " . json_encode($eventData, JSON_THROW_ON_ERROR) . ");";
Expand All @@ -350,24 +357,59 @@ protected function _getOrdersTrackingCodeAnalytics4()
//begin checkout
elseif ($moduleName == 'checkout' && $controllerName == 'onepage') {
$productCollection = Mage::getSingleton('checkout/session')->getQuote()->getAllVisibleItems();
$eventData = [];
$eventData['currency'] = Mage::app()->getStore()->getCurrentCurrencyCode();
$eventData['value'] = 0.00;
$eventData['items'] = [];
if ($productCollection) {
$eventData = [];
$eventData['currency'] = Mage::app()->getStore()->getCurrentCurrencyCode();
$eventData['value'] = 0.00;
$eventData['items'] = [];
foreach ($productCollection as $productInCart) {
$_product = Mage::getModel('catalog/product')->load($productInCart->getProductId());
$eventData['items'][] = [
'item_id' => $_product->getSku(),
'item_name' => $_product->getName(),
'item_brand' => $_product->getAttributeText('manufacturer'),
'price' => number_format($_product->getFinalPrice(), 2),
];
$eventData['value'] += $_product->getFinalPrice();
}
$eventData['value'] = number_format($eventData['value'], 2);
$result[] = "gtag('event', 'begin_checkout', " . json_encode($eventData, JSON_THROW_ON_ERROR) . ");";
}
}

foreach ($productCollection as $productInCart) {
$eventData['items'][] = [
'id' => $productInCart->getSku(),
'name' => $productInCart->getName(),
'list_name' => 'Product Detail Page',
'brand' => $productInCart->getAttributeText('manufacturer'),
'category' => 'Products',
'price' => number_format($productInCart->getFinalPrice(), 2),
//purchase events
$orderIds = $this->getOrderIds();
if (!empty($orderIds) && is_array($orderIds)) {
$collection = Mage::getResourceModel('sales/order_collection')
->addFieldToFilter('entity_id', ['in' => $orderIds]);
/** @var Mage_Sales_Model_Order $order */
foreach ($collection as $order) {
$orderData = [
'currency' => $order->getBaseCurrencyCode(),
'transaction_id' => $order->getIncrementId(),
'value' => number_format($order->getBaseGrandTotal(), 2),
'coupon' => strtoupper($order->getCouponCode()),
'shipping' => number_format($order->getBaseShippingAmount(), 2),
'tax' => number_format($order->getBaseTaxAmount(), 2),
'items' => []
];
$eventData['value'] += $productInCart->getFinalPrice();

/** @var Mage_Sales_Model_Order_Item $item */
foreach ($order->getAllVisibleItems() as $item) {
$orderData['items'][] = [
'item_id' => $item->getSku(),
'item_name' => $item->getName(),
'quantity' => $item->getQtyOrdered(),
'price' => $item->getBasePrice(),
'discount' => $item->getBaseDiscountAmount()
];
}
$result[] = "gtag('event', 'purchase', " . json_encode($orderData, JSON_THROW_ON_ERROR) . ");";
}
$eventData['value'] = number_format($eventData['value'], 2);
$result[] = "gtag('event', 'begin_checkout', " . json_encode($eventData, JSON_THROW_ON_ERROR) . ");";
}

if ($this->helper('googleanalytics')->isDebugModeEnabled() && count($result) > 0) {
Mage::log($result, Zend_Log::DEBUG, 'googleanalytics4.log', true);
}
return implode("\n", $result);
}
Expand Down
24 changes: 24 additions & 0 deletions app/code/core/Mage/GoogleAnalytics/Helper/Data.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ class Mage_GoogleAnalytics_Helper_Data extends Mage_Core_Helper_Abstract
public const XML_PATH_TYPE = 'google/analytics/type';
public const XML_PATH_ACCOUNT = 'google/analytics/account';
public const XML_PATH_ANONYMIZATION = 'google/analytics/anonymization';
public const XML_PATH_DEBUG = 'google/analytics/debug';
public const XML_PATH_USERID = 'google/analytics/user_id';

/**
* @var string google analytics 4
Expand Down Expand Up @@ -104,4 +106,26 @@ public function isUseAnalytics4($store = null)
{
return Mage::getStoreConfig(self::XML_PATH_TYPE, $store) == self::TYPE_ANALYTICS4;
}

/**
* Whether GA Debug Mode is enabled (only for development ip)
fballiano marked this conversation as resolved.
Show resolved Hide resolved
*
* @param null $store
* @return bool
*/
public function isDebugModeEnabled($store = null)
{
return Mage::getStoreConfigFlag(self::XML_PATH_DEBUG, $store) && Mage::helper('core')->isDevAllowed();
}

/**
* Whether GA IP Anonymization is enabled
*
* @param null $store
* @return bool
*/
public function isUserIdEnabled($store = null)
{
return Mage::getStoreConfigFlag(self::XML_PATH_USERID, $store);
}
}
29 changes: 29 additions & 0 deletions app/code/core/Mage/GoogleAnalytics/etc/system.xml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,32 @@
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
</account>
<user_id translate="label">
empiricompany marked this conversation as resolved.
Show resolved Hide resolved
<label>User_id tracking</label>
empiricompany marked this conversation as resolved.
Show resolved Hide resolved
<frontend_type>select</frontend_type>
<source_model>adminhtml/system_config_source_yesno</source_model>
<sort_order>21</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
<comment>Enable GA4 User_id tracking for logged in customers.</comment>
<depends>
<type>analytics4</type>
</depends>
</user_id>
<debug translate="label">
empiricompany marked this conversation as resolved.
Show resolved Hide resolved
empiricompany marked this conversation as resolved.
Show resolved Hide resolved
<label>Debug</label>
<frontend_type>select</frontend_type>
<source_model>adminhtml/system_config_source_yesno</source_model>
<sort_order>22</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
<comment>Enable GA4 Debug Real Time view for Development IP.</comment>
<depends>
<type>analytics4</type>
</depends>
</debug>
<anonymization translate="label">
<label>Enable IP anonymization</label>
<frontend_type>select</frontend_type>
Expand All @@ -65,6 +91,9 @@
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
<depends>
<type>universal</type>
</depends>
</anonymization>
</fields>
</analytics>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,7 @@ $_accountId = $_helper->getAccountId();
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '<?= $_accountId ?>');
<?php echo $this->_getPageTrackingCode($_accountId) ?>
<?php echo $this->_getOrdersTrackingCodeAnalytics4() ?>
</script>
<!-- END GOOGLE ANALYTICS 4 CODE -->
Expand Down
Loading