
Payment Status Sync for OpenCart — match pending orders with the bank: LiqPay, monobank, WayForPay, Portmone
A module for OpenCart 4, 3 and 2.3 that finds orders still waiting for payment although the bank has already taken the money, because the bank notification never reached the store. It asks LiqPay, monobank (Mono Acquiring), WayForPay and Portmone for the payment status through their official APIs and shows every mismatch with an Apply payment button. Works with our payment modules and reads the keys from them. Pro sets the paid status by itself and sends alerts by e-mail and Telegram.
- Compatibility
- OpenCart 4.0.2 – 4.1.x (tested on 4.1.0.3 and 4.0.2.3, including DB_DRIVER=pdo) · OpenCart 3.0.x (tested on 3.0.5.0) · OpenCart 2.3.0.2 (PHP 7.0) · CatCode payment modules LiqPay, Mono Acquiring, WayForPay, Portmone · PHP cURL · MariaDB 10.11
- Version
-
v1.0.1 (OpenCart 4)
v1.0.1 (OpenCart 3.x)
v1.0.1 (OpenCart 2.3) - Licence
- one site, lifetime
- Trial
- 7 days, no card, one per site
- Updated
- 10 October 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 buyer sees
Nothing changes in the storefront or the checkout: the module adds no scripts and makes no requests from store pages.
What the admin gets
Menu item Sales > Payment Status Sync with a counter of orders that need attention, and the Monitor, Payment methods, Log and Settings pages.

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. For studios — keys for 5 or 25 sites, or unlimited.
Technical requirements
OpenCart 4.0.2 – 4.1.x (tested on 4.1.0.3 and 4.0.2.3 with the mysqli and pdo database drivers), 3.0.x (tested on 3.0.5.0) or 2.3.0.2.
A CatCode payment module: LiqPay, Mono Acquiring, WayForPay or Portmone for your OpenCart version, with saved keys.
PHP as your OpenCart version needs it: the 2.3 build was tested on PHP 7.0, the others on PHP 8.x. The cURL extension for bank requests and the licence.
Database: tested on MariaDB 10.11.
For checks more often than once an hour (and on OpenCart 3 and 2.3): a hosting cron that opens the check URL every 5 to 10 minutes. A ready crontab line is on the Schedule tab.
Version history
OpenCart 4.0.2 with the PDO database driver: the check run stopped with SQL error 1064 — fixed.
For OpenCart 4.x, 3.x and 2.3: matching orders waiting for payment with the LiqPay, monobank (Mono Acquiring), WayForPay and Portmone APIs, the monitor, the Apply payment button, the line…
Frequently bought with Payment Status Sync for OpenCart
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
Payment Status Sync for OpenCart is a module for stores that take card payments. It happens: the buyer paid, the bank took the money, and the order in the admin is still waiting for payment. The paid status is set by the notification the bank sends to the site. If it never arrived (the site was down, the notification URL changed, a firewall cut the request), the order keeps waiting. Nobody ships it, the buyer writes to support, and a manager opens the bank dashboard to match payments by hand.
The module asks the bank about every order waiting for payment through the official payment status APIs of LiqPay, monobank (Mono Acquiring), WayForPay and Portmone, and shows the orders that are actually paid, with an Apply payment button. The check relies only on the status the bank returns: the module guesses nothing from the cart, e-mails or timing. Short payments, payments in another currency, holds and refunds are shown, but the order status is not changed.
It works with our payment modules for OpenCart: LiqPay, Mono Acquiring (monobank), WayForPay and Portmone. The keys are read from their settings, so you do not enter them twice.
Running WooCommerce? There is a separate plugin for it — Payment Status Sync for WooCommerce: LiqPay, monobank, WayForPay and Portmone (our gateways), plus Stripe and PayPal.
What the buyer sees
Nothing changes in the storefront or the checkout: the module adds no scripts and makes no requests from store pages. The buyer only notices the result: a paid order does not get stuck waiting for payment, it gets shipped, and nobody asks for a receipt. If Notify the customer is on in the settings, the buyer gets the usual OpenCart status e-mail.
What the admin gets
Menu item Sales > Payment Status Sync with a counter of orders that need attention, and the Monitor, Payment methods, Log and Settings pages.
- Tiles: how many orders need attention, how many wait for payment, how many were fixed in 7 days and when the last check ran.
- Payment module cards: for LiqPay, monobank, WayForPay and Portmone, whether the module is installed, whether keys are saved, test mode, two-step payments.
- Needs attention: paid at the bank while the order waits, a short payment, money on hold, an API error. Waiting means not paid yet. Closed means fixed or moved to a new status some other way.
- Buttons: Check all now, Check for one order, Apply payment (the bank is asked once more) and Dismiss, which only removes the row from the list and leaves the order itself as it is.
The line on the order page
Orders paid with one of the four modules show at the top what the bank said last and when, with the Ask the bank now and Apply payment buttons. The line can be switched off in the settings.
Payment methods
- The paid share of orders for every payment method of the store, not only the four banks but also, for example, cash on delivery, over the last 24 hours against the 14 days before.
- Dropped means the share fell by 25 points or more with at least 5 orders in the window. A sudden drop usually means the bank stopped confirming payments (expired keys, a changed notification URL, a broken checkout), not that buyers changed their minds. All thresholds can be changed in the settings.
Pro: automation and alerts
- Automatic apply: when the bank confirms the full amount in the order currency, the order gets the paid status without a click, including a lost order with no status that the order list does not show.
- Alerts to up to 5 e-mail addresses through the store mail settings and to Telegram (bot token and chat ID): one message per run with what was fixed, what needs a person (short payments, holds), API errors (at most once every 6 hours per bank) and payment method drops (once every 12 hours).
- Failed status, optional: when the checks have ended and the last word of the bank was declined or expired, the order moves from the payment module’s waiting status to its failed status. Off by default.
- Log CSV: UTF-8 with BOM, opens in Excel.
How it works, step by step
- The module takes orders paid with one of the four payment modules whose payment log is still unpaid: orders with no status (lost), in the payment module’s waiting status, in the store’s new order status or in statuses you picked yourself. Paid and complete orders are never checked.
- The first request goes 15 minutes after the last status change, then less and less often, up to once every 12 hours. After 72 hours the module stops asking.
- The status request follows the bank documentation: LiqPay
action=status, monobank invoice status with the merchant token, WayForPayCHECK_STATUSwith the response signature checked, Portmonemethod=result. Keys and secrets come from the payment module settings and are decrypted the same way that module does it. - When the bank confirms the full amount in the order currency, the module re-reads the order and the payment log under a lock, writes the payment into the payment module log and sets the paid status through the standard OpenCart order history, just as the bank notification would: stock, coupons and e-mails work as usual.
- A short payment, another currency, a hold or a refund only makes an entry in the monitor and the log (and an alert in Pro). If the bank does not answer or limits the request rate, the order is asked again later and nothing changes.
Under the hood
- No core edits. No OCMOD patches. The menu item and the order page line use OpenCart events. One class library is identical in the three builds, and the code is compatible with PHP 7.0.
- Own tables
oc_cc_paysync_check(check state of each order) andoc_cc_paysync_log(event log). Core tables are not changed. In the payment module log only the row of the paid order is updated, with a conditional query, so a parallel bank notification is never overwritten. - Banks in turn. A run shares the request limit between the banks and ends within 35 s even when a bank answers slowly. HTTP 429 from a bank pauses that bank until the end of the run without counting the attempt.
- Check URL
index.php?route=extension/cc_paysync/cron.cron&key=…(on 3.x and 2.3:extension/module/cc_paysync_cron/cron). Without the key it returns 403. The admin buttons call the same URL. - The licence lives in a separate settings group, so Save does not touch it.
- Uninstall removes the events and (OpenCart 4) the scheduler task and keeps the log and the check state, so a new install sees them. For a full removal, drop the
oc_cc_paysync_*tables by hand.
How to install
- OpenCart 4: Extensions > Installer > upload
cc_paysync.ocmod.zip(keep the file name) and press Install. OpenCart 3: Extensions > Installer >cc_paysync-oc3.ocmod.zip. OpenCart 2.3: upload the contents ofupload/fromcc_paysync-oc2.ocmod.zipto the store root (FTP or the hosting file manager). The 2.3 Installer does not copy files without a configured FTP. - Extensions > Extensions > Modules > CatCode Payment Status Sync > Install.
- Sales > Payment Status Sync. The payment module cards should say checked. Press Check all now.
- On the Schedule tab, copy the line for the hosting cron (every 5 to 10 minutes). On OpenCart 4 the check also runs every hour without it.
- For Pro: paste the licence key from the e-mail after payment or press Try Pro for 7 days on the Licence tab.
Questions
about the module
Didn't find the answer? Message us on Telegram and we'll reply within a business day.
Why is an order still waiting for payment when the card was charged?
The paid status is set by the notification the bank sends to the site after the payment. If the site was down at that moment, the notification URL was changed, a firewall blocked the request or the hosting failed, the bank has the money and the order keeps waiting. The module asks the bank about such orders itself and shows which of them are actually paid.
Which payment modules does it work with?
With the CatCode payment modules for OpenCart: LiqPay, Mono Acquiring (monobank), WayForPay and Portmone, builds for 4.x, 3.x and 2.3. The module reads the keys and the payment log from them, so modules from other developers are not supported. The Payment methods page counts the paid share for any payment method of the store.
Can the module mark an order as paid by mistake?
The status is set only when the bank returns a successful status for the full amount in the order currency. Before applying, the bank is asked once more, and the order and the payment log are re-read under a lock. Short payments, another currency, holds and refunds are never applied, only shown.
What if the bank notification arrives later after all?
The module writes the payment into the log of the payment module itself, so that module treats the late notification as already handled: no second line in the order history and no second e-mail. In the tests this was checked for all four payment modules and for the reverse order too (notification first, then the module).
How often does the module ask the bank?
The first request goes 15 minutes after the last status change, so the bank notification has time to arrive. Then less and less often: 10, 20, 40 minutes … up to once every 12 hours, and after 72 hours the requests stop. Both limits can be changed in the settings. In OpenCart 4 the store scheduler runs the check every hour. For a faster reaction, call the check URL from the hosting cron every 5 to 10 minutes.
Do I need to renew the licence every year?
No. For OpenCart it is a one-time payment, a lifetime licence, one for all three builds: 4.x, 3.x and 2.3. The Pro trial starts only when you press the button. After the trial the check and the Apply payment button keep working. Only the automation, the alerts and the payment methods watch switch off.
Does the module change OpenCart files or the storefront?
No. No core edits, no OCMOD patches. The menu item and the line on the order page are added with OpenCart events. The module does not touch the storefront or the checkout and does not change core tables. The bank keys are used only to request the payment status.
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
—
