diff --git a/vendor/magento/module-reports/Controller/Report/Product/View.php b/vendor/magento/module-reports/Controller/Report/Product/View.php
new file mode 100644
index 0000000000000..6c656793e6eab
--- /dev/null
+++ b/vendor/magento/module-reports/Controller/Report/Product/View.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Copyright 2025 Adobe
+ * All Rights Reserved.
+ */
+declare(strict_types=1);
+
+namespace Magento\Reports\Controller\Report\Product;
+
+use Magento\Framework\App\Action\Context;
+use Magento\Customer\Model\Session;
+use Magento\Customer\Model\Visitor;
+use Magento\Framework\App\Action\HttpPostActionInterface;
+use Magento\Framework\App\RequestInterface;
+use Magento\Framework\Controller\Result\JsonFactory;
+use Magento\Reports\Model\Event;
+use Magento\Reports\Model\Product\Index\ViewedFactory;
+use Magento\Reports\Model\ReportStatus;
+use Magento\Reports\Observer\EventSaver;
+use Magento\Store\Model\StoreManagerInterface;
+
+/**
+ * Report Action
+ */
+class View implements HttpPostActionInterface
+{
+    /**
+     * @var RequestInterface
+     */
+    private $request;
+
+    /**
+     * @param Context $context
+     * @param JsonFactory $resultJsonFactory
+     * @param ReportStatus $reportStatus
+     * @param StoreManagerInterface $storeManager
+     * @param Session $customerSession
+     * @param Visitor $customerVisitor
+     * @param ViewedFactory $productIndexFactory
+     * @param EventSaver $eventSaver
+     */
+    public function __construct(
+        private readonly Context $context,
+        private readonly JsonFactory $resultJsonFactory,
+        private readonly ReportStatus $reportStatus,
+        private readonly StoreManagerInterface $storeManager,
+        private readonly Session $customerSession,
+        private readonly Visitor $customerVisitor,
+        private readonly ViewedFactory $productIndexFactory,
+        private readonly EventSaver $eventSaver
+    ) {
+        $this->request = $context->getRequest();
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function execute()
+    {
+        $result = $this->resultJsonFactory->create();
+
+        if ($this->reportStatus->isReportEnabled((string)Event::EVENT_PRODUCT_VIEW)) {
+            $productId = $this->request->getParam('product_id');
+
+            $viewData['product_id'] = $productId;
+            $viewData['store_id']   = $this->storeManager->getStore()->getId();
+            if ($this->customerSession->isLoggedIn()) {
+                $viewData['customer_id'] = $this->customerSession->getCustomerId();
+            } else {
+                $viewData['visitor_id'] = $this->customerVisitor->getId();
+            }
+            $this->productIndexFactory->create()->setData($viewData)->save()->calculate();
+            $this->eventSaver->save(Event::EVENT_PRODUCT_VIEW, $productId);
+        }
+
+        return $result->setData([]);
+    }
+}
diff --git a/vendor/magento/module-reports/Observer/CatalogProductViewObserver.php b/vendor/magento/module-reports/Observer/CatalogProductViewObserver.php
index b3ec141ef01a7..e9f952279ad99 100644
--- a/vendor/magento/module-reports/Observer/CatalogProductViewObserver.php
+++ b/vendor/magento/module-reports/Observer/CatalogProductViewObserver.php
@@ -1,7 +1,7 @@
 <?php
 /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
+ * Copyright 2015 Adobe
+ * All Rights Reserved.
  */
 namespace Magento\Reports\Observer;
 
@@ -11,6 +11,10 @@
 /**
  * Reports Event observer model
  * @SuppressWarnings(PHPMD.CookieAndSessionMisuse)
+ * @deprecated We cannot rely on the observer to count product page visits (GET requests)
+ * because the observer will not be called due fact that pages rely heavily on cache.
+ * Instead, a call from a product page should be made to a separate controller.
+ * @see \Magento\Reports\Controller\Report\Product\View
  */
 class CatalogProductViewObserver implements ObserverInterface
 {
diff --git a/vendor/magento/module-reports/etc/frontend/events.xml b/vendor/magento/module-reports/etc/frontend/events.xml
index aa0312640d2b7..fdbb170257588 100644
--- a/vendor/magento/module-reports/etc/frontend/events.xml
+++ b/vendor/magento/module-reports/etc/frontend/events.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0"?>
 <!--
 /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
+ * Copyright 2013 Adobe
+ * All Rights Reserved.
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
@@ -15,9 +15,6 @@
     <event name="customer_logout">
         <observer name="reports" instance="Magento\Reports\Observer\CustomerLogoutObserver" />
     </event>
-    <event name="catalog_controller_product_view">
-        <observer name="reports" instance="Magento\Reports\Observer\CatalogProductViewObserver" />
-    </event>
     <event name="sendfriend_product">
         <observer name="reports" instance="Magento\Reports\Observer\SendfriendProductObserver" />
     </event>
diff --git a/vendor/magento/module-reports/etc/frontend/routes.xml b/vendor/magento/module-reports/etc/frontend/routes.xml
new file mode 100644
index 0000000000000..5b43b70eca733
--- /dev/null
+++ b/vendor/magento/module-reports/etc/frontend/routes.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright 2025 Adobe
+ * All Rights Reserved.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
+    <router id="standard">
+        <route id="reports" frontName="reports">
+            <module name="Magento_Reports" />
+        </route>
+    </router>
+</config>
diff --git a/vendor/magento/module-reports/view/frontend/layout/catalog_product_view.xml b/vendor/magento/module-reports/view/frontend/layout/catalog_product_view.xml
new file mode 100644
index 0000000000000..7d83005828125
--- /dev/null
+++ b/vendor/magento/module-reports/view/frontend/layout/catalog_product_view.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright 2025 Adobe
+ * All Rights Reserved.
+ */
+-->
+
+<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
+    <body>
+        <referenceContainer name="product.info.main">
+            <block name="report.product.view.container" template="Magento_Theme::template.phtml" ifconfig="reports/options/enabled" after="-">
+                <block class="Magento\Catalog\Block\Product\View" name="report.product.view" template="Magento_Reports::product/report_viewed_product.phtml" ifconfig="reports/options/product_view_enabled"/>
+            </block>
+        </referenceContainer>
+    </body>
+</page>
diff --git a/vendor/magento/module-reports/view/frontend/templates/product/report_viewed_product.phtml b/vendor/magento/module-reports/view/frontend/templates/product/report_viewed_product.phtml
new file mode 100644
index 0000000000000..ff455e686ab45
--- /dev/null
+++ b/vendor/magento/module-reports/view/frontend/templates/product/report_viewed_product.phtml
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Copyright 2025 Adobe
+ * All Rights Reserved.
+ */
+
+/** @var \Magento\Reports\Block\Product\ViewedProduct $block */
+/** @var \Magento\Framework\Escaper $escaper */
+/** @var \Magento\Framework\View\Helper\SecureHtmlRenderer $secureRenderer */
+?>
+<script type="text/x-magento-init">
+    {
+        "*": {
+            "Magento_Reports/js/product-viewed": {
+                "product_id": "<?= $escaper->escapeJs($block->getProduct()->getId()) ?>"
+            }
+        }
+    }
+</script>
diff --git a/vendor/magento/module-reports/view/frontend/web/js/product-viewed.js b/vendor/magento/module-reports/view/frontend/web/js/product-viewed.js
new file mode 100644
index 0000000000000..c3bac05fc4211
--- /dev/null
+++ b/vendor/magento/module-reports/view/frontend/web/js/product-viewed.js
@@ -0,0 +1,20 @@
+/**
+ * Copyright 2025 Adobe
+ * All Rights Reserved.
+ */
+
+define([
+    'jquery',
+    'mage/url'
+], function ($, urlBuilder) {
+    'use strict';
+
+    return function (data) {
+        $.ajax({
+            url: urlBuilder.build('reports/report_product/view'),
+            type: 'POST',
+            data: {'product_id': data.product_id },
+            dataType: 'json'
+        });
+    };
+});
