Magento 2: How to Send Email when Product Price Change

Magento 2 How to Send Email when Product Price Change

Hello Magento Friends,

In today’s blog we will learn about how to send email when there is a change in product prices for your Magento 2 store.

Keeping admins informed about product price changes can improve price management and foster transparency within your team. Here’s a comprehensive guide on how to set up this feature.

Before that, learn How to Change Product Price with Plugin in Magento 2.

Steps to Send Email when Product Price Change in Magento 2:

Step 1: First, we need to create an “events.xml“ file inside our extension at the following path

app\code\Vendor\Extension\etc\adminhtml\events.xml

Then add the below-mentioned code

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">     
    <event name="catalog_product_save_before">
        <observer name="custom_shipping_observet" instance="Vendor\Extension\Observer\Saveshippingdata" />
    </event>
</config>

Step 2: After that, we need to create a “Saveshippingdata.php” file inside our extension at the following path

app\code\Vendor\Extension\Observer\Saveshippingdata.php

And add the code as given below

<?php

namespace Vendor\Extension\Observer;

use \Magento\Framework\Event\Observer;
use \Magento\Framework\Event\ObserverInterface;
use Magento\ProductAlert\Model\StockFactory;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\App\ResourceConnection;
use Magento\Customer\Model\CustomerFactory;
use Magento\Store\Model\StoreManagerInterface;
use Magento\Framework\Mail\Template\TransportBuilder;
use Magento\Framework\Translate\Inline\StateInterface;
use Magento\Directory\Model\Currency;

class Saveshippingdata implements ObserverInterface
{
    protected $request;
    protected $stockFactory;
    protected $resourceConnection;
    protected $customFactory;
    protected $_transportBuilder;
    protected $storeManager;
    protected $inlineTranslation;
    protected $currency;
 
    public function __construct(
        \Magento\Framework\App\RequestInterface $request,
         StockFactory $stockFactory = null,
         ResourceConnection $resourceConnection,
         CustomerFactory $customFactory,
         StoreManagerInterface $storeManager,
         TransportBuilder $_transportBuilder,
         StateInterface $inlineTranslation,
         Currency $currency
    )
    {
        $this->stockFactory = $stockFactory ?? ObjectManager::getInstance()->get(StockFactory::class);
        $this->resourceConnection = $resourceConnection;
        $this->request = $request;
        $this->customFactory=$customFactory;
    	$this->storeManager=$storeManager;
    	$this->_transportBuilder=$_transportBuilder;
    	$this->inlineTranslation=$inlineTranslation;
    	$this->currency=$currency;
    }
    
    public function execute(Observer $observer)
    {
    	$product = $observer->getEvent()->getDataObject();
    	$post = $this->request->getPost();
        $post = $post['product'];
    	$originalPrice = $product->getOrigData('price');
        $currentPrice = $product->getData('price');
        if($originalPrice != '' && $originalPrice != NULL)
        {
        	$formatted_original_price = number_format($originalPrice, 2);
        	if($formatted_original_price != $currentPrice)
            	{
            		 if (array_key_exists("thumbnail",$post))
                        {
                                $product_image = $this->storeManager->getStore()->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA).'catalog/product'.$post['thumbnail'];
                        }
            		$templateOptions = array('area' => \Magento\Framework\App\Area::AREA_FRONTEND, 'store' => $this->storeManager->getStore()->getId());
            		$templateVars = array(
                                                'store' => $this->storeManager->getStore(),
                                                'message'    => 'Price change alert! We wanted you to know that prices have changed for these products:',
                                                'productname'=>$post['name'],
                                                'productimage'=>$product_image,
                                                'producturl'=>$this->storeManager->getStore()->getBaseUrl().$post['url_key'].".html",
                                                'productprice'=>$this->currency->format($post['price'], ['symbol' => $currencySymbol, 'precision'=> $precision], false, false)
                                            );
                            $from = array('email' => "sender@example.com", 'name' => 'Sender Name');
                            $this->inlineTranslation->suspend();
                            $to = receiver@gmail.com;
                            $transport = $this->_transportBuilder->setTemplateIdentifier('price_change_email')
                                            ->setTemplateOptions($templateOptions)
                                            ->setTemplateVars($templateVars)
                                            ->setFrom($from)
                                            ->addTo($to)
                                            ->getTransport();
                            $transport->sendMessage();
                            $this->inlineTranslation->resume();
            	}
        }
    }
}

Step 3: After that, we need to create an “email_templates.xml” file inside our extension at the following path

app\code\Vendor\Extension\etc\adminhtml\email_templates.xml

And add the code as follows

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Email:etc/email_templates.xsd">
    <template id="price_change_email" label="Stock ALert" file="price_change.html" type="html" module="Vender_Extension" area="frontend"/>
</config>

Step 4: After that, we need to create a “price_change.html” file inside our extension at the following path

app\code\Vendor\Extension\view\frontend\email\price_change.html

Now add the below-mentioned code

<!--@subject Products price changed alert @-->
<!--@vars
{"store url=\"\"":"Store Url",
"skin url=\"email/logo/stores/1/Company_Logos_9_.png\" _area='frontend'":"Email Logo Image"}
@-->
<!--@styles
body,td { color:#2f2f2f; font:11px/1.35em Verdana, Arial, Helvetica, sans-serif; }
@-->
{{template config_path="design/email/header_template"}}
        <table cellspacing="0" cellpadding="0" border="0" width="100%">
            <tr>
                <td align="center" valign="top" style="padding:20px 0 20px 0">
                    <table bgcolor="#FFFFFF" cellspacing="0" cellpadding="10" border="0" width="650" style="border:1px solid #E0E0E0;">
                        <tr>
                            <td valign="top">
                                <h1 style="font-size:22px;font-weight:normal;line-height:22px;margin:0 0 11px 0;">{{trans "Hello"}}</h1>
                            </td>
                        </tr>
                        <tr>
                            <td>
                                <table cellspacing="0" cellpadding="0" border="0" width="650">
                                    <tbody>
                                        <tr>
                                            <td colspan="2" valign="top" style="font-size:12px;padding:7px 9px 9px 9px;border:1px solid #EAEAEA;">
                                                {{var message}}
                                            </td>
                                        </tr>
                                        <tr>
                                        <td valign="top" style="font-size:12px;padding:7px 9px 9px 9px;border:1px solid #EAEAEA;">
                                         <a href="{{var producturl}}">
                                                <img src="{{var productimage}}" width="200px"
                                                height="200px" alt="{{var productname}}">
                                           <div class="product-name">{{trans "Product Name: "}}<b>{{var productname}}</b></div></a>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td colspan="2" valign="top" style="font-size:12px;padding:7px 9px 9px 9px;border:1px solid #EAEAEA;">
                                               {{trans "Price: "}}{{var productprice}}
                                            </td>
                                    </tr>
                                    </tbody>
                                </table>
                            </td>
                           
                        </tr>
                        <tr>
                            <td bgcolor="#EAEAEA" align="center" style="background:#EAEAEA;text-align:center;">
                                <center>
                                    <p style="font-size:12px;margin:0;">
                                        <strong>{{trans "Thank you"}}</strong>
                                    </p>
                                </center>
                            </td>
                        </tr>
                    </table>
                </td>
            </tr>
        </table>
    {{template config_path="design/email/footer_template"}}

Conclusion:

With these steps, you have set up a system in Magento 2 that sends email notifications to admins when a product price changes. This proactive approach helps maintain competitive pricing strategies and ensures that the admin is always informed of any significant changes.

If you have any questions or run into issues, feel free to leave a comment below or contact us for further assistance.

Happy Coding!

Previous Article

Mastering Authorization in Laravel: A Guide to Gates and Policies

Next Article

Magento Development with Hyvä

Write a Comment

Leave a Comment

Your email address will not be published. Required fields are marked *

Get Connect With Us

Subscribe to our email newsletter to get the latest posts delivered right to your email.
Pure inspiration, zero spam ✨