Spree 6.0.3
A patch release for Spree 6.0. PayPal is back as an official payment provider that ships with Spree, AI agents connected to your store can now run every back-office action the Admin API offers, product lists show stock totals, and saving a product no longer drops categories or tags added elsewhere.
npx spree upgrade✨ New features
- PayPal for Spree 6. The
spree_paypal_checkoutgem now ships with Spree at the same version. It offers PayPal, Pay Later, Venmo and guest card payments in PayPal's window, honors your capture setting, and registers its own webhooks, so you only enter a client id and secret. Add it withspree add paypal. #15031 by @mad-eel - AI agents can run every back-office action. Agents connected through the MCP server or the dashboard assistant can now approve returns, claims and exchanges, clone products, resend invitations and run every other Admin API action, with no extra setup. They can also reach records nested under another one, such as an order's items or a promotion's rules, and set up promotions with rules and actions. #15086 #15094 #15079
- Agents ask for approval only where it matters. Uploading a file, starting an import or creating an export is no longer flagged as destructive, so agent apps can treat them as safe while still asking before deletes, refunds and other changes. #15107
- Activate, archive or draft one product through the API. New Admin API endpoints move a single product's status and send the matching product event, so webhook subscribers hear about the change. #15092
🧭 Admin dashboard improvements
- Stock totals on product lists. The admin products list and the seller panel's products list show each product's units in stock across all its variants. The Admin and Seller APIs return the same figure as
total_on_hand. #15106 #15109 - Category mapper preview. The Sellers section shows where the Spree Enterprise page for mapping each seller's own categories to your marketplace's categories will appear once installed. #15111 by @mad-eel
🐛 Bug fixes
- Saving a product keeps the categories, collections and tags added after the page was opened, from another tab, a bulk action or an import. #15111 by @mad-eel
- The admin dashboard works when opened over plain HTTP at an address other than
localhost, such as a server's IP address; saving no longer fails with "crypto.randomUUID is not a function". #15087 - A signed-in customer subscribing to the newsletter with their own email in different letter case is subscribed straight away, without a confirmation email. #15115
- Changing a product's status from two places at once sends one product event, not two. #15097
- The translations dialog keeps the paragraphs and line breaks of the original text. #15066
- Addresses keep the original letter case of their company name when the app encrypts that field. #15102 by @mad-eel
- Removing a product from carts no longer fails for a cart that was checked out in the meantime. #15082
- An address the geocoder cannot find is reported as a warning instead of an error. #15100
⬆️ Upgrading from 5.6
- Stores that take PayPal on 5.6 can now upgrade to 6.0. The 5.6 → 6.0 upgrade adds two optional steps:
migrate_paypal_paymentsgives existing PayPal payments the 6.0 shape, andregister_paypal_webhookssets up each payment method's webhook. A store already on 6.0 runs them by name withspree upgrade --step <name>; the PayPal section of the upgrade guide has the details. #15031 by @mad-eel
🛠 Developer experience
- Typelizer 0.14.
spree_apinow requires Typelizer~> 0.14.0. Update it together with Spree (bundle update spree typelizerif you update by hand). Typelizer no longer readsDISABLE_TYPELIZERorENABLE_TYPELIZER; Spree sets the newTYPELIZERswitch itself, so remove the old variables. #15114 - Ruby 4.0.
spree_corenow depends onostruct, so apps on Ruby 4.0 boot without adding it themselves. #15099 - SDK extensions.
client.extend()withdefineStoreExtension,defineAdminExtensionordefineSellerExtensionadds a typed namespace for an extension's own endpoints to an SDK client, sharing its auth, locale and retries. The newspree sdk generatecommand in@spree/cliwrites that client from the extension's OpenAPI document. #15113 - Document an extension's Admin API. The rswag helpers now ship in
spree_api(Spree::Api::TestingSupport::Openapi.configure,admin_operation), andrake spree:openapi:generatewrites an extension's ownopenapi/admin.yamlwith only its own filter tables. Its operations become agent tools like core's. #15095 #15116 - Extension hooks.
Spree::Dependencies.registerlets an extension put its own workflows behind a key a store can swap;Spree.cart_copierscopies an extension's cart records onto the order a cart becomes; and theorders.complete.validatehook can refuse an order's placement under its row lock. #15112 #15078 #15075 spree add paypalinstallsspree_paypal_checkoutat your project's Spree version or newer. This is the first Spree 6 release of the gem, so a project on 6.0.0 to 6.0.2 upgrades Spree to 6.0.3 first. #15031 by @mad-eel
📚 Documentation
- The Docker deployment guide explains how published ports bypass host firewalls and how to keep the database and cache private, and mounts the Postgres 18 data volume where the image expects it. #15088 #15081
- The Admin API reference documents ten more actions, payments'
can_voidandcan_capture, and the digital link endpoint. #15093 #15072
📦 Package versions
| Package | Version |
|---|---|
| Spree gems | 6.0.3
|
@spree/sdk, @spree/admin-sdk, @spree/seller-sdk, @spree/core
| 6.0.3
|
@spree/dashboard, @spree/dashboard-core, @spree/dashboard-ui, @spree/seller-dashboard
| 6.0.3
|
@spree/cli
| 3.6.3
|
create-spree-app
| 2.4.2 (unchanged)
|
Full Changelog: v6.0.2...v6.0.3