
Marketplace Returns Control for WooCommerce — returns and unclaimed parcels under control
A WooCommerce module that checks the waybills of your orders against Nova Poshta, Ukrposhta and Meest and shows the parcels that need a person: a return "arrived" but the goods are not on the shelf; storage at the branch is ending; a parcel is stuck; the order status contradicts the parcel; money was refunded before the goods came back. Pro also reconciles Rozetka, Prom and Epicentr orders, checks every hour and sends a digest by e-mail and to Telegram.
- Compatibility
- WordPress 6.2+ · WooCommerce 7.0+ (tested on WordPress 7.1 and WooCommerce 11.1) · PHP 7.4+ (run on PHP 8.3) · HPOS and the classic order storage
- Licence
- one site, annual
- Trial
- 7 days, no card, one per site
- Updated
- September 2026
What Free has,
and what Pro adds
The free version works with no time limit. Pro adds the rest of the features in the table.
What it looks like
Key points
What the customer sees
Customers do not see the module: nothing changes on the storefront or at checkout, and there are no extra requests or scripts on the shop pages.
What the admin gets
WooCommerce → “Returns control”: the parcel list with the number of problems on the menu item, and “Returns control settings”.

The trial starts when you ask
A fresh install is the free version, nothing switches on by itself. The “Try Pro for 7 days” button → e-mail → the key right in the window and by e-mail.

One key — one site
Moving the store? Unbind the licence on the old domain and activate it on the new one yourself. If our server is unreachable, Pro keeps working for 14 more days. For studios — keys for 5 or 25 sites, or unlimited.
Technical requirements
WordPress 6.2+, WooCommerce 7.0+ (tested on WordPress 7.1 and WooCommerce 11.1), PHP 7.4+ (run on PHP 8.3).
HPOS and the classic order storage — both tested.
Outgoing HTTPS requests from the server to the carrier APIs (and to the marketplace cabinets in Pro).
WP-Cron or a system cron — for the hourly check in Pro.
For Nova Poshta return waybills — the sender’s key or the recipient’s phone in the order; without them the module tracks the main waybill.
Version history
First public release: waybills from orders (Nova Poshta, Ukrposhta, Meest, own meta key, by hand), tracking of three carriers, Nova Poshta return waybills, verdicts (return without…
Frequently bought with Marketplace Returns Control for WooCommerce
4 modules in one order — 40% cheaper than separately


Nova Poshta Premium — a Nova Poshta module for OpenCart 2.3, 3.x and 4.x

LiqPay — Card Payments for OpenCart 2.3, 3.x and 4.x

Telegram notifications and Viber/SMS for customers for OpenCart
Full module description
Marketplace Returns Control for WooCommerce is a module for shops that ship with Nova Poshta, Ukrposhta or Meest and sell on Rozetka, Prom or Epicentr. A parcel the customer never picked up costs twice: delivery both ways plus goods that are “somewhere on the road”. Worse, a carrier or a marketplace sometimes closes such a parcel as “delivered” or “returned” while it still sits at a branch. A week later nobody remembers that it had to be collected.
The module checks every waybill of your orders against the carrier (with the “Check now” button, in Pro also every hour) and shows only the parcels that need a person. A return is closed not by the carrier status but by your “Return received” — when the goods are really back on the shelf. Waybills and keys come from our Nova Poshta, Ukrposhta and Meest modules, so after installation there is usually nothing to fill in.
What the customer sees
Customers do not see the module: nothing changes on the storefront or at checkout, and there are no extra requests or scripts on the shop pages. It works in the admin. Customers notice only the effects: you call them while the parcel is still at the branch, not after it has gone back; the money for a return is refunded when the goods have really arrived; the order status matches what happened to the parcel.
What the admin gets
WooCommerce → “Returns control”: the parcel list with the number of problems on the menu item, and “Returns control settings”.
- One verdict per parcel. Every waybill gets exactly one verdict, and the list is split into tabs: “Needs attention”, “Returns”, “In transit”, “Done”, “All”. Next to it — the carrier status with its code, the date of the change, the storage end date, the linked order and marketplace.
- Actions. “Return received” with a comment, “Mark resolved” (the parcel leaves “Needs attention” and comes back if its state changes again), delete, history.
- Filters and search. By source (WooCommerce, Rozetka, Prom, Epicentr), carrier, waybill, return waybill or order number.
- Adding by hand. The waybill of a parcel that is not among your WooCommerce orders, for example a marketplace order shipped by hand.
The box on the order screen shows the parcels of this order, the verdict, the “Return received” / “Cancel confirmation” / “Mark resolved” buttons and the history: who confirmed what and when. If no shipping module wrote the waybill, you can type it here and save it with the order.
- What to track. Which order meta keys hold waybills (our Nova Poshta, Ukrposhta, Meest, Marketplace Waybills modules or your own key), how many days back to take orders, which statuses to skip, after how many days without movement a parcel is “stuck”, how many days before the end of storage to warn.
- Carriers. Keys come from our shipping modules. The fields here are needed only if those modules are not installed or you want another key. Every carrier has “Save and test”.
- Order notes. A private note when a problem is found or a return is confirmed (can be turned off).
Pro: marketplaces, automation, Telegram
- Rozetka, Prom.ua, Epicentr. Cabinet orders with a waybill are reconciled with the carrier and with your order. The module catches three situations: the marketplace closed the order as received while the carrier did not deliver it; the marketplace and the carrier disagree; the money was refunded to the customer before the goods came back. Credentials from our Marketplace Waybills, Epicentr Price & Stock Sync and Prom Model Guard modules are picked up automatically.
- The link to the WooCommerce order comes from Marketplace Waybills. Marketplace orders without a WooCommerce order get into the list too.
- Hourly check of carriers and marketplaces, no button needed.
- Morning e-mail digest: the parcels that need attention.
- Telegram: urgent cases (the marketplace closed it as received, the marketplace and the carrier disagree, money refunded before the goods, “returned” without your confirmation, a lost parcel) at once, the digest in the morning.
- Order status changes by itself: after a confirmed return (for example “Refunded”) and after a refusal (for example “On hold”), with a note in the order.
- CSV of the list with the current filters, for Excel and accounting.
How it works — step by step
- As soon as an order is saved with a waybill written by a shipping module or by you, the module creates a parcel. Orders in statuses you skip (for example “Pending payment”) are not taken.
- “Check now” (in Pro also every hour) asks the carriers: Nova Poshta and Ukrposhta in batches of up to 100 waybills, Meest one by one. Parcels never checked go first, then the stalest ones.
- Every carrier’s answer is reduced to one state: in transit, at the branch, delivered, refused, coming back, returned to the sender, lost. For Nova Poshta the module takes the return waybill (except a redirect) and the storage end date.
- In Pro the module reads Rozetka, Prom and Epicentr orders that have a waybill and adds the marketplace state and the refund to the parcel.
- All of this plus your order status gives one verdict, from the most important to the ordinary: marketplace closed as received, disagreement, money before goods, “returned” without confirmation, lost, order status contradicts, storage ending, stuck.
- Every change goes into the parcel history, in Pro also into Telegram or the morning digest. A return is closed only by your “Return received”.
Under the hood
- Own tables
wp_ccmrc_parcels(one waybill — one row; the order and marketplace data are merged into it) andwp_ccmrc_events(history). Every query goes through$wpdb->prepare(). - Carrier APIs: Nova Poshta TrackingDocument.getStatusDocuments, Ukrposhta Status Tracking, Meest openAPI tracking. In Pro — Rozetka Seller API, Prom.ua API, Epicentr Marketplace API.
- Keys and tokens are encrypted with AES-256 plus HMAC and never printed into HTML. Keys of our modules are read through their classes, nothing is copied.
- Security: every action checks a nonce and the
manage_woocommercecapability. Anonymous requests to the handlers are rejected. - Removal: uninstalling removes the tables, settings, transients, cron events and the module’s own order meta. Waybills written by shipping modules stay.
How to install
- Download the free version
catcode-marketplace-returns-control-for-woocommerce-1.0.0.zipwith the button at the top of the page (or the Pro archive from your account after payment) and install it: Plugins → Add New → Upload Plugin. WooCommerce must be active. - WooCommerce → “Returns control settings”: check which order fields hold waybills. Keys from our shipping modules are picked up automatically — you will see “taken from the module …”.
- WooCommerce → “Returns control” → “Check now”. Parcels appear in the tabs by verdict.
- When a return has physically arrived, press “Return received” in the list or on the order screen.
- For Pro: paste the licence key from the e-mail after payment or press “Try Pro for 7 days” in the “Pro licence” section, then turn on the marketplaces and automation.
Questions
about the module
Didn't find the answer? Message us on Telegram and we'll reply within a business day.
Do I need a Nova Poshta API key?
No. Nova Poshta tracking works without a key. With the sender's key (or with the phone in the order) Nova Poshta also reports the return waybill and the date storage ends. If the key is wrong or expired, the module repeats the request without it and shows a warning in the parcel list saying where to fix the key.
Why confirm a return by hand?
Because the carrier status is exactly what goes wrong: a return marked "delivered to the sender" while the parcel is still at the branch. Such a parcel stays in "Needs attention" until you press "Return received" — that is, until the goods are really back on the shelf.
Another plugin writes the waybill into the order.
Enter its meta key in the settings ("Another order meta key") and choose the carrier, or "detect by the number". You can also type the waybill in the "Returns control" box of the order.
Which marketplaces does Pro support?
Rozetka, Prom.ua and Epicentr. The module reads cabinet orders that have a waybill and compares the marketplace status with the carrier. The link to the WooCommerce order comes from our Marketplace Waybills module; marketplace orders without a WooCommerce order are tracked too. Logins and tokens already entered in our modules are picked up automatically.
Was it tested on live cabinets?
Nova Poshta — live, on its API. Ukrposhta, Meest, Rozetka, Prom and Epicentr — by their official documentation on test answers: these services have no public sandbox. So try the module on your own parcels in the 7-day Pro trial, and if some status is read the wrong way, tell us and we will fix it.
Where does the data go?
Parcels, statuses and history are stored in your site's database. Waybill numbers go only to the carriers (and, in Pro, requests go to the marketplace cabinets you connected). The digest and Telegram go only to the addresses you entered.
Does the module change orders by itself?
In Free — no, it only adds private notes when a problem is found or a return is confirmed (can be turned off). In Pro you can choose the order status after a confirmed return and after a refusal; the default is "do not change".
No reviews yet. Be the first.
No questions yet. Ask one — we answer within 24 hours.
Not quite what you are looking for?
We build custom modules for WordPress, WooCommerce, OpenCart and Shopify. Tell us about the task and we'll prepare an estimate.
Order a custom module
Buying the module
—