OpenCart returns portal

Returns as rows, not as email

A customer proves the order is theirs with an order number and the address the confirmation went to, 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, including for the people who checked out as guests, whose returns OpenCart records where they can never see them again.

Get it on the marketplace Read the documentation

The customer’s line picker on a three-line order, under a banner reading “Returnable until 12/09/2026”. Two lines are ticked, each with a quantity, a reason chosen from a list, an Opened or Unopened choice and an optional photo field; the first has two files attached. The third line has a dash in place of a tick and “This item cannot be returned.” in red under its name. A card on the right reads Subtotal 2 item(s) $80.00, Share of order discount −$8.00, Tax $0.00, Estimated refund $72.00, with the notes that ticking updates the estimate and that the final amount is confirmed by the store.
The screen the customer meets: every line of the order, with the one that may not come back carrying its reason instead of being hidden, and the estimate adding up as they tick, with its arithmetic on view.

A guest proves the order is theirs

An order number and the address the confirmation went to, and nothing else: no account, no password, no link to lose. Every refusal is worded the same way whatever went wrong, and the counters behind it sit on the order and on the caller rather than on the email address, so nobody can lock a real customer out of their own return. OpenCart’s own form accepts an order number without checking either.

Every line, with the reason it cannot come back

The picker shows the whole order: the lines that may not be returned are greyed with the reason printed on them: window expired, product excluded, or already returned. What has gone back before is netted off, including returns filed through OpenCart’s own form before you installed this and returns you typed into Sale → Returns yourself, so nothing is returnable twice through two doors.

An estimate with its arithmetic on view

Per line, broken into subtotal, share of any order discount and tax, worked out from that order’s own recorded prices in that order’s own currency at the rate it was placed at, and frozen at submission. It is labelled an estimate everywhere, shipping is never in it, and a discount from a third-party extension suppresses the customer’s figure rather than guessing at it.

Accept half of it and refuse the rest

Refuse a line at review time and the screen shows what you are accepting now against the demoted request total; the customer is emailed the outcome line by line with your reason. The slip prints immediately, overprinted NOT YET APPROVED — DO NOT POST until you agree, which is what stops the parcel that arrives before anybody has said yes.

Your own systems can read it out

Returns Portal answers an HTTP API (v1 today), so the system that keeps your records can pull the requests that moved since it last asked, with their lines, their verdicts, their estimated refund and the photographs a customer attached, and settle them back: decided line by line, closed, or cancelled, into the same history the admin screen writes. It authenticates as an OpenCart API user you create yourself, answers only over HTTPS, and is off until you switch it on. What will not change about it, and for how long, is written down.

Translation published, not claimed

Which of our strings a named native speaker has actually read is published per extension and per language, and anything unreviewed ships as English rather than as a blank or a raw identifier.

We would rather you knew this before paying than after. Limits and guarantees says that it prints no carrier label and calls no carrier API, that it moves no money through your payment provider (store credit is the one payout it can make, and only for a customer with an account), that an exchange is recorded as requested and creates no order, that nothing restocks, and that while the module is enabled OpenCart's own return form is closed, with switching it off restoring OpenCart's own behaviour.

Questions people ask before buying

Can a guest start a return without an account?

Yes. They prove the order is theirs with the order number and the address the confirmation went to, without logging in, then pick the lines they are sending back with a reason for each.

Can I accept part of a return and refuse the rest?

Yes. You work a queue under Sales → Return Requests and accept or refuse line by line, rather than taking or rejecting a whole request.

Does it work with OpenCart 4?

Every Kyvero extension is built for OpenCart 4.x. Each one declares the lowest release it will install on and refuses to install below it, and its documentation lists the releases a full install-and-upgrade pass was run against.

Do I get the source code?

Yes. An extension is PHP on your own server: readable, not obfuscated, and with no remote licence check to fail. Your copy is yours to modify and to keep backed up.

Who answers when something goes wrong?

A developer, usually the one who wrote the extension. There are two official routes, the support portal and the support address, and both arrive in the same place.