Returns Portal¶
Returns Portal is a self-service returns portal for OpenCart 4.x that a guest can actually use. A customer proves the order is theirs, picks the lines they are sending back with a reason for each, sees an estimated refund worked out from that order's own rows, and prints an RMA slip. You work a queue under Sales → Return Requests and accept or refuse line by line.

It replaces OpenCart's own return form while it is enabled, and that is the most invasive thing it does, so it is stated here rather than in a footnote. Stock OpenCart accepts a return against any order number without checking that the order exists or that it belongs to the person filing it, and records a guest's return where that guest can never see it again. Both doors are closed together, and switching the module off restores OpenCart's behaviour exactly.
Who it is for¶
- Store owners whose returns arrive as emails, and who would like them as rows.
- Anyone selling to people who checked out as guests. That is most stores, and the case OpenCart's own returns handle worst.
- Store owners who want to accept half a return and refuse the rest, with the reason recorded and the customer told.
- Anyone who has to answer what do you hold about me and delete it without calling a developer.
- Administrators who are not comfortable at a command line. Everything is in the OpenCart admin, and there is no scheduled task to set up anywhere.
What it does today¶
- Ownership-verified guest access. An order number and the address the confirmation went to, and nothing else. No account, no password, no link to lose. Every refusal is the same refusal, and the counters behind it are on the order and the caller rather than on the email address, so nobody can lock a real customer out.
- A line picker that shows every line, with the ones that may not come back greyed and the reason printed on them: expired window, excluded product, or already returned.
- Netting off what has already gone back, including returns filed through OpenCart's own form before you installed this and returns you typed in yourself. Nothing is returnable twice through two doors. No other extension in this category documents doing it.
- A per-line refund estimate with its breakdown (subtotal, share of any order discount, tax), computed from that order's own recorded prices in that order's own currency, and frozen at submission. OpenCart itself computes nothing here.
- Partial approval at review time. Refuse one line and the screen shows what you are accepting now against the demoted request total; the customer is emailed the outcome per line, with your reason.
- A printable RMA slip, immediately, overprinted NOT YET APPROVED — DO NOT POST until you agree. That stops a parcel arriving before anybody said yes.
- Photos on a line, accepted on what their bytes actually are rather than what the file is called, stored outside the web root.
- Store credit in one click, with the accepted total already worked out, or automatically for customers who asked for it.
- Stock put back when you close a request, if you switch it on: per line, ticked by default, and kept in step with the order's status afterwards so marking the order Refunded never counts a returned unit twice.
- A record of the refund you paid, against the request: amount, day and how, as many as there were, with the queue flagging a refund recorded before the parcel arrived.
- The queue as a spreadsheet. An Export CSV button writes one row per request line for the tab and filters you are looking at.
- A queue with three tabs and their counts, plus a count of the returns the portal did not create, so what is outside it is visible rather than quietly missing.
- An erasure screen that shows the plan before it runs it, including what it deliberately does not reach. It exists because OpenCart's own erasure does nothing at all for a guest while emailing them that it is done.
- No scheduled task of any kind, which matters on shared hosting. Nothing to set up outside OpenCart and nothing to stop working.
- Multi-store from the start. Every setting is per store, bar four that serve the whole installation: the API switch, the overdue threshold on the queue, putting stock back on close and detailed logging.
What it does not do¶
This list is here so that nobody buys Returns Portal for something it will not do. The full version is limits and guarantees, which is the page worth reading before you buy.
- No carrier labels and no carrier API. Returns run on your return address and the printable slip. Under EU law the consumer bears return postage by default, so this is the category's standard mode rather than a degraded version of one. If you are buying to print labels, this is not it.
- No gateway refunds. It moves no money through your payment provider, reverses no charge and contacts no gateway. Store credit is the one payout it can make, and only for customers with an account. A refund you record is your note of one you made elsewhere.
- No exchanges as real orders. An exchange requested resolution records a preference. It does not create an order, and every screen says requested.
- No rule engine. A return window, a status list and two exclusion lists. There is no per-product window, no per-reason policy and no conditions.
- No restock unless you switch it on, and then only on close, never on approval, and never a bundle's components. See Putting stock back.
- The estimate is an estimate. An order-level discount is spread evenly across the lines, which is exact for a whole-order coupon and an approximation for one restricted to certain products. Shipping is never included. Both limits are printed where you can see them.
- A guest's copy of their request is the email. They have nothing to log in to, so the confirmation screen and the slip last as long as their session and the email lasts forever.
- No delivery guarantee on any email. OpenCart reports that a message was handed over, not that it arrived, so no screen here says delivered.
- Uninstalling deletes nothing. All nine tables, their rows and the photos stay exactly where they are.
The rest of this section¶
- Requirements & install: what the store needs, the two permissions, and what an update keeps.
- Quick start: the whole loop on one order, in fifteen minutes.
- Guides: setting the window, excluding products, working the queue, paying in store credit, erasing a customer.
- Reference: the settings, the states, the estimate's inputs, the photo rules, the API, what it holds about a person, its security verdict and what it costs, generated from the code.
- Limits & guarantees: exactly what Returns Portal promises, and where that promise stops.
- Troubleshooting: when it does not behave.
- Changelog: what changed in each release.
Whichever extension you bought, the shared pages apply to it too.