Skip to main content
Render hooks give you named injection points inside Shopper’s admin views. Instead of overriding templates, you register a callback on a hook name and Shopper renders your content in the right place at the right time. This is the recommended way to extend any admin page adding a custom banner to the order detail sidebar, inserting a widget above the product list, or injecting tracking scripts into the page head.

Registering a Hook

Hooks are registered on the ShopperPanel instance via the Shopper facade. The recommended place to register them is in the boot() method of your application’s service provider or in a dedicated extension service provider.
The callback receives no arguments and must return a string. You can return any HTML, a rendered Blade view, or a Livewire component tag.

Returning a Blade View

Returning a Livewire Component

Registering Multiple Hooks

You can chain multiple renderHook() calls on the same Shopper instance:
Multiple callbacks registered on the same hook are rendered in the order they were registered, concatenated together.

Disabling a Hook

Hooks registered from an addon respect the addon’s enabled state they are never registered when the addon is disabled. For application-level hooks, you can conditionally register them:

Available Hooks

Layout Hooks

LayoutRenderHook covers the global admin layout present on every page.

Product Hooks

ProductRenderHook targets the product list and product edit pages.

Order Hooks

OrderRenderHook targets the order list, order detail, shipments, and abandoned carts pages.

Customer Hooks

CustomerRenderHook targets the customer list and customer detail pages.

Collection Hooks

CollectionRenderHook targets the collection list and collection edit pages.

Catalog Hooks

CatalogRenderHook covers the catalog support pages: categories, brands, tags, attributes, and reviews.

Sales Hooks

SalesRenderHook covers the discounts and suppliers pages.

Example: Injecting an External Status Badge on Order Detail

A real-world scenario: your store syncs orders to a fulfillment service (ShipStation, ShipBob, etc.) and you want to display the external status directly on the order detail page, without modifying any Shopper files. Create a Livewire component:
Register the hook in your service provider:

Using Hook Constants vs. Raw Strings

Always use the class constants instead of raw hook name strings. They are checked by static analysis, will trigger IDE autocompletion, and won’t silently break if a hook name changes in a future release.