Payment Truth for WooCommerce

Logo

Read-only WooCommerce Stripe reconciliation for payment status, amount, currency, and refund mismatches.

View the Project on GitHub moxianyu6975-cpu/payment-truth-for-woocommerce

Stripe Payment Succeeded but the WooCommerce Order Is Still Pending

Quick answer

Stripe can report a successful payment while WooCommerce still treats the matching order as pending, on hold, failed, or otherwise unpaid. That disagreement does not automatically mean the customer should be charged again or that the order should be marked paid manually. First confirm that both records refer to the same transaction, then inspect order notes, Stripe events, webhook delivery, logs, and timing.

What the disagreement means

WooCommerce order status and Stripe payment status are separate records. The official Stripe extension normally updates the WooCommerce order after the payment flow and relevant webhook processing complete. A delay, configuration problem, interrupted request, plugin conflict, or manual edit can leave those records out of sync.

The observable fact is simple:

The cause is not established until the evidence is reviewed.

Evidence to collect before changing the order

  1. Confirm the WooCommerce order number and creation time.
  2. Copy the Stripe PaymentIntent ID (pi_...) or charge ID (ch_...) from the order metadata or transaction details.
  3. Verify that the Stripe object belongs to the same amount, currency, store mode, and order.
  4. Read the WooCommerce order notes for payment-complete or error messages.
  5. Review the corresponding Stripe event and webhook delivery status.
  6. Check WooCommerce Stripe logs and recent plugin, checkout, cache, firewall, or hosting changes.
  7. Allow for normal asynchronous processing before treating a brief delay as an incident.

Do not use a screenshot or customer statement as the only proof that the two records match.

Where Payment Truth helps

Payment Truth for WooCommerce scans recent orders created by the official WooCommerce Stripe Gateway. When a usable PaymentIntent or charge reference exists, it reads the matching Stripe record through the gateway’s existing connection and compares it with WooCommerce.

After a five-minute grace period, it can report the critical pattern “Stripe succeeded while WooCommerce still considers the order unpaid.” The finding keeps the order and provider evidence together, but it does not change the order, replay a webhook, capture money, or decide whether fulfillment is safe.

What the plugin cannot determine by itself

A mismatch does not prove that a webhook failed. The same visible result may follow an interrupted checkout, delayed processing, an extension conflict, a manual status edit, an incorrect transaction reference, or another integration problem. Root-cause analysis still requires logs and event history.

Official references