The following code snippet can be used to change the status of an order to ‘completed’ after a payment has been processed successfully by the Subscription for WooCommerce plugin. Simply add the following code snippet to the active child theme function.php.
Home > Docs > Subscriptions for WooCommerce > Change the Order Status After Successful Payment Using Subscriptions for WooCommerce
Change the Order Status After Successful Payment Using Subscriptions for WooCommerce
Last updated on May 29, 2023
Article by Safwana
Safwana is a technical content writer for WebToffee. She loves working in WordPress and writing about it.
Got any query? Please leave a comment or reach out to our support
Cancel reply
Got any query? Please leave a comment or reach out to our support
Privacy Overview
This website uses cookies to improve your experience while you navigate through the website. Out of these cookies, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of the basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website, to store user preferences and provide you with content and advertisements that are relevant. Such cookies will be stored on your browser but only upon procuring consent.
You will also have the option to opt-out of these cookies should you want to. But opting out of some of these cookies may have an effect on your browsing experience as per the descriptions elucidated against the respective categories below.
Cookie | Description |
---|---|
__cfruid | Cloudflare sets this cookie to identify trusted web traffic. |
__stripe_mid | Stripe sets this cookie cookie to process payments. |
__stripe_sid | Stripe sets this cookie cookie to process payments. |
cookielawinfo-checkbox-advertisement | Set by the GDPR Cookie Consent plugin, this cookie is used to record the user consent for the cookies in the "Advertisement" category . |
cookielawinfo-checkbox-analytics | Set by the GDPR Cookie Consent plugin, this cookie is used to record the user consent for the cookies in the "Analytics" category . |
cookielawinfo-checkbox-necessary | Set by the GDPR Cookie Consent plugin, this cookie is used to record the user consent for the cookies in the "Necessary" category . |
cookielawinfo-checkbox-preferences | This cookie is set by the GDPR Cookie Consent plugin to check if the user has given consent to use cookies under the "Preferences" category. |
CookieLawInfoConsent | Records the default button state of the corresponding category & the status of CCPA. It works only in coordination with the primary cookie. |
PHPSESSID | This cookie is native to PHP applications. The cookie is used to store and identify a users' unique session ID for the purpose of managing user sessions on the website. The cookie is a session cookie and is deleted when all the browser windows are closed. |
viewed_cookie_policy | The cookie is set by the GDPR Cookie Consent plugin and is used to store whether or not a user has consented to the use of cookies. It does not store any personal data. |
Cookie | Description |
---|---|
_ga | This cookie is installed by Google Analytics. The cookie is used to calculate visitor, session, campaign data and keep track of site usage for the site's analytics report. The cookies store information anonymously and assigns a randomly generated number to identify unique visitors. |
_ga_BQH8MSKD4M | This cookie is installed by Google Analytics. |
_gat_gtag | Identification code of website for tracking visits. |
_gid | This cookie is installed by Google Analytics. The cookie is used to store information on how visitors use a website and helps in creating an analytics report of how the website is doing. The data collected including the number visitors, the source where they have come from, and the pages visited in an anonymous form. |
_hjAbsoluteSessionInProgress | Hotjar sets this cookie to detect the first pageview session of a user. This is a True/False flag set by the cookie. |
_hjFirstSeen | Hotjar sets this cookie to identify a new user’s first session. It stores a true/false value, indicating whether it was the first time Hotjar saw this user. |
_hjid | Hotjar cookie. This cookie is set when the customer first lands on a page with the Hotjar script. It is used to persist the random user ID, unique to that site on the browser. This ensures that behavior in subsequent visits to the same site will be attributed to the same user ID. |
_hjIncludedInPageviewSample | Hotjar sets this cookie to know whether a user is included in the data sampling defined by the site's pageview limit. |
_hjIncludedInSample | This cookie is set to let Hotjar know whether that visitor is included in the sample which is used to generate heatmaps, funnels, recordings, etc. |
_hjIncludedInSessionSample | Hotjar sets this cookie to know whether a user is included in the data sampling defined by the site's daily session limit. |
_hjSessionUser_1376571 | No description |
_hjTLDTest | To determine the most generic cookie path that has to be used instead of the page hostname, Hotjar sets the _hjTLDTest cookie to store different URL substring alternatives until it fails. |
CONSENT | YouTube sets this cookie via embedded youtube-videos and registers anonymous statistical data. |
has_recent_activity | This cookie is used to signal to the code repository website if the user has browsed other website resources during the current session. |
tk_ai | Gathers information for our own first-party analytics tool about how our services are used. A collection of internal metrics for user activity and is used to improve user experience. |
tk_lr | This cookie is set by the JetPack plugin on sites using WooCommerce. This is a referral cookie used for analyzing referrer behavior for Jetpack. |
tk_or | This cookie is set by the JetPack plugin on sites using WooCommerce. This is a referral cookie used for analyzing referrer behavior for Jetpack. |
tk_qs | Gathers information for our own first-party analytics tool about how our services are used. A collection of internal metrics for user activity and is used to improve user experience. |
tk_r3d | The cookie is installed by JetPack. Used for the internal metrics for user activities to improve user experience. |
Cookie | Description |
---|---|
_fbp | This cookie is set by Facebook to deliver advertisements when they are on Facebook or on a digital platform powered by Facebook advertising after visiting this website. |
fr | The cookie is set by Facebook to show relevant advertisements to the users and measure and improve the advertisements. The cookie also tracks the behavior of the user across the web on sites that have Facebook Pixel or Facebook social plugin. |
VISITOR_INFO1_LIVE | A cookie set by YouTube to measure bandwidth that determines whether the user gets the new or old player interface. |
YSC | YSC cookie is set by Youtube and is used to track the views of embedded videos on Youtube pages. |
yt-remote-connected-devices | YouTube sets this cookie to store the video preferences of the user using embedded YouTube video. |
yt-remote-device-id | YouTube sets this cookie to store the video preferences of the user using embedded YouTube video. |
Cookie | Description |
---|---|
_gh_sess | This cookie is used to preserve users' states across page requests. |
Cookie | Duration | Description |
---|---|---|
_hjSession_1376571 | 30 minutes | No description |
_octo | 1 year | No description available. |
_zendesk_authenticated | past | No description |
_zendesk_session | session | No description available. |
_zendesk_shared_session | session | No description available. |
edd_wp_session | 12 hours | No description available. |
logged_in | 1 year | No description available. |
m | 2 years | No description available. |
Federico Van
June 29, 2021
Hi,
great job! I used the code and it works perfectly. But if I wanted to use this hook ‘woocommerce_subscription_renewal_payment_complete’ for Subsciptions renewal order, I could use the same code?
Thanks in advance
Mark
June 30, 2021
Hi Federico,
Could you please brief your exact requirement? This code can be used only to mark all orders as completed after payments.
Federico Van
June 30, 2021
Hi Mark,
and thanks for reply.
I would like to mark as Completed also the orders for renewal of subscriptions after the payment, not only the new orders
Mustafa Akgül
April 11, 2021
Hello there. If a note is written on the order, can I automatically change the order status to pending?
Mark
April 13, 2021
Hi Mustafa,
We do not have any particular hooks in the plugin to achieve this. Since order creation is a default woocommerce action, kindly check in some common woocommerce forums.
Amanda Wyatt
April 9, 2021
I have a very strange question relating to this. I need to auto update my status from “pending” to “processing”. I have an order approval gateway for an account customer – after the order is approved – that counts as the payment. So rather than requesting payment I need a status to be auto updated to processing… is there any help available for me?
Mark
April 16, 2021
Hi Amanda,
If you are required to auto update all pending order to completed, you might need to look for some plugin like this one here. Hope it helps.
Arif Sharif
August 19, 2020
Does this code work for the latest version of woocommerce?
Mark
August 26, 2020
Yes.
Roland Steinmassl
August 28, 2020
yes it works! i just implemented it.
Al Ortiz
July 22, 2020
What if I want to change only “On Hold” orders to “processing”, can I still use the above code?
Mark
August 7, 2020
Hi Al,
To change from on hold to processing orders, you should try the following:
add_action( 'woocommerce_thankyou', 'woocommerce_auto_processing_orders');
function woocommerce_auto_processing_orders( $order_id ) {
if ( ! $order_id )
return;
$order = wc_get_order( $order_id );
// If order is "on-hold" update status to "processing"
if( $order->has_status( 'on-hold' ) ) {
$order->update_status( 'processing' );
}
}
Roland Steinmassl
August 31, 2020
Hi Mark.
I switched it so that “processing” always goes to “on-hold” – BUT the problem is that i only need that after a successful payment – not when i set “processing” manually. Any ideas? Thanks, Roland
arash
June 14, 2020
it is better to use something like this:
add_filter( ‘woocommerce_payment_complete_order_status’, ‘ar_woocommerce_payment_complete_order_status’, 10, 2 );
if(!function_exists(‘ar_woocommerce_payment_complete_order_status’)){
function ar_woocommerce_payment_complete_order_status( $order_status, $order_id ) {
$order = new WC_Order( $order_id );
if ( ‘processing’ == $order_status && ( ‘on-hold’ == $order->get_status() || ‘pending’ == $order->get_status() || ‘failed’ == $order->get_status() ) ) {
return ‘completed’;
}
return $order_status;
}
}
Chris
April 9, 2019
This does not look like it targets orders created via a subscription. I sell physical products too. If I add this code, it looks like its going to mark my physical products as Completed too, “and never make it in to shipstation” could you confirm this?
Alan
April 9, 2019
Hi Chris,
If the above code snippet is used all the order status will be changed to completed from processing. If you required to change the status of only the subscription orders we can customize the snippet for you. Please reach us via support if you are interested in having the customized code snippet.
Colin
September 5, 2018
Hi Safwana
So adding the above code will just mark the original order as complete, but leave all the recurring payment alone? i.e. if a customers has 5 recurring payments, the original order will say complete, but the remaining 4 payments will all work fine and live in the WebToffee Subscriptions tab?
Thanks
Safwana
September 5, 2018
Hi Colin,
The above code snippet will change the status of orders to “completed” when it comes in as “processing”. Also, if the recurring order comes in the processing status, that will also be marked as completed.
If the parent order is set to complete from processing, that will not affect the remaining recurring orders and they will occur as expected.
Rob
August 19, 2018
Does this work for recurring subscriptions?
At the moment, only the first payment is taken and the subscription then shows as ‘on hold’.
I’ve done something similar to the above snippet for virtual products setting them to complete when payment is taken, but the subscriptions have a status of ‘active’ when complete.
So does this work, or should I just change it to $order->update_status(‘active’); ?
(I don’t have access to the site’s database to see what it’s actually stored as).
Rob
August 19, 2018
I think I get it now. Subscriptions aren’t orders, so when the order is set as complete the subscription status should update.
Safwana
August 20, 2018
Hi Rob,
The above snippet will let you mark the parent order as complete, which would be set to processing by default after payment processing. The subscription order status will be set to active if the order status is either processing or complete, considering the payment completed successfully.
The issue could be related to payment failure. Please reach us via our support desk and share us the version of the plugin and the payment gateway plugin you are using so that the developers can have a look.