Get in touch
  • OpenCart
  • Payments
  • v1.0.1

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.

Download Free
Pro · lifetime licence The more sites, the less each one costs
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
Or all 173 Pro modules with All Access — 4 990 ₴ / year

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.

Feature Free Pro
Matches orders waiting for payment with the payment status at LiqPay, monobank (Mono Acquiring), WayForPay and Portmone through their official APIs ✔ ✔
Keys are read from the settings of our payment modules, no need to enter them twice ✔ ✔
Monitor: Needs attention, Waiting, Closed, tiles and cards for the four payment modules ✔ ✔
Apply payment button: the bank is asked once more, the status is set through the standard order history ✔ ✔
Short payments, another currency, holds and refunds are only shown, the order status is not changed ✔ ✔
Also finds lost orders with no status that the order list does not show ✔ ✔
Background check: the OpenCart 4 scheduler and a URL with a secret key for the hosting cron ✔ ✔
A line on the order page with the bank answer and an Ask the bank now button ✔ ✔
Menu item Sales > Payment Status Sync with a counter ✔ ✔
Payment methods page: the paid share for every payment method of the store and a drop flag ✔ ✔
Event log ✔ ✔
Admin in English, Ukrainian and Russian, builds for OpenCart 4.x, 3.x and 2.3 ✔ ✔
Confirmed payments applied automatically without a click, lost orders included — ✔
E-mail and Telegram alerts: fixed orders, short payments, holds, API errors — ✔
An alert when a payment method suddenly stops producing paid orders — ✔
Failed status for payments the bank declined, after the checks end (switched on separately) — ✔
Log export to CSV — ✔

What it looks like

Payment Status Sync monitor in OpenCart 4.1: tiles, payment module cards and orders the bank has already paid
The monitor (OpenCart 4.1, free version, demo orders and a test bank): four orders need attention. The bank confirmed LiqPay #201 and WayForPay #203 while the orders are still Pending, with an Apply payment button next to them. Portmone #204 is a short payment (600 of 900 UAH) and monobank #202 is a hold: the module only shows these two.
The module line on the OpenCart order page: the bank answer, Ask the bank now and Apply payment buttons
Order #203: WayForPay confirms the payment (Approved, 300 UAH) while the order still waits. Ask the bank now asks the bank right away, Apply payment sets the paid status.
Payment methods page: the paid share of orders over the last 24 hours against the 14 days before
Payment methods: for every payment method of the store, the share of orders that reached a paid status over the last 24 hours against the 14 days before. A method is flagged Dropped when the share falls by 25 points or more.

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

v1.0.1 Current 10 October 2026

OpenCart 4.0.2 with the PDO database driver: the check run stopped with SQL error 1064 — fixed.

v1.0.0 First release 10 October 2026

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

“Store starter” bundle Payment Status Sync Nova Poshta Premium LiqPay Telegram notifications and Viber/SMS for customers Need more — all 173 modules in All Access for 4 990 ₴.
3 790 ₴ lifetime instead of 6 260 UAH bought separately
Buy the bundle →

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

  1. 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.
  2. 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.
  3. The status request follows the bank documentation: LiqPay action=status, monobank invoice status with the merchant token, WayForPay CHECK_STATUS with the response signature checked, Portmone method=result. Keys and secrets come from the payment module settings and are decrypted the same way that module does it.
  4. 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.
  5. 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) and oc_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

  1. 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 of upload/ from cc_paysync-oc2.ocmod.zip to the store root (FTP or the hosting file manager). The 2.3 Installer does not copy files without a configured FTP.
  2. Extensions > Extensions > Modules > CatCode Payment Status Sync > Install.
  3. Sales > Payment Status Sync. The payment module cards should say checked. Press Check all now.
  4. 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.
  5. 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.

@catcode_support Setup, compatibility, activation
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.

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