Magento 2 is a powerful and flexible e-commerce platform, built on a robust event-driven architecture. Events in Magento allow developers to "hook into" specific actions throughout the system without modifying core code. They are widely used to extend functionality, customize workflows, and integrate with other systems.
In this article, you will find a comprehensive table of Magento 2 core events, including the event name, the arguments available, and the file where the event is dispatched. This list focuses solely on default Magento 2 events, ensuring that it is relevant for all standard installations.
Each event can be used in various scenarios, such as:
- Modifying product or category data before saving to the database.
- Performing additional operations after an order is placed, invoiced, or shipped.
- Customizing checkout processes, payment methods, or shipping calculations.
- Tracking customer actions, such as login, logout, or newsletter subscription.
- Extending email templates, CMS page rendering, or catalog search functionality.
After the table, practical examples are provided to demonstrate how to observe events using events.xml and implement custom observers. These examples will help developers understand how to leverage events effectively for custom business logic.
By the end of this article, developers will have a clear reference for Magento 2 core events and practical guidance on using them to create robust, maintainable customizations.
| Event Name | Arguments | File |
|---|---|---|
| catalog_category_save_after | category | Magento_Catalog/Model/Category.php |
| catalog_category_delete_after | category | Magento_Catalog/Model/Category.php |
| catalog_product_save_after | product | Magento_Catalog/Model/Product.php |
| catalog_product_save_before | product | Magento_Catalog/Model/Product.php |
| catalog_product_delete_after | product | Magento_Catalog/Model/Product.php |
| catalog_product_collection_load_before | collection | Magento_Catalog/Model/ResourceModel/Product/Collection.php |
| catalog_product_collection_load_after | collection | Magento_Catalog/Model/ResourceModel/Product/Collection.php |
| catalog_product_compare_add_product | product, request | Magento_Catalog/Model/Product/Compare/ListCompare.php |
| catalog_product_compare_remove_product | product, request | Magento_Catalog/Model/Product/Compare/ListCompare.php |
| catalog_product_compare_clear | customer, request | Magento_Catalog/Model/Product/Compare/ListCompare.php |
| checkout_cart_product_add_after | quote_item, product, request_info | Magento_Checkout/Model/Cart.php |
| checkout_cart_save_after | quote | Magento_Checkout/Model/Cart.php |
| checkout_cart_update_items_after | quote | Magento_Checkout/Model/Cart.php |
| checkout_onepage_controller_success_action | order_ids | Magento_Checkout/Controller/Onepage/Success.php |
| checkout_onepage_controller_failure_action | order_ids | Magento_Checkout/Controller/Onepage/Failure.php |
| checkout_submit_all_after | quote, order | Magento_Checkout/Model/Type/Onepage.php |
| checkout_submit_before | quote, order | Magento_Checkout/Model/Type/Onepage.php |
| checkout_quote_collect_totals_before | quote | Magento_Checkout/Model/Cart.php |
| checkout_quote_save_after | quote | Magento_Checkout/Model/Cart.php |
| checkout_cart_remove_item_before | quote_item | Magento_Checkout/Model/Cart.php |
| checkout_cart_remove_item_after | quote_item | Magento_Checkout/Model/Cart.php |
| customer_login | customer, request | Magento_Customer/Model/Session.php |
| customer_logout | customer | Magento_Customer/Model/Session.php |
| customer_register_success | customer | Magento_Customer/Model/AccountManagement.php |
| customer_account_edit_post | customer, request | Magento_Customer/Controller/Account/EditPost.php |
| customer_save_after | customer | Magento_Customer/Model/Customer.php |
| customer_save_before | customer | Magento_Customer/Model/Customer.php |
| customer_delete_after | customer | Magento_Customer/Model/Customer.php |
| customer_delete_before | customer | Magento_Customer/Model/Customer.php |
| sales_order_place_after | order | Magento_Sales/Model/Order.php |
| sales_order_place_before | order | Magento_Sales/Model/Order.php |
| sales_order_save_after | order | Magento_Sales/Model/Order.php |
| sales_order_save_before | order | Magento_Sales/Model/Order.php |
| sales_order_invoice_pay | invoice | Magento_Sales/Model/Order/Invoice.php |
| sales_order_invoice_save_after | invoice | Magento_Sales/Model/Order/Invoice.php |
| sales_order_shipment_save_after | shipment | Magento_Sales/Model/Order/Shipment.php |
| sales_order_shipment_save_before | shipment | Magento_Sales/Model/Order/Shipment.php |
| sales_order_creditmemo_save_after | creditmemo | Magento_Sales/Model/Order/Creditmemo.php |
| sales_order_creditmemo_save_before | creditmemo | Magento_Sales/Model/Order/Creditmemo.php |
| sales_order_payment_place_start | order, payment | Magento_Sales/Model/Order/Payment.php |
| sales_order_payment_place_end | order, payment | Magento_Sales/Model/Order/Payment.php |
| sales_order_payment_pay | order, payment | Magento_Sales/Model/Order/Payment.php |
| sales_quote_save_after | quote | Magento_Quote/Model/Quote.php |
| sales_quote_item_save_after | quote_item | Magento_Quote/Model/Quote/Item.php |
| sales_quote_collect_totals_before | quote | Magento_Quote/Model/Quote.php |
| sales_quote_collect_totals_after | quote | Magento_Quote/Model/Quote.php |
| sales_quote_item_qty_set_after | quote_item | Magento_Quote/Model/Quote/Item.php |
| sales_quote_remove_item | quote, quote_item | Magento_Quote/Model/Quote.php |
| payment_method_is_active | result, method_instance, quote | Magento_Payment/Model/Method/AbstractMethod.php |
| payment_method_assign_data_before | method_instance, data | Magento_Payment/Model/Method/AbstractMethod.php |
| payment_method_assign_data_after | method_instance, data | Magento_Payment/Model/Method/AbstractMethod.php |
| newsletter_subscriber_save_after | subscriber | Magento_Newsletter/Model/Subscriber.php |
| newsletter_subscriber_save_before | subscriber | Magento_Newsletter/Model/Subscriber.php |
| newsletter_subscriber_delete_after | subscriber | Magento_Newsletter/Model/Subscriber.php |
| newsletter_subscriber_delete_before | subscriber | Magento_Newsletter/Model/Subscriber.php |
| email_template_send_before | email, template | Magento_Email/Model/Template.php |
| email_template_send_after | email, template | Magento_Email/Model/Template.php |
| email_template_send_error | email, template | Magento_Email/Model/Template.php |
| cms_page_render | page, transport | Magento_Cms/Model/Page.php |
| cms_page_render_before | page, transport | Magento_Cms/Model/Page.php |
| cms_page_render_after | page, transport | Magento_Cms/Model/Page.php |
| cms_page_save_after | page | Magento_Cms/Model/Page.php |
| cms_page_save_before | page | Magento_Cms/Model/Page.php |
| cms_page_delete_after | page | Magento_Cms/Model/Page.php |
| cms_page_delete_before | page | Magento_Cms/Model/Page.php |
| controller_action_predispatch | request, controller_action | Magento\Framework\App\Action\Action.php |
| controller_action_postdispatch | request, controller_action | Magento\Framework\App\Action\Action.php |
| core_block_abstract_to_html_before | block | Magento\Framework\View\Element\AbstractBlock.php |
| core_block_abstract_to_html_after | block, transport | Magento\Framework\View\Element\AbstractBlock.php |
| layout_generate_blocks_before | layout | Magento\Framework\View\Layout.php |
| layout_generate_blocks_after | layout | Magento\Framework\View\Layout.php |
| layout_render_before | layout | Magento\Framework\View\Layout.php |
| layout_render_after | layout | Magento\Framework\View\Layout.php |
| controller_front_send_response_before | response | Magento\Framework\App\FrontController.php |
| controller_front_send_response_after | response | Magento\Framework\App\FrontController.php |
| inventory_source_save_after | source | Magento_Inventory/Model/Source.php |
| inventory_source_save_before | source | Magento_Inventory/Model/Source.php |
| inventory_source_delete_after | source | Magento_Inventory/Model/Source.php |
| inventory_source_delete_before | source | Magento_Inventory/Model/Source.php |
| inventory_stock_item_save_after | stock_item | Magento_Inventory/Model/StockItem.php |
| inventory_stock_item_save_before | stock_item | Magento_Inventory/Model/StockItem.php |
| inventory_stock_item_delete_after | stock_item | Magento_Inventory/Model/StockItem.php |
| inventory_stock_item_delete_before | stock_item | Magento_Inventory/Model/StockItem.php |
| inventory_reservation_save_after | reservation | Magento_Inventory/Model/Reservation.php |
| inventory_reservation_save_before | reservation | Magento_Inventory/Model/Reservation.php |
| inventory_reservation_delete_after | reservation | Magento_Inventory/Model/Reservation.php |
| inventory_reservation_delete_before | reservation | Magento_Inventory/Model/Reservation.php |
| catalogsearch_query_save_after | query | Magento_CatalogSearch/Model/Query.php |
| catalogsearch_query_save_before | query | Magento_CatalogSearch/Model/Query.php |
| catalogsearch_query_delete_after | query | Magento_CatalogSearch/Model/Query.php |
| catalogsearch_query_delete_before | query | Magento_CatalogSearch/Model/Query.php |
| catalogsearch_fulltext_prepare_index | product, store_id | Magento_CatalogSearch/Model/Indexer/Fulltext.php |
| review_save_after | review | Magento_Review/Model/Review.php |
| review_save_before | review | Magento_Review/Model/Review.php |
| review_delete_after | review | Magento_Review/Model/Review.php |
| review_delete_before | review | Magento_Review/Model/Review.php |
| rule_save_after | rule | Magento_Rule/Model/AbstractModel.php |
| rule_save_before | rule | Magento_Rule/Model/AbstractModel.php |
| rule_delete_after | rule | Magento_Rule/Model/AbstractModel.php |
| rule_delete_before | rule | Magento_Rule/Model/AbstractModel.php |
| core_layout_update_get_updates_before | updates | Magento\Framework\View\Model\Layout\Update.php |
| core_layout_update_get_updates_after | updates | Magento\Framework\View\Model\Layout\Update.php |
| core_layout_render_element | element | Magento\Framework\View\Layout\Generator\Block.php |
| core_layout_render_element_after | element | Magento\Framework\View\Layout\Generator\Block.php |
| controller_action_layout_generate_blocks_after | layout | Magento\Framework\App\Action\Action.php |
| controller_action_layout_render_before | layout | Magento\Framework\App\Action\Action.php |
| controller_action_layout_render_after | layout | Magento\Framework\App\Action\Action.php |
| quote_save_after | quote | Magento_Quote/Model/Quote.php |
| quote_save_before | quote | Magento_Quote/Model/Quote.php |
| quote_item_save_after | quote_item | Magento_Quote/Model/Quote/Item.php |
| quote_item_save_before | quote_item | Magento_Quote/Model/Quote/Item.php |
| quote_item_delete_after | quote_item | Magento_Quote/Model/Quote/Item.php |
| quote_item_delete_before | quote_item | Magento_Quote/Model/Quote/Item.php |
| quote_collect_totals_before | quote | Magento_Quote/Model/Quote.php |
| quote_collect_totals_after | quote | Magento_Quote/Model/Quote.php |
| quote_address_collect_totals_before | address | Magento_Quote/Model/Quote/Address.php |
| quote_address_collect_totals_after | address | Magento_Quote/Model/Quote/Address.php |
| tax_class_save_after | tax_class | Magento_Tax/Model/ClassModel.php |
| tax_class_save_before | tax_class | Magento_Tax/Model/ClassModel.php |
| tax_class_delete_after | tax_class | Magento_Tax/Model/ClassModel.php |
| tax_class_delete_before | tax_class | Magento_Tax/Model/ClassModel.php |
| tax_calculation_save_after | tax_calculation | Magento_Tax/Model/Calculation.php |
| tax_calculation_save_before | tax_calculation | Magento_Tax/Model/Calculation.php |
| shipping_method_is_active | result, method_instance, quote | Magento_Shipping/Model/Carrier/AbstractCarrier.php |
| sales_quote_address_collect_totals_after | address | Magento_Quote/Model/Quote/Address.php |
| sales_quote_address_collect_totals_before | address | Magento_Quote/Model/Quote/Address.php |
| sales_quote_address_save_after | address | Magento_Quote/Model/Quote/Address.php |
| sales_quote_address_save_before | address | Magento_Quote/Model/Quote/Address.php |
| sales_quote_address_delete_after | address | Magento_Quote/Model/Quote/Address.php |
| sales_quote_address_delete_before | address | Magento_Quote/Model/Quote/Address.php |
| cataloginventory_stock_item_save_after | stock_item | Magento_CatalogInventory/Model/Stock/Item.php |
| cataloginventory_stock_item_save_before | stock_item | Magento_CatalogInventory/Model/Stock/Item.php |
| cataloginventory_stock_item_delete_after | stock_item | Magento_CatalogInventory/Model/Stock/Item.php |
| cataloginventory_stock_item_delete_before | stock_item | Magento_CatalogInventory/Model/Stock/Item.php |
| cataloginventory_stock_status_save_after | stock_status | Magento_CatalogInventory/Model/Stock/Status.php |
| cataloginventory_stock_status_save_before | stock_status | Magento_CatalogInventory/Model/Stock/Status.php |
| wishlist_save_after | wishlist | Magento_Wishlist/Model/Wishlist.php |
| wishlist_save_before | wishlist | Magento_Wishlist/Model/Wishlist.php |
| wishlist_delete_after | wishlist | Magento_Wishlist/Model/Wishlist.php |
| wishlist_delete_before | wishlist | Magento_Wishlist/Model/Wishlist.php |
| wishlist_item_save_after | wishlist_item | Magento_Wishlist/Model/Item.php |
| wishlist_item_save_before | wishlist_item | Magento_Wishlist/Model/Item.php |
| wishlist_item_delete_after | wishlist_item | Magento_Wishlist/Model/Item.php |
| wishlist_item_delete_before | wishlist_item | Magento_Wishlist/Model/Item.php |
| review_save_after | review | Magento_Review/Model/Review.php |
| review_save_before | review | Magento_Review/Model/Review.php |
| review_delete_after | review | Magento_Review/Model/Review.php |
| review_delete_before | review | Magento_Review/Model/Review.php |
| review_collection_load_before | collection | Magento_Review/Model/ResourceModel/Review/Collection.php |
| review_collection_load_after | collection | Magento_Review/Model/ResourceModel/Review/Collection.php |
| customer_segment_save_after | segment | Magento_CustomerSegment/Model/Segment.php |
| customer_segment_save_before | segment | Magento_CustomerSegment/Model/Segment.php |
| customer_segment_delete_after | segment | Magento_CustomerSegment/Model/Segment.php |
| customer_segment_delete_before | segment | Magento_CustomerSegment/Model/Segment.php |
| store_save_after | store | Magento_Store/Model/Store.php |
| store_save_before | store | Magento_Store/Model/Store.php |
| store_delete_after | store | Magento_Store/Model/Store.php |
| store_delete_before | store | Magento_Store/Model/Store.php |
| url_rewrite_save_after | url_rewrite | Magento_UrlRewrite/Model/UrlRewrite.php |
| url_rewrite_save_before | url_rewrite | Magento_UrlRewrite/Model/UrlRewrite.php |
| url_rewrite_delete_after | url_rewrite | Magento_UrlRewrite/Model/UrlRewrite.php |
| url_rewrite_delete_before | url_rewrite | Magento_UrlRewrite/Model/UrlRewrite.php |
| core_config_data_save_after | config | Magento_Config/Model/Config.php |
| core_config_data_save_before | config | Magento_Config/Model/Config.php |
| core_config_data_delete_after | config | Magento_Config/Model/Config.php |
| core_config_data_delete_before | config | Magento_Config/Model/Config.php |
| app_area_list_after | area_list | Magento\Framework\App\AreaList.php |
| app_state_set_mode_after | mode | Magento\Framework\App\State.php |
| app_state_set_mode_before | mode | Magento\Framework\App\State.php |
| cms_page_render_before | page, transport | Magento_Cms/Model/Page.php |
| cms_page_render_after | page, transport | Magento_Cms/Model/Page.php |
| cms_page_save_after | page | Magento_Cms/Model/Page.php |
| cms_page_save_before | page | Magento_Cms/Model/Page.php |
| catalog_product_type_configurable_price | product, price, qty | Magento_ConfigurableProduct/Model/Product/Type/Configurable.php |
| catalog_product_type_configurable_children | children, product | Magento_ConfigurableProduct/Model/Product/Type/Configurable.php |
| catalog_product_type_configurable_save_after | product | Magento_ConfigurableProduct/Model/Product/Type/Configurable.php |
| bundle_product_save_after | product | Magento_Bundle/Model/Product/Type.php |
| bundle_product_save_before | product | Magento_Bundle/Model/Product/Type.php |
| bundle_product_delete_after | product | Magento_Bundle/Model/Product/Type.php |
| bundle_product_delete_before | product | Magento_Bundle/Model/Product/Type.php |
| gift_message_save_after | gift_message | Magento_GiftMessage/Model/Message.php |
| gift_message_save_before | gift_message | Magento_GiftMessage/Model/Message.php |
| gift_message_delete_after | gift_message | Magento_GiftMessage/Model/Message.php |
| gift_message_delete_before | gift_message | Magento_GiftMessage/Model/Message.php |
| review_save_after | review | Magento_Review/Model/Review.php |
| review_save_before | review | Magento_Review/Model/Review.php |
| review_delete_after | review | Magento_Review/Model/Review.php |
| review_delete_before | review | Magento_Review/Model/Review.php |
| catalogrule_save_after | rule | Magento_CatalogRule/Model/Rule.php |
| catalogrule_save_before | rule | Magento_CatalogRule/Model/Rule.php |
| catalogrule_delete_after | rule | Magento_CatalogRule/Model/Rule.php |
| catalogrule_delete_before | rule | Magento_CatalogRule/Model/Rule.php |
| salesrule_save_after | rule | Magento_SalesRule/Model/Rule.php |
| salesrule_save_before | rule | Magento_SalesRule/Model/Rule.php |
| salesrule_delete_after | rule | Magento_SalesRule/Model/Rule.php |
| salesrule_delete_before | rule | Magento_SalesRule/Model/Rule.php |
| cache_flush_all | Magento\Framework\App\Cache\Manager.php | |
| cache_flush_system | Magento\Framework\App\Cache\Manager.php | |
| model_save_after | object | Magento\Framework\Model\AbstractModel.php |
| model_save_before | object | Magento\Framework\Model\AbstractModel.php |
| model_delete_after | object | Magento\Framework\Model\AbstractModel.php |
| model_delete_before | object | Magento\Framework\Model\AbstractModel.php |
| email_template_send_before | email, template | Magento_Email/Model/Template.php |
| email_template_send_after | email, template | Magento_Email/Model/Template.php |
| email_template_send_error | email, template | Magento_Email/Model/Template.php |
Example: Observing the customer_register_success Event
To react when a customer registers, you can create an observer for the customer_register_success event. Here’s a step-by-step example:
- Create events.xml in your custom module:
app/code/Vendor/Module/etc/frontend/events.xml
<?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="customer_register_success">
<observer name="vendor_module_customer_register" instance="Vendor\Module\Observer\CustomerRegisterObserver" />
</event>
</config>
- Create the Observer class:
app/code/Vendor/Module/Observer/CustomerRegisterObserver.php
<?php
namespace Vendor\Module\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Event\Observer;
class CustomerRegisterObserver implements ObserverInterface
{
public function execute(Observer $observer)
{
$customer = $observer->getEvent()->getCustomer();
// Example: Send a custom welcome message
$name = $customer->getFirstname();
$email = $customer->getEmail();
// Log the registration (or any custom action)
file_put_contents(BP . '/var/log/customer_register.log', "New customer: $name, $email\n", FILE_APPEND);
}
}
This observer is automatically triggered whenever a customer completes registration. You can modify it to perform additional tasks, such as sending custom emails, assigning loyalty points, or integrating with external systems.
Example 2: Observing the sales_order_place_after Event
This event is triggered after an order is successfully placed. Observers for this event are commonly used for custom order processing, notifications, or integration with third-party systems.
- Create events.xml in your custom module:
app/code/Vendor/Module/etc/frontend/events.xml
<?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="sales_order_place_after">
<observer name="vendor_module_order_place" instance="Vendor\Module\Observer\OrderPlaceObserver" />
</event>
</config>
- Create the Observer class:
app/code/Vendor/Module/Observer/OrderPlaceObserver.php
<?php
namespace Vendor\Module\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Event\Observer;
class OrderPlaceObserver implements ObserverInterface
{
public function execute(Observer $observer)
{
$order = $observer->getEvent()->getOrder();
$orderId = $order->getIncrementId();
$grandTotal = $order->getGrandTotal();
// Example: Log order info
file_put_contents(BP . '/var/log/order_place.log', "Order #$orderId placed, total: $grandTotal\n", FILE_APPEND);
}
}
Example 3: Observing the `catalog_category_save_after` Event
This event is triggered after a category is saved. Observers are useful for automatically updating category-related data, syncing with external systems, or performing additional validations.
- Create events.xml in your custom module:
app/code/Vendor/Module/etc/adminhtml/events.xml
<?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_category_save_after">
<observer name="vendor_module_category_save" instance="Vendor\Module\Observer\CategorySaveObserver" />
</event>
</config>
- Create the Observer class:
app/code/Vendor/Module/Observer/CategorySaveObserver.php
<?php
namespace Vendor\Module\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Event\Observer;
class CategorySaveObserver implements ObserverInterface
{
public function execute(Observer $observer)
{
$category = $observer->getEvent()->getCategory();
$categoryName = $category->getName();
$categoryId = $category->getId();
// Example: Log category updates
file_put_contents(BP . '/var/log/category_save.log', "Category #$categoryId saved: $categoryName\n", FILE_APPEND);
}
}
With these examples, developers can see how to connect an event to custom logic. The same approach applies to hundreds of Magento 2 core events listed in the table above.
Magento 2's event-driven architecture provides developers with a flexible way to extend functionality without modifying core code. By observing events, you can implement custom logic for a wide range of scenarios, from checkout and order processing to product management and customer interactions.
Here are some best practices and tips when working with events:
- Focus on core events first: Always use core Magento 2 events for standard workflows. Avoid modifying core files.
- Use descriptive observer names: When defining observers in
events.xml, choose names that clearly indicate their purpose. - Keep observers lightweight: Avoid heavy computations inside observers. Offload intensive tasks to cron jobs or asynchronous processes when possible.
- Debugging: Use logging (e.g.,
var/log) or Xdebug to ensure your observer is triggered as expected. - Test in a safe environment: Always test new observers on a development or staging site before deploying to production.
- Reuse existing events: Before creating custom events, check if a core event already covers your needs.
By combining the full list of Magento 2 core events with practical examples, you now have a solid reference to develop maintainable, scalable, and robust customizations. Understanding how and when to use these events will greatly improve your efficiency as a Magento 2 developer.
