MastriaDocs

Certificates

A certificate on Mastria is a public page on your academy's domain that never revokes and never expires — the URL is the verification. It is issued by the same definition your impact reports use for "trained", so a credential and your cohort numbers can never disagree.

Turning certificates on

Open a course's settings and switch on Issue certificates (the Completion card). Learners who complete every published lesson earn one automatically — including anyone who had already finished before you enabled it. Optionally name the credential; empty uses the course title.

Three credentials, told apart by name everywhere they appear:

  • Certificate of completion — every published lesson complete.
  • Assessed certificate — every lesson complete and every lab check passed cleanly. Switch on Also require passing every lab check: real checks against real execution state, and revealed checkpoint solutions don't count (learners can re-attempt for a clean pass). The course page shows the bar from the first lab onward ("3 of 5 passed so far"), the certificate says so on its face, and it shows the work (the evidence ledger below). A pass counts only while the exercise's checks are the ones it was judged by — change what an exercise asserts and old passes stop counting toward the credential (hints, titles, and solutions can change freely). A course with the switch on but no lab yet issues a certificate of completion: the assessed claim is never made over zero checks.
  • Learning path certificate — every course of a learning path complete, and every certificate those courses award earned (see Learning path certificates).

Certificates never revoke and never expire: adding lessons later takes nothing away, and the page outlives unpublishing — it is a dated record, like a diploma. Its words are its own, too: the credential name, the course title, the tier, the version, and the evidence are stamped when it is issued, so renaming a course or changing its certificate settings later never rewrites what an earlier certificate claims. The only thing that renders live is the holder's name (below).

The certificate page

Every certificate is a page at /certificates/<credential id> carrying:

  • your academy's mark and name, and "Verified · issued on your domain";
  • the credential's tier and name, the holder, and what it attests ("for completing every lesson … of …");
  • a record block — credential ID, issue date, issuer, course, the content version it was issued for, status, and a link to the Open Badges document — beside a QR code that resolves back to the same page, so a printed copy can always be checked against the live record;
  • on an assessed certificate, the evidence ledger;
  • the criteria, spelled out.

Under it: Add to LinkedIn, Download PDF (prints as a landscape document; the evidence ledger is its second page), Copy verification link, and Start this course — a shared certificate is also a door into your academy. Shared on LinkedIn or Slack, the link unfurls as the certificate itself.

The evidence ledger

An assessed certificate shows the work it was issued for. Under the record, every lab the learner passed is listed: the lesson, the lab, the runtime the checks ran on (DuckDB SQL or Python, in the browser), when it was cleanly passed, and each exercise with the attempt on which it first passed — "first attempt", "2nd attempt". Pass state and attempts, never scores, hint counts, or checkpoint use (those stay in your admin analytics). The ledger is captured at issue, so it keeps describing that credential even after you change the course's labs. It is the evidence of the Open Badges document too.

No other platform renders per-check lab evidence on a public credential — most can't, because their assessments don't run anything.

Content version, not expiry

Certificates never expire, but a fast-moving product still needs to say which course a certificate was earned on. Every certificate carries a Version line: "Issued for the August 2026 publish", plus "labs author-verified" when every lab in the course had passed Verify labs against its exact published source at that moment.

When you publish the course again, existing certificates stay exactly as valid. The holder sees a quiet note on their certificate ("this course was updated in September 2026"), and the record refreshes itself the next time the same criteria hold against the current content — completing the new lessons, re-passing the current labs, or simply visiting the course page when they already do. The issue date never moves; the page and the ledger note "record refreshed", and the evidence is captured again. Nothing is ever taken away.

Learning path certificates

A learning path can award its own credential: open the path under Admin → Learning paths and switch on Issue a learning path certificate (optionally naming it). A learner earns it when every listed course in the path is complete and every certificate those courses award is held — an assessed course keeps its lab requirement inside the path credential. Like path progress it is derived, never enrolled; enabling it also covers learners who already finished.

The path certificate is the same kind of page — "Learning path certificate", attesting "for completing every course of …" — with the member courses as its evidence, each linking to its own certificate where one exists. It is emailed, sent to your webhook, and listed in the ledger like any other. A path that has issued certificates can't be deleted (unpublish it instead): their permalinks never break.

Open Badges 3.0

Every certificate has a machine-readable twin at /certificates/<credential id>/credential (the Data row on the page): an Open Badges 3.0-shaped JSON document carrying the issuer, the achievement (name, criteria, the course's tags as skill tags, the content version), the holder (their name, plus a salted hash of their email — never the address), and the evidence ledger. It is unsigned: the verification is your domain serving the record, exactly like the page. A signed Verifiable Credential for wallet import is available on partner request. The document's URL travels in the certificate.issued webhook and the CSV, for CRMs and badge platforms.

The issuance email

The moment a certificate is issued, the learner is emailed the permalink and the LinkedIn button — no action on their part, so the credential is in their possession even if they never come back, or their work inbox later disappears (see Accounts & learners for the full leaving-the-company story). If the email didn't land, staff can resend it from the ledger below.

Learners also retrieve every certificate they hold — months later, on any course — from their My profile page.

Names

Sign-in never asks for a name (magic links, zero friction). Until a learner sets one, their certificate reads a masked address ("a•••@datacraft.io") — a certificate is public from the moment it issues, so the address itself never appears on the page, in the link preview, or in the Open Badges document (which carries only a salted hash). The learner is asked for a name at the moment it matters — on the completion card, on the certificate itself, and in the issuance email: "your certificate currently reads a•••@… — add your name." Certificates render the name live, never frozen at issuance, so setting or correcting it later updates every certificate the learner holds, instantly, self-serve. The name-change support ticket has nothing to attach to.

For your records, the name at issue is kept privately and later changes are logged: the ledger flags a credential whose holder was renamed after earning it. The public page never shows name history.

Add to LinkedIn

One click opens LinkedIn's own "Licenses & certifications" form pre-filled — credential name, your academy as the issuer, issue date, credential ID, and the verification URL. Set your LinkedIn Company Page id once (Admin → Certificates; it is the number in your page's admin URL) and the issuer resolves to your company page instead of a typed name.

Because the entry lives on the learner's LinkedIn and points at a permalink that never revokes, the credential survives their work email. On most vendor academies, credentials live in a third-party account keyed to a work address, and "I left the company and lost my certificates" is one of the most common support threads in the industry.

The certificate ledger

Every credential your academy has issued is listed under Admin → Certificates, newest first: who (their current name, with a "renamed" flag when it changed after issue), which credential and tier, when, whether the issuance email went out (with Resend), and the verification link. Search by email, name, or course; account rosters link straight to a learner's certificates, and the dashboard counts them.

The whole ledger exports as certificates.csv (holder, course or path, credential, tier, issue/refresh/email dates, verification URL, Open Badges URL), and a signed certificate.issued webhook fires once per certificate with the same permalink — see Integrations & exports — so your CRM sees exactly what the learner and their LinkedIn entry see.

What we deliberately don't do

  • No template designer. The certificate is opinionated and branded with your mark, name, and accent color; the effort went into the lifecycle — email, ledger, verification, names — which is what differs between platforms.
  • No expiry. Nothing is ever taken away. For fast-moving products the content version line and the self-refreshing record are the answer.
  • No public scores. The evidence ledger shows pass state and attempts, never a gameable number.
  • No third-party badge account required. Verification lives on your domain: no claim email to land in spam, no badge pending until the learner creates an account elsewhere. The certificate.issued webhook is the push if a badge program already exists on your side.
  • No proctoring. The assessed certificate is open book and says so; its evidence is that the checks ran against real state.