Skip to main content
A compliance report is the gap between assigned and finished, not a count of either. Reading enrollments as training records reports someone as trained when the data only says they were told to be.

What you’ll use

Models - course, enrollment, completion, user
Before you start
  • The connector is an LMS connector. A connector token works for one API category, so an HRIS token on /api/lms/v1/* returns 403 - see Authentication.

Steps

1

Read the catalog, filtered by status

Course, content, category, skill and user all carry a status of ACTIVE, PENDING or INACTIVE. Read the catalog without filtering, and you’ll get retired and unpublished courses too - and an unfiltered user read includes deactivated learners. A compliance count built on top of that includes people and courses that aren’t live anymore.
Narrow further with categories, skills or languages.Result: The courses that are actually live.
2

Read enrollments

Filter by user for one learner, or course for everyone assigned a given course. start_date_from and start_date_to scope the assignment period.Result: Who was assigned what, and when.
3

Find outstanding training with a null check

An enrollment with an empty completion is training that’s been assigned but not finished. No join needed.
This is the compliance report. Counting enrollments instead just reports the assignment, which everyone out of compliance also has.Result: The people who still owe the training.
4

Read completions for what was actually finished

Filter by user, course, content or grade. Scope by date with completed_at_from and completed_at_to.Check whether course or content is set before you count anything. A completion against a content is one module finished, not one whole course.Result: Achievements, dated, with scores where the platform tracks them.
5

Match learners to employees on email

LMS user IDs and HRIS employee IDs don’t correspond. Match on email_address, and keep a separate bucket for learners with no employee record instead of dropping them.Result: Learning data tied to real people, with the unmatched ones called out.

Frequently Asked Questions

A connector token only works for one API category. An HRIS connector called on /api/lms/v1/* returns 403 even with valid credentials.
Expected on many integrations. A large share of LMS platforms have no concept of skills, and some don’t separate content from courses. Check raw_data before treating it as a sync problem - see Inspect raw data.
Completions reference either a course or a content. Module-level completions are being counted as course completions - check which field is set.
Expected for contractors, former employees and outside participants. They hold LMS accounts with no HRIS record, and email_address is the only field you can reliably join on - see Record identity.
Almost always an unfiltered status. Retired courses and deactivated learners are returned right alongside live ones.
Not supported by any LMS model. Passthrough is the only route, and it’s specific to each integration - see Write support.