Skip to content

fix(core-flows): force cart refresh on updatePromotionsWorkflow when refreshing items#14569

Merged
shahednasser merged 4 commits intodevelopfrom
fix/recompute-shipping-promotion-item-refresh
Apr 9, 2026
Merged

fix(core-flows): force cart refresh on updatePromotionsWorkflow when refreshing items#14569
shahednasser merged 4 commits intodevelopfrom
fix/recompute-shipping-promotion-item-refresh

Conversation

@NicolasGorga
Copy link
Copy Markdown
Contributor

@NicolasGorga NicolasGorga commented Jan 17, 2026

Summary

What — What changes are introduced in this PR?

Guarantee that updateCartPromotionsWorkflow has the latest snapshot of the cart.

Why — Why are these changes relevant or necessary?

We were avoiding refetching the cart in updateCartPromotionsWorkflow, which doesn't cause issues unless:

  • You have a shipping option whose price depends on the cart context, like items. i.e Adding $X for each item in the cart.
  • You have an automatic promotion targeting shipping amount. i.e 100% off for carts with item_subtotal >= 100.

In this case, if we don't force the refresh inside the workflow, refreshCartShippingMethodsWorkflow runs and updates the shipping totals correctly, but we pass a cart object with stale data for the shipping totals and thus, adding/removing an item from the cart will compute the promotion based on the shipping total before the modification happened.

How — How have these changes been implemented?

Force the cart to be refreshed inside updateCartPromotionsWorkflow so that if the shipping total changed because it had a calculated price dependent on the cart context, then the promotion is computed using the latest information of the cart.

Testing — How have these changes been tested, or how can the reviewer test the feature?


Examples

Provide examples or code snippets that demonstrate how this feature works, or how it can be used in practice.
This helps with documentation and ensures maintainers can quickly understand and verify the change.

// Example usage

Checklist

Please ensure the following before requesting a review:

  • I have added a changeset for this PR
    • Every non-breaking change should be marked as a patch
    • To add a changeset, run yarn changeset and follow the prompts
  • The changes are covered by relevant tests
  • I have verified the code works as intended locally
  • I have linked the related issue(s) if applicable

Additional Context

Add any additional context, related issues, or references that might help the reviewer understand this PR.

fixes #14484


Note

Ensures promotions are computed against the latest cart state when items change, avoiding stale shipping totals.

  • In refresh-cart-items.ts, remove passing cart to updateCartPromotionsWorkflow, forcing it to refetch the cart before applying REPLACE on promo_codes.
  • Add changeset marking a patch for @medusajs/core-flows.

Written by Cursor Bugbot for commit 937ae7a. This will update automatically on new commits. Configure here.

@NicolasGorga NicolasGorga requested a review from a team as a code owner January 17, 2026 21:41
@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Jan 17, 2026

🦋 Changeset detected

Latest commit: f7fa0dd

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 77 packages
Name Type
@medusajs/core-flows Patch
@medusajs/medusa Patch
@medusajs/test-utils Patch
integration-tests-http Patch
@medusajs/medusa-oas-cli Patch
@medusajs/analytics Patch
@medusajs/api-key Patch
@medusajs/auth Patch
@medusajs/caching Patch
@medusajs/cart Patch
@medusajs/currency Patch
@medusajs/customer Patch
@medusajs/file Patch
@medusajs/fulfillment Patch
@medusajs/index Patch
@medusajs/inventory Patch
@medusajs/link-modules Patch
@medusajs/locking Patch
@medusajs/notification Patch
@medusajs/order Patch
@medusajs/payment Patch
@medusajs/pricing Patch
@medusajs/product Patch
@medusajs/promotion Patch
@medusajs/rbac Patch
@medusajs/region Patch
@medusajs/sales-channel Patch
@medusajs/settings Patch
@medusajs/stock-location Patch
@medusajs/store Patch
@medusajs/tax Patch
@medusajs/translation Patch
@medusajs/user Patch
@medusajs/workflow-engine-inmemory Patch
@medusajs/workflow-engine-redis Patch
@medusajs/draft-order Patch
@medusajs/oas-github-ci Patch
@medusajs/cache-inmemory Patch
@medusajs/cache-redis Patch
@medusajs/event-bus-local Patch
@medusajs/event-bus-redis Patch
@medusajs/analytics-local Patch
@medusajs/analytics-posthog Patch
@medusajs/auth-emailpass Patch
@medusajs/auth-github Patch
@medusajs/auth-google Patch
@medusajs/caching-redis Patch
@medusajs/file-local Patch
@medusajs/file-s3 Patch
@medusajs/fulfillment-manual Patch
@medusajs/locking-postgres Patch
@medusajs/locking-redis Patch
@medusajs/notification-local Patch
@medusajs/notification-sendgrid Patch
@medusajs/payment-stripe Patch
@medusajs/framework Patch
@medusajs/js-sdk Patch
@medusajs/modules-sdk Patch
@medusajs/orchestration Patch
@medusajs/types Patch
@medusajs/utils Patch
@medusajs/workflows-sdk Patch
@medusajs/http-types-generator Patch
@medusajs/cli Patch
@medusajs/deps Patch
@medusajs/telemetry Patch
@medusajs/admin-bundler Patch
@medusajs/admin-sdk Patch
@medusajs/admin-shared Patch
@medusajs/admin-vite-plugin Patch
@medusajs/dashboard Patch
@medusajs/icons Patch
@medusajs/toolbox Patch
@medusajs/ui-preset Patch
create-medusa-app Patch
medusa-dev-cli Patch
@medusajs/ui Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel
Copy link
Copy Markdown

vercel bot commented Jan 17, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

9 Skipped Deployments
Project Deployment Actions Updated (UTC)
api-reference Ignored Ignored Apr 9, 2026 11:37am
api-reference-v2 Ignored Ignored Preview Apr 9, 2026 11:37am
bloom-docs Ignored Ignored Preview Apr 9, 2026 11:37am
cloud-docs Ignored Ignored Preview Apr 9, 2026 11:37am
docs-ui Ignored Ignored Preview Apr 9, 2026 11:37am
docs-v2 Ignored Ignored Preview Apr 9, 2026 11:37am
medusa-docs Ignored Ignored Preview Apr 9, 2026 11:37am
resources-docs Ignored Ignored Preview Apr 9, 2026 11:37am
user-guide Ignored Ignored Preview Apr 9, 2026 11:37am

Request Review

@NicolasGorga NicolasGorga changed the title Fix/recompute shipping promotion item refresh fix(core-flows): force cart refresh on updatePromotionsWorkflow when refreshing items Jan 17, 2026
Copy link
Copy Markdown
Contributor

@fPolic fPolic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! Would it make sense to add a test case for this scenario?

@medusa-os-bot
Copy link
Copy Markdown

medusa-os-bot bot commented Apr 9, 2026

Thank you for your contribution! 🎉

After an initial review, this PR looks good to us. Here's a summary:

✅ Linked to a verified issue (#14484)
✅ Follows contribution guidelines
✅ Changeset included (patch)
✅ Follows Medusa's conventions

The root cause analysis in the PR description is accurate: refetchedCart is fetched at the start of refreshCartItemsWorkflow, before refreshCartShippingMethodsWorkflow runs and updates shipping amounts in the DB. Passing that stale cart reference to updateCartPromotionsWorkflow caused promotions to be computed against the old shipping totals. Removing cart: refetchedCart so the workflow re-fetches is the correct fix.

Notes:

  • The added integration test validates that calculated shipping amounts update correctly when items are added (shipping goes from 3 → 4.5), which is a useful regression test. However, it doesn't exercise the specific scenario described in the issue — a cart with an automatic promotion targeting shipping amount computed after a calculated shipping refresh. A test that sets up such a promotion and asserts the adjustment is recomputed against the updated shipping total would give higher confidence the bug is fully covered. This is non-blocking.

  • This introduces one extra DB query per cart refresh (the re-fetch inside updateCartPromotionsWorkflow), trading a small performance cost for correctness. That's the right call here.

A team member will do a final review before this is merged. We appreciate your patience!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] Shipping promotion discount uses stale shipping amount when cart items change (V2)

3 participants