80% off for waitlist membersGet 20+ WooCommerce plugins — Launch from $39.80 or Lifetime from $49.80 

← Back to Guides

How to Reconcile WooCommerce Orders with Stripe and PayPal

WPBundle Team··9 min read
WooCommerce payment reconciliationreconcile WooCommerce orders with StripeWooCommerce Stripe reconciliation
WooCommerce and your payment gateway will almost never show the same revenue number. The discrepancies come from refund timing, failed payments, currency conversion, disputes, and payout batching. Monthly reconciliation catches these gaps before they become accounting nightmares.

It's the end of the month. WooCommerce says you did $12,450 in revenue. Stripe says $12,187. PayPal says $1,820. That's $13,007 from gateways versus $12,450 from WooCommerce. Where's the $557 difference?

Welcome to payment reconciliation — the least exciting but most important financial task for any WooCommerce store. The numbers will never match perfectly, and that's expected. The goal is to understand WHY they don't match and verify that every dollar is accounted for.

Why the Numbers Don't Match

There are legitimate reasons why WooCommerce's revenue number and your payment gateway's processed amount will differ:

1. Refund timing. WooCommerce records a refund when you initiate it. Stripe processes the refund 5–10 business days later. If you refund an order on the 30th of the month, WooCommerce counts it in this month's numbers but Stripe processes it next month.

2. Failed/abandoned payments. A customer initiates checkout, Stripe creates a payment intent, but the charge fails (insufficient funds, card declined). WooCommerce may record the order as "failed" or "pending" while Stripe records an attempted charge. These show up differently in each system.

3. Currency conversion. If a customer pays in EUR and your store currency is USD, WooCommerce records the USD equivalent at the time of order. Stripe may convert at a slightly different rate. The difference per order is small but compounds across many international orders.

4. Disputes and chargebacks. When a customer disputes a charge, Stripe immediately debits the disputed amount from your balance. WooCommerce doesn't automatically update the order status. The revenue shows in WooCommerce but the money isn't in your Stripe balance.

5. Fees don't reduce WooCommerce revenue. WooCommerce shows gross revenue. Stripe payouts are net of fees. This is the single largest "discrepancy" and it's not a discrepancy at all — it's just different reporting.

The most common "discrepancy" isn't an error — it's that WooCommerce shows gross revenue while Stripe shows net payouts after fees. Always compare gross to gross or net to net, never mix them.

Step-by-Step Reconciliation Process

Step 1: Export Your Data

From WooCommerce:

  1. Go to WooCommerce → Orders
  2. Filter by date range (the month you're reconciling)
  3. Export to CSV (all orders including refunded and failed)
  4. Note the total revenue, total refunds, and order count

From Stripe:

  1. Log into Stripe Dashboard
  2. Go to Payments → All Transactions
  3. Filter by the same date range
  4. Export to CSV
  5. Note total charges, total refunds, total fees, and net amount

From PayPal (if applicable):

  1. Log into PayPal Business
  2. Go to Activity → All Transactions
  3. Download the monthly statement or export transactions
  4. Note the same figures as Stripe
The most common reconciliation error is date range mismatch. WooCommerce uses your WordPress timezone. Stripe uses UTC. PayPal uses the account timezone. Make sure you're comparing the exact same 24-hour periods.

Step 2: Normalize the Data

Before comparing, make sure you're comparing apples to apples:

  • Remove taxes from WooCommerce totals if Stripe/PayPal don't include tax in their charge amounts
  • Separate refunds into their own column (don't net them against revenue yet)
  • Identify the gateway for each WooCommerce order (Stripe vs PayPal vs other)
  • Convert currencies to a single base currency if you accept multiple currencies

Step 3: Match Orders to Transactions

Each WooCommerce order should have a corresponding transaction in your payment gateway. The matching key is typically:

For Stripe: The Stripe Charge ID (stored as _stripe_charge_id in WooCommerce order meta)
For PayPal: The PayPal Transaction ID (stored as _paypal_transaction_id or similar)

Match every WooCommerce order to a gateway transaction. Flag any orders that don't have a matching transaction (possible payment failures that were marked as completed) and any gateway transactions that don't have a matching WooCommerce order (possible webhook failures).

Unmatched transactions in either direction are the most important reconciliation findings. An order in WooCommerce without a gateway transaction means money you think you received but didn't. A gateway transaction without a WooCommerce order means money received that you haven't fulfilled.

Step 4: Reconcile Refunds

Refunds are the most common source of discrepancies. Check:

  • Every WooCommerce refund has a corresponding gateway refund
  • The refund amounts match (partial refunds are common)
  • The refund dates are in the same reporting period (they often aren't)

For Stripe specifically, check whether any refunds were initiated directly in the Stripe dashboard (bypassing WooCommerce). These will show as gateway refunds without corresponding WooCommerce refunds — they're easy to miss and cause confusion.

Step 5: Account for Fees and Calculate Net

Once gross amounts are reconciled, calculate the net:

WooCommerce gross revenue
- Refunds initiated in this period
- Payment processing fees (from gateway data)
= Net revenue

Compare this net revenue to the total payouts received in your bank account from Stripe and PayPal during the same period. Note that payouts lag transactions by 2–7 days, so month-end payouts may not land until early the following month.

For more on tracking those processing fees inside WooCommerce, check our cash flow management guide and payment gateway fee comparison.

Common Discrepancies and What They Mean

Small amounts ($0.01–$1.00) per order: Usually currency rounding or conversion differences. Normal and not worth investigating individually. Track the aggregate to ensure it doesn't grow over time.

Exact order amounts missing from gateway: The payment likely failed after WooCommerce created the order. Check the order status — it should be "failed" or "pending," not "completed." If it's marked "completed" without a successful charge, that's a fulfillment error.

Gateway transactions without WooCommerce orders: Webhook failure. The payment went through but WooCommerce didn't receive the confirmation. Check your webhook logs in Stripe (Developers → Webhooks → Recent Events) for failed deliveries. The customer was charged but their order may not have been processed.

Large discrepancies ($100+): Usually disputed charges, manual refunds processed directly in the gateway dashboard, or test transactions. Investigate each one individually.

Failed webhooks are the most dangerous reconciliation issue because they mean customers were charged without orders being processed. Set up Stripe webhook failure notifications (Stripe Dashboard → Developers → Webhooks → Add endpoint) and check them weekly.

Automating Reconciliation

Manual reconciliation works for stores processing under 200 orders/month. Beyond that, consider automation:

Accounting software integration: QuickBooks and Xero integrations can automatically reconcile payment gateway transactions with WooCommerce orders, flagging discrepancies for review.

Stripe's built-in reconciliation: Stripe Sigma (available on Scale plan or $0.02/row for ad-hoc queries) lets you run SQL queries against your Stripe data. You can build custom reconciliation reports that compare charges to your WooCommerce order data via API.

Custom reconciliation scripts: For technically-inclined store owners, a script that pulls data from both WooCommerce REST API and Stripe API, matches transactions, and generates a discrepancy report can be built in a few hours and saves days of manual work per year.

How Often Should You Reconcile?

Weekly: Quick check — compare WooCommerce order count to Stripe/PayPal transaction count. If they match within 1–2, you're fine. If they're off by more, investigate immediately.

Monthly: Full reconciliation. Match all transactions, verify refunds, check for disputes, calculate net revenue vs payouts received. This is the minimum for any store doing $5,000+/month.

Quarterly: Deep reconciliation including fee analysis, payout verification against bank statements, and review of any recurring discrepancy patterns.

The minimum viable reconciliation is monthly. Set a calendar reminder for the 5th of each month to reconcile the previous month. It takes 30–60 minutes for a store doing 200–500 orders/month.

The Bottom Line

Payment reconciliation isn't glamorous, but it's essential. The stores that do it catch webhook failures, dispute fraud, and accounting errors before they compound. The stores that don't reconcile discover problems when their accountant asks why the books don't balance — or worse, when a customer complains they were charged but never received their order.

Start with a simple monthly comparison: WooCommerce gross revenue vs gateway gross charges. Match the numbers within 1–3%. Investigate anything larger. As your store grows, add automation to handle the volume. The goal isn't perfection — it's confidence that every dollar is accounted for.

Reconcile monthly at minimum: compare WooCommerce gross revenue against payment gateway gross charges, match within 1–3%, and investigate any larger discrepancies. The most critical finding isn't a dollar amount — it's unmatched transactions that indicate failed webhooks or processing errors affecting customer orders.

Level up your WooCommerce store

Join the WPBundle waitlist and get beta access to our plugin suite completely free.

Join the Waitlist