diff --git a/src/module-elasticsuite-tracker/Model/Healthcheck/TrackerInvalidEvents.php b/src/module-elasticsuite-tracker/Model/Healthcheck/TrackerInvalidEvents.php
new file mode 100644
index 000000000..be14967cf
--- /dev/null
+++ b/src/module-elasticsuite-tracker/Model/Healthcheck/TrackerInvalidEvents.php
@@ -0,0 +1,210 @@
+
+ * @copyright 2026 Smile
+ * @license Open Software License ("OSL") v. 3.0
+ */
+
+namespace Smile\ElasticsuiteTracker\Model\Healthcheck;
+
+use Magento\Framework\AuthorizationInterface;
+use Magento\Framework\Exception\LocalizedException;
+use Magento\Framework\Notification\MessageInterface;
+use Magento\Framework\UrlInterface;
+use Smile\ElasticsuiteCore\Api\Healthcheck\CheckInterface;
+use Smile\ElasticsuiteCore\Model\Healthcheck\AbstractCheck;
+use Smile\ElasticsuiteTracker\Api\EventQueueInterface;
+use Smile\ElasticsuiteTracker\Helper\Data as TrackerConfig;
+
+/**
+ * Elasticsuite invalid tracker events healthcheck.
+ *
+ * Checks if there are invalid tracker events in the tracker event queue.
+ * Invalid events usually indicate a misconfiguration or JavaScript issue
+ * in Elasticsuite tracker tags on the frontend.
+ *
+ * Severity is dynamically determined:
+ * - NOTICE : less than 10 000 invalid events
+ * - WARNING : 10 000 invalid events or more
+ *
+ * @category Smile
+ * @package Smile\ElasticsuiteTracker
+ */
+class TrackerInvalidEvents extends AbstractCheck
+{
+ /**
+ * Threshold above which the severity becomes WARNING.
+ */
+ private const WARNING_THRESHOLD = 10000;
+
+ /**
+ * Tracker events queue.
+ *
+ * @var EventQueueInterface
+ */
+ private EventQueueInterface $eventQueue;
+
+ /**
+ * Tracker configuration helper.
+ *
+ * @var TrackerConfig
+ */
+ private TrackerConfig $config;
+
+ /**
+ * Authorization service.
+ *
+ * @var AuthorizationInterface
+ */
+ private AuthorizationInterface $authorization;
+
+ /**
+ * Cached invalid events count.
+ *
+ * @var integer|null
+ */
+ private ?int $invalidEventsCount = null;
+
+ /**
+ * Constructor.
+ *
+ * @param EventQueueInterface $eventQueue Event queue.
+ * @param TrackerConfig $config Tracker config helper.
+ * @param AuthorizationInterface $authorization User authorization.
+ * @param UrlInterface $urlBuilder URL builder.
+ * @param int $sortOrder Sort order (default: 60).
+ * @param int $severity Severity level.
+ */
+ public function __construct(
+ EventQueueInterface $eventQueue,
+ TrackerConfig $config,
+ AuthorizationInterface $authorization,
+ UrlInterface $urlBuilder,
+ int $sortOrder = 60,
+ int $severity = MessageInterface::SEVERITY_NOTICE
+ ) {
+ parent::__construct($urlBuilder, $sortOrder, $severity);
+ $this->eventQueue = $eventQueue;
+ $this->config = $config;
+ $this->authorization = $authorization;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getIdentifier(): string
+ {
+ return 'tracker_invalid_events';
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getStatus(): string
+ {
+ return ($this->getNumberOfInvalidTrackerEvents() > 0) ? CheckInterface::STATUS_FAILED : CheckInterface::STATUS_PASSED;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * Severity is dynamically adjusted based on the number of invalid events.
+ */
+ public function getSeverity(): int
+ {
+ if ($this->getNumberOfInvalidTrackerEvents() >= self::WARNING_THRESHOLD) {
+ return MessageInterface::SEVERITY_MINOR;
+ }
+
+ return MessageInterface::SEVERITY_NOTICE;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getDescription(): string
+ {
+ $description = __('No invalid Elasticsuite tracker events were detected.');
+ $invalidEventsCount = $this->getNumberOfInvalidTrackerEvents();
+
+ if ($invalidEventsCount > 0) {
+ $messages = [];
+
+ $messages[] = __(
+ 'There are %1 invalid Elasticsuite tracker events in the tracker events queue table. ' .
+ 'This could indicate that something is wrong with the Elasticsuite tracker tags in the frontend.',
+ number_format($invalidEventsCount, 0, '.', '')
+ );
+
+ $messages[] = __(
+ 'Those invalid tracker events will not be indexed into your behavioral data indices ' .
+ 'and will automatically be deleted after %1 days.',
+ $this->config->getEventsQueueCleanupDelay()
+ );
+
+ if ($this->authorization->isAllowed('Magento_Backend::smile_elasticsuite_tracker')) {
+ $messages[] = __(
+ 'You can decide to remove all of them immediately from the ' .
+ 'Elasticsuite tracker settings in the ' .
+ '"Queue cleanup configuration" section.',
+ $this->getTrackerConfigUrl()
+ );
+ }
+
+ $description = implode('
', $messages);
+ }
+
+ return $description;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function isDisplayed(): bool
+ {
+ return true;
+ }
+
+ /**
+ * Return the number of invalid tracker events.
+ *
+ * The result is cached to avoid multiple database calls.
+ *
+ * @return int
+ */
+ private function getNumberOfInvalidTrackerEvents(): int
+ {
+ if (is_null($this->invalidEventsCount)) {
+ try {
+ $this->invalidEventsCount = $this->eventQueue->getInvalidEventsCount();
+ } catch (LocalizedException $e) {
+ $this->invalidEventsCount = 0;
+ }
+ }
+
+ return $this->invalidEventsCount;
+ }
+
+ /**
+ * Get URL to the Elasticsuite tracker configuration page.
+ *
+ * @return string
+ */
+ private function getTrackerConfigUrl(): string
+ {
+ return $this->urlBuilder->getUrl(
+ 'adminhtml/system_config/edit',
+ [
+ 'section' => 'smile_elasticsuite_tracker',
+ '_fragment' => 'smile_elasticsuite_tracker_queue_cleanup-link',
+ ]
+ );
+ }
+}
diff --git a/src/module-elasticsuite-tracker/Model/System/Message/WarningAboutInvalidTrackerEvents.php b/src/module-elasticsuite-tracker/Model/System/Message/WarningAboutInvalidTrackerEvents.php
deleted file mode 100644
index 827b65a14..000000000
--- a/src/module-elasticsuite-tracker/Model/System/Message/WarningAboutInvalidTrackerEvents.php
+++ /dev/null
@@ -1,146 +0,0 @@
-
- * @copyright 2024 Smile
- * @license Open Software License ("OSL") v. 3.0
- */
-
-declare(strict_types = 1);
-
-namespace Smile\ElasticsuiteTracker\Model\System\Message;
-
-use Magento\Framework\AuthorizationInterface;
-use Magento\Framework\Exception\LocalizedException;
-use Magento\Framework\Notification\MessageInterface;
-use Smile\ElasticsuiteTracker\Api\EventQueueInterface;
-use Smile\ElasticsuiteTracker\Helper\Data as TrackerConfig;
-use Magento\Framework\UrlInterface;
-
-/**
- * ElasticSuite warning about invalid tracker events
- *
- * @category Smile
- * @package Smile\ElasticsuiteTracker
- * @author Richard Bayet
- */
-class WarningAboutInvalidTrackerEvents implements MessageInterface
-{
- /** @var EventQueueInterface */
- private $eventQueue;
-
- /** @var TrackerConfig */
- private $config;
-
- /** @var AuthorizationInterface */
- private $authorization;
-
- /** @var UrlInterface */
- private $urlBuilder;
-
- /** @var integer */
- private $invalidEventsCount;
-
- /**
- * Constructor.
- *
- * @param EventQueueInterface $eventQueue Event queue.
- * @param TrackerConfig $config Tracker config helper.
- * @param AuthorizationInterface $authorization User authorization.
- * @param UrlInterface $urlBuilder Url builder.
- */
- public function __construct(
- EventQueueInterface $eventQueue,
- TrackerConfig $config,
- AuthorizationInterface $authorization,
- UrlInterface $urlBuilder
- ) {
- $this->eventQueue = $eventQueue;
- $this->config = $config;
- $this->authorization = $authorization;
- $this->urlBuilder = $urlBuilder;
- }
-
- /**
- * {@inheritDoc}
- */
- public function getIdentity(): string
- {
- return hash('sha256', 'ELASTICSUITE_INVALID_TRACKER_EVENTS_WARNING');
- }
-
- /**
- * {@inheritdoc}
- */
- public function getSeverity(): int
- {
- return self::SEVERITY_MINOR;
- }
-
- /**
- * {@inheritdoc}
- */
- public function getText(): string
- {
- $messageDetails = '';
-
- // @codingStandardsIgnoreStart
- $messageDetails .= __(
- 'There are %1 invalid Elasticsuite tracker events in the tracker events queue table. This could indicate that something is wrong with the Elasticsuite tracker tags in the frontend.',
- $this->getNumberOfInvalidTrackerEvents()
- ) . '
';
-
- $messageDetails .= __(
- 'Those invalid tracker events will not be indexed into your behavioral data indices and will automatically be deleted after %1 days.',
- $this->config->getEventsQueueCleanupDelay()
- );
-
- if ($this->authorization->isAllowed('Magento_Backend::smile_elasticsuite_tracker')) {
- $routeParams = [
- 'section' => 'smile_elasticsuite_tracker',
- '_fragment' => 'smile_elasticsuite_tracker_queue_cleanup-link',
- ];
- $messageDetails .= '
' . __(
- 'You can decide to remove all of them immediately from the Elasticsuite tracker settings in the "Queue cleanup configuration" section.',
- $this->urlBuilder->getUrl(
- 'admin/system_config/edit',
- $routeParams
- )
- );
- }
- // @codingStandardsIgnoreEnd
-
- return $messageDetails;
- }
-
- /**
- * {@inheritdoc}
- */
- public function isDisplayed(): bool
- {
- return ($this->getNumberOfInvalidTrackerEvents() > 0);
- }
-
- /**
- * Return the number of invalid tracker events.
- *
- * @return int
- */
- private function getNumberOfInvalidTrackerEvents(): int
- {
- if (is_null($this->invalidEventsCount)) {
- try {
- $this->invalidEventsCount = $this->eventQueue->getInvalidEventsCount();
- } catch (LocalizedException $e) {
- $this->invalidEventsCount = 0;
- }
- }
-
- return $this->invalidEventsCount;
- }
-}
diff --git a/src/module-elasticsuite-tracker/etc/adminhtml/di.xml b/src/module-elasticsuite-tracker/etc/adminhtml/di.xml
index e6460782c..2754e6072 100644
--- a/src/module-elasticsuite-tracker/etc/adminhtml/di.xml
+++ b/src/module-elasticsuite-tracker/etc/adminhtml/di.xml
@@ -17,20 +17,12 @@
-->
-
-
-
-
- - Smile\ElasticsuiteTracker\Model\System\Message\WarningAboutInvalidTrackerEvents
-
-
-
-
- Smile\ElasticsuiteTracker\Model\Healthcheck\TrackerPendingEvents
+ - Smile\ElasticsuiteTracker\Model\Healthcheck\TrackerInvalidEvents
diff --git a/src/module-elasticsuite-tracker/i18n/de_DE.csv b/src/module-elasticsuite-tracker/i18n/de_DE.csv
index 1c42bcf09..688848544 100644
--- a/src/module-elasticsuite-tracker/i18n/de_DE.csv
+++ b/src/module-elasticsuite-tracker/i18n/de_DE.csv
@@ -21,8 +21,9 @@
"We'd like to invite you to extend your connection with Elasticsuite by subscribing to our newsletter. Stay ahead of the curve with exclusive insights into our cutting-edge product features. Experience the freedom of open-source collaboration and receive non-intrusive updates that keep you informed without overwhelming your inbox.","Wir möchten Sie einladen, Ihre Verbindung mit Elasticsuite durch ein Abonnement unseres Newsletters zu erweitern. Bleiben Sie der Kurve mit exklusiven Einblicken in unsere neuesten Produktmerkmale. Erleben Sie die Freiheit der Open-Source-Zusammenarbeit und erhalten Sie nicht aufdringliche Updates, die Sie auf dem Laufenden halten, ohne Ihren Posteingang zu überlasten."
"Join the Elasticsuite community today.","Treten Sie der Elasticsuite Community heute bei."
"No thanks","Nein danke"
+"No invalid Elasticsuite tracker events were detected.","Es wurden keine ungültigen Elasticsuite Tracker-Ereignisse erkannt."
"There are %1 invalid Elasticsuite tracker events in the tracker events queue table. This could indicate that something is wrong with the Elasticsuite tracker tags in the frontend.","Es gibt %1 ungültige Elasticsuite Tracker-Ereignisse in der Warteschlange für Tracker-Ereignisse. Dies könnte darauf hindeuten, dass etwas mit den Elasticsuite Tracker-Tags im Frontend nicht stimmt."
-"Those invalid tracker events will not be indexed into your behavioral data indices and will automatically be deleted after %1 days.","Diese ungültigen Tracker-Ereignisse werden nicht in Ihre Verhaltensdatenindizes indiziert und werden nach %1 Tagen automatisch gelöscht."
+"Those invalid tracker events will not be indexed into your behavioral data indices and will automatically be deleted after %1 days.","Diese ungültigen Tracker-Ereignisse werden nicht in Ihre Verhaltensdatenindizes indiziert und werden nach %1 Tagen automatisch gelöscht."
"You can decide to remove all of them immediately from the Elasticsuite tracker settings in the ""Queue cleanup configuration"" section.","Sie können entscheiden, alle von ihnen sofort aus den Elasticsuite Tracker Einstellungen im Abschnitt ""Warteschlange Bereinigung der Konfiguration"" zu entfernen."
"Purge now","Jetzt löschen"
"Purge the queue of all invalid events now","Löschen Sie die Warteschlange aller ungültigen Ereignisse jetzt"
diff --git a/src/module-elasticsuite-tracker/i18n/en_US.csv b/src/module-elasticsuite-tracker/i18n/en_US.csv
index 771d20e03..44daf0d99 100644
--- a/src/module-elasticsuite-tracker/i18n/en_US.csv
+++ b/src/module-elasticsuite-tracker/i18n/en_US.csv
@@ -21,8 +21,9 @@ Enabled,Enabled
"We'd like to invite you to extend your connection with Elasticsuite by subscribing to our newsletter. Stay ahead of the curve with exclusive insights into our cutting-edge product features. Experience the freedom of open-source collaboration and receive non-intrusive updates that keep you informed without overwhelming your inbox.","We'd like to invite you to extend your connection with Elasticsuite by subscribing to our newsletter. Stay ahead of the curve with exclusive insights into our cutting-edge product features. Experience the freedom of open-source collaboration and receive non-intrusive updates that keep you informed without overwhelming your inbox."
"Join the Elasticsuite community today.","Join the Elasticsuite community today."
"No thanks","No thanks"
+"No invalid Elasticsuite tracker events were detected.","No invalid Elasticsuite tracker events were detected."
"There are %1 invalid Elasticsuite tracker events in the tracker events queue table. This could indicate that something is wrong with the Elasticsuite tracker tags in the frontend.","There are %1 invalid Elasticsuite tracker events in the tracker events queue table. This could indicate that something is wrong with the Elasticsuite tracker tags in the frontend."
-"Those invalid tracker events will not be indexed into your behavioral data indices and will automatically be deleted after %1 days.","Those invalid tracker events will not be indexed into your behavioral data indices and will automatically be deleted after %1 days."
+"Those invalid tracker events will not be indexed into your behavioral data indices and will automatically be deleted after %1 days.","Those invalid tracker events will not be indexed into your behavioral data indices and will automatically be deleted after %1 days."
"You can decide to remove all of them immediately from the Elasticsuite tracker settings in the ""Queue cleanup configuration"" section.","You can decide to remove all of them immediately from the Elasticsuite tracker settings in the ""Queue cleanup configuration"" section."
"Purge now","Purge now"
"Purge the queue of all invalid events now","Purge the queue of all invalid events now"
diff --git a/src/module-elasticsuite-tracker/i18n/fr_FR.csv b/src/module-elasticsuite-tracker/i18n/fr_FR.csv
index 9901ba910..f7d02d331 100644
--- a/src/module-elasticsuite-tracker/i18n/fr_FR.csv
+++ b/src/module-elasticsuite-tracker/i18n/fr_FR.csv
@@ -21,8 +21,9 @@ Tracking,Tracking
"We'd like to invite you to extend your connection with Elasticsuite by subscribing to our newsletter. Stay ahead of the curve with exclusive insights into our cutting-edge product features. Experience the freedom of open-source collaboration and receive non-intrusive updates that keep you informed without overwhelming your inbox.","Nous aimerions vous inviter à renforcer votre lien avec Elasticsuite en vous abonnant à notre newsletter. Recevez régulièrement des informations exclusives sur les fonctionnalités de notre produit, ainsi que des mises à jour non intrusives qui vous tiennent informé sans submerger votre boîte de réception."
"Join the Elasticsuite community today.","Rejoignez la communauté Elasticsuite dès aujourd'hui."
"No thanks","Non merci"
+"No invalid Elasticsuite tracker events were detected.","Aucun événement de tracking Elasticsuite invalide n'a été détecté."
"There are %1 invalid Elasticsuite tracker events in the tracker events queue table. This could indicate that something is wrong with the Elasticsuite tracker tags in the frontend.","Il y a %1 évènements invalides du tracker Elasticsuite dans la table file d'attente du tracker. Cela pourrait indiquer un souci au niveau des tags du tracker Elasticsuite dans le frontend."
-"Those invalid tracker events will not be indexed into your behavioral data indices and will automatically be deleted after %1 days.","Ces évènements invalides ne seront pas indexés dans vos index des données comportementales et seront automatiquement supprimés après %1 jours."
+"Those invalid tracker events will not be indexed into your behavioral data indices and will automatically be deleted after %1 days.","Ces évènements invalides ne seront pas indexés dans vos index des données comportementales et seront automatiquement supprimés après %1 jours."
"You can decide to remove all of them immediately from the Elasticsuite tracker settings in the ""Queue cleanup configuration"" section.","Vous pouvez décider de les supprimer tous immédiatement depuis les paramètres du tracker Elasticsuite dans la section ""Configuration du nettoyage de la file d'attente""."
"Purge now","Purger maintenant"
"Purge the queue of all invalid events now","Purger de la file d'attente tous les évènements invalides maintenant"
diff --git a/src/module-elasticsuite-tracker/i18n/nl_NL.csv b/src/module-elasticsuite-tracker/i18n/nl_NL.csv
index 7a74c59d4..dc9b201d8 100644
--- a/src/module-elasticsuite-tracker/i18n/nl_NL.csv
+++ b/src/module-elasticsuite-tracker/i18n/nl_NL.csv
@@ -21,8 +21,9 @@
"We'd like to invite you to extend your connection with Elasticsuite by subscribing to our newsletter. Stay ahead of the curve with exclusive insights into our cutting-edge product features. Experience the freedom of open-source collaboration and receive non-intrusive updates that keep you informed without overwhelming your inbox.","We willen u graag uitnodigen om uw verbinding met Elasticsuite uit te breiden door u te abonneren op onze nieuwsbrief. Blijf voor de curve met exclusieve inzichten in onze geavanceerde productfuncties. Ervaar de vrijheid van open source samenwerking en ontvang niet-opdringerige updates die je op de hoogte houden zonder je inbox te overweldigen."
"Join the Elasticsuite community today.","Word vandaag lid van de Elasticsuite gemeenschap."
"No thanks","Nee, bedankt"
+"No invalid Elasticsuite tracker events were detected.","Er zijn geen ongeldige Elasticsuite tracker gebeurtenissen gedetecteerd."
"There are %1 invalid Elasticsuite tracker events in the tracker events queue table. This could indicate that something is wrong with the Elasticsuite tracker tags in the frontend.","Er zijn %1 ongeldige Elasticsuite tracker gebeurtenissen in de tracker events wachtrij tabel. Dit kan aangeven dat er iets mis is met de Elasticsuite trackertags in de frontend."
-"Those invalid tracker events will not be indexed into your behavioral data indices and will automatically be deleted after %1 days.","Deze ongeldige tracker gebeurtenissen worden niet geïndexeerd in uw behavioral data indices en zullen automatisch worden verwijderd na %1 dagen."
+"Those invalid tracker events will not be indexed into your behavioral data indices and will automatically be deleted after %1 days.","Deze ongeldige tracker gebeurtenissen worden niet geïndexeerd in uw behavioral data indices en zullen automatisch worden verwijderd na %1 dagen."
"You can decide to remove all of them immediately from the Elasticsuite tracker settings in the ""Queue cleanup configuration"" section.","Je kunt besluiten om ze direct te verwijderen uit de Elasticsuite tracker instellingen in de ""Opschonen configuratie"" sectie."
"Purge now","Wis nu"
"Purge the queue of all invalid events now","Wis nu de wachtrij van alle ongeldige gebeurtenissen"