Skip to main content
Spree is a flexible platform allowing you to customize every part of it to suit your business needs. This guide presents customization options in order of recommendation - start from the top and only move down if simpler options don’t meet your needs.

Quick Reference

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 > SettingsSpree Admin Store Settings
Best for: Tweaking Spree’s behavior globally without modifying source code.Global application configuration allows you to customize various aspects of Spree:
config/initializers/spree.rb
Please see Configuration section for more information.
Best for: Reacting to model changes, syncing with external services, sending notifications, audit logging.
Events are the recommended way to add behavior when something happens in Spree, replacing the need for decorator callbacks.
Spree’s event system lets you subscribe to events like order.completed, product.updated, payment.paid, etc.:
app/subscribers/order_completed_subscriber.rb
Key benefits:
  • Loose coupling - your code doesn’t depend on Spree internals
  • Async by default - keeps requests fast
  • Easier testing and upgrades
Please see Events section for more information.
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
Configure webhooks in Admin > Developers > Webhooks or via the API.Please see Webhooks section for more information.
Best for: Swapping core services, serializers, and abilities with your own implementations.Spree allows you to replace core classes without modifying them:
config/initializers/spree.rb
This is cleaner than decorating services because you provide a complete replacement rather than patching behavior.Please see Dependencies section for more information.
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:
config/initializers/spree.rb
Partials API - Add sections to forms:
config/initializers/spree.rb
Please see:
Best for: Making custom fields searchable/sortable in the admin and API.Instead of decorating models to add ransackable_attributes, use the Ransack configuration API:
config/initializers/spree.rb
Please see Search & Filtering section for more information.
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.
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.
Best for: Adding associations, validations, scopes, and methods to Spree models. Use as a last resort.
Decorators should be used only when no other option works. They tightly couple your code to Spree internals and can break during upgrades.Do NOT use decorators for:
Decorators are still appropriate for structural changes:
app/models/spree/product_decorator.rb
Please see Decorators section for more information.