
Your WhatsApp lights up: “I paid through FPX already, why is my order still pending?” You open WP Admin and the order sits on Pending payment. No stock was reduced, no confirmation email went out and you are not sure whether the money arrived.
A WooCommerce pending payment status is not an error by itself. It is the normal first step of every online order. It only becomes a problem when the status never moves even though the customer paid by FPX, DuitNow or e-wallet.
This guide ranks the causes by how often we see them on client stores. It gives fixes based on WooCommerce’s own help pages (checked in October 2026), sets honest timelines and shows how to stop it happening again. If the payment page itself shows an error and customers cannot pay at all, read our guide on why a payment gateway keeps failing at checkout instead. This article is about payments that went through but never updated the order.
The video below shows how stuck background tasks can hold up orders, which is one of the causes covered in Sections 2 and 4.
Source video: Watch on YouTube (ShieldClimb)
Quick Answer: Pending payment means WooCommerce has created the order but has not received confirmation that it was paid. Stock is not reduced and no order email is sent. The order moves to Processing only when the payment gateway tells your store the payment succeeded. If that message never arrives, the order stays pending.
WooCommerce’s order status documentation describes Pending payment as an order that has been received with no payment made, usually waiting for customer action. Compare it with the statuses it is often confused with:
| Status | Payment received? | Stock reduced? | What you should do |
|---|---|---|---|
| Pending payment | Not confirmed | No | Check the gateway before shipping |
| On hold | Waiting for you to confirm | Yes | Match the bank transfer, then mark Processing |
| Failed | No, declined | No | Ask the buyer to retry with another method |
| Processing | Yes, paid | Yes | Pack and ship |
Source: WooCommerce Docs — Order statuses, compiled by ZenWeb, October 2026.
The key difference is who is waiting. On hold waits for you, for example to match a manual bank transfer. Pending payment waits for the gateway. Manual bank transfer orders sitting on Pending payment usually mean the payment method is set up wrongly.
Quick Answer: The most common reason is that the buyer never finished paying, for example by closing the FPX bank page. When the buyer did pay, the gateway’s payment callback (also called a webhook or IPN) was blocked or rejected. Caching, firewalls, security plugins, wrong API keys and stuck background tasks cause most blocked callbacks.
Here is how the causes rank on the Malaysian WooCommerce stores we support:
| Root cause | Share of cases |
|---|---|
| Buyer abandoned payment (no money taken) | 41% |
| Callback blocked by firewall, CDN or security plugin | 21% |
| Wrong API keys, webhook URL or test/live mode mix-up | 14% |
| Checkout or order pages cached | 10% |
| Outdated gateway plugin or plugin conflict | 8% |
| Stuck background tasks (WP-Cron or Action Scheduler) | 6% |
Source: From ZenWeb client tracking of Malaysian SME WooCommerce stores, 2024–2026. Illustrative of typical patterns, not WooCommerce data.
The top cause is not a fault at all. Malaysian buyers often open the FPX bank page, see the amount, then close the tab or switch to another payment method. That leaves a pending order with no money behind it. The other causes are real faults, and WooCommerce’s order troubleshooting guide points to the same two areas: the gateway not completing its response, and webhook notifications not reaching the store. If the idea of a callback is new to you, our explainer on what a payment gateway is covers how the payment round trip works.
Paid orders piling up on pending?
We build and maintain WooCommerce stores for Malaysian businesses, with payment callbacks tested before launch. See our web design services →
Quick Answer: Search for the order number in your payment gateway’s merchant dashboard first. Then open the order in WooCommerce and read the order notes, and check WooCommerce > Status > Logs for the gateway’s log. A paid transaction in the gateway with no matching note in WooCommerce confirms a blocked callback.
These steps follow WooCommerce’s troubleshooting guidance. You need an Administrator or Shop Manager login and access to your gateway account.
Keep the buyer in the loop while you check. A short WhatsApp reply such as “We can see your order and are confirming the payment” stops them paying twice. Pending orders send no confirmation email, which is why buyers worry so quickly; our guide to WooCommerce emails not sending explains the link.
Quick Answer: Match the symptom in your log to its cause. Exclude Cart, Checkout and My Account from caching, allow the gateway’s callback URL through your firewall and security plugin, confirm live API keys and webhook URL, update the gateway plugin, and get WP-Cron running again. Test with a small real order after each change.
Use this table to go straight to the likely fix instead of changing everything at once:
| What you see | Likely cause | Where to fix |
|---|---|---|
| Gateway shows “paid”, no order notes, 403 in gateway’s delivery log | Firewall, CDN or security plugin blocking the callback | Firewall rules, CDN bot settings, security plugin allowlist |
| “Signature mismatch” or “invalid hash” in the log | Wrong secret key, or test keys on a live store | Gateway plugin settings and merchant dashboard |
| Buyer sees an old cart or wrong order on return | Checkout or order-received pages cached | Caching plugin and hosting cache exclusions |
| Callback returns 301 or 302 redirect | Old http or non-www URL saved in the gateway | Webhook or return URL in the merchant dashboard |
| PHP fatal error in the log during payment | Outdated gateway plugin or conflict | Plugins page, tested on staging |
| Many past-due Scheduled Actions | WP-Cron not running | Hosting cron job or cron settings |
Source: WooCommerce Docs — Troubleshooting orders and caching guidance; ZenWeb audits of Malaysian SME WooCommerce stores, 2024–2026.
Work through the fixes in this order:
Test plugin changes on a staging copy where you can. Deactivating plugins on a live shop can briefly leave an add to cart button missing, shipping not showing at checkout or an Elementor editor that won’t load. If an interrupted update leaves a maintenance notice up, follow our guide to WordPress stuck in maintenance mode.
Quick Answer: For each pending order, confirm the payment in your gateway dashboard, then change the status to Processing by hand and add an order note with the transaction ID. Leave unpaid orders alone and let the Hold stock setting cancel them. Never mark an order paid based only on a customer’s screenshot.
Fixing the callback stops new orders getting stuck. It does not update the old ones. Clear the backlog like this:
Do not set Hold stock too short. A late callback on an already-cancelled order leaves you with a paid but cancelled order. Give buyers enough time to finish an FPX or e-wallet payment, and check cancelled orders against the gateway for a week after any change.
Quick Answer: Settings fixes such as cache exclusions or re-entered API keys take under an hour. Firewall and cron fixes depend on your host and usually take a few hours to a day. Callbacks blocked by a gateway-side issue depend on the provider’s support queue, which can take a few working days.
Use these ranges to plan, not as a promise:
| Cause | Typical time to fix |
|---|---|
| Cache exclusions for checkout pages | 15–30 minutes |
| API keys, webhook URL or test/live mode | 30–60 minutes |
| Gateway plugin update or conflict | 1–3 hours |
| Firewall, CDN or cron changes via host | Few hours–1 day |
| Issue on the gateway provider’s side | 2–5 working days |
Source: ZenWeb operational observations across Malaysian client WooCommerce stores, 2024–2026. Host and gateway response times vary.
While you wait, check your ads are not paying for a broken checkout. Look out for Google Shopping ads not showing, Meta catalog products getting no impressions or e-commerce tracking broken in GA4, since a stuck payment status often breaks purchase tracking too.
Choosing or switching payment gateways?
Compare FPX, card and e-wallet options before you commit, then let us connect it properly. See payment gateway integration in Malaysia →
Quick Answer: Place a small real test order after every plugin, theme, hosting or security change. Keep checkout pages out of every cache, keep the gateway plugin updated, keep a real server cron running and review pending orders against the gateway once a week. Most repeat cases start with an unchecked change.
We run this routine on the stores we maintain:
The same weekly check works across your marketing stack, whether it is Google Ads payment failed, TikTok Ads payment failed in Malaysia or a Meta Verified application pending.
Quick Answer: Get help when paid orders keep sticking after you have checked caching, keys and plugins, when the log shows errors you cannot read, when firewall or server cron changes are needed, or when you plan to switch gateways. These fixes touch live payments, so a mistake costs real sales.
Escalate when you see any of these:
ZenWeb is a Google Partner agency that has worked with 500+ Malaysian businesses. Our web design and WooCommerce services cover gateway setup, callback testing and maintenance, so stuck orders get cleared safely.
A WooCommerce pending payment order is only a problem when the money has arrived and the status has not. Work in order: confirm the payment in the gateway dashboard, read the order notes and logs, fix whatever blocked the callback, then update paid orders by hand with a note. Let Hold stock clean up the truly unpaid ones, and finish with a test order after every change. For more ways to keep your website and marketing running smoothly, start at the ZenWeb home page.
No. Pending payment means WooCommerce has no confirmation of payment. Check the transaction in your gateway dashboard first. If it is paid, change the order to Processing with a note, then ship.
Yes, if the Hold stock setting is on. Under WooCommerce > Settings > Products > Inventory, WooCommerce cancels eligible pending orders after the minutes you set and releases the stock. Leaving the field blank turns this off.
On hold means the order is waiting for you to confirm payment, which suits manual bank transfers. Stock is already reduced. Match the transfer in your bank account, then change the status to Processing.
No. Deleting them hides the symptom and can remove orders that were actually paid. Confirm each one against the gateway, fix the blocked callback, and let Hold stock cancel the unpaid ones.
Paid orders still stuck on pending?
Tell us which gateway you use and what your log shows. We will trace the blocked callback, clear stuck orders safely and test every payment method end to end.
Get A Free Proposal
Complete the form and our team will contact you to discuss your goals. Let’s grow your business.
Chat with us on WhatsApp
Tell us a little about what you need. We'll open WhatsApp with your message ready to send.