If you have built more than two or three e-learning sites on WordPress, you already know the pattern. The client wants a course site. You reach for LearnDash because it is the mature, reliable choice for the actual learning part — courses, lessons, topics, quizzes, progress, certificates. That part works.
Then you start building the storefront around it, and you hit a wall. Then another one. And after the fourth or fifth project you realize you are writing the same custom code every single time, for the same missing pieces.
That is roughly the story of how we ended up building an add-on. This post is less a product pitch and more a list of the specific gaps we kept falling into — because if you are building a LearnDash site right now, you are going to fall into them too, and it is worth knowing where the holes are before you quote a client a timeline.
One thing up front so there is no confusion: we are not LearnDash, and we have no affiliation with the company behind it. What we built is a third-party add-on that sits on top. Everything below is our own experience with the platform, not an official position from anyone.
Wall #1: your course grid can't show a price
This is the one that surprises people first, and it is the most visual.
Say you are designing the site in Elementor — which, realistically, most people are. You build a beautiful course archive: a grid of cards, each one showing a course. And you go looking for the widget that displays the course price on that card.
It isn't there.
You can show the title. You can show the featured image. You can show the excerpt. But the price — the single most important number on a commerce page — is not something you can just drop onto a template. Same story for a sale price, a "was $99, now $49" strike-through, a discount badge, or a seat counter. LearnDash stores a price on the course, but it does not hand you the building blocks to design with it.
So every project turned into the same thing: custom shortcodes, a bit of PHP, some get_post_meta() calls, and a template partial that only that one site would ever use. Rewritten from scratch next time, because of course it was.
The fix we settled on was a set of Elementor widgets that treat course commerce data as first-class design material — course grid, price, regular price, sale price, discount badge, enrollment button, stock counter, countdown timer. Eight widgets, plus shortcodes for the people who are not using Elementor. Nothing clever. Just the pieces that should have existed already, so you can lay out a course card the way you would lay out any WooCommerce product card.
And the sale price is set where you would expect it — right inside the course edit screen, next to the regular price. Not in a separate settings panel three menus away.
Wall #2: there is no seat limit
Here is a scenario that comes up constantly and has no native answer: a live cohort with twenty seats. A workshop with a room that fits thirty people. A mentorship program the instructor can only handle eight of at a time.
LearnDash, as far as we have found, has no concept of enrollment capacity. A course is infinitely purchasable. If two hundred people buy your twenty-seat cohort, that is two hundred refunds and one very unhappy client phone call.
WooCommerce solves this for products — it is called stock. So the sensible move is to let a course behave like a stocked product: set a maximum number of enrollments, show the remaining count on the front end ("6 seats left" does more for conversion than any amount of copywriting), and stop sales when it fills.
The other half of that is duplicate purchase blocking. Without it, an already-enrolled student can buy the same course again, which quietly eats a seat and generates a support ticket.
Wall #3: your sales data lives in the wrong place
This one is the least visible and the most annoying six months into a project.
LearnDash can take payments. But once you are selling seriously, you want your orders where the rest of your store's orders are: in WooCommerce. That is where the refund flow lives, where the reports live, where the tax handling lives, where every accounting and analytics plugin in the ecosystem is already looking. Splitting course sales into a separate silo means you have two sources of truth about your revenue and no single place to reconcile them.
So the integration side of what we built works like this:
- A single variable product is created on your site. That product is the bridge — it is what makes course sales real WooCommerce orders.
- When a user goes to buy a course, a variation for that course is generated automatically. The user does not see any of this; they see a normal checkout.
- They pay through your existing WooCommerce gateway — whatever you already have configured — and come back to the site.
- Order status changes drive enrollment. Order completes, access is granted. Order is refunded or cancelled, access is revoked.
The part that matters is step 4. Enrollment follows order status automatically, in both directions. That is the difference between "we sell courses" and "we manually check the orders list every morning."
The payoff is that you now get proper sales reporting, refunds through the normal WooCommerce refund button, and every WooCommerce extension you already know how to use.
Wall #4: discounts, or the lack of them
LearnDash's built-in discounting is thin. If a client asks for a coupon code, a limited-time launch price, a bundle rule, or "20% off everything in the design category until Friday" — you are improvising.
Once course sales are real WooCommerce orders, coupons work the way coupons work. But we also wanted rule-based discounting on top: global rules that apply across courses, and course-specific rules for one-off promotions. Combined with a countdown timer widget, that covers most of what a launch actually needs without a second plugin and a compatibility gamble.
Wall #5: self-hosted video that LearnDash won't recognize
This is the most technical of the five, and the one that costs the most money if you get it wrong.
Video hosting for a course site is a real decision. YouTube is free but you lose control. Vimeo and Wistia are excellent and expensive at scale. A lot of people land on the middle path: a download host, or an FTP box on a subdomain — something like dl.yourdomain.com — where you upload the video files yourself and pay for bandwidth instead of a per-seat platform.
The problem is that LearnDash historically would not recognize those files as lesson video. You had a perfectly valid MP4 sitting on your own server, a direct URL to it, and no clean way to hand it to the lesson video field.
So we added it. You point the lesson at your own URL — MP4, WebM, OGG, or a streaming manifest for HLS or DASH — and it plays as the lesson video, with LearnDash still tracking completion the way it normally does. Your files, your subdomain, your bandwidth bill.
What actually changes about how you build
Step back from the individual features and the shift is this: your course site stops being limited to what LearnDash's own templates can express.
You design course listings and grids in Elementor with real commerce data on them. You sell through WooCommerce, so your reporting, refunds, coupons, tax setup, and gateway are all the ones you already use. You host video wherever the economics make sense. LearnDash goes back to doing what it is genuinely great at — being the learning engine — and stops being the bottleneck on everything wrapped around it.
We also made the boring parts boring on purpose: HPOS compatible, translation-ready, low-stock alerts, automatic access revocation. Those are the things you do not think about until the project has been live for a year.
Some honest caveats
This is not for everyone. If you are selling three courses at a flat price and never running a promotion, LearnDash's built-in checkout is fine and you should not add a layer of complexity you do not need.
Where it earns its place is the moment any of these become true: you are designing custom course templates in Elementor, you need seats to be finite, you want course revenue in the same reports as everything else you sell, you run promotions, or you host your own video.
If you have been fighting any of those five walls, it is worth a look. The plugin is LumoWP's LearnDash to WooCommerce Integration — and if you want to see the flow rather than read about it, watch the tutorial video on the product page first. It is a much faster way to tell whether this solves your problem than any blog post, including this one.
If you have built LearnDash sites and hit gaps I did not list here, I would like to hear about them in the comments — a couple of features in this add-on exist purely because someone described a problem we had not run into yet.





Top comments (0)