Quick Reference
| What you want to do | Recommended approach |
|---|---|
| Change store settings (currency, zones, languages) | Store Settings |
| Tweak Spree behavior globally | Configuration |
| React to model changes (sync, notifications) | Events & Subscribers |
| Notify external services | Webhooks |
| Swap core services (cart, checkout, etc.) | Dependencies |
| Add admin menu items | Admin Navigation |
| Add sections to admin forms | Admin Partials |
| Add searchable/filterable fields | Ransack Configuration |
| Add associations/validations to models | Decorators (last resort) |
Store settings
Store settings
Best for: Changing currency, shipping zones, languages, and other business settings.There’s a lot of Store settings you can change in the admin panel without touching the code.Go to Admin > Settings

Configuration
Configuration
Best for: Tweaking Spree’s behavior globally without modifying source code.Global application configuration allows you to customize various aspects of Spree:Please see Configuration section for more information.
config/initializers/spree.rb
Events and Subscribers
Events and Subscribers
Best for: Reacting to model changes, syncing with external services, sending notifications, audit logging.Spree’s event system lets you subscribe to events like Key benefits:
Events are the recommended way to add behavior when something happens in Spree, replacing the need for decorator callbacks.
order.completed, product.updated, payment.paid, etc.:app/subscribers/my_app/order_completed_subscriber.rb
- Loose coupling - your code doesn’t depend on Spree internals
- Async by default - keeps requests fast
- Easier testing and upgrades
Webhooks
Webhooks
Best for: Notifying external services (ERPs, CRMs, fulfillment systems) when events occur.Webhooks send HTTP POST requests to external URLs when Spree events happen:
- Order completed → Notify fulfillment system
- Product updated → Sync with PIM
- Customer created → Add to CRM
Dependencies
Dependencies
Best for: Swapping core services, serializers, and abilities with your own implementations.Spree allows you to replace core classes without modifying them:This is cleaner than decorating services because you provide a complete replacement rather than patching behavior.Please see Dependencies section for more information.
config/initializers/spree.rb
Admin Extensions
Admin Extensions
Best for: Adding menu items, form sections, dashboard widgets, and other UI elements to the admin panel.Spree provides declarative APIs for extending the admin without decorators or view overrides:Navigation API - Add menu items:Partials API - Add sections to forms:Please see:
config/initializers/spree.rb
config/initializers/spree.rb
- Admin Navigation - For adding menu items
- Admin Partials - For extending UI
- Admin Tables - For customizing list views
Search and Filtering
Search and Filtering
Best for: Making custom fields searchable/sortable in the admin and API.Instead of decorating models to add Please see Search & Filtering section for more information.
ransackable_attributes, use the Ransack configuration API:config/initializers/spree.rb
Authentication
Authentication
Best for: Using your own user model or authentication system.Spree allows you to use your own authentication system instead of the default Devise-based one.You can find more information in the Authentication section.
Checkout flow
Checkout flow
Best for: Customizing checkout steps and flow.With Spree you can change the checkout flow to fit your business needs - add steps, remove steps, or change the order.Please see Checkout flow customization section for more information.
Decorators
Decorators
Best for: Adding associations, validations, scopes, and methods to Spree models. Use as a last resort.Decorators are still appropriate for structural changes:Please see Decorators section for more information.
app/models/spree/product_decorator.rb

