TechCorner HQ · Technical Troubleshooting Guide

WooCommerce Order Stuck Pending Payment After Successful Customer Payment: How to Fix It

By TechCorner HQ Editorial Desk Last reviewed Review standards

Quick Answer

When a payment provider shows that a customer was charged successfully but the WooCommerce order remains stuck in Pending payment, the store has not received or processed the payment confirmation. Start by checking the Order notes panel in WooCommerce > Orders and reviewing the gateway transaction logs in WooCommerce > Status > Logs. Common causes include unconfigured or blocked webhooks/notification URLs, gateway authentication or credential mismatches, or a PHP fatal error on your site during the order status transition.

Abstract technical network diagnostic visual depicting interrupted online payment order status processing.

Understanding Order Statuses in WooCommerce

In WooCommerce, order statuses reflect exactly where a transaction sits within the checkout, payment, and fulfillment lifecycle:

  • Pending payment: The order has been created and received, but payment has not yet been confirmed in WooCommerce.
  • Processing: Payment has been successfully received, stock has been reduced, and the order is awaiting fulfillment. All orders require manual processing to reach Completed unless every product in the order is marked as both virtual and downloadable.
  • On hold: The order is awaiting manual payment confirmation (such as Direct Bank Transfer / BACS) or delayed verification.

When an online gateway captures funds successfully, it sends a confirmation response, webhook, or Instant Payment Notification (IPN) back to your site, which triggers WooCommerce to move the order from Pending payment to Processing (or Completed for virtual/downloadable products). If that notification fails to arrive or cannot be processed, the order remains in Pending payment.

Before Making Any Status Changes

Warning: Never change an order status to Processing or Completed solely based on a customer message. Manually updating an unpaid order can trigger automated shipment or digital product delivery for uncaptured funds. Always verify the transaction ID, settlement amount, and captured state directly inside your payment gateway dashboard first.

Step 1: Check the Order Notes for Clues

Navigate to WooCommerce > Orders, select the stuck order, and inspect the Order notes box in the right column:

  • Gateway Response Present: If notes show an authorization notice or gateway message without moving to Processing, a subsequent capture notification or background callback may have failed.
  • No Payment Notes: If the order contains only creation notes, the payment provider never communicated the payment result to WooCommerce, or the connection timed out before reaching the store.

Step 2: Inspect Gateway and Site Error Logs

To inspect communication failures between your payment gateway and your site:

  1. Go to WooCommerce > Status > Logs.
  2. Use the log dropdown menu to select recent logs for your specific payment gateway (for example, Stripe, PayPal, or Square debug logs) and fatal error logs (fatal-errors).
  3. Look for HTTP 400 client errors (often invalid notification URLs or malformed payloads), 401/403 authentication failures (invalid webhook secrets or credentials), or PHP fatal errors occurring at the timestamp of the transaction.

Step 3: Verify Gateway Webhooks and Notification URLs

Most modern payment extensions rely on asynchronous webhooks or IPNs to notify WooCommerce when a transaction completes off-site or completes asynchronous verification.

  • Log in to your payment gateway portal (e.g., Stripe Dashboard, PayPal Developer Dashboard, or merchant portal) and review the Webhooks or Event Logs section.
  • Verify that the webhook URL matches your store's live HTTPS endpoint as specified in your payment gateway plugin's documentation.
  • Check the HTTP response status code sent back by your server. If the payment gateway recorded an HTTP status other than 200 OK (such as 403 Forbidden, 404 Not Found, 500 Internal Server Error, or 504 Gateway Timeout), WooCommerce could not process the notification.

If you are troubleshooting WooCommerce core outgoing webhooks rather than incoming payment gateway notifications, review our guide on WooCommerce Webhooks Automatically Disabled After Delivery Failures.

Step 4: Check for Plugin Conflicts and Staging Security Blocks

If the gateway records show that webhook delivery returned a 403 or 500 error:

  • Security and Firewall Rules: Web Application Firewalls (WAFs) or security plugins might block automated POST requests to gateway notification endpoints. Inspect security logs to ensure legitimate gateway IP ranges and user-agents are permitted.
  • Maintenance Mode & HTTP Basic Auth: Staging sites or stores behind password-protection plugins block incoming external webhook payloads.
  • Plugin and Theme Conflicts: A custom script or third-party plugin hooking into WooCommerce status change hooks (such as woocommerce_payment_complete or woocommerce_order_status_changed) can crash the execution before the database status update finishes. Test plugins in a staging environment to isolate conflicts.

Step 5: Safely Reconcile Existing Orders

Once you identify and resolve the gateway communication issue, reconcile any historical orders that remain in Pending payment:

  1. Confirm the captured payment status and transaction ID inside your payment processor merchant portal.
  2. Open the affected order in WooCommerce > Orders.
  3. Change the order status dropdown to Processing (or the status appropriate for your store workflow) and click Update.
  4. Add a private note in the Order notes panel documenting the gateway transaction ID and verification date for auditing purposes.

Sources & References