v2.3.6: Split order payments, rich text descriptions & sidebar
In Mercur v2.3.6, split orders finally get payments of their own, so refunds and cancellations work through the stock Medusa routes. Product descriptions get a rich text editor, and the sidebar collapses to an icon rail. Medusa is bumped to 2.21.2, and the workspace moves to zod 4, plus a long list of new extension points and fixes.
What's New
Split order payments
When a cart's payment is captured, it is now split: every seller order gets its own payment collection with a captured payment for its share, pointing at the same charge. Refunding and canceling a split order work through the stock Medusa routes and workflows, capped at the order's share. Canceling before capture leaves the authorization for the cart's other orders. Orders captured before this release are not split retroactively.
Rich text descriptions
Product descriptions can mix formatted text and images. RichTextEditor and the RichText renderer ship in @mercurjs/dashboard-shared and are used across product create, edit, and detail in both panels. Descriptions are sanitized on write and on the storefront; existing plain-text descriptions keep working, and there is no migration.
Sidebar
The sidebar collapses to an icon rail with tooltips instead of disappearing, and useSidebar / useCollapsedSidebar let a page drive it. _navigation.ts gains a groups API, so you can declare groups and assign items to them in both the main and settings sidebars.
Registration and invitations
A plugin can add fields to the vendor register and invite forms and act on them on the server: createSellerAccountWorkflow gets a validate hook, and acceptMemberInviteWorkflow gets validate and memberInviteAccepted, with additional_data accepted on invite acceptance. Plugin vendor routes exporting AUTHENTICATE = false now skip vendor auth.
Admin & Vendor Panel
- Added tabs on the admin store detail page via
stores.detail.tabs.*, with a label ondefineWidgetConfig. - Added
topbar.beforeandtopbar.afterwidget zones in both panels. - Added a per-card
locations.list.itemwidget zone on the locations list. - Made custom-fields list filters able to replace or remove built-in filters.
Core
- Added
paymentCapturedandpaymentRefundedhooks on the capture and refund workflows, plusreturnReceivedandcommissionLinesUpserted. - Added a
payoutCreatedhook oncreatePayoutWorkflow. - Added a
fulfillmentDeliveredhook onmarkOrderFulfillmentAsDeliveredWorkflow. - Made offer inventory items inherit the variant's shipping and customs attributes.
What's Changed
Admin & Vendor Panel
- Removed the built-in notifications bell (breaking) –
Notificationsis no longer exported from@mercurjs/adminor@mercurjs/vendor, and the Cmd/Ctrl+N shortcut is gone. Register your own widget on the newtopbar.afterzone instead. - Moved both panels to bearer-token sign-in (breaking) – the cookie session is dropped, so everyone is logged out once after upgrading. Custom page clients should send
getAuthHeaders()from@mercurjs/admin/@mercurjs/vendorinstead ofcredentials: 'include'. - Routed admin product delete through the change pipeline (breaking) –
DELETE /admin/products/:idnow returns an error when the product has a pending product change.
Core
- Bumped Medusa to 2.21.2 and moved the workspace to zod 4 (breaking) – every
@medusajs/*pin moves to 2.21.2, and in your own validators, single-argumentz.record(value)must becomez.record(key, value). - Made deleting a product soft-delete its seller offers.
- Gave
PayoutAccount.dataa default – run migrations before upgrading.
What's Fixed
Admin & Vendor Panel
- Kept admin and vendor logins independent when both panels share one API host.
- Restored dropped placeholders and
Transtags in admin and vendor locales. - Stopped showing a published, allowlisted product to its creator once it is restricted to other stores.
- Forwarded order list filters to the API.
- Used the outline star for the vendor reviews sidebar item.
- Kept order group
seller_countand total independent of list filters, and made sorting bydisplay_idwork.
Core
- Returned the existing order group when a cart is completed again, instead of placing duplicate orders.
- Preserved other sellers' prices when one seller updates an offer price.
- Restored Medusa middleware on product routes Mercur does not override, fixing 500s on variant batch, options, and product-variant routes.
- Applied Medusa patches on import, so blocks imported in
medusa-config.tssee the patched workflows. - Returned a proper 400 instead of a 500 when a payout account is created without data.
Storefront
- Detected Medusa's Stripe card provider.
- Self-hosted the Funnel Display font.
Other
- Scaffolded new projects from the template of the pinned release tag, so
create-mercur-appno longer produces projects that fail to boot. - Resolved the local CLI directly for codegen, removing the slow
npxon every boot in monorepos. - Resolved the repository root dynamically in the dev scripts.
- Bumped
sanitize-htmlto 2.17.7.
More product updates
Ready to build?
Read the release notes, then see the product – open the demo, or book a walkthrough on your terms.


