Skip to content

Event Listeners

Event Listeners in Bagisto provide a powerful way to extend and customize the platform's functionality without modifying core code. Bagisto uses Laravel's event system with string-based event dispatching, making it simple to hook into various points in the application lifecycle.

This advanced guide covers how to implement comprehensive event-driven architecture in your Bagisto applications, including listening to core events, creating custom events, and building reactive systems.

What You'll Learn

Understanding Bagisto's Event System

Bagisto dispatches events throughout its operations using string identifiers. This approach allows for:

  • Loose Coupling: Components can communicate without direct dependencies
  • Extensibility: Third-party packages can hook into core functionality
  • Maintainability: Changes can be made without affecting existing code
  • Scalability: Event-driven architecture supports complex business logic

Dispatching Events

Events are dispatched using Event::dispatch() with string identifiers:

php
<?php

namespace Webkul\RMA\Http\Controllers;

use Illuminate\Support\Facades\Event;
use Webkul\Admin\Http\Controllers\Controller;

class RMAController extends Controller
{
    public function processReturnRequest()
    {
        // Dispatch before event
        Event::dispatch('rma.return.request.before', request()->all());

        // Perform main operation - create return request
        $returnRequest = $this->createReturnRequest();

        // Dispatch after event with result
        Event::dispatch('rma.return.request.created', $returnRequest);

        return response()->json(['status' => 'success', 'data' => $returnRequest]);
    }
}

Event Naming Convention

Follow Bagisto's hierarchical naming convention for consistency:

Event TypePatternExampleUse Case
Core Events{module}.{entity}.{action}.{timing}catalog.product.create.afterBuilt-in Bagisto operations
Package Events{package}.{feature}.{action}.{timing}rma.return.request.createdCustom package functionality
Integration Events{system}.{integration}.{action}.{status}payment.paypal.transaction.failedThird-party integrations

Event Naming Best Practices:

php
// ✅ Good - Clear and descriptive
Event::dispatch('rma.return.request.created', $returnRequest);
Event::dispatch('rma.return.item.approved', $returnItem);
Event::dispatch('rma.refund.processed', $refund);

// ❌ Avoid - Vague or inconsistent
Event::dispatch('rma.something.happened', $data);
Event::dispatch('return_created', $return);

Creating Event Listeners

To create an event listener in Bagisto, you need to define a listener class with a method that will handle the event. This method receives the event data as its argument. You can then register this listener to respond to specific events, allowing you to execute custom logic whenever those events are fired.

Let's say you are having a package like RMA (Return Merchandise Authorization) or some other name - let's use RMA for this practical example. This RMA package would listen to order events to manage returns effectively.

Package Development Reference

If you want to build a package, check out our Package Development Guide where we have shown how to build an RMA package step by step. This guide covers the basics of creating packages, service providers, and directory structure before implementing event listeners.

Basic Event Listener

In an RMA package, you would have an event listener to handle order events:

php
<?php

namespace Webkul\RMA\Listeners;

use Illuminate\Support\Facades\Log;

class RMAOrderListener
{
    public function handleOrderCreated($order): void
    {
        // Create RMA eligibility record for the order
        Log::info('Order created - checking RMA eligibility', ['order_id' => $order->id]);
        
        // Check if order items are eligible for returns
        $this->createRMAEligibilityForOrder($order);
    }

    public function handleOrderStatusUpdate($order): void
    {
        // Update RMA status based on order status changes
        if ($order->status === 'delivered') {
            $this->activateReturnWindow($order);
        }
    }

    private function createRMAEligibilityForOrder($order): void
    {
        // Implementation logic for RMA eligibility
    }

    private function activateReturnWindow($order): void
    {
        // Start 30-day return window
    }
}
Method Explanations
  • handleOrderCreated(): Creates RMA eligibility records when new orders are placed
  • handleOrderStatusUpdate(): Manages RMA status changes based on order status
  • createRMAEligibilityForOrder(): Business logic for determining return eligibility
  • activateReturnWindow(): Starts the countdown for return requests

Event Service Provider

In your RMA package, you would register the listeners in the EventServiceProvider:

php
<?php

namespace Webkul\RMA\Providers;

use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use Webkul\RMA\Listeners\RMAOrderListener;

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event handler mappings for the application.
     *
     * @var array<string, array<int, array<int, string>>>
     */
    protected $listen = [
        // Listen to core Bagisto order events
        'checkout.order.save.after' => [
            [RMAOrderListener::class, 'handleOrderCreated'],
        ],

        'sales.order.update-status.after' => [
            [RMAOrderListener::class, 'handleOrderStatusUpdate'],
        ],
    ];
}

Modern Event Registration

The [ClassName::class, 'method'] syntax is the modern Laravel approach for registering event listeners. This provides better IDE support and refactoring capabilities compared to string-based registration.

RMA Package Registration

Your package may not have an EventServiceProvider initially. If so, you would need to register the EventServiceProvider in the package's main service provider:

php
// In Webkul\RMA\Providers\RMAServiceProvider
public function register(): void
{
    $this->app->register(EventServiceProvider::class);
}

This ensures all your RMA event listeners are properly loaded when the package is installed.

Advanced Event Patterns

Advanced event patterns in Bagisto allow you to build more flexible and modular systems. You can chain events, trigger custom events from listeners, and even use queued listeners for asynchronous processing. This enables you to decouple business logic, improve maintainability, and handle complex workflows such as notifications, analytics, or integrations with external services.

Multiple Listeners for Single Event

You can register multiple listeners for the same event to separate concerns:

php
protected $listen = [
    'checkout.order.save.after' => [
        [RMAOrderListener::class, 'handleOrderCreated'],
        [NotificationListener::class, 'sendOrderConfirmation'],
        [InventoryListener::class, 'updateStockLevels'],
        [AnalyticsListener::class, 'trackOrderMetrics'],
    ],
];

Event Priority and Ordering

Listeners execute in the order they're registered. Place critical listeners first:

php
protected $listen = [
    'sales.order.update-status.after' => [
        // Critical: Update RMA status first
        [RMAStatusListener::class, 'updateReturnEligibility'],
        // Secondary: Send notifications
        [NotificationListener::class, 'notifyCustomer'],
    ],
];

Practical Example: Complete RMA Integration

Here's a complete example showing how to integrate RMA functionality using event listeners:

php
<?php

namespace Webkul\RMA\Listeners;

use Webkul\RMA\Services\RMAService;
use Illuminate\Support\Facades\Log;

class RMAOrderListener
{
    public function __construct(
        private RMAService $rmaService
    ) {}

    public function handleOrderCreated($order): void
    {
        try {
            $this->rmaService->createEligibilityRecords($order);
            
            Log::info('RMA eligibility created for order', [
                'order_id' => $order->id,
                'customer_id' => $order->customer_id
            ]);
        } catch (\Exception $e) {
            Log::error('Failed to create RMA eligibility', [
                'order_id' => $order->id,
                'error' => $e->getMessage()
            ]);
        }
    }

    public function handleOrderDelivered($order): void
    {
        $this->rmaService->activateReturnWindow($order);
        
        // Dispatch custom RMA event
        event('rma.return.window.activated', $order);
    }
}
php
<?php

namespace Webkul\RMA\Providers;

use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use Webkul\RMA\Listeners\RMAOrderListener;

class EventServiceProvider extends ServiceProvider
{
    protected $listen = [
        // Core Bagisto events
        'checkout.order.save.after' => [
            [RMAOrderListener::class, 'handleOrderCreated'],
        ],
        
        'sales.order.update-status.after' => [
            [RMAOrderListener::class, 'handleOrderDelivered'],
        ],
        
        // Custom RMA events
        'rma.return.window.activated' => [
            [RMANotificationListener::class, 'sendReturnEligibilityEmail'],
        ],
    ];
}

Best Practices

By following best practices, you can ensure your event-driven code is robust, easy to extend, and integrates smoothly with both core and custom features.

Performance Considerations

Keep these performance guidelines in mind when implementing event listeners:

  • Keep listeners lightweight: Avoid heavy computations in event listeners
  • Use queues for heavy operations: Dispatch time-consuming tasks to background queues
  • Handle exceptions gracefully: Wrap listener logic in try-catch blocks
  • Log important events: Use structured logging for debugging and monitoring

Event Naming Guidelines

Follow these naming conventions for consistent and maintainable event-driven architecture:

  • Use consistent hierarchical patterns (module.entity.action.timing)
  • Fire both before and after events for major operations
  • Include descriptive action names (created, updated, deleted)

Data Handling Best Practices

Ensure robust data management in your event listeners:

  • Validate event data before processing
  • Pass relevant context in event payloads
  • Avoid circular event dependencies

Error Handling Strategies

Implement comprehensive error handling to maintain system stability:

  • Implement proper exception handling in listeners
  • Log errors with sufficient context for debugging
  • Consider fallback mechanisms for critical operations

Example Error Handling:

php
public function handleOrderCreated($order): void
{
    try {
        $this->createRMAEligibilityForOrder($order);
    } catch (\Exception $e) {
        Log::error('Failed to create RMA eligibility', [
            'order_id' => $order->id,
            'error' => $e->getMessage(),
            'trace' => $e->getTraceAsString()
        ]);
        
        // Don't break the order creation process
        // Consider alternative handling or notification
    }
}

Available Bagisto Events

The following table lists the core events available in Bagisto that you can listen to:

Events NameFunctionalityArguments
catalog.attribute.create.beforeThis event will be fired before attribute gets created.-
catalog.attribute.create.afterThis event will be fired after attribute gets created.attribute
catalog.attribute.update.beforeThis event will be fired before attribute gets updated.-
catalog.attribute.update.afterThis event will be fired after attribute gets updated.$attribute
catalog.attribute.delete.beforeThis event will be fired before attribute gets deleted.$id
catalog.attribute.delete.afterThis event will be fired after attribute gets deleted.$id
catalog.attribute_family.create.beforeThis event will be fired before attribute family gets created.-
catalog.attribute_family.create.afterThis event will be fired after attribute family gets created.attribute_family
catalog.attribute_family.update.beforeThis event will be fired before updating attribute family.$id
catalog.attribute_family.update.afterThis event will be fired after updating attribute family.$attributeFamily
catalog.attribute_family.delete.beforeThis event will be fired before deleting attribute family.$id
catalog.attribute_family.delete.afterThis event will be fired after deleting attribute family.$id
catalog.category.create.beforeThis event will be fired before creating category.-
catalog.category.create.afterThis event will be fired after creating category.$category
catalog.category.update.beforeThis event will be fired before updating category.$id
catalog.category.update.afterThis event will be fired after updating category.$category
catalog.category.delete.beforeThis event will be fired before deleting category.$id
catalog.category.delete.afterThis event will be fired after deleting category.$id
catalog.categories.mass-update.beforeThis event will be fired before bulk category update.$categoryId
catalog.categories.mass-update.afterThis event will be fired after bulk category update.$category
catalog.product.create.beforeThis event will be fired before product gets created.-
catalog.product.create.afterThis event will be fired after product gets created.$product
catalog.product.update.beforeThis event will be fired before product gets updated.$id
catalog.product.update.afterThis event will be fired after product gets updated.$product
catalog.product.delete.beforeThis event will be fired before product gets deleted.$id
catalog.product.delete.afterThis event will be fired after product gets deleted.$id
products.datagrid.syncThis event will be fired to synicing datagrid product.true
cms.page.create.beforeThis event will be fired before cms page gets created.-
cms.page.create.afterThis event will be fired after cms page gets created.$page
cms.page.update.beforeThis event will be fired before cms page gets updated.$id
cms.page.update.afterThis event will be fired after cms page gets updated.$page
cms.page.delete.beforeThis event will be fired before cms page gets deleted.$id
cms.page.delete.afterThis event will be fired after cms page gets deleted.id
customer.addresses.create.beforeThis event will be fired before customer address gets created.-
customer.addresses.create.afterThis event will be fired after customer address gets created.$address
customer.addresses.update.beforeThis event will be fired before customer address gets updated.$id
customer.addresses.update.afterThis event will be fired after customer address gets updated.$address
customer.addresses.delete.beforeThis event will be fired before customer address gets deleted.$id
customer.addresses.delete.afterThis event will be fired after customer address gets deleted.$id
customer.registration.beforeThis event will be fired before customer gets created.-
customer.registration.afterThis event will be fired after customer gets created.-
customer.update.beforeThis event will be fired before customer gets updated.$id
customer.update.afterThis event will be fired after customer gets updated.$customer
customer.password.update.afterThis event will be fired after customer password gets updated.$customer
customer.note.create.beforeThis event will be fired before customer note gets created.$id
customer.note.create.afterThis event will be fired after customer note gets created.$customerNote
customer.subscription.beforeThis event will be fired before customer gets subscription.-
customer.subscription.afterThis event will be fired after customer gets subscription.$subscription
customer.after.loginThis event will be fired after customer login.auth()->guard()->user()
customer.delete.beforeThis event will be fired before customer gets deleted.$customer
customer.delete.afterThis event will be fired after customer gets deleted.$customer
customer.customer_group.create.beforeThis event will be fired before customer group gets created.-
customer.customer_group.create.afterThis event will be fired after customer group gets created.$customerGroup
customer.customer_group.update.beforeThis event will be fired before customer group gets updated.$id
customer.customer_group.update.afterThis event will be fired after customer group gets updated.$customerGroup
customer.customer_group.delete.beforeThis event will be fired before customer group gets deleted.$id
customer.customer_group.delete.afterThis event will be fired after customer group gets deleted.$id
customer.review.update.beforeThis event will be fired before customer review gets updated.$id
customer.review.update.afterThis event will be fired after customer review gets updated.$review
customer.review.delete.beforeThis event will be fired before customer review gets deleted.$id
customer.review.delete.afterThis event will be fired after customer review gets deleted.$id
customer.account.gdpr-request.create.beforeThis event will be fired before gdpr request created.-
customer.gdpr-request.create.afterThis event will be fired after gdpr request created.$gdprRequest
customer.account.gdpr-request.update.beforeThis event will be fired before gdpr request updated.-
customer.account.gdpr-request.update.afterThis event will be fired after gdpr request updated.$gdprRequest
customer.gdpr-request.update.afterThis event will be fired after gdpr request updated.$gdprRequest
customer.gdpr-request.update.beforeThis event will be fired after gdpr request updated.-
marketing.search_seo.sitemap.create.beforeThis event will be fired before sitemaps gets created.-
marketing.search_seo.sitemap.create.afterThis event will be fired after sitemaps gets created.$sitemap
marketing.search_seo.sitemap.update.beforeThis event will be fired before sitemaps gets updated.$id
marketing.search_seo.sitemap.update.afterThis event will be fired after sitemaps gets updated.$sitemap
marketing.search_seo.sitemap.delete.beforeThis event will be fired before sitemaps gets deleted.$id
marketing.search_seo.sitemap.delete.afterThis event will be fired after sitemaps gets deleted.$id
marketing.search_seo.search_synonyms.create.beforeThis event will be fired before search synonyms created-
marketing.search_seo.search_synonyms.create.afterThis event will be fired after search synonyms created$searchSynonym
marketing.search_seo.search_synonyms.update.beforeThis event will be fired before synonyms gets updated.$id
marketing.search_seo.search_synonyms.update.afterThis event will be fired after synonyms gets updated.$searchSynonym
marketing.search_seo.search_synonyms.delete.beforeThis event will be fired before synonyms gets deleted.$id
marketing.search_seo.search_synonyms.delete.afterThis event will be fired before synonyms gets deleted.$id
marketing.search_seo.search_terms.create.beforeThis event will be fired before search search terms created-
marketing.search_seo.search_terms.create.afterThis event will be fired after search search terms created$searchTerm
marketing.search_seo.search_terms.update.beforeThis event will be fired before search search terms updated$id
marketing.search_seo.search_terms.update.afterThis event will be fired after search search terms updated$searchTerm
marketing.search_seo.search_terms.delete.beforeThis event will be fired before search search terms gets deleted$id
marketing.search_seo.search_terms.delete.afterThis event will be fired after search search terms gets deleted$id
marketing.search_seo.url_rewrites.create.beforeThis event will be fired before search url rewrites gets created-
marketing.search_seo.url_rewrites.create.afterThis event will be fired after search url rewrites gets created$urlRewrite
marketing.search_seo.url_rewrites.update.beforeThis event will be fired before search url rewrites gets updated$id
marketing.search_seo.url_rewrites.update.afterThis event will be fired after search url rewrites gets updated$urlRewrite
marketing.search_seo.url_rewrites.delete.beforeThis event will be fired before search url rewrites gets deleted$id
marketing.search_seo.url_rewrites.delete.afterThis event will be fired after search url rewrites gets deleted$id
marketing.campaigns.create.beforeThis event will be fired before campaigns gets created.-
marketing.campaigns.create.afterThis event will be fired after campaigns gets created.$campaign
marketing.campaigns.update.beforeThis event will be fired before campaigns gets updated.$id
marketing.campaigns.update.afterThis event will be fired after campaigns gets updated.$campaign
marketing.campaigns.delete.beforeThis event will be fired before campaigns gets deleted.$id
marketing.campaigns.delete.afterThis event will be fired after campaigns gets deleted.$id
marketing.events.create.beforeThis event will be fired before marketing event gets created.-
marketing.events.create.afterThis event will be fired after marketing event gets created.$event
marketing.events.update.beforeThis event will be fired before marketing event gets updated.$id
marketing.events.update.afterThis event will be fired after marketing event gets updated.$event
marketing.events.delete.beforeThis event will be fired before marketing event gets deleted.$id
marketing.events.delete.afterThis event will be fired after marketing event gets deleted.$id
marketing.templates.create.beforeThis event will be fired before templates gets created.-
marketing.templates.create.afterThis event will be fired after templates gets created. $template
marketing.templates.update.beforeThis event will be fired before templates gets updated.$id
marketing.templates.update.afterThis event will be fired after templates gets updated.$template
marketing.templates.delete.beforeThis event will be fired before templates gets deleted.$id
marketing.templates.delete.afterThis event will be fired after templates gets deleted.$id
promotions.cart_rule.create.beforeThis event will be fired before cart rule gets created.-
promotions.cart_rule.create.afterThis event will be fired after cart rule gets created.$cartRule
promotions.cart_rule.update.beforeThis event will be fired before cart rule gets updated.$id
promotions.cart_rule.update.afterThis event will be fired after cart rule gets updated.$cartRule
promotions.cart_rule.delete.beforeThis event will be fired before cart rule gets deleted.$id
promotions.cart_rule.delete.afterThis event will be fired after cart rule gets deleted.$id
promotions.catalog_rule.create.beforeThis event will be fired before catalog rule gets created.-
promotions.catalog_rule.create.afterThis event will be fired after catalog rule gets created.$catalogRule
promotions.catalog_rule.update.beforeThis event will be fired before catalog rule gets updated.$id
promotions.catalog_rule.update.afterThis event will be fired after catalog rule gets updated.$catalogRule
promotions.catalog_rule.delete.beforeThis event will be fired before catalog rule gets deleted.$id
promotions.catalog_rule.delete.afterThis event will be fired after catalog rule gets deleted.$id
sales.order.comment.create.beforeThis event will be fired before order comment gets created.-
sales.order.comment.create.afterThis event will be fired after order comment gets created.$comment
core.channel.create.beforeThis event will be fired before channel gets created.-
core.channel.create.afterThis event will be fired after channel gets created.$channel
core.channel.update.beforeThis event will be fired before channel gets updated.$id
core.channel.update.afterThis event will be fired after channel gets updated.$channel
core.channel.delete.beforeThis event will be fired before channel gets deleted.$id
core.channel.delete.afterThis event will be fired after channel gets deleted.$id
core.exchange_rate.create.beforeThis event will be fired before exchange rate gets created.-
core.exchange_rate.create.afterThis event will be fired after exchange rate gets created.
core.exchange_rate.update.beforeThis event will be fired before exchange rate gets updated.request()->id
core.exchange_rate.update.afterThis event will be fired after exchange rate gets updated.$exchangeRate
core.exchange_rate.delete.beforeThis event will be fired before exchange rate gets deleted.$id
core.exchange_rate.delete.afterThis event will be fired after exchange rate gets deleted.$id
inventory.inventory_source.create.beforeThis event will be fired before inventory source gets created.-
inventory.inventory_source.create.afterThis event will be fired after inventory source gets created.$inventorySource
inventory.inventory_source.update.beforeThis event will be fired before inventory source gets updated.$id
inventory.inventory_source.update.afterThis event will be fired after inventory source gets updated.$inventorySource
inventory.inventory_source.delete.beforeThis event will be fired before inventory source gets deleted.$id
inventory.inventory_source.delete.afterThis event will be fired after inventory source gets deleted.$id
user.role.create.beforeThis event will be fired before role gets created.-
user.role.create.afterThis event will be fired after role gets created.$role
user.role.update.beforeThis event will be fired before role gets updated.$id
user.role.update.afterThis event will be fired after role gets updated.$role
user.role.delete.beforeThis event will be fired before role gets deleted.$id
user.role.delete.afterThis event will be fired after role gets deleted.$id
theme_customization.create.beforeThis event will be fired before theme customization gets created.-
theme_customization.create.afterThis event will be fired after theme customization gets created.$id
theme_customization.update.beforeThis event will be fired before theme customization gets updated.$id
theme_customization.update.afterThis event will be fired after theme customization gets updated.$theme
theme_customization.delete.beforeThis event will be fired before theme customization gets deleted.$id
theme_customization.delete.afterThis event will be fired after theme customization gets deleted.$id
user.admin.create.beforeThis event will be fired before admin gets created.-
user.admin.create.afterThis event will be fired after admin gets created.$admin
user.admin.update.beforeThis event will be fired before admin gets updated.$id
user.admin.update.afterThis event will be fired after admin gets updated.$admin
admin.password.update.afterThis event will be fired after admin password gets updated.$admin
user.admin.delete.beforeThis event will be fired before admin gets deleted.$id
user.admin.delete.afterThis event will be fired after admin gets deleted.$id
tax.category.create.beforeThis event will be fired before tax category gets created.-
tax.category.create.afterThis event will be fired after tax category gets created.$taxCategory
tax.category.update.beforeThis event will be fired before tax category gets updated.$id
tax.category.update.afterThis event will be fired after tax category gets updated.$taxCategory
tax.category.delete.beforeThis event will be fired before tax category gets deleted.$id
tax.category.delete.afterThis event will be fired after tax category gets deleted.$id
tax.rate.create.beforeThis event will be fired before tax rate gets created.-
tax.rate.create.afterThis event will be fired after tax rate gets created.$taxRate
tax.rate.update.beforeThis event will be fired before tax rate gets updated.$id
tax.rate.update.afterThis event will be fired after tax rate gets updated.$taxRate
tax.rate.delete.beforeThis event will be fired before tax rate gets deleted.$id
tax.rate.delete.afterThis event will be fired after tax rate gets deleted.$id
checkout.cart.delete.beforeThis event will be fired before cart item gets deleted.$itemId
checkout.cart.delete.afterThis event will be fired after cart item gets deleted.$itemId
checkout.cart.add.beforeThis event will be fired before cart item gets created.$product->id
checkout.cart.add.afterThis event will be fired after cart item gets created.$this->cart
checkout.cart.update.beforeThis event will be fired before cart item gets updated.$item
checkout.cart.update.afterThis event will be fired after cart item gets updated.$item
checkout.cart.collect.totals.beforeThis event will be fired before collecting cart totals.$this->cart
checkout.cart.collect.totals.afterThis event will be fired after collecting cart totals.$this->cart
checkout.cart.calculate.items.tax.beforeThis event will be fired before calculating cart items tax.$this->cart
checkout.cart.calculate.items.tax.afterThis event will be fired after calculating cart items tax.$this->cart
core.configuration.save.beforeThis event will be fired before core configuration gets saved.-
core.configuration.save.afterThis event will be fired after core configuration gets saved.-
core.currency.create.beforeThis event will be fired before currency gets created.-
core.currency.create.afterThis event will be fired after currency gets created.$currency
core.currency.update.beforeThis event will be fired before currency gets updated.$id
core.currency.update.afterThis event will be fired after currency gets updated.$currency
core.currency.delete.beforeThis event will be fired before currency gets deleted.$id
core.currency.delete.afterThis event will be fired after currency gets deleted.$id
core.locale.create.beforeThis event will be fired before locale gets created.-
core.locale.create.afterThis event will be fired after locale gets created.$locale
core.locale.update.beforeThis event will be fired before locale gets updated.$id
core.locale.update.afterThis event will be fired after locale gets updated.$locale
core.locale.delete.beforeThis event will be fired before locale gets deleted.$id
core.locale.delete.afterThis event will be fired after locale gets deleted.$id
sales.invoice.save.beforeThis event will be fired before invoice gets saved.$data
sales.invoice.save.afterThis event will be fired after invoice gets saved.$invoice
checkout.order.save.beforeThis event will be fired before order gets saved.[$data]
checkout.order.save.afterThis event will be fired after order gets saved.$order
checkout.order.orderitem.save.beforeThis event will be fired before order item gets saved.$item
checkout.order.orderitem.save.afterThis event will be fired after order item gets saved.$orderItem
sales.order.cancel.beforeThis event will be fired before order gets canceled.$order
sales.order.cancel.afterThis event will be fired after order gets canceled.$order
sales.order.update-status.beforeThis event will be fired before order status gets updated.$order
sales.order.update-status.afterThis event will be fired after order status gets updated.$order
sales.refund.save.beforeThis event will be fired before order refund gets saved.$data
sales.refund.save.afterThis event will be fired after order refund gets saved.$refund
sales.shipment.save.beforeThis event will be fired before shipment gets saved.$data
sales.shipment.save.afterThis event will be fired after shipment gets saved.$shipment
checkout.load.indexThis event will be fired on checkout page load.-

Released under the MIT License.