The short answer: when a WooCommerce subscription customer is charged twice, the cause is almost always one of five things: a payment gateway or plugin bug, a conflict with a multi-currency or multilingual plugin, a renewal job that ran twice, a double-clicked "Pay now" link on an early renewal, or duplicate webhooks. Find out which one by checking whether the double charge sits on one order or on two, and then test one suspect at a time on a staging copy.
If this is happening to your customers right now, the first section below tells you what to do in the next 15 minutes. The rest of this guide covers how to find the cause, how to fix it properly, and what it costs to get help if you would rather not debug billing code yourself.
- Open your payment gateway dashboard (Stripe, PayPal, Braintree and so on) and list every duplicate charge from the last billing cycle.
- Refund the extra charge from the gateway dashboard. WooCommerce often cannot see a duplicate that was never recorded as an order.
- Email the affected customers a short, honest note. A fast apology and a refund usually prevents a chargeback.
- If renewals are about to run again in the next day or two, put the store on a hold plan (see Step 7) so the same customers are not charged twice again.
What "charged twice" can actually mean
Store owners say "double charge" for three different situations, and each points to a different cause. Before touching a plugin, work out which one you have.
| What you see | Likely cause | First thing to check |
|---|---|---|
| One renewal order in WooCommerce, two payments in the gateway | Gateway or multi-currency/multilingual plugin sending the payment twice | Payment IDs in the order notes versus the gateway log |
| Two renewal orders for the same subscription and billing date | Renewal job ran twice (scheduler or cron overlap) | WooCommerce → Status → Scheduled Actions |
| One extra charge right after the customer clicked "Pay now" or logged in during checkout | Early renewal link double-click, or a renewal and a cart item processed together | Timestamps of the two charges (seconds apart?) |
| Same charge repeated on a retry after a failed payment | Retry logic plus webhook updating the order late | Order notes showing "failed" then "paid" at the wrong times |
Step 1: Compare WooCommerce with the gateway
Open the subscription in WooCommerce and look at the related orders. Then open the same customer in your payment gateway and list every payment on the renewal date. You are comparing two records:
- One order, two payments: the gateway received the charge request twice. Skip to Step 3 and Step 4.
- Two orders, two payments: WooCommerce created the renewal twice. Go to Step 5.
- Timestamps a few seconds apart: suspect a double request such as a double-click or a duplicate webhook. Go to Step 6.
- Timestamps hours apart: suspect a retry or scheduler overlap. Go to Step 5.
Write down the gateway transaction IDs. You will need them if you contact your gateway support or the plugin author.
Step 2: Update and read the changelogs
Many double-charge bugs are real bugs that were already fixed. Check the WooCommerce Subscriptions version, your gateway plugin version, and WooCommerce itself. Read the changelogs for words like "duplicate", "charged twice" and "renewal".
WooCommerce's own release notes for a recent Subscriptions update describe a fix where an early renewal could charge the saved payment method twice for one billing period after a double-click on "Pay now", or when a browser preloaded the link. If you are on an older release, an update may fix the problem outright. Back up and test first, because renewal code is the last place to update blindly. Our WooCommerce staging site guide shows how to test safely.
Step 3: Test the multi-currency and multilingual suspect
Support-forum reports connect some renewal double charges to a multi-currency or multilingual plugin update running alongside a third-party Stripe gateway plugin. In those cases, the customer saw one order but two payments in Stripe, and the problem disappeared when the plugin was deactivated or rolled back.
To test this on staging:
- Clone the store to staging with a test gateway account.
- Deactivate the multi-currency or multilingual plugin.
- Trigger a renewal for a test subscription.
- Check the gateway test dashboard for one payment or two.
If the duplicate vanishes, you have found the conflict. Check the plugin vendor's compatibility notes for your gateway. If you are not sure how to isolate it, our plugin conflict troubleshooting guide walks through the method.
Step 4: Look at the gateway plugin itself
Some reports involve a single gateway only. A store may charge twice on one card gateway and never on its other gateways. That pattern points to the gateway plugin or its API integration, not WooCommerce.
- Check the plugin's changelog and support forum for the same symptom.
- Look for multiple payment intents or charge attempts for one renewal in the gateway log.
- If the plugin is abandoned or the bug is open with no fix, plan to switch gateways or patch it. Our WooCommerce payment gateway integration guide covers what to look for in a replacement.
Step 5: Check for a renewal job that ran twice
Subscription renewals run as scheduled background jobs. If the scheduler runs two renewal jobs for the same subscription, or two processes pick up the same job, a customer gets billed twice.
- Go to WooCommerce → Status → Scheduled Actions.
- Search for the subscription ID or the renewal action name and filter by date.
- Look for two actions for the same subscription and date, or an action stuck in "in-progress" that was retried.
Two common causes of overlap are WP-Cron and a real server cron job both triggering the scheduler, and a slow or timed-out renewal job that gets retried while the first one is still processing. If your server is overloaded at renewal time, the second cause becomes more likely, so check your hosting resources too.
Step 6: Check early renewals and duplicate webhooks
If the two charges came seconds apart, look at what the customer did and what your gateway sent.
- Early renewal: a customer who double-clicks "Pay now" can send two requests. Update Subscriptions and test the flow on staging.
- Logging in during a renewal payment: a customer who logs in at checkout while paying a renewal, with the same product already in the cart, has been reported as a double-charge trigger in release notes. Update and retest.
- Webhooks: gateways can send the same event more than once. A well-built integration checks whether the renewal is already paid before charging again. If yours does not, the fix is in the integration code.
Step 7: Protect customers while you fix it
Finding the cause can take a few days. Protect the next billing run first.
- Pause or reschedule renewals for subscriptions due in the next window if you can do it safely.
- Switch affected subscriptions to manual renewal for one cycle.
- Turn on gateway alerts for duplicate payments from the same customer within a short period.
- Keep a list of every refunded charge so your accounting matches the gateway.
Also confirm customers actually receive your refund and apology messages. If they do not, check our guide on WooCommerce emails not sending.
What a double charge costs you
The refund is the smallest part. Here is what a billing bug really costs a subscription store:
- Chargebacks. A customer who disputes with their bank costs you the amount, a dispute fee and a hit to your chargeback ratio.
- Lost subscribers. Customers charged twice often cancel, even after a refund.
- Support time. Every affected customer is an email thread.
- Account risk. A high dispute rate can lead a payment processor to review your account.
That is why a billing bug is worth fixing quickly, not at the end of the month.
What it costs to get this fixed
These are planning ranges based on the kind of work involved, not fixed prices. A real quote needs a look at your logs.
| Situation | Typical fix cost | Typical time |
|---|---|---|
| Update or plugin conflict found and resolved | $100 to $250 | Same day to 2 days |
| Scheduler or cron overlap, config fix and monitoring | $150 to $400 | 1 to 3 days |
| Gateway integration patch or webhook de-duplication | $300 to $800 | 2 to 5 days |
| Custom subscription code or gateway rewrite | $800 to $2,000+ | 1 to 2 weeks |
Compare that with the cost of a month of refunds, disputes and cancelled subscribers, and the fix usually pays for itself. If you are still deciding how your subscription setup should be built, our WooCommerce subscriptions cost guide explains what a reliable recurring-payments setup involves.
When to hire a developer instead of debugging it yourself
Handle it yourself if the fix is an update or a simple plugin conflict and you have a working staging site. Bring in a developer when:
- The duplicates continue after updating and deactivating suspect plugins.
- You see two renewal orders or two scheduled actions and do not know why.
- The problem involves custom code, a custom gateway or a webhook handler.
- You have no staging site and cannot afford to test on live billing.
- Renewals are due in the next day or two and customers are already affected.
If you want a second pair of eyes, see my WooCommerce developer page, or send me your gateway log and the subscription details. I will tell you what I see, and whether it needs a fix or a replacement, before you spend anything. For bugs that need new code, WooCommerce custom plugin development explains how that work is scoped.
How to stop it happening again
- Test renewals on staging. Before any major update, trigger a test renewal with a test gateway and confirm there is one charge.
- Keep a duplicate-payment alert. Most gateways can notify you of two payments from one customer in a short window.
- Update on a schedule, not at random. Test updates before a billing peak, not the day before one.
- Review scheduled actions monthly. Look for stuck or repeated renewal jobs.
- Keep the plugin list small. Every extra payment-adjacent plugin increases the chance of a conflict.
Frequently asked questions
Why was my WooCommerce subscription customer charged twice?
The usual causes are a payment gateway or plugin bug, a conflict with a multi-currency or multilingual plugin, a renewal job that ran twice, a double-clicked early renewal link, or a duplicate webhook. Compare your WooCommerce orders with the gateway log to find out which one applies.
How do I refund a double subscription charge?
Refund the extra payment from your payment gateway dashboard. If the duplicate was never recorded as a WooCommerce order, you may not be able to refund it from inside WooCommerce. Then tell the customer what happened.
Will updating WooCommerce Subscriptions fix a double charge?
Sometimes. Some double-charge cases, such as an early renewal link charging twice, have been fixed in newer releases. Read the changelog and test the update on staging before applying it to a live store.
Can two WooCommerce plugins cause duplicate subscription payments?
Yes. Forum reports link some duplicate renewal charges to a multi-currency or multilingual plugin used together with a third-party gateway. Deactivating the suspect plugin on staging and running a test renewal will confirm whether it is the cause.
How much does it cost to fix a WooCommerce subscription billing bug?
A plugin conflict or update fix often costs $100 to $250. A scheduler or webhook issue usually costs $150 to $800. Custom subscription or gateway code can cost $800 to $2,000 or more.
Should I pause renewals until it is fixed?
If renewals are about to run and you have not found the cause, yes. Pausing or switching affected subscriptions to manual renewal for one cycle protects customers from a second duplicate charge.