Skip to main content
Estimated Upgrade Time: 15 to 45 minutes depending on how much you customized auth models and event listeners.

Updating Dependencies

You should update the following dependencies in your application’s composer.json file: shopper/framework to ^2.6 shopper/stripe to ^2.6 (If installed) Then run:
After updating, run the migrations:
v2.6 ships one new package: shopper/cart. The tax system is built into shopper/core. Both are included in shopper/framework and installed automatically. Their migrations run with the standard php artisan migrate command.

High Impact Changes

Auth Models and Traits Moved from Core to Admin

Likelihood of Impact: High Affects applications that import Role, Permission, ShopperUser, or HasProfilePhoto directly. The Role and Permission models, the ShopperUser and HasProfilePhoto traits, and the spatie/laravel-permission dependency have all moved from shopper/core to shopper/admin. If you import any of these directly in your application code, update the namespaces: The old namespaces are still present in shopper/core as deprecated aliases and will continue to work until v3.0, but you should migrate at your earliest convenience. The role configuration has also moved. If you referenced the admin role from config/shopper/core.php, update to config/shopper/admin.php:

Before (v2.5)

After (v2.6)


Medium Impact Changes

New Migrations

v2.6 adds 15 new migrations across two packages. Run php artisan migrate after updating. Tax system (shopper/core): Cart package (shopper/cart): Performance (shopper/admin):

Order and Product Event Renaming

Likelihood of Impact: Medium Affects applications with listeners registered for OrderCancel or AddNoteToOrder events. Two events have been renamed for consistency. If you registered listeners for either of these events, update your EventServiceProvider:

Before (v2.5)

After (v2.6)

Render Hooks: Enum Replaced by Scoped Classes

Likelihood of Impact: Medium Affects applications that registered render hooks using the RenderHook enum in v2.5. The RenderHook enum (Shopper\Enum\RenderHook) from v2.5 had 6 layout-level hooks. It has been replaced by seven scoped classes organized by business domain. If you used any of these hooks, update to LayoutRenderHook: The new classes are in the Shopper\View namespace. See the Render Hooks documentation for the complete list of available hooks across all 7 scoped classes.

Before (v2.5)

After (v2.6)


Low Impact Changes

allow_backorder Column Added to Products

A new boolean column allow_backorder has been added to the products table. It defaults to false. No action is required, the migration handles it automatically. When allow_backorder is true on a product or variant, the cart’s add() and update() methods skip the stock availability check entirely, allowing the item to be added regardless of inventory level.

user_id Nullable on Inventory Histories

The user_id foreign key on the inventory_histories table is now nullable. This accommodates stock changes triggered by automated processes rather than an admin action. No action is required.

System Permissions Cleanup

Three system permissions have been removed from the seeder and are no longer created on fresh installations: For existing installations these permissions remain in your database but have no effect. You can delete them manually if you want to keep your permissions table clean:

Server-Side Authorization Enforced Across Admin Components

Likelihood of Impact: Medium Affects applications with custom roles beyond the default administrator role. All admin Livewire pages and slide-overs now enforce permissions server-side via $this->authorize(). Previously, many components relied only on sidebar visibility to restrict access, so a direct URL or Livewire call was enough to bypass the check. The following table lists every area that is now protected and the permission required: The administrator role is not affected as it holds all permissions by default. For custom roles, assign the relevant permissions before upgrading:
Review all custom roles in your installation and assign the permissions appropriate to their scope before upgrading. Users with insufficient permissions will receive a 403 response.

Shopper Enums Now Implement Shopper\Core\Contracts

Shopper’s internal enums (OrderStatus, ProductType, etc.) now implement HasLabel, HasIcon, HasColor, and HasDescription from Shopper\Core\Contracts instead of Filament\Support\Contracts. This removes the Filament dependency from shopper/core and keeps the core package framework-agnostic. This has no impact on your application. Since Shopper runs on top of Filament, your own custom enums can continue to implement either Filament\Support\Contracts or Shopper\Core\Contracts. The method signatures are identical.

New Features

Cart Package

shopper/cart is now bundled with Shopper. It provides a full cart management system with pipeline-based calculation, discount validation, tax integration, and order conversion. See the Cart documentation for setup and usage.

Tax System

A built-in tax system is now available. Configure tax zones per country (or country + province), assign rates, and define override rules for specific products, product types, or categories. Taxes are calculated automatically in the cart pipeline. See the Taxes documentation for full details.

Dashboard Analytics

The dashboard now includes five new Livewire components: a 12-month revenue bar chart, stat cards with month-over-month trends, a recent orders table, a top-selling products table, and an interactive setup guide. All data is cached with stale-while-revalidate semantics. See the Dashboard documentation.

Abandoned Carts

A new admin page at Orders → Abandoned Carts lists carts that have been inactive for longer than the configured threshold (default: 60 minutes). The threshold is configurable in config/shopper/cart.php:

Addon System

Shopper now has a first-class addon API for packaging extensions. An addon can register routes, Livewire components, sidebar entries, views, settings items, and permissions as a single unit. See the Addons documentation.

Render Hooks

62 named render hooks are now available across all admin pages. Use them to inject content into specific positions without modifying any Shopper views. See the Render Hooks documentation.

Migration Checklist

1

Update dependencies

Run composer update -W after updating shopper/framework to ^2.6.
2

Run migrations

Run php artisan migrate to apply all 15 new migrations.
3

Update auth model namespaces

Replace Shopper\Core\Models\RoleShopper\Models\Role and Shopper\Core\Models\PermissionShopper\Models\Permission wherever you import them.
4

Update auth trait namespaces

Replace Shopper\Core\Traits\ShopperUserShopper\Traits\InteractsWithShopper and Shopper\Core\Models\Traits\HasProfilePhotoShopper\Traits\HasProfilePhoto.
5

Update renamed events

Replace OrderCancelOrderCancelled and AddNoteToOrderOrderNoteAdded in your event listeners.
6

Update render hooks

Replace the old RenderHook enum constants with the new scoped class constants if you used render hooks in v2.5.
7

Update role config key

Replace config('shopper.core.users.admin_role') with config('shopper.admin.roles.admin') if you referenced it directly.
8

Review custom role permissions

Assign access_setting, view_users, edit_attributes, edit_products, edit_product_variants, edit_collections, edit_categories, edit_orders, browse_reviews, and browse_tags to any custom role that should access the corresponding areas. Optionally delete the unused manage_mail, impersonate, and setting_analytics permissions from your database.