LMS

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

enrolled learners

corporate seats across 85 companies
≈ 1,400

corporate seats across 85 companies

certificate issuance
3 days → instant

certificate issuance

corporate renewal rate (up from ~74%)
~91%

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

  1. 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.

  2. 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.

  3. 03

    WooCommerce to LearnDash enrollment

    Enrollment runs on woocommerce_order_status_completed, including group and corporate seat counts stored on the order line.

  4. 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.

  5. 05

    BuddyPress gated forums

    Forum visibility is tied to the MemberPress level, with a custom "you need Level X" upsell panel.

  6. 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

LearnDash certificate (idempotent)php
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.