If you wish to mark paid orders as “Completed” automatically (i.e. without having to manually login to the site and “check” processing orders one by one), you can use the code below.
What is more, this snippet will completely skip the “Processing” order status transition, which means no “Order Processing” email notification will trigger either. Once again, these 4 lines of code could save you millions of hours… hope this helps!
PHP Snippet: Autocomplete WooCommerce Paid Orders
/**
* @snippet Programmatically Complete Paid WooCommerce Orders
* @how-to businessbloomer.com/woocommerce-customization
* @author Rodolfo Melogli, Business Bloomer
* @testedwith WooCommerce 3.8
* @community https://businessbloomer.com/club/
*/
add_filter( 'woocommerce_payment_complete_order_status', 'bbloomer_autocomplete_processing_orders', 9999 );
function bbloomer_autocomplete_processing_orders() {
return 'completed';
}
Is this still working? I just updated a bunch of stuff and now it doesn’t appear to be working for me.
Yep, I use it on this same website!
Hi
Does this update all historical orders or just those that come in after the coding has been added to functions.php ?
Correct, it’s not retroactive
Thank you for this amazing and simple code snippet! I found it very very useful for Woo Stripe gateway, specifically for virtual products that are not downloadable. The Stripe gateway will only set the status to Completed if both Virtual and Downloadable are checked per product. If just virtual then it will set it to Processing even after a successful payment which is not desired in this case. Thanks again!
Great!
Hey Rodolfo,
Is it possible to add a time delay to your code snippet, e.g. 24 or 48 hours?
Many thanks for all your fantastic code snippets. They always serve as a great guide.
Kind regards,
Pairfum London
Hello there, thanks so much for your comment! Yes, this is definitely possible, but I’m afraid it’s custom work. If you’d like to get a quote, feel free to contact me here. Thanks a lot for your understanding!
Hi Rudolfo, your script works fine, but maybe not always anymore?
On a client site 4 payments this year received the status ‘completed’, but afterwards it turned out that they were not paid.
From the order notes in Woocommerce it seems that processing the payments took longer than usual and therefore the customers left the payment page and returned to the website. After doing this, they received the order completed email message including a PDF invoice and on the site the order is marked completed.
The Woocommerce Mollie plugin is installed. Mollie is a European payment gateway like Ayden.
Thanks for all your helpful blogs, regards, Elisabeth
Hello Elisabeth, thanks so much for your comment! I just retested this on the latest version of WooCommerce and it still works. Unfortunately this looks like custom troubleshooting work and I cannot help here via the blog comments. If you’d like to get a quote, feel free to contact me here. Thanks a lot for your understanding! ~R
Same here. It does not always work with Mollie PSP.
I see. Maybe there is some bug that needs fixing in the Mollie plugin. Because this works perfectly for PayPal, Stripe, and others
In the Woocommerce official documentation, they suggests to use `add_action` on `woocommerce_thankyou` instead of `add_filter` on `woocommerce_order_status_completed`.
Any comments on the pros and cons of each?
Thanks!
https://woocommerce.com/document/automatically-complete-orders/
I have also tested both solution, seems like the one in WooCommerce documentation works but this does not.
Thanks for your comments Ken. This snippet works fine, I use it here on Business Bloomer as well. Do you use a custom payment gateway or one that is not developed by WooCommerce?
The main difference between the two is here: “this [Business Bloomer] snippet will completely skip the “Processing” order status transition, which means no “Order Processing” email notification will trigger either”
Thanks for your reply, I am using the WooSa adyen plugin (https://wordpress.org/plugins/integration-adyen-woocommerce/).
Fair enough, I see it’s a pretty new plugin, so if I were you I’d contact support and see if a fix is needed
Hi, I was wondering if it was possible to auto-complete for selected product categories only?
I suggest you take a look at “conditional logic”: https://businessbloomer.com/woocommerce-conditional-logic-ultimate-php-guide/. Enjoy 🙂
The code snippet works great to automatically mark an order as completed after payment has been processed, thank you. But it seems as if it doesn’t trigger the hook woocommerce_order_status_completed.
I have to manually change the status of the order in the backend. En then manually change the order status to completed before the hook woocommerce_order_status_completed – and my custom code hooked to this – gets triggered.
Have you experienced this? Any suggestions? (WooCommerce 3.9.3)
Sounds weird to me, honestly. This works fine on my setup
PS. I wonder if your snippet could be merged with this one somehow?:
https://gist.github.com/willgorham/874c4ac943fc27443cd862a93764d659
I’m in need of a solution for WooCommerce subscription products that I would like to have auto-completed.
Hey Jonas, thanks so much for your comment! Yes, this is definitely possible, but I’m afraid it’s custom work. If you’d like to get a quote, feel free to contact me here. Thanks a lot for your understanding!
Thank you! This is a really useful snippet!
Was wondering if there’s a way to make it only apply to orders that only contain virtual products?
Cheers!