Skip to main content

Certificates and completion

A certificate is the formal record that a member finished a course. It's a PDF the platform generates on completion, persists in your organization's storage, and exposes via both a private download (for the member) and a public verification URL (for third parties checking authenticity). This page covers the full completion-to-certificate flow, what's on the certificate, and how to bulk-import completions from external systems.

When an enrollment is "complete"

Completion is gated on every required piece of the course being done. Specifically:

  1. Every required lesson has a "completed" event recorded for this enrollment. Optional lessons don't count. See modules and lessons for the required vs. optional distinction.
  2. Every assessment attached to the course — both module-level checkpoints and the course-level final exam — has at least one passing attempt for this enrollment. A passing attempt is one where the score percent met the threshold and grading is fully resolved (no Free Form answers still awaiting human review).

When both conditions are true, the platform:

  1. Flips the enrollment to Completed.
  2. Stamps the completion timestamp.
  3. Computes the final score as the mean of the member's passing assessment scores. If the course had no assessments (lessons only), the final score stays null — "completed without scoring" is a valid outcome.
  4. Fires a course completion notification to the member.
  5. Queues the certificate generation job in the background.

If a course has no assessments and no required lessons, an enrollment effectively completes the moment it's created — there's nothing to gate completion on. That's almost never what you want; build at least one required lesson or assessment into every course.

Certificate generation

A background job renders the certificate PDF and persists it. The job is idempotent: if you re-run it for the same enrollment (e.g., it gets retried after a transient failure), it returns the existing certificate rather than minting a new one. There is exactly one certificate per enrollment, never more.

The PDF is a landscape "Certificate of Completion" with:

  • Your organization's name (uppercased) at the top.
  • A "Certificate of Completion" title.
  • The member's first and last name.
  • The course title.
  • The completion date.
  • A certificate number at the bottom-right.

The certificate uses your platform's primary color palette (charcoal indigo by default) for the border and accents. There is no per-org template editor in the current release — the layout and design are fixed.

The PDF is stored in your organization's storage backend (the same one you configured under storage config). Members never see the storage key; downloads stream through the platform with auth checks every time.

What the member sees

A member's My Learning view has a Certificates tab listing every certificate they've earned. For each certificate:

  • They can view it inline.
  • They can download the PDF directly.
  • They can share the public verification URL.

A certificate stays in the member's list as long as the membership that earned it remains active on the platform. If the member is disaffiliated or otherwise loses platform access, the certificate row is hidden from their view — this is privacy protection, not data deletion (the certificate row still exists in the database; it's just no longer downloadable through their account).

Verification URL

Every certificate has a unique verification token. The public verification URL looks like:

https://your-platform-host/api/learning/verify/{verification_token}/

Hitting this URL returns a small JSON payload with:

  • The certificate number.
  • The issue date.
  • The course title.
  • The organization name.
  • The member's display name (first + last as they appeared on the certificate).

The verification endpoint is intentionally unauthenticated — that's the point. A third party (a national grand chapter HQ, a risk-management insurer, a job recruiter) can confirm a certificate is real without needing an account on your platform.

The endpoint deliberately exposes nothing else. There's no email address, no chapter membership detail, no list of other courses the member has taken. The token serves as the proof — knowing it means you (or someone the member shared it with) is allowed to confirm the certificate exists.

If you want to disable a certificate (e.g., it was issued by mistake), there is no "revoke" action in the UI today. Deletion of the enrollment cascades to deletion of the certificate, which makes the verification URL return 404. But that's destructive — it also wipes the member's record of the course.

Expiry and recertification

The current release does not auto-expire certificates. A certificate issued today stays valid forever from the platform's perspective; the verification URL keeps returning success.

If your org needs annual recertification (Title IX, hazing prevention, anti-bias training), the right pattern is at the enrollment level, not the certificate level:

  1. Publish the new course version each year ("Hazing Prevention 2027" supersedes "Hazing Prevention 2026").
  2. Use assignment rules or a manual bulk assign to re-enroll members in the new version.
  3. The old certificate stays valid as a historical record; the new course produces a new certificate when completed.

A future release may add explicit expiry dates on certificates (driving automated recertification reminders), but it isn't shipping today.

Compliance integration

If a course was linked to a compliance requirement at authoring time (the Compliance requirement field on the course form), then completing the course also writes a synthetic compliance submission against the member's chapter for that requirement.

So a chapter's compliance dashboard will reflect course completions automatically — your chapter officers don't have to manually log "this member finished the training" in two places. One completion event, two records.

The compliance submission is a best-effort link. If the requirement hasn't been seeded to that chapter yet (rare, but possible during compliance setup), the platform silently skips the compliance update rather than failing the certificate generation. The certificate is the priority.

Importing external completions (CSV)

If your org has historic training data from outside the platform — a previous LMS, a vendor's compliance system, paper rosters someone digitized — you can bulk-import it as completed enrollments via CSV.

The import file needs three columns:

  • member_email — the member's email address. The platform looks the member up by any email associated with their account (primary or secondary), case-insensitively.
  • course_slug — the course's unique slug in your org. You can find a course's slug in the course editor URL.
  • completed_date — when the member finished. Multiple formats accepted: YYYY-MM-DD, MM/DD/YYYY, full ISO timestamps with time. Naive dates assume your platform timezone.

Upload the CSV from Org → Learning → Reports (the import action is grouped with the reports tooling). The platform processes the file row by row:

  • For each row, it finds the member and the course. If either is missing — or is outside your authority — the row is reported as an error and the import continues.
  • For new completions, it creates an enrollment in the Completed state with the supplied date, then queues certificate generation.
  • For existing enrollments (the member was already enrolled and possibly mid-progress), it flips them to Completed with the imported date. The certificate is not regenerated in this case — the existing enrollment keeps whatever certificate it already had, if any.

You'll get back a summary: how many rows were processed, how many enrollments were created vs. updated, and a per-row error list for anything that failed. Errors are non-fatal — one bad row doesn't kill the rest of the import.

This is the recommended path for back-filling historic training before you went live on GreekManage. It is not the recommended path for ongoing training — for that, use assignment rules and let members complete courses natively on the platform.

Bulk download / roster export

There is no "download every certificate as a zip" action today. If you need a roster of who has completed what, use the Completion report on the Learning dashboard — it exports an Excel sheet listing members, courses, completion dates, and certificate numbers. Individual PDFs are downloadable one at a time via the member-facing flow.

Last verified against v0.62.1.