-
Posted in : Efor
-
Hello Team,
I’m experiencing a really frustrating issue with a client website using Tutor LMS and WooCommerce with the official WooCommerce Stripe Gateway.
The Problem:
When customers purchase courses using Apple Pay or Google Pay, the payment processes successfully in Stripe but the order gets stuck at “Processing” status in WooCommerce.This creates three issues:
1) No course access – Students cannot access purchased courses due to “Processing” order status
2 ) Manual completion doesn’t trigger enrollment – Even when I manually change the order from “Processing” to “Completed”, students are not automatically enrolled in the course
3) Missing user accounts – In some cases, customers aren’t registered as WordPress users at all, requiring me to manually create their account AND enroll them in the course
What Works:
Payments with Credit/Debit cards, Link, and Klarna work perfectly. Orders automatically complete, customers get enrolled, and they receive instant access to course materials.I have a similar website for another client using the same theme and plugins and the issue exists also there.
Thank you for your assistance!
Best regards,
VasilisHi Vasilis,
Thank you very much for your detailed report — and for describing the behavior so clearly. 🙏
We understand how frustrating this can be.
Fortunately, the issue isn’t caused by the theme itself but rather by how the WooCommerce Stripe Gateway handles Apple Pay / Google Pay transactions in combination with Tutor LMS’s enrollment triggers.Here’s what’s happening technically:
When Apple Pay / Google Pay is used, Stripe processes the payment through a direct tokenized session, and the standard woocommerce_payment_complete hook isn’t always fired in real time.
Tutor LMS relies on that hook (or woocommerce_order_status_completed) to auto-enroll the user after checkout.
Because that hook is skipped or delayed, the order stays in “Processing” and the student never gets enrolled — even if you manually mark the order as “Completed”.
Recommended Steps
Update everything
Ensure the latest versions of Tutor LMS, Tutor LMS Pro, WooCommerce, and the WooCommerce Stripe Gateway plugin are installed.
(Older Stripe versions had incomplete support for Apple Pay / Google Pay webhooks.)Enable Stripe webhooks properly
In your Stripe Dashboard → Developers → Webhooks, make sure these events are active and correctly pointing to your site’s listener URL (typically
https://yourdomain.com/?wc-api=wc_stripe).
Missing or misconfigured webhooks can prevent order status updates.Add a small compatibility snippet
If the issue persists even after webhooks are verified, you can add the following custom code in your child theme’s functions.php or a snippets plugin:add_action('woocommerce_order_status_processing', function($order_id) { if (class_exists('TUTOR\Tutor')) { do_action('tutor_course_enrollment_after_payment_complete', $order_id); } });This forces Tutor LMS to trigger enrollment when an order stays in “Processing” due to Apple Pay / Google Pay behavior.
Optional temporary fix
If you prefer automatic completion for all paid orders (until an update from the plugin authors), you can use:add_action('woocommerce_thankyou', function($order_id) { $order = wc_get_order($order_id); if ($order && $order->has_status('processing')) { $order->update_status('completed'); } });Why credit/debit and Klarna work
Those payment methods use WooCommerce’s standard checkout flow, so the normal hooks fire correctly — that’s why enrollment completes instantly there.
This is a known compatibility behavior between Stripe’s express checkout and Tutor LMS, not related to the theme, and it’s being improved by both plugin teams in their recent releases.
Please try the steps above and let us know if it resolves the issue — we’re happy to guide you further if you share your current plugin versions and webhook settings.
Kind regards,
SerkanHi,
We’ve just released Efor v13.2.0.
This update includes the latest versions of bundled premium plugins to ensure full compatibility and optimal performance with the latest WordPress and Elementor releases.
You can view the full changelog here: https://www.pixelwars.org/themes/efor/
1. First, update your theme to the latest version following this guide:
https://www.pixelwars.org/forums/topic/how-to-update-your-theme/2. Then go to Appearance → Install Theme Plugins and update all bundled plugins from there.
Important:
If you encounter any issues or failed updates while updating bundled plugins from the “Install Theme Plugins” page:– Go to the Plugins page, deactivate the problematic plugin, and delete it.
– Then return to Appearance → Install Theme Plugins and install it again.This process will install the latest version of the plugin and will not affect any of your existing content or data stored in the database.
If you need license keys to activate Pro plugins, please request them here:
https://www.pixelwars.org/forums/topic/tutorlms-pro/For full documentation and detailed setup instructions, visit:
https://docs.pixelwars.org/efor.phpBest regards,
MehmetSerkan & Mehmet, I really appreciate both responses and all the information you provided! It is super helpful and shines a lot of light on the cause of problem.
I’ll be sure to implement the steps provided in the following days and see if it resolves the issue.
Please keep this thread open so I can post an update soon.
Have an amazing day ahead!
Best regards,
VasilisHello Serkan & Mehmet,
I have really good news!
Looks like the issue is now resolved!!
1) I performed the updates to the latest versions of my theme & plugins
2) I double checked all the Stripe Webhooks
3) Via “Code Snippets Plugin” I inserted the 2 snippets you provided above.Also I’m not sure if it mattered but I put a different priority to the snippets:
– Priority “10” to the one regarding the Tutor enrollment and
– Priority “20” to the one Autocompleting the woocommerce ordersI was thinking that if they fire with the same priority, the order might get completed before the enrollment happens. Let me know if this makes sense or should I make them both priority “10”??
I did test payments with Apple Pay and everything worked as expected!
Your help has been immense and I really appreciate the guidance.
Best,
VasilisHi Vasilis,
That’s fantastic news — we’re really glad to hear everything is now working perfectly! 🎉
And yes, your thinking about the priorities makes total sense.
Keeping the Tutor enrollment hook with priority 10 and the auto-complete hook with priority 20 is actually the optimal order — this ensures the enrollment action fires first, and only then the order moves to “Completed.”Thank you for taking the time to test and share your detailed results — this will surely help other users facing similar behavior with Apple Pay / Google Pay.
Have a great day ahead and happy teaching!
Best regards,
SerkanHello Serkan,
I have an update about the issue.
Despite the fix we implemented via the two snippets of code, after 3 days the issue seems to have appeared again for unknown reason.
I have both snippets activated in the “Code Snippets” plugin but neither students get access to the course after payment, not the orders get auto-completed. This happens on both Google Pay and Apple Pay methods
Also, I didn’t perform an update or did any change to my website.
Is there any reason this could be happening?
Best,
VasilisHi Vasilis,
Thank you very much for the update — and I’m really sorry to hear the issue resurfaced after everything was working smoothly.
Let’s troubleshoot it together step-by-step, because what you describe typically means one of the triggers stopped firing, usually due to a webhook delay, caching, or an isolated Stripe event not being delivered.1. Please help me confirm whether Stripe is sending the events
Can you go to:
Stripe Dashboard → Developers → Webhooks → Click your endpoint → View “Recent Deliveries”
For the problematic orders, please check if the following events show Success:payment_intent.succeeded charge.succeeded checkout.session.completed (if using Express Checkout)
If Stripe attempted to send them but marked them as Failed, then WooCommerce never receives the trigger — which explains why both snippets suddenly stop working.
This is the number one cause when everything works for a couple of days and then stops.
2. Let’s confirm that no caching layer is blocking callbacks
Sometimes hosting providers introduce updates or patches silently (server-level updates).
Could you check whether your hosting added or modified:
Server-level caching (LiteSpeed, Cloudflare, Redis, NGINX micro-cache)
A firewall/WAF rule
A security plugin that started blocking?wc-api=wc_stripe
Even a minor server-side WAF rule can block Stripe’s webhook calls.3. Regarding the code snippets
The priorities you set are correct and shouldn’t break spontaneously.
But sometimes Code Snippets plugin:
gets disabled automatically after a hosting update
skips execution due to a PHP warning
conflicts with object cachingCould you confirm:
Both snippets are still “Active”
No red warning appears inside Snippets → Logs
If you’d like, you can temporarily move the snippets into a child theme’s functions.php to rule out plugin-level conflicts.We’ll sort this out
Since it worked perfectly for several days, this is almost certainly related to a webhook or server response interruption rather than your theme or LMS setup.
Once you share the webhook delivery logs (success/failure), we’ll know exactly where the chain broke and help you fix it permanently.Looking forward to your update!
Best regards,
SerkanHello Serkan,
It took me some time to properly test. To respond to your comments:1) I checked at the endpoint recent deliveries. Stripe sends all the required events.
2) I disabled all cache. The issue persisted
3) Code snippets are active no issue there.My mistake was that I didn’t realize that the following snippet is not working under any scenario. No matter the tests, it’s not helping completing the enrolments.
add_action(‘woocommerce_order_status_processing’, function($order_id) {
if (class_exists(‘TUTOR\Tutor’)) {
do_action(‘tutor_course_enrollment_after_payment_complete’, $order_id);
}
});But I did manage to figure something out.
If a user is logged in and makes a purchase with Apple Pay or Google pay, the order is completed and he gets enrolled right away. So, the issue does not appear at all for logged in users.
**Accidentally, I was logged in myself when testing in the first place, and that’s why I thought the problem was solved!!!**
The problem appears when New users are doing a guest checkout that don’t have an existing account. So, I’m thinking maybe something goes wrong with the account creation process and that’s why enrolment fails and orders are stuck at “processing”.
Do you have any lead as to how we could fix this? Or alternatively, is there a way to escalate this to Tutor LMS team in order to troubleshoot and fix the issue?
Thank you in advance for your time!
Best,
VasilisHi Vasilis,
Thank you again for the detailed update — your findings are extremely helpful and they clearly reveal where the issue is coming from.
Based on your tests, we can now confirm:
✅ The problem only happens during guest checkoutWhen a user is not logged in, Apple Pay / Google Pay completes the payment in Stripe, but the WordPress user account is not created or linked early enough for Tutor LMS to attach the enrollment.
This explains why:
Logged-in users → enrollment works
Guest users → no proper account creation → no enrollment → order stuck in “Processing”This behavior confirms that the issue is not theme-related, but a compatibility gap between WooCommerce Stripe Express Checkout and Tutor LMS’s enrollment logic.
✅ We will escalate this to the Tutor LMS development team on your behalf
There is nothing you need to do at this point.We will prepare a technical report, including:
Your test results
The behavior difference between logged-in vs guest checkout
Confirmation that Stripe webhooks are delivered successfully
The fact that standard card payments work normally
The enrollment hook never firing for guest users using Apple/Google PayOur developer will forward this directly to the Tutor LMS engineers so they can reproduce and patch the issue at the plugin level.
We’ll keep you updated.
As soon as we receive feedback from the Tutor LMS team, we will follow up here and guide you through any necessary steps or fixes.Thank you again for your patience, your detailed testing, and for helping narrow this down so precisely.
You’ve already contributed significantly to identifying the root cause.Best regards,
SerkanHello serkan,
Thank you for the recap and for forwarding the information to the Tutor team!
I’ll keep an eye out for an update.
Till then if I can assist in any way let me know!
Best,
VasilisHello Vasilis,
Thank you for the update — and for offering to help.
We’ve already forwarded the full technical recap to the Tutor LMS team and we’re currently waiting for their feedback. As soon as we receive an official response or a patch recommendation, we’ll post it here immediately.
In the meantime, as a temporary workaround (to avoid blocked access for new customers), you can consider disabling guest checkout and forcing account creation/login for course purchases, since your tests confirm the issue only happens on guest checkouts. Tutor LMS also has guest checkout controls when using WooCommerce monetization, so disabling guest mode there can help minimize the impact until Tutor provides a permanent fix.
Thanks again for your patience — we’ll keep this thread updated.
Best regards,
SerkanThank you Serkan!
I really appreciate it!
Talk soon
Best,
VasilisHey serkan,
Hope you’re doing amazing!
I wanted to ask if there’s been any update on the issue mentioned above.
Looking forward to your reply!
Best,
VasilisHi Vasilis,
Thanks for checking in — hope you’re doing well too 🙂
I’ve reached out to our developer to see if there’s any update or progress on this issue. As soon as I hear back with any new information, I’ll get back to you right away.
Thanks for your patience in the meantime.
Best regards,
SerkanHi, I have passed this issue to the plugin author and here is their reply. Please check these solutions and let us know if it still not fixed:
Solution for Tutor LMS Pro + WooCommerce Stripe Issue Issue Analysis
The problem arises when using Apple Pay and Google Pay through WooCommerce Stripe Gateway, where orders remain in “Processing” status, preventing automatic enrollment in Tutor LMS. This issue is likely due to the specific flow of Stripe’s Express Checkout not triggering the necessary WooCommerce/Tutor LMS hooks.Steps to Resolve
Verify WooCommerce Settings:Ensure that the “Auto Complete Orders” setting is enabled for virtual products in WooCommerce. This can be done by adding a custom function to your theme’s functions.php file:
add_filter('woocommerce_payment_complete_order_status', 'auto_complete_virtual_orders', 10, 3); function auto_complete_virtual_orders($order_status, $order_id, $order) { if ('processing' === $order_status && $order->has_status('processing')) { $virtual_order = true; if (count($order->get_items()) > 0) { foreach ($order->get_items() as $item) { if ('line_item' == $item->get_type()) { $product = $item->get_product(); if (!$product->is_virtual()) { $virtual_order = false; break; } } } } if ($virtual_order) { return 'completed'; } } return $order_status; }Check Webhook Configuration:
Ensure that the Stripe webhooks are correctly configured to communicate with WooCommerce. The necessary events for order completion should be enabled, such as payment_intent.succeeded.
Custom Hook for Enrollment:If the issue persists, consider adding a custom hook to manually trigger enrollment upon order completion. This can be done by using the woocommerce_order_status_completed action:
add_action('woocommerce_order_status_completed', 'enroll_student_on_order_complete', 10, 1); function enroll_student_on_order_complete($order_id) { $order = wc_get_order($order_id); if ($order) { // Logic to enroll the student in Tutor LMS // Example: TutorLMS enrollment function } }Compatibility Check:
Confirm with Tutor LMS support if there are any known compatibility issues with Apple Pay/Google Pay and if there are any updates or patches available.
Testing:After implementing the above changes, conduct thorough testing with both logged-in and guest users to ensure that orders complete and enrollments occur as expected.
Additional Recommendations
Plugin Updates: Regularly update all plugins to the latest versions to benefit from bug fixes and improvements.
Consult Documentation: Review the documentation for both Tutor LMS and WooCommerce Stripe Gateway for any specific instructions related to payment gateways.By following these steps, you should be able to resolve the issue of orders remaining in “Processing” status and ensure automatic enrollment in Tutor LMS.
Hey Ahmet,
Thank you for your reply.
I tested the codes provided above and they don’t work.
The issue persists and for new customers checking out with Google Pay or Apple Pay the orders are stuck at processing and the enrollment isn’t happening.
I have at least 5 client websites using the Efor Theme and this issue is really frustrating for my clients for multiple months.
Specifically this thread has been opened in November 1st and no viable solution has been provided. On another client of mine this issue started since February 2025 so it’s almost been a year struggling with this.
Clients must log in daily to the website to complete orders and enroll students, which is tiresome and gives a bad rep to the website because customers don’t get their courses after they paid resulting in many complaints.
I would really appreciate if you could at least provide a tried and tested temporary or permanent fix.
Thank you in advance for your time.
Best,
VasilisI understand your frustration, I have prioritized this topic now, talking directly to the plugin author for a permanent fix. I will update you on this topic about the progress.
Hi again, here is the update from the plugin support:
“Thank you for the detailed explanation — this helps clarify the scenario very clearly.
You are correct: the behavior you’re describing is not expected, and enrollment should normally be triggered when the WooCommerce order status changes to Completed, regardless of whether the payment was completed immediately or updated later.
That said, based on what you’ve outlined, this does point to a limitation in the current Tutor LMS–WooCommerce integration, specifically when handling Stripe Express Checkout (Apple Pay / Google Pay) guest orders. In these cases, the user–order association and related metadata may not be fully available at the moment Tutor LMS evaluates the enrollment conditions, which can cause the enrollment logic to fail silently even when the order status is later changed to Completed.
At the moment, Tutor LMS does not officially provide a separate or alternative hook dedicated specifically to Stripe Express Checkout flows. Enrollment is still expected to rely on the standard WooCommerce order lifecycle, and manually changing the order status should work in normal scenarios.
I will inform our development team about this case and check whether there are any plans to improve or officially support this behavior in future updates. If they have any plans to add that, they will do so in a future update after collaborating with WooCommerce, but it will take time. We could not confirm the time frame.
In the meantime, you can use the standard Stripe method. I hope you understand my point.
Regards.”
I will update you on this topic when there is an update on this matter.
Have a nice day!
Hello Ahmet,
Thank you for relaying the response from Tutor Support.
First of all, this issue wasn’t always present. As I recall, the issue appeared after WooCommerce Stripe Payment Gateway Version 9.x.x. meaning Woocommerce-Tutor were functioning perfectly for Apple/Google Pay methods.
I don’t know what went wrong after Version 9.x.x. and that’s exactly the reason I’m asking for expert help from the plugin author.
Secondly, based on the Tutor Support response, I understand that no one has actually inspected or debugged my website to verify what’s going wrong.
Thirdly, there is
– no specific timeframe for a proper resolution
– no actual confirmation that this will be fixed in the future
– not even a temporary fix via a code snippetI’m sorry to say this, but this not support nor help. It’s just agreeing that there is an issue with the plugin and completely abandoning the end customer.
Finally, disabling completely Apple Pay and Google Pay is Not a solution because it would result in significant drop is sales across all my client websites using Tutor & Stripe. Apple Pay and Google Pay are now vastly used by consumers and it’s causing real damage to businesses in terms of revenue and reputation if they don’t work.
I kindly request someone to properly debug this issue and at least provide a temporary fix.
I use Efor and Tutor LMS across multiple websites and it’s really discouraging that all my clients face the same issue and also knowing that for every new website I built, it will be problematic from day 1.
I’ll be looking forward to your response.
Kind regards,
VasilisHi again, I am talking to the plugin support team about this issue and pushing them for a solution. I will post here when I got an update from the plugin support.
Thanks for your patience.
Hi, here is an update from the plugin support. I will post when there is an update from them:
“Thank you for explaining the impact so clearly and for outlining your concerns in detail — we completely understand why this is critical in a production environment.
I’ll share this information and your questions with our development team so they can review the behavior and provide their input. Once I receive feedback from them, I’ll be sure to update you right away with any clarification or next steps.
Thank you for your patience and for bringing this to our attention in such a constructive way.”
You must be logged in and have valid license to reply to this topic.