Magento 2 RMA & Returns Management Extension

View Demo

Let customers request refunds, exchanges and store credit from their account, even as guests or for offline purchases. Your team handles every return in one admin grid, with workflow rules setting statuses, assigning managers and sending emails.

  • One admin grid for all returns, exchanges and credit memos
  • Workflow rules set status and manager automatically
  • One-click replacement orders
  • Guest returns and offline-order returns
  • Custom statuses, reasons and resolutions
  • REST and GraphQL API
Marketplace Approved
Hyvä
Magento Cloud
GraphQL
WCAG
Mage-OS
Compatible with:
Community:
2.3.* - 2.4.9
Enterprise:
2.3.* - 2.4.9
Problem

Magento Open Source has no returns management. Return requests arrive by email, someone checks each order by hand, and refunds, exchanges and return labels are handled one message at a time. Customers can't see where their return stands, so they write again.

Solution

Customers request a refund, exchange or store credit from their account, even as guests or for purchases made offline. Your team handles every request in one admin grid, while workflow rules set the status, assign a manager and send the emails.

Ready from day one

Used by 1,000+ stores

Workflow rules, replacement orders, reports and both APIs come in one extension, with no tiers to upgrade.

Running in minutes

Statuses, emails and reasons come pre-filled; you add your return address. Installation is free.

Your orders stay untouched

Returns live in their own tables, and refunds use standard Magento credit memos. 30-day money-back guarantee.

RMA for Magento 2 main features

  • Refunds, exchanges, store credit and one-click replacement orders
  • Returns from guests and for offline orders that aren't in your database
  • Returns from several orders in one RMA
  • Workflow rules that set statuses, assign managers and send emails
  • A reports dashboard that flags slow replies and rising reasons, plus ten detail reports
  • REST and GraphQL API, Hyvä storefront built in, Magento Open Source and Adobe Commerce 2.3–2.4.9

Returns, exchanges and refunds in one place

Customers choose how to settle a return: refund, exchange or store credit, for a whole order or part of it. Our guide on simplifying Magento returns shows the full process step by step. The extension works with multistore setups: statuses, messages and quick responses can differ per store view.

Refunds, exchanges and store credit

Customers send a refund request or ask for an exchange. Store credit is a ready-made resolution: the manager opens a credit memo from the RMA and refunds the amount to the customer's balance. It works with Mirasvit Store Credit & Refund or the store credit built into Adobe Commerce.

Partial returns

For an order of several products, customers return only the items that don't suit them and set the quantity for each. There's no need to refund the entire order.

Product returns for offline orders

Customers can open an RMA for goods bought by phone, in your physical store or on another site in your network, even when your store database has no record of the order. The option is off by default, and staff can open an offline RMA from the admin even when customers can't.

RMA for guests

Customers who bought as guests open a return with their order number and email. No account is needed to return or exchange products.

One-click replacement orders

When an item needs replacing, the manager creates the replacement order from the RMA in one click: a zero-price order with free payment and free shipping, sent to the address from the original order and linked to the RMA.

Exchange orders and credit memos from the RMA

Exchange orders and credit memos open from the RMA in the standard Magento forms and stay linked to it, so their numbers show in the RMA grid and its export.

Set up the RMA workflow your way

Set up reasons, resolutions, statuses, fields and emails to match your own return policy.

Return reasons list in Mirasvit Magento 2 RMA.

Return reasons

Customers pick the return reason from a list you define. Reasons can be grouped into parent and child reasons.

Resolutions and a different resolution per returned item in Mirasvit Magento 2 RMA.

RMA resolutions

Exchange, refund and store credit come ready, and you can add your own resolutions, such as repair. Each resolution decides which buttons the manager gets on the RMA: exchange order, replacement order or credit memo.

Status workflow diagram and color-coded statuses in Mirasvit Magento 2 RMA.

Custom RMA request statuses

Show customers which stage their RMA is at. Each status has its own color and its own emails to the customer and the admin, sent when the RMA reaches it. The Statuses page draws the whole workflow as a diagram: statuses sit in columns by step, side branches such as Rejected hang under the step they leave from, and the arrows show every transition.

Workflow rules

A rule runs on an event: a new RMA, a change to an RMA, a new reply from the customer or from staff, or an hourly check. It tests conditions such as the current and previous status, owner, who replied last, hours since the last reply, whether a return label is attached, the reason or resolution, custom fields, and product attributes or categories. Then it sets the status or owner, marks the RMA resolved and sends emails to the owner, the customer or any address.

For example, a rule can:

  • Approve a return automatically when the reason and item condition match your policy
  • Close an RMA and email the customer after 72 hours without a reply
  • Email the manager when an approved RMA still has no return label after 24 hours

See the workflow rules guide for all events, conditions and actions.

Store any RMA information in custom fields

Custom fields list and a custom field on the return form in Mirasvit Magento 2 RMA.

Store any additional information on an RMA in custom fields: text, date, checkbox or drop-down. Fields can be required, visible or editable for the customer, shown only at certain statuses, and set for each returned item, not only for the whole RMA.

For example, a field on the Confirm Shipping step lets the customer enter the carrier and tracking number of the parcel they sent back.

Approval email to the customer in Mirasvit Magento 2 RMA.

Custom email notifications

Emails go out automatically on the RMA events you choose, to customers and staff. Templates use Magento's standard variables plus the module's own, so each email can name the customer, the RMA and its status.

Full RMA transparency for customers

Customers open an RMA and follow every status change from their account. A message thread on each RMA keeps the full communication history in one place.

Returns from the customer account

RMA page with the progress tracker in a Hyvä customer account in Mirasvit Magento 2 RMA.

Customers start a return from the RMA section of their account or with the return button in their order history. A progress bar shows where the request stands.

The returns pages look the same on Luma and Hyvä. The Hyvä storefront ships with the extension, so there is no second package to install and keep in step.

The RMA page shows all information relevant to the request: product name and SKU, quantity returned, return reason and the resolution the customer wants.

Message thread with status changes as timeline events in Mirasvit Magento 2 RMA.

Convenient communication

Shoppers discuss any issue with store managers in the message thread on the RMA. For example, a customer may ask for a prepaid return label. With Mirasvit Help Desk installed, customers can also reply by email and their answers land in the same thread.

Status changes appear in the same history as timeline events, between the messages, so customers can review the whole story of a return at any time.

File attachments with previews on an RMA message in Mirasvit Magento 2 RMA.

Attach files to RMA requests

Customers add photos and documents to their RMA request, several files at once, and managers see the images right in the message history. Uploads are limited to the file types and size you allow, and each file is checked against its type.

The form lists the chosen files with a thumbnail for images, accepts drag and drop, and lets the customer remove a file before sending. A file of a type you don't allow, or over your size limit, is rejected right on the form, with the reason shown.

Simplify the RMA workload for store managers

Everything the team needs to process returns sits in one section of the Magento admin.

RMA grid with status and owner counters in Mirasvit Magento 2 RMA.

Magento 2 returns management in one grid

Store admins monitor all RMAs in one grid. Counters above it show how many RMAs wait in each status and with each manager, and a click on a counter filters the grid; RMAs without an owner show as Unassigned. Managers can filter the grid by status, company or customer email. Export the grid to CSV or Excel XML, with the linked exchange, replacement and credit memo numbers.

RMA history with an internal note in the admin in Mirasvit Magento 2 RMA.

Full communication history on each RMA

Each RMA keeps its full history of messages, status changes and files. Internal notes stay visible to the store team only.

Quick responses in the message form in Mirasvit Magento 2 RMA.

Quick responses

Predefine standard answers, for example, a link to print a return shipping label, and set them per store view. Store admins simply pick the answer from the list to send it in seconds.

Return label upload and the print links the customer gets in Mirasvit Magento 2 RMA.

Return labels and packing slips

Store managers upload a prepaid return label from any carrier as an image or PDF. The customer prints it from their account and clicks Confirm Shipping, which moves the RMA to Package Sent. Each RMA also has a printable packing slip with your return address.

Help Desk integration support

Connect RMA with the Mirasvit Help Desk extension. Customer emails about a return land in the RMA thread, and managers can open an RMA from a ticket or a ticket from an RMA.

Return policy agreement on the return form in Mirasvit Magento 2 RMA.

Craft your RMA policy

Fit the RMA policy to your needs by configuring its main parameters:

  • Number of days after order completion during which an RMA can be requested
  • Allow RMA requests only for orders with specific statuses
  • Combine returns from several orders in one RMA
  • Allow returns only for shipped products
  • Exclude specific products from returns
  • Ask customers to confirm agreement with your return and exchange policy
  • Show customers a block with the RMA policy agreement

Selling to EU consumers? The withdrawal button required since 19 June 2026 comes with our Withdrawal Button extension, which works next to RMA: it records the customer's withdrawal statement and receipt, while the return itself runs through RMA.

RMA reports dashboard with Needs Attention and key figures in Mirasvit Magento 2 RMA.

Built-in RMA reports

RMA > Reports opens on a dashboard with the key figures for the period: RMAs, return rate, refunded amount, exchanges, rejected share, first response time, the share of RMAs answered within your target (24 hours by default, set in the configuration), resolution time and open RMAs. A chart shows created and resolved RMAs by day, week or month, and any period can be compared with the previous one.

The Needs Attention block points out what to act on: RMAs waiting for a staff reply longer than your target, a queue that grows faster than it is resolved, return reasons on the rise, products that come back more often than the store average, and customers who return at least half of their orders.

Product x Reason report in Mirasvit Magento 2 RMA.

Ten detail reports go deeper: By Product, Product x Reason, Reasons, Outcomes, Offline Products, Top Returners, Time to Return, Open RMAs, Time in Status and Team. A click on a figure opens the report behind it, and each report exports to CSV with the same filter and sort as on screen. The reports are part of the extension, with no separate package to install.

REST and GraphQL API

Use the GraphQL API to build returns into a PWA or headless storefront: customers create RMAs, send messages with attachments, check the status and print the packing slip and label.

The REST API covers the back office: create, read, update and delete RMAs, items, messages, statuses, reasons, resolutions, custom fields, quick responses and workflow rules, change statuses in bulk, create replacement orders and confirm shipping. Customer and guest endpoints are included. See the REST API and GraphQL API guides.

Workflow rules, reports with export, both APIs and the Hyvä storefront are part of the extension, not separate tiers or add-ons. The extension works on Magento Open Source and Adobe Commerce 2.3–2.4.9 and Mage-OS, and meets WCAG 2.2 AA.

No hidden fees
Our developers install the extension on your store and configure it for your setup, free of charge.
Lifetime access to source code
Access to free support and updates for 1 year
Updates and support prolongation - $108

Pay today $179 for the first year.

Then $108 for updates and support services per year.

Cancel anytime.

30 days money back guarantee
See it in action!
Pick a quick tutorial to learn about various aspects of this extension
Customer Reviews 107
Earn points for your review about this extension modules. $1 = 10 points
Write Your Own Review

check-circle You submitted your review for moderation.

BBMC Verified Buyer
From Carol Stream, United States
Using the module for over 3 years
A complete return-management system rather than a basic RMA form
Any ecommerce business processing a meaningful number of returns needs a proper RMA system, and Mirasvit provides a very complete one.

It handles both online and offline returns and integrates directly with Magento orders, refunds and customer information. Statuses, communications, return terms and other parts of the process can be customized extensively. The included templates cover the normal stages of a return, while stores can also create their own.

Administration is straightforward and the extension has been reliable for us.

The biggest feature I would like added is a visual customer return-flow builder. It would be useful to define a step-by-step sequence—return reason, order selection, purchase date, additional information, eligibility checks, and then different available resolutions depending on the answers.
Also installed:
Help Desk MX,  Knowledge Base,  Full Page Cache Warmer,  Advanced Product Feeds,  Follow Up Email,  Reward Points,  Promo Banners and 28 more
Alex Verified Buyer
From United States
Using the module for over 1 month
Effective RMA solution with room for UI/UX improvement
This extension is a powerful and intuitive tool for managing authorized returns (RMA). It automates many key steps in the returns process, integrates smoothly with existing order management systems, offers customization options, and provides detailed analytics on return trends. The only downside is that the UI/UX design could be improved.
BB Verified Buyer
From Carol Stream, United States
Using the module for over 3 years
Best RMA extension for Magento
I have tried 3 RMA extensions for our store and this is by far the most comprehensive, yet easiest to manage.

I would like to see a possible way to integrate exchanges that can be preauthorized for a "ship first and return later" exchange method, but other than that, this is the one to get.
Also installed:
Help Desk MX,  Knowledge Base,  Full Page Cache Warmer,  Advanced Product Feeds,  Follow Up Email,  Reward Points,  Promo Banners and 28 more
Paolo Verified Buyer
From Gandino, Italy
Using the module for over 3 years
Great extension for managing returns.
The module for managing authorized returns (RMA) is an effective and intuitive solution that automates many critical phases of the returns process. It integrates easily with existing order management systems, offers customization options, and provides detailed analytics on return trends.
Also installed:
Product Kits ,  Automatic Related Products,  Help Desk MX,  Follow Up Email,  Reward Points,  Elastic Search Ultimate,  Advanced Product Feeds and 25 more
Pedro Verified Buyer
From Seixal, Portugal
Using the module for over 2 years
Very nice extension
The extension works very nicely. We had to do some tunning for our client needs, but now it's flying.
Also installed:
Reward Points,  Follow Up Email,  Customer Segmentation Suite,  Advanced Product Feeds,  Custom Form Builder ,  Help Desk MX,  Improved Sorting and 7 more
Manual & Support
Need more help?

Save time by starting your support request online and we'll connect you to an expert.

Frequently asked questions
chevron-down chevron-right

Does Magento 2 have a built-in RMA?

Magento Open Source has no returns module: return requests come by email and refunds are done by hand. Adobe Commerce includes a native Returns feature.

This extension works on both. On Adobe Commerce it runs alongside native Returns without changing it, and adds your own statuses with emails, workflow rules with timers, quick responses, returns for offline orders, several orders in one RMA, one-click replacement orders and a reports dashboard with ten detail reports. Native Returns can generate carrier labels; this extension doesn't: you upload the label instead.

chevron-down chevron-right

How does a return work with this extension?

  • The customer opens an RMA from their account, the order history or the guest form, picks the items and quantities, and chooses a reason and resolution.
  • The manager approves it, by hand or with a workflow rule. The approval email carries the packing slip, the return label if you uploaded one, and your return address.
  • The customer ships the parcel and clicks Confirm Shipping.
  • The manager settles the RMA with a credit memo, an exchange order or a one-click replacement order.

The administrator can also create an RMA on behalf of a customer from the order page in the backend. See how to process an RMA.

chevron-down chevron-right

What do I need to set up after installation?

Very little, and it takes minutes. Customers can open returns right after installation: five statuses with colors and emails, return reasons, item conditions and three resolutions come pre-filled. You add your return address. Workflow rules, quick responses, offline returns and the Help Desk integration are optional. Installation is free.

chevron-down chevron-right

Does the extension include store credit?

Store credit is one of the ready-made resolutions. The manager opens a credit memo from the RMA and refunds the amount to the customer's balance. The balance is kept by a store credit feature: Mirasvit Store Credit & Refund or the one built into Adobe Commerce. The RMA extension takes into account credit already refunded with Mirasvit Store Credit.

chevron-down chevron-right

Can customers return only some items from an order?

Yes. Customers choose which items to return and the quantity of each. For example, a customer can return just one or two of the five items they bought. You can also let them combine items from several orders in one RMA, or allow returns only for shipped products.

chevron-down chevron-right

How do guests open a return?

Guests open a return with their order number and email, without an account, and then follow the RMA and reply to the store from its page. The guest form doesn't accept an online order that belongs to a registered customer: that customer returns it from their account. You can hide the guest return link in the store footer.

chevron-down chevron-right

Does the RMA extension support returns for offline orders?

Yes. Customers can open an RMA for products bought by phone, in your physical store or on another site connected to your store network, even when your store database has no record of the order. The customer enters the receipt number, and you can ask for a phone number.

Offline returns have their own custom fields and their own report. The option is off by default, so you decide whether to allow it.

chevron-down chevron-right

What can RMA workflow rules do?

A rule runs on an event: a new RMA, a change to an RMA, a new reply from the customer or from staff, or an hourly check. It checks conditions such as status, owner, who replied last, hours since the last reply, whether a return label is attached, the reason or resolution, custom fields and product attributes. Then it sets the status or owner, marks the RMA resolved and sends emails to the owner, the customer or any address.

For example, a rule can approve a return automatically when the reason matches your policy, or close an RMA after 72 hours without a reply from the customer. See the workflow rules guide.

chevron-down chevron-right

How do return shipping labels work?

The manager uploads a prepaid return label from any carrier as an image or PDF. The customer prints it from their account and clicks Confirm Shipping, which moves the RMA to Package Sent; a custom field on that step can collect the tracking number. Every RMA also has a printable packing slip with your return address.

Uploads are limited to the file types you allow, and the content of each label file is checked. The extension doesn't generate labels through carriers or track parcels.

chevron-down chevron-right

Does the RMA extension cover the EU withdrawal button?

The withdrawal function EU law requires since 19 June 2026 comes with a separate extension, Withdrawal Button. It works next to RMA: the customer states the withdrawal in two steps and gets a dated receipt, you approve or reject the request, and the refund goes through a standard credit memo. The return of the goods, labels and inspection stay in RMA.

chevron-down chevron-right

Does the RMA extension keep the full communication history on each RMA?

Yes. Every message to the customer, every status change and every attached file stays on the RMA, and both the customer and the store team can see them. Staff can also add internal notes that only the store team sees. Managers can answer faster with quick responses, set per store view. With Mirasvit Help Desk, customers can also reply by email and their answers land in the RMA thread.

chevron-down chevron-right

Can I set my own reasons, conditions, statuses and resolutions?

Yes. Create your own return reasons (grouped into parent and child reasons if you like), item conditions, statuses with their own names, colors and emails, and resolutions. Each resolution decides which buttons the manager gets on the RMA: exchange order, replacement order or credit memo.

For example, offer a refund to store credit to encourage the customer to buy from you again.

chevron-down chevron-right

Does the RMA extension work with Hyvä?

Yes, and nothing extra is needed. Since version 2.5.0 the Hyvä storefront ships inside the extension: the return form, the guest and offline forms, the returns list and the return page with messages and attachments. After an upgrade, run bin/magento hyva:config:generate and rebuild your Hyvä theme so it picks up the RMA templates, as described in the user guide.

chevron-down chevron-right

Does the RMA extension support REST API and GraphQL?

Yes, both. GraphQL serves the storefront: PWA and headless stores can create RMAs, send messages with attachments and show the status. The REST API serves the back office: it manages RMAs, items, messages, statuses, reasons, resolutions, custom fields, quick responses and workflow rules, and can create replacement orders and confirm shipping. Customer and guest endpoints are included. GraphQL requests follow the same return period, policy and file rules as the storefront form.

Learn more in the REST API and GraphQL API guides.

Changelog
Version 2.6.1Nov 10, 2026
The RMA reports are rebuilt from scratch. RMA > Reports now opens on a dashboard with the key figures, a trend chart and insights that point out what needs attention: RMAs left waiting, a growing queue, reasons on the rise, problem products and customers who return often. Next to it are ten detail reports: By Product, Product x Reason, Reasons, Outcomes, Offline Products, Top Returners, Time to Return, Open RMAs, Time in Status and Team. The reports are now part of the extension and no longer need the separate mirasvit/module-report package. Time in Status counts only status changes made after the upgrade to 2.6.0, so earlier history is not included.
A refreshed RMA grid summary in the admin. The status and owner counters above the RMA grid are now a light card of chips; a click on a chip filters the grid. "In Progress" no longer counts RMAs in a final status, and an RMA without an owner shows as "Unassigned". Which statuses are final is set in RMA > General > Final Statuses (Closed and Rejected by default).
The status workflow diagram on the Statuses page is redrawn. Statuses are laid out in columns by their step in the workflow, with side branches under the step they leave from, and transitions are routed around the cards instead of across them.
Tidier storefront RMA pages on Hyvä and Luma. My Returns, the new return form and the return view are restyled to match the customer account: status changes appear as timeline events, the progress tracker is more compact, and a single pager sits under the returns list. On Hyvä the pages are styled with Tailwind utility classes, so the extension's own stylesheet is much smaller.
Links to a return stay on the store view the customer is on. On a website with several store views (another language, or Hyvä next to Luma), the returns list, the page after submitting a return and the print links no longer send the customer to the store view of the original order. Emails keep using the return's store view.
Saving an RMA, changing statuses in bulk and creating a replacement order in the admin now require the RMA "Add and Edit" permission.
A guest createRma GraphQl request can no longer name an order placed by a registered customer. Guest lookups that fail now return a single generic "Wrong Order #, Email" message.
static-content:deploy no longer fails on the RMA storefront stylesheet (".lib-button is undefined") when the module's styles are compiled on their own.
Version 2.6.0Nov 9, 2026
Shoppers and guests can now only view and act on their own returns and orders. A return request or order page in "My Returns" opens only for the shopper it belongs to, and a return can no longer be created or saved against someone else's order.
The returns API returns only what the customer may see. Return messages are limited to the ones visible on the storefront, and internal fields sent in a request are ignored.
Guest return pages no longer sign visitors out on live stores.
Version 2.5.1Oct 21, 2026
Searching statuses, reasons, conditions, resolutions, custom fields and workflow rules by exact name finds them again. A REST API search, or any integration that lists these records, with an exact-match filter on the name returned nothing for a record whose name had been saved in the admin, because the name is stored together with its store-view translations. The search now matches the All Store Views name, wherever it sits among the translations. A name set only for one store view is not matched, and other filter conditions (not equal, in list, like) still compare the stored value as is.
Version 2.5.0Oct 20, 2026
Hyvä and GraphQl support now ship with the extension - The two companion packages, mirasvit/module-rma-hyva and mirasvit/module-rma-graph-ql, are retired: everything they contained is part of RMA itself. That is the Hyvä storefront for the whole returns flow - the request form, the guest and offline forms, the RMA list, the RMA view with its messages and attachments, the returns column in order history and the My Returns link in the account menu - and the customerRmas, guestCustomerRmas, rmaDictionary and orderRmas queries with the createRma and addRmaMessage mutations used by headless and PWA storefronts. Each storefront page now has one template and one plain-JavaScript script for both themes, so Luma and Hyvä behave the same way. There is no longer a second package to find and keep in step, and on a Luma store the Hyvä part simply stays dormant. Composer removes the companion packages by itself when you upgrade.
A new attachment control on the RMA forms - The request forms, the message form and the admin reply form now list the chosen files, with a thumbnail for images, accept drag and drop, and let a file be taken off the list before sending. A file of a type you do not allow, or over your size limit, is refused while the customer is still on the form instead of after a failed submit, and the refusal says why: "that file type is not allowed" or "it is larger than 2.0 MB". Choosing files again adds to the list instead of replacing it. The file picker's own filter now honours Allow attachment upload with extensions (it never did before), and a store with no size limit set falls back to PHP's upload ceiling. The admin reply form takes its limits from the RMA's own store view. Without JavaScript the plain file input still works.
Attachment previews open in a gallery on Hyvä - A click on an image attachment in the RMA view opens it in place, as Luma has always done, instead of leaving the page. The gallery walks every previewable attachment on the page with on-screen arrows or the left and right keys, shows the position (2/6), preloads the neighbours, and closes on the backdrop, the close button or Escape. A click on the picture zooms it. Files without a preview are listed as framed rows with the file name in bold, as on Luma.
Compatible with Mirasvit Core 2.0 — the module can now be installed alongside both the 1.x and 2.0 versions of the core package
⚠️ The mstRma GraphQl queries now answer on every store - Previously the schema arrived with an optional package, so customerRmas, rmaDictionary, orderRmas, guestCustomerRmas, createRma and addRmaMessage existed only where that package had been installed. They now ship with the extension and apply everywhere. That is the intended change, but it is a change in behaviour on upgrade for anyone querying /graphql: those fields appear in your schema whether or not you asked for them, and any tooling that introspects the schema will see them.
⚠️ The Hyvä module is gone, not renamed - Hyva_MirasvitRma no longer exists in any form. Everything it did now happens inside Mirasvit_Rma: each storefront page has one template for both themes, and hyva_-prefixed layout files set what only Hyvä needs. setup:upgrade removes the old name from app/etc/config.php for you. You only need to act if you referenced it yourself - in a custom di.xml, a layout file, or a deployment script that enables modules by name.
⚠️ Hyvä stores: run bin/magento hyva:config:generate and rebuild your theme after upgrading - Retiring the companion package took RMA off the list of modules Hyvä's Tailwind build scans, and the extension now registers itself there. Until you regenerate that list and run npm run build in your theme, utility classes the RMA templates use are purged from the built stylesheet. The extension's own styling - status badges, the progress bar, the unread marker, the box treatment, the dialogs and the layout of every RMA page - ships as a plain stylesheet that needs no build and loads only on the RMA pages, so the pages are usable either way and the rest of your store is not affected, but the rebuild is what makes them complete.
⚠️ Re-check your theme's overrides of RMA storefront templates - The Luma and Hyvä copies are merged into one template per page, driven by plain JavaScript (js/rma-new-form.js, js/rma-attachments.js) instead of Knockout on Luma and Alpine on Hyvä. A Hyvä override under Hyva_MirasvitRma/templates/… no longer applies; move it to Mirasvit_Rma/templates/… under the shared name. A Luma override of rma/new.phtml or the message form copied from an earlier version still asks for the removed Mirasvit_Rma/js/create-rma component or the removed jQuery MultiFile (jqueryMultiFile, js/multifile/); rebuild it from the new template.
⚠️ GraphQl attachments now obey your attachment settings - An attachment sent through the createRma or addRmaMessage mutation is now checked against Allow attachment upload with extensions and Limit of attachments size, Mb (RMA configuration, File Upload Settings), exactly as a file uploaded through the storefront form. Until now GraphQl stored any file. The extension list has a default (images, PDF, office documents, text/CSV and archives), so even if you never changed it, a mutation sending another type, such as .exe, now fails with "Uploaded file does not match requirements" instead of saving. The size limit has no default and applies only if you set one. Every attachment, including that it is valid base64, is checked before anything is saved, so a refused file leaves no return or message behind.
The RMA GraphQl resolvers no longer need magento/module-customer-graph-ql. They identify the signed-in customer themselves (token, account not locked or awaiting confirmation, account of the current website), so a store that strips Magento's GraphQl modules with a composer replace still compiles.
The message history reads as a conversation on both themes. Messages from the store sit on the left and the customer's on the right, each bubble capped at 78% of the column, with the author line and the tail following its bubble. An automatic status notice sits centred and full width, in its own neutral colour on Hyvä too, so a line the system wrote no longer looks like one somebody typed. The history box no longer scrolls inside the page.
Status chips are readable on both themes. Each chip keeps the hue the administrator picked but shows it as a tint behind a darker label of the same hue, so every label meets the 4.5:1 contrast body text needs. Twelve of the sixteen palette colours failed it before, and a black status printed its label in black on black.
The RMA pages on Hyvä follow your theme's palette. The greys, the link blue and the reply green come from the theme's own colour tokens, with the previous values as the fallback, so a Hyvä store that retunes its theme colours retunes the RMA pages with it.
More storefront text is translatable. The RMA column heading in the order history on Luma, the "Order or Receipt #" tooltip and the "Item Name" tooltip on the offline form were printed in English whatever the store locale; the order picker on the request form now has a label for screen readers; and the Remove control on a selected order can be reached from the keyboard on Hyvä.
⚠️ createRma can no longer take over another customer's return. A custom field code in the input was written into the RMA as is, so rma_id, customer_id or status_id sent as custom fields loaded and reassigned an existing RMA. Only active fields a customer may fill in on the storefront form are accepted now; any other code is refused.
⚠️ createRma only accepts orders the caller owns. A signed-in customer can return only their own orders, a guest only a guest order placed with the e-mail they gave, and the order must belong to the current website.
⚠️ createRma now applies the return period and the RMA policy. An order last updated longer ago than Return Period is refused, as the storefront form refuses it, and when the RMA policy is active the request must send agree_box: true. Until now GraphQl accepted any order in an allowed status and ignored agree_box.
⚠️ guestCustomerRmas now checks the e-mail it asks for. The query declared customer_email as required but never read it, so an order id alone listed another guest's returns. The order and e-mail pair is now checked the way the guest storefront form checks it. A store with guest access off answers with an authorization error instead of a bare internal server error, an unknown order id answers "not found", and each return in the list now carries its rma_id, which was always null.
createRma works for a return of offline orders only. It answered "Please select an order for the RMA." and left the offline order it had created behind, one more with every retry. If the return cannot be saved, the offline orders created for it are now removed. Offline items take their name from the new optional name field of RmaItemInput, or from product_sku when it is not sent.
Each order in the orders of customerRmas, guestCustomerRmas and createRma lists only its own items. An RMA of two orders listed the items of both under each, and an offline order listed the store order's items.
Hyvä: the request form requires the policy box. With Ask to agree with RMA policy text on, only Luma's validation enforced the "I agree" box, so on Hyvä a return could be created without accepting the policy.
createRma with attachments and no reply creates the return. It failed with "Please, enter a message". A GraphQl attachment can also carry its MIME type in the new optional type field of RmaMessageAttachmentInput; without it the file is stored as application/octet-stream, as before.
The request form no longer fails to render its policy when no policy block is chosen. With Ask to agree with RMA policy text on and no CMS block selected, the form logged Argument 'value' must be type of string, NULL given; it now shows the "I agree" box with no policy text.
The policy's "I agree" box shows the required-field asterisk on both themes. It was always required but carried no asterisk.
orderRmas now requires the signed-in customer who placed the order. It used to list the returns of any order id for anyone.
The createRma and addRmaMessage GraphQl mutations no longer fail for a signed-in customer. Both answered Internal server error for every logged-in customer: the resolver passed Magento's customer data object into a service that requires the customer model, so the request died before it reached the returns logic. Guest requests were unaffected. Both mutations now create the return, and the message is recorded against the right customer name.
A message can be an attachment alone again. Since 2.4.0 a reply with a file and no text was refused with "text" is required, although the form allows it. A message that fails now also returns the customer to the return with the reason, instead of adding "RMA does not exist" and leaving for the list.
Luma: a second order can be added to a return opened from an order. When a customer started a return from an order's page and then picked another order and pressed Apply, the form read the first order again, said "Order already exists in current RMA" and never added the second one. It now adds the order that was picked.
Hyvä: the request form no longer submits a return with no items selected. It now asks the customer to select an order and the items to return, as Luma always has.
Luma: a date custom field no longer logs "Script error for calendar". The storefront input is the browser's native date picker; the admin-only calendar widget init is no longer rendered with it.
The rmaDictionary query no longer breaks on a store with an empty vocabulary. If a store view had no return conditions, no reasons or no resolutions configured, the query answered with an undefined value in that part of the response instead of an empty list.
A guest offline return no longer records an undefined customer. When an offline return was created through createRma by a guest, the customer id written to the request came from a variable that was only ever set for signed-in customers.
guestCustomerRmas now reports a missing order id properly. A query without order_id produced a PHP warning rather than the input error every other RMA query returns for the same mistake.
Every value the Hyvä storefront prints is now escaped. The Hyvä templates were carrying 183 unescaped outputs, inherited from the companion package, which had no static checks of its own. Pages render exactly as before; the values simply cannot be read as page markup any more.
A status message left blank at a store view again means "do not send" there. Clearing the customer, administrator or history message of a status for one store view now stores that blank as the store view's own setting, as the field's "Leave blank to not send" hint promises, instead of falling back to the All Store Views text. Clearing it at All Store Views clears only the default text. A message that cannot be saved now raises an error instead of being silently wiped.
Saving a name at a store view no longer overwrites All Store Views. Editing the store-view text of a status, reason, condition, resolution, custom field or workflow rule copied that text into the All Store Views value whenever the default was empty, and clearing a store-view text left an empty override instead of falling back to the default. Each store view now keeps its own text, and a cleared one shows the All Store Views text again.
A long word or link in a message no longer runs out of its bubble. An unbroken run of characters - a long URL, a tracking number - pushed the message past the column in the customer's RMA view and in the admin RMA conversation. It now wraps inside the bubble.
The Hyvä RMA pages are laid out properly, on a desktop and on a phone. In Hyvä's narrower account column the RMA view now stacks the message form and history full width, keeps the status bar on one line, keeps product thumbnails visible at a sensible size, and shows order numbers and links in a link colour instead of plain grey text. On a phone, the RMA view and the request form no longer scroll sideways, and long order or reason options no longer widen their dropdowns past the screen. The "Show N per page" control in the order's Returns tab no longer breaks onto two lines, and the message box keeps its border while you type. The Confirm Shipping dialog opens centred on the screen, and the instructions inside it wrap.
Version 2.4.21Oct 16, 2026
⚠️ RMA Free Shipping has a new carrier code, rmafree - The old code rma_free_shipping contained the underscore Magento uses to join the carrier and the method into the rate code it stores, so a replacement order shipped with it read back as carrier rma, which does not exist. Anything that looks the carrier up from an order - Order::getShippingMethod(true), a shipping or ERP integration, a payment provider's callback - found none. setup:upgrade moves your saved settings from carriers/rma_free_shipping/* to carriers/rmafree/* in every scope and rewrites the rate code on existing orders and quotes from rma_free_shipping_rma_free_shipping to rmafree_rmafree. You only need to act if you refer to the old code or path yourself: in custom code, in settings locked in app/etc/config.php or env.php, or in reports that filter on the shipping method.
A replacement order that cannot be created is now reported as an error. When Replacement Order on an RMA was refused - because the RMA Free Shipping method is disabled, or no item has the resolution "Replacement" - the reason was shown as a green success message. It is now a red error message.
Exchange orders created from an RMA are linked to it again. Since 2.4.18, an order placed with the Exchange Order button on an RMA was saved but not attached to the return, so it did not appear among the RMA's exchange orders. The return is now remembered through the whole order-create page - including its background requests, such as the admin notification bar refreshing - until the order is submitted, and forgotten only once you leave order creation.
Reasons to choose Mirasvit
Client focusing and satisfaction

These are our primary. A major portion of our new clients come from referrals from our existing clients. Our professional team of developers, marketers and support staff have invested the best knowledge and experience in the field into our work, so you know you can come back to us again and again.

Remarkable support

One year free and high quality support. We go to great lengths to provide maximum satisfaction with every module you have purchased in our store. By helping you with installation, configuration, answering your every question, we do all our best to eliminate any possible problems.

Risk-free Investment

30-days money back guarantee. If you are not satisfied with our extension performance for any reason, we provide a full refund.

Constant improvements and upgrades

We constantly add new features to all our modules, and are always interested in hearing your opinion and implementing your suggested features in our future developments.

Comprehensive Documentation

We provide an expanded user guide for every aspect of our extension, so you can find answers for all your burning questions.

Unencrypted source code of our products

You can customize extension according to your needs and requirements.

Usability and Performance

The Module is easy to install and upgrade, just follow our step-by-step user guide. Additionally, the extension is ready to use with the Hyvä theme.

Ready for Magento Cloud

No core modifications. The extension has been tested in a Magento Cloud environment and is fully compatible with it.

Loading...