Estimated Upgrade Time: 30 to 90 minutes depending on how much storefront code interacts with monetary values.v2.7 ships with an AI-assisted upgrade package. Install it before upgrading to get guided migration prompts.
AI-Assisted Upgrade (Recommended)
Shopper v2.7 includesshopper/upgrade, a temporary package with Laravel Boost skills that guide your AI assistant through each breaking change.
| Skill | What it does |
|---|---|
shopper-upgrade-money-storage | Migrates storefront code to smallest currency unit |
shopper-upgrade-slide-overs | Migrates custom slide-over components |
shopper-upgrade-two-factor-auth | Migrates 2FA traits to SOLID interfaces |
shopper-upgrade-filament-schemas | Migrates InteractsWithForms to InteractsWithSchemas |
Updating Dependencies
Update the following dependencies in your application’scomposer.json file:
shopper/framework to ^2.7
shopper/stripe to ^2.7 (If installed)
Then run:
v2.7 requires Laravel 11.28+ or Laravel 12.x. If you are on an earlier Laravel 11 version, update Laravel first.
Filament minimum version is now 4.9.
High Impact Changes
Money Storage: Smallest Currency Unit
Likelihood of Impact: High Affects all applications that read or write monetary values (prices, orders, cart totals, payment gateway calls). This is the most critical change in v2.7. All monetary values are now stored and returned in the smallest currency unit (cents for USD/EUR/GBP, raw value for zero-decimal currencies like XAF/JPY). This follows the Stripe/Shopify standard. What changed: All Eloquent price accessors (get/set) have been removed fromOrder, OrderItem, Price, CarrierOption, CartLine, CartLineTaxLine, CartLineAdjustment, and Discount.
Reading prices
Model properties now return the raw database value (smallest unit) instead of human-readable values:1200 and 16300 respectively, not 12.00 and 163.00. For display, use shopper_money_format():
Writing prices
Pass the smallest unit directly — the setter no longer multiplies by 100:Cart pipeline
CartPipelineRunner no longer divides results by 100. All values are in cents:
Payment gateways
Values are already in cents — remove any manual multiplication:Zero-decimal currencies
If you use zero-decimal currencies (XAF, JPY, KRW, etc.), existing data was incorrectly multiplied by 100. Run the fix command:New helpers
Two new helpers are available:| Helper | Purpose |
|---|---|
zero_decimal_currencies() | Returns the list of zero-decimal currency codes |
is_no_division_currency($code) | Checks if a currency code is zero-decimal |
MoneyInput component
A new Filament form component handles the conversion between human values (form display) and smallest unit (database) automatically:Filament table columns
Replace->money() with the ->currency() macro:
Existing database data for standard currencies (USD, EUR, GBP) is already correct — the old setters stored values in cents. No migration needed for these currencies.
Slide-Over Components Replaced
Likelihood of Impact: High Affects applications with custom slide-over components extending Shopper’s base class. Shopper’s internalSlideOverComponent and SlideOverPanel classes have been removed and replaced by the laravelcm/livewire-slide-overs package.
If you created custom slide-over components that extend Shopper’s base class, update the import:
closePanelWithEvents() method no longer exists:
Medium Impact Changes
Two-Factor Authentication: SOLID Interfaces
Likelihood of Impact: Medium Affects applications that override the User model and use two-factor authentication. The monolithicTwoFactorAuthenticatable trait has been split into focused interfaces and traits:
$hidden array on your User model:
Filament HasForms to HasSchemas
Likelihood of Impact: Medium Affects applications with custom Filament components that useInteractsWithForms.
Shopper now uses InteractsWithSchemas instead of InteractsWithForms. If you have custom components in app/Shopper/ or app/Livewire/:
InteractsWithForms still works in Filament 4.x — this migration is recommended but not urgent.Dependency Version Bumps
Likelihood of Impact: Medium Affects all applications.| Dependency | Before | After |
|---|---|---|
laravel/framework | ^11.0|^12.0 | ^11.28|^12.0|^13.0 |
filament/filament | ^4.7 | ^4.9 |
spatie/laravel-permission | ^6.24 | ^6.24|^7.0 |
Low Impact Changes
InteractsWithSlideOverForm Trait
10 slide-over form components now use the sharedInteractsWithSlideOverForm trait and a generic Blade view. Their dedicated Blade views have been removed:
add-collection-form.blade.php, attribute-form.blade.php, brand-form.blade.php, category-form.blade.php, create-team-member.blade.php, discount-form.blade.php, supplier-form.blade.php, update-variant.blade.php
If you published and customized any of these views, you’ll need to adapt to the new generic view or override the component’s render() method.
Shipment Event Date Validation
Shipment events now enforce chronological ordering — you cannot create an event with a date earlier than the previous event. TheRecordShipmentEventAction validates this server-side.
Nested Sortable Categories
Categories can now be reordered with drag & drop in the admin panel. No code changes required.Collection Price Rules
Automatic collection price rules now filter by the shop’s default currency when evaluating products.New Features
Upgrade Package
shopper/upgrade is a new temporary package with Laravel Boost skills for AI-assisted upgrades and an artisan command for zero-decimal currency data fixes. Install it before upgrading, remove it after.
MoneyInput Component
A newMoneyInput Filament form component that handles currency-aware conversion between human values and smallest unit storage.
Migration Checklist
Install the upgrade package
Run
composer require shopper/upgrade:^2.7 --dev and php artisan boost:install to get AI-assisted migration prompts.Update storefront price reads
Replace direct price property access with
shopper_money_format() for display. Use raw values for calculations.Update storefront price writes
Pass values in smallest currency unit to all
create() / update() calls on monetary fields.Update payment gateway code
Remove any
* 100 multiplication before sending to Stripe or other providers.Fix zero-decimal currency data
Run
php artisan shopper:upgrade:fix-zero-decimal-currencies if you use XAF, JPY, or other zero-decimal currencies.Update slide-over imports
Replace
Shopper\Livewire\Components\SlideOverComponent with Laravelcm\LivewireSlideOvers\SlideOverComponent in any custom slide-overs.Update 2FA traits and hidden fields
Replace
TwoFactorAuthenticatable with the new interfaces and traits if you override the User model. Update your $hidden array to use store_two_factor_secret and store_two_factor_recovery_codes instead of the old column names.Run tests
Run
php artisan test and fix assertions that expect human-readable price values instead of cents.