Si je comprends bien, tu veux faire partir un mail lorsqu'un ou plusieurs produits passent en promotion. La mise à jour de l'état promo est faite à 4 occasions :
1) Lors de la génération des combinaisons de declinaison (TheliaEvents::PRODUCT_COMBINATION_GENERATION)
2) A la modification d'un produit (TheliaEvents::PRODUCT_UPDATE_PRODUCT_SALE_ELEMENT)
3) Lors de la mise en place d'une promotion, via Outils -> Gestion des promotions (TheliaEvents::UPDATE_PRODUCT_SALE_STATUS)
4) Lors de l'importation du catalogue via Outils -> Import -> Importer vos prix Hors-Taxes (pas vraiment d’évènement défini)
Mais bon, si tu essaie de gérer ces events, tu vas avoir un problème : comment savoir que l'état "promo" d'un produit a changé ? En effet, tu n'est pas capable de déterminer quand tu reçois ces events si le produit était déjà en promo ou s'il vient tout juste d'être mis en promo. Tu dois donc gérer ça dans ton module, avec une table spécifique qui mémorise quels sont les produits en promo.
Mais étant donné que tu es obligé de gérer cet état, il est bien plus simple de lancer un script que à intervalles réguliers (par exemple dans un cron, toutes les heures), qui contrôle l'état "promo" de chaque produit auquel au moins un client s'est abonné, et envoie les mails à bon escient :
Si le produit est en promo, tu vas regarder dans une table de ton module si l'ID du produit d'y trouve.
Si l'ID ne se trouve pas dans cette table, tu le met et tu envoie tes mails.
Si l'ID du produit se trouve déjà dans cette table, tu ne fais rien.
Si le produit n'est pas en promo, tu le supprime de ta table.
Ainsi, tu n'as pas besoin de te tracasser avec les events Dans ton module, tu définis une route vers le contrôleur qui va lancer l'examen des produits, et tu rajoutes ton script dans ton cron (ou web cron).
My 2 cents.