npm @medusajs/medusa 2.17.0
v2.17.0

latest releases: 2.17.1-preview-20260624212801, 2.17.1-preview-20260624184849, 2.17.1-preview-20260624183104...
3 hours ago

Highlights

Global Product Options

🚧 Breaking change

Product options in Medusa can now be global — defined once at the store level and reusable across any number of products. Previously, options such as "Size" or "Color" had to be recreated independently for each product. With this release, you define an option once, attach it to as many products as you need, and manage values from a single place. This unlocks consistent variant modeling across large catalogs and reduces duplication when building storefront filters or admin tooling.

#13817

Read more in the announcement post.


Provider-Agnostic Auth Verification

🚧 Breaking change

Auth verification (email, phone, etc.) has been reworked into a flexible, provider-based system. You can now declare exactly which verifications are required per actor type and auth provider via the new authVerificationsPerActor config — for example, require email verification for customers using emailpass, but skip it for those signing in with Google. Codes are issued and confirmed through pluggable code providers, with a built-in token provider out of the box.

This is a breaking change:

  • The verification endpoints moved from POST /auth/:actor_type/:auth_provider/verification/request (and /confirm) to flat POST /auth/verification/request and POST /auth/verification/confirm. The request route is now authenticated and takes entity_id, entity_type, and code_provider in the body instead of actor/provider in the URL.
  • The JS SDK's auth verification methods were updated to match — upgrade the SDK and adjust any custom verification calls.
  • A database migration replaces the auth_verification_token table with a new auth_verification table. Run npx medusa db:migrate after upgrading; any pending (unconfirmed) verifications are discarded.

#15696


Medusa ESLint Plugin

A new @medusajs/eslint-plugin package ships with this release, bringing first-party linting rules for Medusa projects. The plugin covers API routes, subscribers, scheduled jobs, admin customizations, and module patterns. Lint runs automatically via the Medusa CLI when the plugin is installed:

npx medusa lint

Rules are grouped into config presets (recommended, modules, etc.) so you can opt in to the level of strictness that fits your project.

#15719
#15697
#15700
#15714
#15715
#15717

Features

Bugs

  • fix: handle bodyparser errors by @peterlgh7 in #15749
  • fix: Run linting by default if eslint plugin is installed by @sradevski in #15816
  • fix(medusa): update variant mutation endpoints query config to its retrieve query config by @NicolasGorga in #15735
  • fix(core-flows): include order shipping method names in tax context by @gaoflow in #15783
  • fix(dashboard): don't call hooks after an early return in UserLink by @merkelis-p in #15751
  • fix(dashboard): don't call useTranslation inside NavItem items.map() by @merkelis-p in #15750
  • fix(caching): invalidate list caches on entity update events by @imharjot in #15747
  • fix: log single error log line by @peterlgh7 in #15748
  • fix(medusa): maintain ESLint config detection behavior by @shahednasser in #15776
  • fix: Remove unused actor type in auth module by @sradevski in #15761
  • fix(eslint-plugin): handle link edge cases by @shahednasser in #15774
  • fix(eslint-plugin): fix and improve main config by @shahednasser in #15758
  • fix(eslint-plugin): fixes to avoid false positives by @shahednasser in #15743
  • fix(core-flows, loyalty-plugin, medusa): fix medusa lint errors by @shahednasser in #15732
  • fix(framework,medusa): surface real error and terminate process on db commands by @NicolasGorga in #15726
  • fix(loyalty-plugin): respect user locale in currency formatting by @adem-loghmari in #15725
  • fix(dashboard): feature flag rbac sidebar entries by @NicolasGorga in #15733
  • fix(dashboard): prevent URL param collision breaking pagination in price list add products modal by @Tusharkhadde in #15704
  • fix(pricing): return override as original_amount when a sale is stacked on an override by @cainydev in #15541
  • fix(framework): match build ignore list against path segments by @sapirbaruch in #15577
  • fix(core-flows): scope calculated shipping provider items to the option's shipping profile by @langovoi in #15163
  • fix(promotion): prevent negative taxable base when stacking promotions by @shafi-VM in #15532
  • fix(utils,dashboard): add GMD (Gambian Dalasi) to default currency lists by @kzroo in #15266
  • fix: Await onapplicationstart by @sradevski in #15786

Documentation

Chores

New Contributors

Full Changelog: v2.16.0...v2.17.0

Don't miss a new medusa release

NewReleases is sending notifications on new releases.