LearnDash + MemberPress LMS Development for a Certification Body
A professional certification body needed cohort-based drip content, verifiable certificates, WooCommerce enrollment, corporate seats and gated forums. I built it on LearnDash, MemberPress and BuddyPress for 6,200 learners.
- Client
- Professional certification body
- My role
- Lead WordPress / LMS engineer
- LearnDash
- MemberPress
- BuddyPress
- WooCommerce
- Action Scheduler
- PHP
- enrolled learners
- 6,200
- corporate seats across 85 companies
- ≈ 1,400
- certificate issuance
- 3 days → instant
- corporate renewal rate (up from ~74%)
- ~91%
enrolled learners
corporate seats across 85 companies
certificate issuance
corporate renewal rate (up from ~74%)
The challenge
A professional certification body needed learners to get drip content by cohort, a certificate with a serial number that anyone could verify, WooCommerce-to-LearnDash enrollment, corporate and group seats, and community forums gated by membership.
Certificates were a manual process that took 3 days, and the team was answering about 50 "is this certificate valid?" emails a month.
What I built
- 01
Drip schedule by cohort
Content is released relative to each learner's start date, not a fixed calendar date. A learner who enrolls in March gets Week 1 immediately and Week 2 seven days later. This uses custom learndash_lesson_access_from logic keyed on the course start date.
- 02
Certificates with public verification
A PDF is generated on completion with a unique serial number and a QR code. A public page at /verify/{serial} checks the serial against user meta. PDF generation is queued through Action Scheduler so checkout never blocks.
- 03
WooCommerce to LearnDash enrollment
Enrollment runs on woocommerce_order_status_completed, including group and corporate seat counts stored on the order line.
- 04
Corporate seat management
A company admin can invite and remove seats up to the purchased count. Seats deactivate when a membership lapses and reactivate on renewal.
- 05
BuddyPress gated forums
Forum visibility is tied to the MemberPress level, with a custom "you need Level X" upsell panel.
- 06
Custom learner dashboard
Progress rings, the next lesson, certificate download and a cohort calendar.
Gotchas and how I fixed them
Completion hooks can fire twice
learndash_course_completed fires more than once in some edge cases, such as re-completion or an admin override. The certificate action checks for an existing serial before it generates anything.
MemberPress and WooCommerce both want the checkout
When both handle the same product, pick one as the source of truth and mirror the other through hooks. If both grant access you get double enrollments.
Roles are per site on multisite
A "company admin" on the main site is not automatically one on a sub-site. Sync the role with add_user_to_blog and remove_user_from_blog.
Hiding menu items is not access control
For BuddyPress gating, I use bp_has_forums filters plus a hard redirect on direct topic URLs.
Code from the build
add_action( 'learndash_course_completed', function ( $data ) {
$user_id = $data['user']->ID;
$course_id = $data['course']->ID;
if ( get_user_meta( $user_id, "_cert_serial_{$course_id}", true ) ) {
return; // already issued — hook can fire more than once
}
$serial = strtoupper( wp_generate_password( 10, false, false ) );
update_user_meta( $user_id, "_cert_serial_{$course_id}", $serial );
wp_schedule_single_event( time(), 'my_generate_certificate_pdf', [ $user_id, $course_id, $serial ] );
}, 10, 1 );PDF generation is queued so checkout/completion never blocks; the serial is the source of truth for the public verification page.
Results
- 6,200 enrolled learners and about 1,400 corporate seats across 85 companies.
- Certificate issuance went from 3 days of manual work to instant.
- The verification page removed about 50 "is this certificate valid?" emails a month.
- Course completion up about 27% after the drip schedule and dashboard rework.
- Corporate renewal rate about 91%, up from about 74%, after automatic seat deactivation and reactivation.
Questions people ask
Can LearnDash drip content by cohort instead of a fixed date?
Yes. I wrote custom learndash_lesson_access_from logic keyed on each learner's course start date. Someone who enrolls in March gets Week 1 immediately and Week 2 seven days later.
How do I issue LearnDash certificates with a serial number and a public verification page?
On course completion, generate a unique serial, save it in user meta and queue the PDF with Action Scheduler. A public /verify/{serial} page checks the serial against user meta. Check for an existing serial first, because learndash_course_completed can fire more than once.
Can LearnDash handle corporate seats that follow a membership?
Yes. A company admin can invite and remove seats up to the purchased count. Seats deactivate when the membership lapses and reactivate on renewal. Corporate renewals rose from about 74% to about 91% after this was added.
Can MemberPress and WooCommerce both sell LearnDash courses?
Yes, but choose one as the source of truth for access and mirror the other with hooks. If both grant access you get double enrollments.