Written as a build recommendation for a specific learning platform; the architecture generalizes to any credential issuer.
Skills Wallet Architecture
Verifiable Credentials, and What Coursera Should Actually Build
The certificate is a PDF. The verification is a support ticket. The learner owns nothing. Twelve modules on the standards stack that fixes this — W3C VC 2.0, Open Badges 3.0, CLR 2.0, DIDs — the wallet and issuer architecture underneath it, and a phased roadmap with honest cost estimates and kill criteria.
This field has a habit of being discussed in the future tense. Most of it is past tense now. Be precise in internal conversations:
- W3C Verifiable Credentials 2.0 — a W3C Recommendation since 15 May 2025, along with six sibling specs (JOSE/COSE securing, Data Integrity cryptosuites, Controlled Identifiers, Bitstring Status List). Not a draft. Done.
- Open Badges 3.0 and CLR 2.0 — 1EdTech final specs, built on VCs, with a live certification program. Credly by Pearson certified for OB 3.0 on 27 January 2026.
- OpenID4VCI 1.0 (issuance) final September 2025; OpenID4VP 1.0 (presentation) final 10 July 2025; SD-JWT published as RFC 9901 in November 2025.
- EU mandate: all 27 member states must offer a compliant EUDI Wallet by December 2026. Readiness varies, but the deadline is law.
- Still genuinely unsettled: trust registries (who decides an issuer is legitimate), wallet-to-wallet portability, and the UX of key recovery. These are where the real engineering risk lives.
The honest summary: the specs stopped being the bottleneck around mid-2025. What is missing is issuers at scale and verifiers who care. Both of those are business problems wearing a technical costume.
The Credentialing Problem
▾A Coursera certificate today is a PDF with a URL on it. The URL is the entire security model. Everything in this course follows from taking that sentence seriously.
What a certificate actually is right now
Consider the artifact a learner receives on completion. It is a rendered document containing a name, a course title, a date, a signature image, and a verification link back to coursera.org. It looks official. It is designed to look official. And structurally it is a claim about a claim: the PDF asserts that somewhere on a server there is a record, and invites you to go check.
That design has three properties, and all three are problems.
Today's credential is a pointer to a database row the issuer controls. A verifiable credential is a signed statement the learner controls. Every architectural decision downstream — wallets, DIDs, status lists, selective disclosure — is a consequence of moving the authoritative artifact from the issuer's server into the learner's hands.
The cost of the status quo, measured honestly
It is tempting to describe the current state as broken. It is more accurate to say it is expensive and slow in ways that are invisible because they are distributed across parties who each absorb a small piece.
- The employer pays in verification latency. A background-check vendor contacting a registrar to confirm a degree is a multi-day operation with a per-check fee. That cost is only tolerable because it happens once per hire, at the end of the funnel, for a small subset of claims.
- The learner pays in unrecognized skill. A candidate who has completed nine specializations cannot present that as a single verifiable fact. They retype it into a resume, where it becomes indistinguishable from an assertion.
- The issuer pays in support load and in the strategic cost of being a dead end. Every verification request that lands as a support ticket is an operational expense on a credential you already gave away for free.
The critical asymmetry: verification cost scales with the number of claims, but the current design assumes verification is rare. The moment skills-based hiring makes verification routine — per skill, not per degree — the model collapses under its own arithmetic. That moment has arrived.
The skills-based hiring shift, with real numbers
Coursera runs its own primary research here, which is convenient because it means the strongest available data on this question is data you can cite in your own planning documents without buying a report.
Surveying over 3,500 learners, employers, and higher-education leaders across the US, UK, India, Saudi Arabia, Mexico, Indonesia, and the Philippines:
- 94% of employers are willing to offer higher starting salaries to graduates holding micro-credentials.
- 92% say entry-level hires with micro-credentials perform better in their first year.
- 86% rely on skills-based hiring for entry-level roles; 98% globally use skills-based hiring in some form.
- 96% hired at least three micro-credential holders in the past year; 62% reported a notable productivity increase.
The widely repeated framing "70% of employers use skills-based hiring in 2026" is conservative to the point of being wrong relative to Coursera's own survey, which puts it at 86% for entry-level roles and 98% in some form. The gap is a definitional one — "uses skills-based hiring at all" versus "has replaced degree requirements" are very different questions, and the low numbers usually measure the latter.
Practical guidance: cite 86% for entry-level roles with the Coursera report attached. It is defensible, it is yours, and it is the number a skeptical executive can trace to a methodology.
Note carefully what the 94% figure does and does not say. It says employers report a willingness to pay a salary premium for micro-credential holders. It does not say they pay more for cryptographically verified credentials specifically — that study does not exist yet. The bridge between those two statements is an assumption, and it is the central commercial assumption of this entire course. State it as an assumption in any business case, because an executive who catches you conflating the two will discount everything else you said.
Market size: a range, not a number
The commonly quoted figure for this space is $1.13B growing at 21.7% CAGR. Treat it as one data point among many rather than a fact, because published estimates diverge wildly depending on what the analyst decided to count.
| Source / scope | Size | CAGR |
|---|---|---|
| Commonly cited "digital credentials" figure | $1.13B | 21.7% |
| Digital credential management software (Business Research Co.) | $2.58B (2025) → $2.91B (2026) | 12.7% |
| Digital credential management software (Market Research Future) | $3.14B (2025) → $11.77B (2034) | 15.2% |
| Digital credential management (Verified Market Reports) | $1.25B (2024) → $3.85B (2033) | 14.2% |
| Digital badges only (narrower scope) | ~$0.24B–$0.32B (2025) | 17–19% |
The scope definition is doing all the work. "Digital badges" counts badge-issuing SaaS. "Digital credential management software" counts credential platforms including HR-side verification. Neither counts the value of the hiring decisions the credentials inform, which is where the actual economics live.
My read: the TAM question is the wrong question for this initiative. Coursera is not entering the credential-software market — it already issues millions of credentials. The relevant question is whether verifiable issuance increases enrollment, completion, enterprise renewal, and pricing power on credentials it already sells. That is a defensible attribution study, not a TAM slide.
The scale of the credential landscape
Credential Engine's Counting Credentials 2025 report (December 2025) is the best census available:
Up from 1.08 million credentials in 2022. Certificates account for 486,352 and degrees for 264,099 — meaning badges alone now outnumber degrees roughly four to one.
Sit with that for a moment, because it reframes the problem. The scarce resource is no longer credentials. It is discrimination between them. When a hiring manager sees 1.85 million possible credentials, the signal value of any individual one approaches zero unless something distinguishes a rigorously assessed credential from a completion certificate. That "something" is the real product.
Coursera's advantage in a world of 1.85 million credentials is not that it issues a lot of them. Several platforms issue a lot of them. The advantage is that behind a meaningful subset of Coursera credentials sits graded assessment, proctored exams, and university or industry partner governance — and none of that provenance survives the trip into a PDF.
A verifiable credential can carry it. That is the actual thesis of this course: the wallet is not the product; the machine-readable assessment provenance is the product, and the wallet is how it travels. Module 5 makes this concrete with a schema, and Module 6 makes it commercial.
Isn't the real blocker just that employers don't check credentials at all?
Partly, and it is the strongest objection to this whole program. Today many employers do not verify because verification is expensive and the base rate of fraud is low enough to absorb. If verification stays optional, making it cryptographically possible changes nothing.
Two things break that equilibrium. First, cost: when verification is a free function call rather than a phone call, the calculus flips from "is it worth checking?" to "why wouldn't we?" Second, and more decisively, AI-driven screening. A human recruiter skimming 200 resumes cannot verify each claim. An agent processing 20,000 applications can verify every claim on every application, and will, because the marginal cost is a network round trip. The demand side for verification is being created by automation, not by policy.
This is why Module 7 matters more than it looks: the verification consumer of 2028 is probably not a person.
The Standards Stack
▾Six specifications, each solving exactly one problem, stacked so that a change at one layer does not force a change at the others. If you learn only one thing from this module, learn which layer owns which decision.
The stack, bottom to top
Each layer is replaceable without touching the ones above it. You can change DID method (L0) without changing your credential schema (L2). You can add CLR bundling (L3) without reissuing anything. You can swap transport (L4) without re-signing.
The one exception, and it bites people: the securing mechanism at L1 constrains selective disclosure at every layer above. If you sign with plain Ed25519 over the whole document, you have foreclosed field-level disclosure forever for those credentials. Module 11 covers the escape routes; the point here is that it is an L1 decision with L3 consequences, and it is close to irreversible at scale.
W3C Verifiable Credentials 2.0 — the container
Became a W3C Recommendation on 15 May 2025, alongside six sibling specifications covering JOSE/COSE securing, Data Integrity cryptosuites, Controlled Identifiers, and Bitstring Status Lists. This is a finished, stable, royalty-free web standard, not an emerging technology.
The data model is deliberately thin. A credential is:
{
"@context": ["https://www.w3.org/ns/credentials/v2"],
"id": "urn:uuid:3f9d2a1c-...",
"type": ["VerifiableCredential"],
"issuer": "did:web:coursera.org",
"validFrom": "2026-08-05T14:22:00Z",
"credentialSubject": {
"id": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK"
},
"credentialStatus": { ... },
"proof": { ... }
}
Five things worth noting, because each is a trap for people carrying v1.1 habits:
validFrom/validUntil, notissuanceDate/expirationDate. The v1.1 names are gone in 2.0. Mixing them silently produces credentials that fail strict validation.issuermay be a string or an object. Use the object form when you want to carry a display name and URL, which you do for anything a human will see.credentialSubject.idis optional. A credential with no subject identifier is a bearer credential — anyone holding it can present it. Sometimes correct; usually not what you want for a learner achievement.proofis not the only way to secure a credential. The VC-JOSE-COSE spec lets you wrap the credential in a JWT instead, with noproofmember at all. Two legitimate securing mechanisms, and verifiers must handle whichever you chose.- The
@contextis load-bearing. JSON-LD processing means unknown terms are an error, not something to ignore. Every field you add needs a context entry.
Open Badges 3.0 — the achievement semantics
1EdTech rebuilt Open Badges on top of W3C VCs for version 3.0, and developed CLR 2.0 alongside it so the two share a data model. The practical consequence: an Open Badges 3.0 assertion is a Verifiable Credential. There is no conversion step. You add a context and a type, and the achievement-specific vocabulary becomes available.
{
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
],
"type": ["VerifiableCredential", "OpenBadgeCredential"],
"issuer": {
"id": "did:web:coursera.org",
"type": ["Profile"],
"name": "Coursera",
"url": "https://www.coursera.org"
},
"validFrom": "2026-08-05T14:22:00Z",
"credentialSubject": {
"type": ["AchievementSubject"],
"id": "did:key:z6MkhaXgBZ...",
"achievement": {
"id": "https://coursera.org/achievements/gen-ai-for-everyone",
"type": ["Achievement"],
"achievementType": "Certificate",
"name": "Generative AI for Everyone",
"description": "...",
"criteria": { "narrative": "Completed all graded assessments with 80% or higher." },
"alignment": [ ... ]
}
}
}
The two fields that carry the strategic weight are criteria and alignment, and both are routinely left empty by lazy issuers.
criteriais what a human or agent reads to understand what the learner had to do. "Watched the videos" and "passed a proctored exam at 80%" are the same badge shape with radically different meaning. Fill this in.alignmentpoints the achievement at an external skill framework — O*NET, ESCO, a competency framework, or Credential Engine's CTDL. This is what makes credentials comparable across issuers, which is what makes skills-based search possible at all.
alignment is the difference between a portable credential and a portable image. Without it, an employer holding badges from Coursera, Google, and a bootcamp has three incomparable strings. With it, all three point at the same skill concept and become a set operation.
This is also where Coursera has an unusual asset. Coursera already maintains an internal skills taxonomy mapped across its catalog. Emitting that mapping as alignment entries is comparatively cheap engineering with outsized strategic value — it makes Coursera credentials machine-comparable while competitors emit bare strings. If one thing in this course gets funded, make it this.
CLR 2.0 — the bundle
A Comprehensive Learner Record allows many Open Badge achievement credentials to be bundled together with defined associations between them — another onion layer wrapping the inner set of credentials, and itself signed.
Two things this buys you that individual badges cannot:
- Relationships. "This specialization certificate is composed of these five course certificates" is expressible as structure rather than convention. A verifier can traverse it.
- Multi-source aggregation. A CLR can bundle credentials from different issuers into one presentable record — which is what a transcript actually is, and what a resume is pretending to be.
The subtlety worth internalizing: bundling does not re-attest. A CLR containing a third-party credential does not mean the CLR signer vouches for that credential's content. It means "I assembled these." Verifiers must check each inner credential's own proof independently. Getting this wrong is the most common CLR implementation bug — and it is a security bug, not a correctness one.
DIDs — identifiers without a registrar
A DID is a URI that resolves to a DID document containing public keys and service endpoints. The critical property: resolution requires no central authority to have issued the identifier.
| Method | How it resolves | Good for | Trade-off |
|---|---|---|---|
did:web | HTTPS fetch of /.well-known/did.json at the domain | Institutional issuers. Trust inherits from the domain and its TLS certificate. | Centralized — if you lose the domain, you lose the identity. For Coursera this is a feature. |
did:key | Nothing to fetch — the key is encoded in the identifier itself | Learners. Zero infrastructure, works offline, generated on-device in milliseconds. | No rotation. Key loss is identity loss. Static across verifiers, so it correlates. |
did:jwk | Same idea as did:key, JWK-encoded | JOSE-native stacks | Same rotation limitation |
did:ion, did:ethr, ledger methods | Distributed ledger lookup | Censorship resistance | Operational complexity, cost, latency, and a governance story you must defend |
did:web for Coursera. did:key for learners. No ledger anywhere.
Coursera's trust genuinely does derive from controlling coursera.org — pretending otherwise by putting an identifier on a chain adds operational cost and a governance conversation while removing nothing. And did:web means a verifier's "resolve the issuer" step is an HTTPS GET their existing infrastructure already knows how to do, cache, and monitor.
The one legitimate objection: did:web means a verifier can tell that a credential was issued by Coursera before checking anything else, and that domain control is a single point of failure. Both are true. Both are acceptable for an institutional issuer whose whole value proposition is being a recognized institution.
How the layers actually compose
did:web:coursera.org. The learner's wallet generates did:key:z6Mk... on device.OpenBadgeCredential naming the achievement, criteria, and skill alignments.What is genuinely not settled
1. Trust registries. Verifying a signature proves who issued a credential. It says nothing about whether that issuer should be believed. Anyone can stand up did:web:definitely-a-real-university.example and issue perfect credentials. The ecosystem answer — accreditation-backed issuer registries — exists in fragments (1EdTech certification, Credential Engine, national registries) with no interoperable resolution story. This is the largest open gap in the field.
2. Wallet portability. Credentials are portable in principle. Moving your whole wallet — keys, credentials, history — from one vendor to another is not standardized. A learner who picks the wrong wallet in 2026 may be stuck.
3. Key recovery. A did:key learner who loses their phone loses their identity, and every credential bound to it must be reissued. Every proposed fix (custodial backup, social recovery, seed phrases) trades away either self-sovereignty or usability. Nobody has solved this. Module 4 treats it as the hardest problem in wallet design, because it is.
Why not just sign a JSON blob with our own scheme? We control both ends anyway.
You do not control both ends — that is the entire premise. Controlling both ends is what you have today, and it is what makes a Coursera certificate valueless outside Coursera.
A proprietary signed blob gets you tamper-evidence, which is genuinely the easy 20%. What it does not get you: a verifier who already has a library that parses it, a wallet that will store it, an ATS that can ingest it, a skills framework it aligns to, a revocation mechanism verifiers already poll, or a regulator who recognizes it. In the EU, where all 27 member states must ship EUDI Wallets by December 2026, a proprietary format is simply not admissible into the wallet.
The standards are not there because they are elegant. They are there because the value of a credential is proportional to the number of parties who can check it without a prior agreement with you. A custom format sets that number to one.
The Trust Triangle
▾Issuer, Holder, Verifier. Three roles, and one property that makes the whole thing worth building: the verifier never has to talk to the issuer.
The three roles — and the fourth corner everyone forgets
did:web this is simply HTTPS + DNS + the CA system — no ledger required. Most diagrams draw a blockchain here and confuse everyone.The verifier never contacts the issuer about a specific learner. They fetch a public key (cacheable, learner-independent) and a status list (cacheable, covers ~131,000 credentials at once). Neither request reveals which learner is being checked.
Contrast with today: verification means asking Coursera about a named person. That is a privacy leak, a latency cost, an availability dependency, and a business relationship — four problems that vanish simultaneously. Everything else in this course is plumbing in service of this one property.
What actually happens on the wire
OpenBadgeCredential aligned to skill X." Includes a nonce and the verifier's identity (domain).VerifiablePresentation wrapping the selected credentials, and signs it with the learner's private key over the nonce and domain.did:web:coursera.org → https://coursera.org/.well-known/did.json. Cached aggressively.validFrom/validUntil, schema conformance, and finally the business question: do I trust did:web:coursera.org? That last one is policy, not cryptography.Checking the credential signature but not the presentation signature is a complete authentication bypass. Without step 4, anyone who obtains a copy of a credential can present it as their own — you have verified that Coursera said something true about Alice, and then handed the job to Bob.
The nonce and domain binding matter just as much: without them, a valid presentation captured by one verifier can be replayed to another. If you write a verifier library, these three checks — presentation signature, nonce freshness, domain match — are the ones to put a test around first.
Holder binding: proving you are the subject
The mechanism that makes a credential non-transferable is that credentialSubject.id contains the learner's DID, and presenting it requires signing with the corresponding private key. Possession of the document is not enough; you need the key.
This has a consequence people find surprising: a credential is only as non-transferable as the learner's willingness to hand over their key. Nothing stops a learner from giving someone their phone and PIN. Cryptography prevents theft, not collusion. Anyone claiming VCs eliminate credential fraud is overselling — they eliminate forgery and tampering, which is a large and worthwhile subset.
Selective disclosure — three mechanisms, honestly ranked
"Prove you have this skill without revealing your grade" is the canonical demo. Here is what actually delivers it, in ascending order of sophistication and descending order of readiness.
| Mechanism | How it works | Unlinkable? | Readiness |
|---|---|---|---|
| Atomic credentials | Issue many small credentials instead of one big one. Share only the relevant ones. | No | Ship today — needs no crypto beyond ordinary signatures |
| SD-JWT (RFC 9901, Nov 2025) | Issuer signs salted hashes of each claim; holder reveals only chosen claims plus their salts. | No — the signature is a constant across presentations | Production — an IETF RFC, used in EUDI |
BBS+ / bbs-2023 | Multi-message signature scheme; holder derives a fresh zero-knowledge proof revealing a chosen subset. | Yes — each derived proof is unique | Emerging — cryptosuite still maturing, library support thin |
| ZK predicates ("score > 80" without the score) | General-purpose zero-knowledge circuits over credential claims. | Yes | Research — no interoperable production deployment in education |
"Zero-knowledge proofs let a learner prove they scored above 80% without revealing the score" is the sentence that appears in every deck about this topic. That specific capability — a ZK predicate over a numeric claim — is not something you can ship interoperably in 2026.
What you can ship is selective disclosure of whole fields: reveal the skill, hide the score. Practically, this satisfies nearly every real use case, because employers want to know whether you have the skill far more often than they want a range proof over your grade.
My recommendation: design the schema so atomic disclosure is possible, secure with SD-JWT where field-level hiding is needed, and treat BBS+ as a fast-follow. Do not put ZK predicates on a roadmap you intend to be held to.
The unlinkability question, and why it may matter less than it seems
SD-JWT hides fields but not identity across presentations: the issuer's signature is a constant, so two verifiers who compare notes can tell they saw the same credential. BBS+ fixes this by deriving a fresh proof each time.
Whether you should care depends entirely on the credential. For an employment credential the learner is deliberately presenting under their real name to a named employer, correlation is largely moot — they already told you who they are. For an anonymous skills marketplace, or a credential asserting something sensitive (a disability accommodation, a recovery program completion), unlinkability is the whole ballgame.
Practical guidance: segment by sensitivity. Ordinary course completions do not need BBS+. If Coursera ever issues credentials touching protected categories, that class needs a different securing mechanism from day one — and as Module 2 noted, that decision is close to irreversible once issued at scale.
DIDComm — the encrypted channel, and its actual status
DIDComm v2 (Decentralized Identity Foundation) defines encrypted, authenticated, transport-agnostic messaging between DIDs. Messages are encrypted to the recipient's DID document keys and can travel over HTTPS, Bluetooth, or a mediator — enabling long-lived agent-to-agent relationships without a shared server.
DIDComm is elegant and it is not what won for credential issuance and presentation. OpenID4VCI 1.0 (final September 2025) and OpenID4VP 1.0 (final 10 July 2025) are what the EU Digital Identity Wallet ecosystem standardized on, and at W3C TPAC in November 2025 the FedID working group hardcoded a finite protocol list for the browser Digital Credentials API: openid4vp-v1-*, org-iso-mdoc, and openid4vci-v1. DIDComm is not on that list.
The practical read for an architect: build OID4VCI/OID4VP first. That is what wallets, browsers, and the EU stack speak. Treat DIDComm as an option for peer-to-peer flows outside issuance and presentation — not as your primary transport. Choosing DIDComm as the main channel in 2026 means building bridges to reach every wallet that matters.
If the verifier never contacts the issuer, how does revocation work without a phone-home?
It is a phone-home to a list, not to a lookup. Bitstring Status List works by publishing one compressed bitstring covering a large population of credentials — commonly 131,072 or more. Each credential carries an index. The verifier fetches the entire list and reads one bit.
That gives herd privacy: the issuer learns that someone checked list #3, not which of the 131,072 credentials in it. With a CDN in front and no per-request logging, even the timing signal is weak. Compressed, such a list is a few kilobytes.
Two residual leaks worth naming honestly. First, the fetch reveals the verifier's IP and rough timing to whoever serves the list, so serve it from a CDN and do not log. Second, if a status list is small or a credential type is rare, the anonymity set shrinks and the herd stops helping — which is an argument for large, well-mixed lists rather than one list per course.
Wallet Architecture
▾A wallet is four hard problems in a trench coat: key custody, storage, protocol handling, and recovery. Three of them are solved. The fourth is why wallets are still bad.
Component architecture
Key management: the non-negotiables
- Generate on device, never transmit. A private key that touched a server is a private key the server's operator could have kept. If Coursera generates learner keys, Coursera can impersonate learners — and the entire self-sovereignty claim is theater.
- Hardware-backed and non-extractable. Use the platform keystore so signing happens inside the secure element. Malware on a rooted device can request signatures; it cannot exfiltrate the key and sign forever elsewhere.
- Bind unlock to biometrics or device passcode. Signing should require a user-presence gesture, not merely an unlocked app.
- Consider per-verifier keys. One static
did:keypresented to every employer is a persistent cross-verifier identifier — effectively a cookie that cannot be cleared. Pairwise DIDs fix it at real cost in complexity and credential reuse, since a credential is bound to one subject DID.
A learner whose device is lost, stolen, or factory-reset has lost their private key. Every credential bound to that did:key is now unpresentable. Not revoked — just orphaned. The options, all bad in different ways:
- Reissue from the issuer. Works, and is the only path most deployments actually use. But it means the issuer must retain enough to reissue — which quietly reintroduces the issuer-controlled database the architecture was meant to escape. Honest, and fine, as long as nobody pretends otherwise.
- Encrypted cloud backup. Good UX; makes the cloud provider a custodian of the encrypted blob, and the passphrase becomes the new single point of failure.
- Seed phrase. Fully self-sovereign; catastrophic usability. A decade of crypto-wallet evidence says ordinary users lose seed phrases at high rates.
- Social recovery. Elegant on paper; requires the learner to have designated guardians in advance, which almost nobody does.
The pragmatic answer for an education issuer: hardware-backed keys, encrypted optional backup, and a frictionless reissuance path as the real safety net. Design reissuance as a first-class flow rather than a support escalation — because at Coursera's scale it will be the most-used recovery mechanism by an enormous margin.
Storage: on-device versus cloud-backed
| On-device only | Cloud-backed (encrypted) | Custodial / web wallet | |
|---|---|---|---|
| Key custody | Learner, hardware-backed | Learner; encrypted backup escrowed | Provider holds keys |
| Device loss | Total loss | Recoverable | Nothing to lose |
| Multi-device | No | Yes | Yes |
| Provider can impersonate | No | No (if E2E) | Yes |
| Onboarding friction | App install | App install + backup setup | A login |
| Honest label | Self-sovereign | Self-sovereign with a safety net | Not self-sovereign — say so |
For a platform with a very large, global, mobile-diverse learner base, a custodial web wallet will out-adopt a self-sovereign mobile wallet by an order of magnitude, because "log in and your credentials are there" beats "install an app, secure a key, save a backup" every time.
The right move is not to pick one. It is to ship the custodial web wallet for reach and support export to any standards-compliant wallet for sovereignty — and to be scrupulously honest in the UI about which mode a learner is in. The failure mode to avoid is marketing a custodial product as self-sovereign. That is the kind of claim that gets quoted back at you in a conference talk.
Import, export, and the multi-issuer reality
A wallet that only holds Coursera credentials is a Coursera feature, not a wallet. The import paths that must work:
- OID4VCI credential offer — the standard path. Issuer generates an offer (deep link or QR), wallet redeems it for the credential. Works with any conforming issuer.
- File import — a
.jsonor.jwtcredential dropped in from email or downloads. Unglamorous, and how a great deal of real-world movement happens. - Legacy Open Badges 2.0 — hosted or baked-in-PNG badges. Millions exist. A wallet that cannot ingest them starts empty, and an empty wallet gets deleted.
Export must be equally serious: standards-compliant credential files, an encrypted full-wallet archive, and a plain human-readable summary. If export is worse than import, you have built a roach motel and the ecosystem will notice.
Reference implementations worth studying
Developed by the Digital Credentials Consortium (a global network of universities including MIT), originally with US Department of Education grant funding from 2020. Cross-platform iOS and Android, supports W3C VCs and Open Badges 3.0.
Stewardship has moved to the OpenWallet Foundation (a Linux Foundation initiative); the code lives at openwallet-foundation-labs/learner-credential-wallet on GitHub. The DCC itself now operates as the Digital Credentials Commons.
Why it matters for a build-versus-fork decision: it is education-native (built around learner credentials rather than government ID), open source, already shipped to both app stores, and governed by a neutral foundation rather than a vendor. That last point is what makes forking it defensible in a partner conversation — you are not adopting a competitor's stack.
Arizona State University's digital wallet for storing achievements across work and learning — badges, experiences, academic and employment records — as Verifiable Credentials, stored encrypted on device. It went to open beta on iOS and Android in November 2023, sits alongside ASU's Trusted Learner Network, and spawned a sibling app, My Skills Pocket, aimed at career mobility for retail workers.
The lesson is less technical than organizational. ASU did not ship a wallet and wait. It shipped a wallet plus an issuer network plus a target population with a concrete career-mobility use case. The wallet was the least interesting part. Any Coursera plan that funds the app and underfunds the issuance pipeline and the demand side will reproduce the most common failure in this field: a well-built wallet with nothing worth putting in it.
Revocation from the wallet's side
Wallets do not enforce revocation — verifiers do. But a good wallet surfaces it: periodically re-check status lists for held credentials and tell the learner when something has been revoked or expired, rather than letting them discover it in an interview.
This creates a genuine privacy tension. Background status polling means the wallet phones the issuer's CDN on a schedule, producing a traffic pattern tied to a device. Mitigations: batch checks across all credentials, randomize timing, route through the same CDN as everything else, and let the learner turn it off. Worth doing, worth documenting, and worth not pretending is free.
Here is the contrarian read, and I think it is the correct one. The wallet is the least defensible part of this stack and the most expensive to run. It is a consumer mobile app with key custody, a support burden, app-store release cycles, and a long tail of device-specific bugs — competing against Apple Wallet, Google Wallet, EUDI national wallets, and every government ID app, all of which will hold credentials eventually.
What is defensible is being the best issuer in the world: credentials so well-structured, so richly aligned to skills, and so honestly graded that every wallet wants them and every verifier trusts them.
Recommendation: ship a lightweight custodial web wallet for reach (weeks of work, not quarters), invest heavily in standards-compliant issuance and export, and defer a native mobile wallet until there is evidence learners want one that is not their government's or their phone vendor's. Module 10 sequences this explicitly, and it is the biggest single departure from the conventional roadmap.
If we fork MIT's wallet, what are we actually signing up for?
A React Native codebase, two app-store relationships, and an ongoing protocol-compatibility treadmill. Concretely: two annual OS major versions to chase, biometric and keystore API churn, OID4VCI/VP profile drift as the EU ecosystem iterates, credential-format additions (mdoc, SD-JWT VC), and a support queue where the top ticket will be "I got a new phone."
Call it 3–4 engineers steady-state after launch, not counting design and support. That is not an argument against doing it — it is an argument for knowing that a wallet is a product line with a permanent staffing commitment, not a project. Most organizations that regret building a wallet regret the year-three cost, not the year-one build.
The counter-argument in favor: forking gets you standards conformance and an education-native data model for free, and OpenWallet Foundation stewardship means you are contributing to a commons rather than to a competitor. If the strategic goal is credibility with university partners, that matters.
The Issuer Side — What Coursera Needs to Build
▾This is the module that matters most, because issuance is the part Coursera is uniquely positioned to do well and the part nobody else can do on its behalf.
The issuance pipeline
Assembly is complex, changes often, and touches many systems. Signing is simple, changes rarely, and touches a private key. Putting them in one service means every schema change is a change to code with key access — and every one of those changes needs a security review.
Keep the signing service to a few hundred lines: accept a validated document plus a key identifier, return a secured credential. Everything interesting happens upstream. This is the same instinct that keeps payment code out of your product services, and it pays off the first time you need to rotate a key under pressure.
Signing infrastructure and the rotation problem
Coursera publishes did:web:coursera.org, resolved at https://coursera.org/.well-known/did.json:
{
"@context": [
"https://www.w3.org/ns/did/v1",
"https://w3id.org/security/multikey/v1"
],
"id": "did:web:coursera.org",
"verificationMethod": [
{
"id": "did:web:coursera.org#key-2026-01",
"type": "Multikey",
"controller": "did:web:coursera.org",
"publicKeyMultibase": "z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK"
},
{
"id": "did:web:coursera.org#key-2025-01",
"type": "Multikey",
"controller": "did:web:coursera.org",
"publicKeyMultibase": "z6MkjchhfUsD6mmvni8mCdXHw216Xrm9bQe2mBH1P5RDjVJG"
}
],
"assertionMethod": [
"did:web:coursera.org#key-2026-01",
"did:web:coursera.org#key-2025-01"
]
}
Rotate a signing key the way you would rotate a TLS certificate — remove the old one — and every credential ever signed with it becomes unverifiable. Not revoked. Unverifiable, which reads to a verifier as forged. At Coursera's volume that could be tens of millions of credentials broken by one deploy.
The rule: old verification methods are never deleted from the DID document. You stop signing with a retired key, but you keep publishing its public half forever. The document grows by one entry per rotation, which is fine — it is a few hundred bytes a year.
Corollary: if a key is ever compromised, removing it is not the fix either, because that invalidates legitimate historical credentials too. The fix is revoking the credentials fraudulently issued with it via the status list, and publishing the compromise window. Write that runbook before you need it.
Practical setup: private keys in a KMS or HSM (AWS KMS with Ed25519, or CloudHSM for stricter custody), one active signing key with a documented rotation cadence, and dual control on key operations. The signing service holds a key reference, never key material.
Schema design: what goes in a Coursera credential
This is where the strategy becomes a data structure. The default is a badge with a name and a date. The differentiated version carries provenance a verifier can reason about.
{
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
],
"id": "urn:uuid:9f2a4c81-6b3e-4f77-9c21-8ad5e0e1b774",
"type": ["VerifiableCredential", "OpenBadgeCredential"],
"issuer": {
"id": "did:web:coursera.org",
"type": ["Profile"],
"name": "Coursera",
"url": "https://www.coursera.org"
},
"validFrom": "2026-08-05T14:22:00Z",
"credentialSubject": {
"type": ["AchievementSubject"],
"id": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK",
"achievement": {
"id": "https://coursera.org/achievements/deep-learning-specialization",
"type": ["Achievement"],
"achievementType": "Certificate",
"name": "Deep Learning Specialization",
"description": "Five-course specialization covering neural networks, ...",
"criteria": {
"narrative": "Passed all 5 courses with a weighted average of 80% or
higher across 23 graded programming assignments and
12 quizzes. Identity verified at enrollment."
},
"alignment": [
{
"type": ["Alignment"],
"targetName": "Deep Learning",
"targetFramework": "Coursera Skills Taxonomy",
"targetUrl": "https://coursera.org/skills/deep-learning"
},
{
"type": ["Alignment"],
"targetName": "Machine Learning",
"targetFramework": "O*NET",
"targetCode": "15-2051.01",
"targetUrl": "https://www.onetonline.org/link/summary/15-2051.01"
}
]
},
"result": [
{ "type": ["Result"], "achievedLevel": "Passed", "resultDescription": "..." }
]
},
"credentialStatus": {
"id": "https://credentials.coursera.org/status/3#94567",
"type": "BitstringStatusListEntry",
"statusPurpose": "revocation",
"statusListIndex": "94567",
"statusListCredential": "https://credentials.coursera.org/status/3"
},
"proof": {
"type": "DataIntegrityProof",
"cryptosuite": "eddsa-rdfc-2022",
"created": "2026-08-05T14:22:01Z",
"verificationMethod": "did:web:coursera.org#key-2026-01",
"proofPurpose": "assertionMethod",
"proofValue": "z58DvkA9L2mHq..."
}
}
The assessment integrity tier — the differentiating design decision
Every credential should carry a machine-readable statement of how rigorously it was assessed. Not buried in prose — as a field a verifier can filter on.
| Tier | What it means | Evidence carried | Employer read |
|---|---|---|---|
| T4 — Proctored | Identity-verified, proctored, timed assessment | Proctoring provider, identity-verification method, score band | Strongest — comparable to a certification exam |
| T3 — Auto-graded | Machine-graded programming assignments and quizzes with a pass threshold | Assignment count, threshold, weighted average band | Strong — demonstrates applied capability |
| T2 — Peer-reviewed | Human-reviewed submissions against a rubric | Rubric reference, reviewer count | Moderate — good for open-ended work, noisier signal |
| T1 — Completion | Content consumed; no meaningful assessment | Effort hours, modules completed | Participation — exposure, not capability |
The instinct is to make every credential look maximally impressive. Resist it. In a market with 1.85 million credentials, the issuer who tells you which of their credentials are weak is the issuer you believe about the strong ones.
Concretely: an employer filtering for T4 and T3 credentials gets a high-precision candidate pool. That employer now has a reason to prefer Coursera credentials over a competitor emitting undifferentiated badges — not because Coursera's badges are better on average, but because Coursera's badges are legible. Legibility is the moat. It is also the thing a competitor cannot copy quickly, because it requires actually having the assessment data.
The internal cost is real and worth naming: someone has to defend the tier assignments, and product teams will lobby for upgrades. Put the taxonomy under the same governance as academic integrity, not under marketing.
Batch issuance at Coursera scale
Suppose the retroactive backfill is on the order of tens of millions of credentials. Where does that actually hurt?
| Stage | Cost per credential | Bottleneck? |
|---|---|---|
| Ed25519 signature | Tens of microseconds | No — a single core does tens of thousands/sec |
| JSON-LD canonicalization (RDFC-1.0) | Single-digit to tens of milliseconds | Yes — often 100–1000x the signing cost |
| Context resolution over the network | Unbounded | Catastrophic if not pre-cached — and a liveness dependency on third-party hosts |
| Claim assembly (DB reads) | Milliseconds | Manageable with batching |
| Status list allocation | Microseconds, but contended | Needs care — pre-allocate index ranges per worker |
Engineers plan capacity around signature throughput and are then surprised. The real cost in a Data Integrity pipeline is RDF canonicalization — parsing JSON-LD, expanding contexts, and producing a deterministic N-Quads serialization before hashing.
Three mitigations, in order of impact:
- Pin and pre-load every context locally. Never fetch
@contextURLs at signing time. This is both a performance fix and a security fix — a remote context is remote code execution over your semantics. - Consider JWT/SD-JWT securing for bulk issuance. VC-JOSE-COSE skips canonicalization entirely. Faster, simpler, and it buys SD-JWT selective disclosure. The trade: you give up Data Integrity's JSON-LD-native properties and BBS+ compatibility.
- Parallelize by status-list shard so index allocation never contends across workers.
Rough shape: a backfill of tens of millions of credentials is a days-long batch job on a modest cluster if you do this right, and a multi-month ordeal if you canonicalize with remote contexts.
Retroactive issuance for existing completions
Millions of learners hold completions predating any of this. Backfilling is high-value — it is what makes a wallet non-empty on day one — and has three sharp edges:
- Date semantics.
validFromis when the credential became valid; the achievement date belongs inawardedDateon the subject. A 2019 completion issued in 2026 has a 2026validFromand a 2019awardedDate. Conflating them produces credentials that look backdated, which reads as fraud. - No subject DID. Historical learners have no wallet and no key. Two options: issue unbound credentials held in a custodial account and bind on first wallet claim, or defer issuance until claim. Prefer deferred issuance — it avoids minting tens of millions of credentials nobody ever claims, and avoids a bearer-credential population you would rather not have.
- Retroactive integrity. Data quality on old completions is worse: missing assessment metadata, deprecated courses, changed criteria. Either backfill at a lower, honestly labeled tier, or exclude records you cannot substantiate. Do not reconstruct criteria you do not have — a signed guess is still a signed statement.
Lazy issuance with an eligibility index. Precompute, for every historical completion, whether it is credential-eligible and at what tier — a cheap batch job over existing data. Store that index. Issue the actual signed credential only when a learner claims it.
Benefits: no wasted signing, credentials bound to a real subject DID at creation, no orphan population, and the ability to fix schema mistakes before most credentials exist. Cost: claim latency of a few hundred milliseconds, which nobody will notice.
Coursera for Campus and Coursera for Business
Enterprise and campus change the issuer question, because the institution wants its name on the credential and often has accreditation standing that Coursera does not.
| Model | Who signs | Verifier sees | When to use |
|---|---|---|---|
| Coursera as sole issuer | did:web:coursera.org | Coursera, with the partner named in the achievement | Default. Simplest, one key, one trust decision. |
| Sub-issuer DID | did:web:coursera.org:issuers:asu | A Coursera-hosted identity clearly scoped to the partner | Partner wants distinct identity without running infrastructure. The sweet spot. |
| Partner as issuer, Coursera as delivery | did:web:asu.edu | ASU | Accredited award where the institution must be the attesting party. Requires partner key custody. |
| Dual credentials | Both, separately | Two linked credentials | Both parties assert different things — Coursera the assessment, the institution the academic award. |
The sub-issuer pattern is underrated. did:web supports path-based identifiers, so did:web:coursera.org:issuers:asu resolves to https://coursera.org/issuers/asu/did.json — a distinct identity with its own keys, hosted by Coursera, requiring zero partner infrastructure. It gives partners the branding and separation they want while keeping key custody in one operationally mature place.
For Coursera for Business, the compelling artifact is not the individual badge. It is the verifiable workforce skills record: a CLR that an enterprise can hold for its own workforce, showing verified skills across thousands of employees, portable into their HRIS, and re-verifiable without trusting Coursera's dashboard.
That flips the sale. Today the pitch is "your employees will learn things." The verifiable pitch is "you will have a cryptographically auditable record of what your workforce can actually do" — which speaks to compliance, workforce planning, and M&A diligence, and is a fundamentally different budget line than L&D. It also outlives the subscription, which is exactly why it is worth paying for.
Why not just let a vendor like Credly issue on our behalf?
It is a legitimate option and the fastest path to OB 3.0 issuance — Credly by Pearson was certified for Open Badges 3.0 on 27 January 2026 and operates the largest badge network, with 3,700+ issuers and a catalog around 200,000 credentials. If the goal is "issue standards-compliant badges this quarter," buying beats building.
What you give up is the thing this course argues is the actual asset. A vendor issues a generic badge from a generic template; the assessment-tier taxonomy, the skills-taxonomy alignments, and the evidence provenance are Coursera-specific data the vendor has no path to represent well. You would be outsourcing the commodity and the differentiator together.
The synthesis most large issuers land on: build the pipeline for your flagship credentials where provenance matters, and use a vendor for the long tail where a plain badge is genuinely sufficient. That also gives you a real interoperability test — if your credentials and the vendor's both land in the same wallet and verify, your standards conformance is not theoretical.
The Verifier Side — What Employers See
▾Issuance without verification is a science project. This module is about the side of the market that decides whether any of the previous five modules produced value.
What "instant verification" actually means
The phrase gets used loosely. Precisely, a verifier performs six checks, and only one of them requires a network call that is not aggressively cacheable:
| # | Check | Network? | Typical cost |
|---|---|---|---|
| 1 | Presentation signature valid, nonce fresh, domain matches | No | Microseconds |
| 2 | Resolve issuer DID → public key | Yes, cacheable for hours | ~50 ms cold, 0 warm |
| 3 | Credential signature valid against that key | No | Microseconds |
| 4 | Status list bit not set | Yes, one fetch per ~131k credentials | ~50 ms cold, 0 warm |
| 5 | validFrom / validUntil window, schema conformance | No | Microseconds |
| 6 | Do I trust this issuer? | Policy lookup | Depends entirely on your trust model |
In steady state, verification is two cached fetches and some elliptic-curve math. Sub-millisecond warm. That is the number that changes employer behavior: verification stops being a procurement decision and becomes a line in a function.
Checks 1–5 are mechanical and a library does them. Check 6 — should I believe did:web:coursera.org? — has no standardized answer, and it is where every real deployment stalls.
Today's practical answers are all unsatisfying: a hardcoded allowlist of known issuers, 1EdTech certification as a proxy, an accreditation database lookup, or "the domain is coursera.org and I have heard of Coursera." That last one is doing most of the work in practice, and it is precisely why did:web is the pragmatic choice for institutional issuers — it lets a verifier reuse the trust judgment they already make about domains.
Verification API design
Most verifiers will not implement checks 1–5 themselves in year one. They will call something. Designing that endpoint well is how Coursera stays in the loop without becoming a bottleneck.
{
"verifiablePresentation": { ... },
"options": {
"checkStatus": true,
"challenge": "b3f1e7a2-...",
"domain": "careers.acme-corp.com"
}
}
{
"verified": true,
"checks": {
"presentationSignature": "valid",
"holderBinding": "valid",
"credentialSignature": "valid",
"issuerResolved": "did:web:coursera.org",
"revocationStatus": "active",
"validityWindow": "in_range",
"schemaConformance": "valid"
},
"credentials": [
{
"achievement": "Deep Learning Specialization",
"awardedDate": "2026-06-14",
"assessmentTier": "T3_AUTO_GRADED",
"assessmentDetail": {
"gradedAssignments": 23,
"passThreshold": 0.80,
"identityVerified": true
},
"skills": [
{ "name": "Deep Learning", "framework": "Coursera Skills Taxonomy" },
{ "name": "Machine Learning", "framework": "O*NET", "code": "15-2051.01" }
],
"effortHours": 128,
"partner": "DeepLearning.AI"
}
],
"warnings": []
}
- Never return a bare boolean. Return every check individually. A verifier with a compliance obligation needs to log which checks passed, and a partially-valid result (valid signature, expired window) is far more useful than
false. - Return warnings distinctly from failures. "Signed with a key retired in 2025" is a warning, not a failure. Collapsing the two makes verifiers reject legitimate credentials.
- Make the API stateless and side-effect free. No account required for basic verification. The moment verification requires an API key, you have rebuilt the business relationship the architecture eliminated.
- Publish an open-source client that does not call you. This is counter-intuitive and correct — see the callout below.
The strongest possible move is to publish an open-source verification library that performs checks 1–5 entirely locally against your published DID document and status lists, with no call to Coursera at all.
Why give away the thing you might charge for? Because ubiquity of verification is worth more than revenue from verification. A credential's value is proportional to how many parties can check it without a prior relationship with you. Every gate you put in front of verification reduces that number. And if you do not publish the library, someone else will — the standards are open, so this is not a defensible chokepoint.
Charge for enrichment instead: skills-graph context, cohort percentiles, bulk operations, assessment provenance detail. Module 7 builds the commercial model on exactly that split.
Skills-based candidate search
Once credentials carry alignment entries pointing at shared frameworks, a fundamentally different query becomes possible. Instead of "candidates who list PyTorch on a resume," a verifier can ask for candidates holding verified credentials aligned to a skill, above an assessment tier, within a recency window.
SELECT candidates WHERE
verified_credential.alignment INCLUDES 'onet:15-2051.01'
AND verified_credential.assessmentTier >= 'T3'
AND verified_credential.awardedDate > '2024-01-01'
AND verified_credential.issuer IN trusted_issuer_registry
Three preconditions, all of which are issuer-side decisions made in Module 5: alignments must be populated, the tier must be machine-readable, and issuer trust must be resolvable. Miss any one and the query degrades to string matching — which is what resumes already are.
Trust scoring: beyond the verified checkmark
A binary "verified" badge is a weak product. It answers "is this real?" while the employer is asking "is this good?"
The temptation is to collapse these into one number: "Coursera Trust Score: 87." Resist it, for three reasons.
It is unauditable. A candidate rejected because of an 87 cannot contest an opaque weighting, and in several jurisdictions automated employment decisions carry explainability obligations. It invites gaming. Any published composite becomes an optimization target within a quarter. And it makes Coursera the arbiter of candidate quality — a position with real legal exposure under emerging AI-hiring rules, including bias-audit requirements like NYC Local Law 144.
Expose the signals, let the verifier weight them, and keep the weighting on their side of the line. This is a legal architecture decision as much as a product one.
ATS integration — the unglamorous reality
Applicant tracking systems are where credentials must land to matter, and the honest status is: they do not speak Verifiable Credentials. Workday, Greenhouse, iCIMS, Lever and the rest have well-developed APIs for candidates, attachments, and custom fields, and essentially no native VC support.
| Integration pattern | How it works | Effort | Fidelity |
|---|---|---|---|
| Verification receipt attachment | Candidate verifies via a hosted page; a signed PDF/JSON receipt attaches to the application | Low | Low — a human reads it |
| Custom field population | An integration writes verified skills into ATS custom fields the recruiter can filter on | Medium | Medium — filterable but lossy |
| Marketplace app | A native app in the Workday/Greenhouse marketplace performing verification in-flow | High | High — but per-ATS build and certification |
| Velocity Network relay | Publish into an HR-industry network that ATS vendors already integrate with | Medium | High — if the network has real reach |
Start with the verification receipt. It is unglamorous, works with every ATS ever built because it is an attachment, and requires zero partner engineering. It also generates the usage data you need to justify the deeper integrations.
Then go where the volume is, not where the standard is prettiest. Two or three ATS vendors cover the large majority of enterprise hiring; build a marketplace app for those. Treat Velocity Network as a parallel bet on the industry consolidating, not as the primary path.
The trap: building a beautiful OID4VP integration nobody can consume because the ATS has no place to put the result. The bottleneck is the recruiter's screen, not the protocol.
Coursera can unilaterally become an excellent issuer. It cannot unilaterally create verifiers. Every credentialing initiative that has failed, failed here.
Three levers Coursera has that most issuers do not:
- Coursera for Business customers are employers. Thousands of enterprises already have a commercial relationship and a reason to verify their own workforce first. That is a captive verifier population — and internal verification (skills inventory, compliance, mobility) is an easier first use case than external hiring.
- Coursera hiring partners and the job-board surface can require verified credentials in postings, creating learner-side pull.
- Google Career Certificates are delivered on Coursera. Any large partner adopting verified issuance drags its own employer network along.
Sequence accordingly: verify inside enterprises first, hiring second. Do not launch by asking the open market to care.
What stops an employer from just calling our existing verification URL, like they do today?
Nothing, and that is exactly the point — today's URL check is a real product with real usage. The question is not whether it works but what it costs both sides.
The URL check requires Coursera to be online, reveals to Coursera which learner is being checked and by whom, cannot be automated at scale without rate limits and an agreement, works only for Coursera credentials, and returns a rendered page rather than structured data. It cannot answer "does this candidate hold any credential aligned to O*NET 15-2051.01 above tier T3," because the answer lives in a page, not a schema.
The VC path removes the online dependency, removes the privacy leak, makes automation free, works identically across issuers, and returns machine-readable skill alignments. Same question, four orders of magnitude cheaper, and answerable by software. That difference is what makes verification routine rather than exceptional — which is the entire thesis.
The Cloudflare Wallets Intersection
▾Two different things are called a "wallet" in this course. One holds credentials, the other holds money. The interesting question is what happens where they meet — and the answer is more constrained than it first looks.
Two wallets, one word
| Skills Wallet | Cloudflare Wallet | |
|---|---|---|
| Holds | Verifiable Credentials | Spending authority over funds |
| Owner | A learner | A human account owner, delegating to agents |
| Standards | W3C VC 2.0, OB 3.0, OID4VP | x402 over HTTP, Web Bot Auth |
| Answers | "Can I prove I have this skill?" | "Can an agent pay for one request?" |
| Status (Aug 2026) | Specs final; issuance scaling | Sell side (Monetization Gateway) live since ~July 2026; buy side largely announced |
They intersect at exactly one point: verification is an API call, and API calls can be priced. Everything in this module follows from that sentence — including its limits.
The x402 flow applied to verification
POST /v1/verify/enriched with a Verifiable Presentation. No credentials, no account, no prior relationship.402 Payment Required with a PAYMENT-REQUIRED header carrying an accepts array: schemes, networks, assets, and amounts the endpoint will take.PAYMENT-SIGNATURE./verify then /settle. The Worker never touches a chain, a node, or a private key.200 OK with the enriched result and a PAYMENT-RESPONSE receipt.The PAYMENT-REQUIRED payload is stable per route. A well-built agent caches it after first contact and goes straight to a signed request thereafter. Keep your requirements stable enough to be cacheable and the extra round trip disappears from steady-state traffic.
Unit gotcha worth a test assertion: amounts are strings in the asset's smallest unit. With USDC's six decimals, "50000" is $0.05, not $50,000. This is a classic off-by-six.
A verification Worker with x402
const PRICE_USDC_BASE_UNITS = "50000"; // $0.05 — USDC has 6 decimals
export default {
async fetch(request, env) {
const url = new URL(request.url);
const body = await request.json();
// Tier 1: basic verification is ALWAYS free. This is strategic,
// not generous — see the note below on why gating it is fatal.
if (url.pathname === "/v1/verify") {
return Response.json(await verifyPresentation(body, env));
}
// Tier 2: enriched verification is metered via x402.
if (url.pathname === "/v1/verify/enriched") {
const payment = request.headers.get("PAYMENT-SIGNATURE");
if (!payment) {
return new Response(null, {
status: 402,
headers: {
"PAYMENT-REQUIRED": btoa(JSON.stringify({
x402Version: 2,
accepts: [{
scheme: "exact",
network: "base",
asset: env.USDC_CONTRACT,
amount: PRICE_USDC_BASE_UNITS,
payTo: env.COURSERA_WALLET,
resource: url.toString(),
description: "Enriched credential verification",
maxTimeoutSeconds: 60
}]
}))
}
});
}
// Facilitator does verify + settle. We never touch a chain.
const settlement = await settleViaFacilitator(payment, env);
if (!settlement.ok) return new Response("Payment failed", { status: 402 });
const result = await verifyPresentation(body, env);
const enriched = await enrich(result, env); // skills graph, percentile, provenance
return Response.json(enriched, {
headers: { "PAYMENT-RESPONSE": btoa(JSON.stringify(settlement.receipt)) }
});
}
return new Response("Not found", { status: 404 });
}
};
Note what the Worker does not do: no node, no gas management, no private key, no invoicing, no metering service. The facilitator abstraction is what makes this adoptable by an ordinary backend team, and Cloudflare plays that role at the edge in its own stack.
The revenue model, with the skepticism it deserves
The seductive arithmetic: a million verifications a day at five cents is $50,000 a day, or roughly $18M a year. Before anyone puts that in a plan, interrogate the denominator.
| Scenario | Daily paid verifications | At $0.05 | Annual | Plausibility |
|---|---|---|---|---|
| Today's world (humans checking at offer stage) | ~1,000–10,000 | $50–$500 | $18K–$180K | Near-certain — and not a business |
| Enterprise skills inventory (C4B workforce audits) | ~50,000 | $2,500 | ~$900K | Plausible — but better sold as a subscription |
| Agent-screened hiring (every application verified) | ~1M | $50,000 | ~$18M | Speculative — requires agentic screening at scale |
| Ambient verification (every skill claim, everywhere) | ~10M+ | $500,000 | ~$180M | Fantasy without an ecosystem shift |
The agent-screened row is the whole thesis, and it depends on something Coursera does not control: employers deploying AI screening agents that verify claims rather than parsing resumes. That is a plausible 2027–2028 development, not an August 2026 fact.
Meanwhile the enterprise row — the one that is genuinely reachable — is better monetized as a seat-based or contract line in Coursera for Business than as micropayments. Enterprises hate unpredictable per-call billing and have procurement processes built around subscriptions. Charging an existing customer five cents a call to verify credentials you issued them would be a strange conversation.
So the honest conclusion: x402 verification is the right architecture for the agent segment specifically — anonymous, high-volume, no prior relationship, no procurement. It is the wrong billing model for the enterprise segment. Build the endpoint because the marginal cost is near zero and it positions you for the agent wave; do not put its revenue in next year's plan.
Basic verification is free, forever, with no key, no account, and no rate limit that a legitimate verifier would notice.
Charging to verify a credential you already issued and were already paid for is a trust-destroying move. It tells the ecosystem that Coursera credentials carry a toll, and a verifier facing a toll chooses the issuer without one. Given that a competent engineer can implement checks 1–5 locally from published open standards anyway, gating basic verification would cost you adoption and earn nothing.
Charge for enrichment — skills-graph context, cohort percentiles, assessment provenance, bulk operations, agent-scale throughput. Those are genuinely Coursera-only data products, and paying for them is a fair trade rather than a toll.
Why Workers specifically
- Verification is embarrassingly cacheable. DID documents and status lists are static artifacts fetched by every verifier — exactly what a CDN edge is for. Serving them from Workers with long cache TTLs makes the fetch effectively free and hides verifier IPs behind the edge, which is also the privacy mitigation from Module 3.
- Verification is stateless and CPU-light. Signature checks and a bitstring lookup. No database in the hot path.
- Global latency matters for a learner population that is majority outside the US.
- x402 support is native at the edge as of Cloudflare's July 2026 Monetization Gateway, so pricing becomes configuration rather than code.
Coursera's unusual position is that it sits on both sides of the agentic credential economy. Sell side: it issues credentials and can meter enriched verification. Buy side: Coursera's own agents will increasingly need to pay for third-party APIs — labor-market data, assessment services, content licensing — per call rather than per contract.
The strategic move is not to bet on either half. It is to make sure the credential is agent-legible: structured, aligned to shared skill frameworks, verifiable without a human, and priced coherently at the enrichment boundary. If an agent screening 20,000 applications finds Coursera credentials trivially machine-verifiable and everyone else's require a human to squint at a PDF, the format advantage compounds long before the revenue does.
That is the real prize here, and it is a distribution prize, not a payments one.
Why not just use ordinary API keys and metered billing for the enrichment tier?
For enterprises, you should — that is the better model, as the table above argues. The x402 path is specifically for callers you have no relationship with and never will.
An API key presumes a prior agreement: someone signed up, agreed to terms, and got provisioned. That works for a hundred enterprise customers and fails for the case that motivates this entire module — an autonomous agent that discovers your verification endpoint mid-task, needs it once, and would happily pay five cents rather than open a business-development conversation. You cannot enumerate those callers in advance, which is exactly why pre-provisioning breaks down.
The honest framing: x402 is not a replacement for enterprise billing, it is a long-tail on-ramp. Run both. The 401-to-402 conversion is additive — existing authenticated partners with keys never see a 402, so nothing migrates and no partner needs to be told anything.
The Ecosystem
▾A map of who is building what, which bodies actually confer legitimacy, and where Coursera should show up versus merely watch.
Standards bodies and consortia
| Organization | Owns | Why it matters to Coursera | Posture |
|---|---|---|---|
| W3C | VC Data Model 2.0, DIDs, Bitstring Status List, Digital Credentials API | The container everything else builds on. VC 2.0 became a Recommendation 15 May 2025. | Follow |
| 1EdTech | Open Badges 3.0, CLR 2.0, and the certification program | The gate that matters in education. Certification is how partners and buyers judge conformance. | Join & certify |
| OpenID Foundation | OID4VCI 1.0 (final Sept 2025), OID4VP 1.0 (final 10 July 2025), SIOPv2 | The transport every wallet and the EU stack speaks. | Follow |
| IETF | SD-JWT (RFC 9901, Nov 2025) | The practical selective-disclosure mechanism. | Follow |
| OpenWallet Foundation (Linux Foundation) | Stewards the Learner Credential Wallet and related OSS | Neutral home for wallet code — forking here is defensible with partners. | Contribute |
| Digital Credentials Commons (formerly DCC) | University consortium; built the LCW with US DOE funding from 2020 | Where Coursera's degree partners already are. | Engage |
| Velocity Network Foundation | The "Internet of Careers" — a public permissioned network for career credentials | HR-side interoperability; members hold career data on 1B+ individuals. | Evaluate |
| Credential Engine | Credential Registry and CTDL; Counting Credentials research | Where a credential becomes publicly discoverable and describable. | Publish into |
Velocity Network Foundation — the Internet of Careers
A non-profit membership organization operating a public permissioned blockchain for exchanging verifiable career credentials. Its pitch is HR-industry interoperability: members span HCM vendors, gig platforms, background and certification processors, education institutions, training vendors, and employers — collectively holding career data on more than a billion individuals.
Velocity's strategic insight is right: the bottleneck is the HR side, not the education side. Universities have been issuing badges for a decade; the reason it did not matter is that no HR system consumed them. A network with HCM vendors as members attacks the correct problem.
Two reasons for caution. First, most of the publicly visible material dates from 2020–2022; verify current member composition and live transaction volume directly before committing — a network's value is entirely its reach, and reach is exactly what press releases overstate. Second, the ledger component adds a governance and operational story you would otherwise not need, since VCs verify perfectly well without one.
Recommendation: engage as an observer or associate member, publish credentials in standard formats that a Velocity relay can pick up, and let membership follow demonstrated ATS pull rather than lead it. Do not architect around it.
Platforms and issuers
| Player | Position | OB 3.0 status | Relevance |
|---|---|---|---|
| Credly by Pearson | The largest badge network — 3,700+ issuers, ~200,000 credentials in catalog, 85% of top IT certifications | Certified 27 Jan 2026 | The default incumbent. Also powers the Google Cloud Credential Wallet. |
| Accredible | Certificates and badges for education and associations | OB 3.0 | Common in higher-ed procurement bake-offs |
| Canvas Credentials (Instructure, formerly Badgr) | Badging tied to the dominant higher-ed LMS | OB 3.0 | LMS-adjacent distribution — credentials issued where coursework already lives |
| Territorium | CLR-first learner records | CLR 2.0 + OB 3.0 certified | One of the few with real CLR 2.0 implementation experience |
| POK | Blockchain-anchored credentials | OB 3.0 | Ledger-anchoring niche |
| ASU / Trusted Learner Network | Institution running its own issuance + wallet | VC-native | The reference deployment for a university-scale program |
The most widely used repository of skill claims on earth issues no verifiable credentials and consumes none. That is either the biggest gap in the ecosystem or evidence that verifiability is not what the market rewards. Module 9 argues it is genuinely both — and that the resolution depends on who does the screening.
Credential Engine and the discovery layer
Credential Engine maintains the Credential Registry and the Credential Transparency Description Language (CTDL). Its Counting Credentials 2025 report (December 2025) found 1,850,034 unique US credentials from 134,000+ providers, against $2.34 trillion invested annually in US education and workforce development.
The distinction that matters architecturally: Credential Engine describes credential types; Verifiable Credentials assert instances. The registry says "this certificate exists, here is what it requires, here are the skills it maps to." A VC says "this person earned it." They are complementary, and the pairing is powerful — a verifier resolving an achievement URI into a registry description gets independent third-party context on what the credential means, from someone other than the issuer.
Publishing Coursera's credential catalog into the Credential Registry with CTDL descriptions is comparatively cheap and makes credentials discoverable to state talent marketplaces and workforce systems that query the registry directly — including the ones being funded right now.
Public-sector programs shaping demand
The December 2026 EUDI mandate creates something that has never existed: hundreds of millions of people with a government-issued credential wallet already on their phone. The chronic chicken-and-egg — no wallets, so no point issuing; no credentials, so no point installing — is being broken by regulation in one of Coursera's largest markets.
Two concrete implications. First, EU learners will have a wallet whether or not Coursera builds one, which strengthens the Module 4 argument for deprioritizing a native app. Second, being EDC/ELM-mappable is not a nice-to-have for the European business — institutions operating under EU frameworks will increasingly expect it, and a proprietary format is simply not admissible into a EUDI wallet.
My read on sequencing: the EU is where a verifiable-credentials program has the clearest, date-certain business case. The US case rests on employer behavior change; the EU case rests on a legal deadline that already passed through the legislature.
Do we need to join 1EdTech, or is conformance enough?
Conformance is what makes the credentials work. Certification is what makes people believe they work, and in education procurement the difference is decisive.
1EdTech certification is a listed, checkable status. When a university's procurement team or a state workforce agency asks "is this Open Badges 3.0 compliant," a certification listing ends the conversation; an engineer's assurance does not. Credly by Pearson certified on 27 January 2026 and Territorium certified for both CLR 2.0 and OB 3.0 — in a bake-off, an uncertified competitor is answering questions the certified ones are not.
Cost is modest relative to the credibility, and the certification suite doubles as a genuinely useful conformance test harness during development. Do it in Phase 1, not later.
Competitive Analysis
▾The incumbent in skills verification is not another course platform. It is a social network that verifies nothing and wins anyway.
LinkedIn — the incumbent to actually worry about
LinkedIn holds the world's largest repository of skill claims, a skills graph mapping people to skills to jobs, and — decisively — it is where the hiring workflow already happens. Recruiters live there. Candidates maintain profiles there. Coursera already integrates with it: on completing a Google Career Certificate, learners get a link to import the credential badge into LinkedIn's Licenses & Certifications section.
| Dimension | A verifiable Skills Wallet | |
|---|---|---|
| Distribution | Overwhelming | Starting from zero |
| Recruiter workflow integration | It is the workflow | None |
| Cryptographic verification | None — claims are self-reported | Native |
| Assessment provenance | Absent | Machine-readable tier + evidence |
| Learner ownership | LinkedIn-owned profile | Learner-held credential |
| Cross-platform portability | Locked in | Standards-based |
LinkedIn wins on the only dimension that has mattered so far. A self-reported certification on a LinkedIn profile influences more hiring decisions today than every verifiable credential ever issued, combined. Not because it is trustworthy, but because it is where the recruiter is looking.
Any strategy premised on "verifiable credentials will displace LinkedIn profiles" is wrong. The correct framing is that verifiable credentials are a trust layer that can sit underneath any surface, including LinkedIn's. The goal is not to replace the profile; it is to make the entry on the profile checkable.
The scenario where this flips is the one from Module 1: when screening moves from a recruiter skimming profiles to an agent processing applications, self-reported claims become a liability rather than a shortcut, because the agent can verify at zero marginal cost and will start discounting anything it cannot. Coursera's bet is on that transition. It should be stated as a bet, not as a certainty.
Google — the partner who is also a competitor
Google occupies an unusual position: Google Career Certificates are delivered on Coursera, making Google simultaneously one of the largest content partners and a credential brand with its own distribution ambitions.
- Google Career Certificates — the 2026 catalog spans Advanced Data Analytics, Business Intelligence, IT Automation with Python, alongside foundational Data Analytics, Project Management, and IT Support. Non-expiring, and delivered through Coursera.
- Google Cloud Credential Wallet — launched for Google Cloud credential holders, powered by Credly, with Labor Market Insights surfacing job opportunities, titles, employers, and salary data against verified skills.
- Google Wallet — increasingly a container for identity documents, and the obvious eventual home for credentials on Android.
Google built a credential wallet and did not build the credential infrastructure — it used Credly. That is a company with unlimited engineering capacity concluding that badge issuance is not worth owning.
Two readings, and both are worth holding. The pessimistic one: credential issuance is a commodity, and Coursera building it in-house is undifferentiated work. The optimistic one, which I find more persuasive: Google's credentials do not carry deep assessment provenance, so a generic badge platform is genuinely sufficient for them. Coursera's flagship credentials do have that provenance — graded assignments, proctored exams, partner governance — and representing it is exactly what a generic platform cannot do.
The strategic tell to watch: the Labor Market Insights layer. Google is attaching labor-market context to credentials, which is the same enrichment play Module 6 recommends. That is the competition worth tracking — not badge issuance.
edX / 2U and the rest of the online-education field
edX's verified certificates use ID verification at enrollment, which is a genuine integrity signal, but the credential artifact remains a hosted page rather than a portable Verifiable Credential. 2U's financial difficulties have limited investment in forward-looking credential infrastructure.
The broader field — Udacity, Udemy, Pluralsight, LinkedIn Learning — is largely in the same position: certificates as marketing artifacts rather than verifiable claims. This is a genuine opening. There is no online-learning platform at Coursera's scale with a serious verifiable-credentials program, which means first-mover advantage in this category is real and currently unclaimed.
Canvas Credentials and the LMS flank
Instructure's Canvas Credentials (formerly Badgr) issues Open Badges 3.0 from inside the dominant higher-education LMS. That is a structurally strong position: credentials issued where the coursework already lives, with no integration required by the institution.
For Coursera this is the flank to watch. If universities issue verifiable credentials natively from Canvas for their own coursework, the Coursera-delivered credential becomes one input among many rather than the record itself — and the aggregation layer (CLR) moves to the LMS. Two responses, and they are not exclusive: make Coursera credentials trivially ingestible into institutional records, and compete on the assessment provenance an LMS badge cannot carry.
Where Coursera actually differentiates
alignment makes credentials machine-comparable while competitors emit bare strings. Cheap to build, hard to copy.1. Nobody verifies. Coursera issues beautiful credentials into a market that keeps hiring on resumes and LinkedIn profiles. Mitigation: seed verification inside Coursera for Business before asking the open market to care. This is the most likely failure mode.
2. A neutral utility wins the layer. Credly, Google, or a government wallet becomes the default container, and Coursera is one issuer among thousands with no special position. Mitigation: do not fight for the container — win on credential quality and be present in every container.
3. Coursera builds a wallet nobody installs. Engineering goes into a consumer app competing with Apple, Google, and EUDI national wallets. Mitigation: Module 4's recommendation — custodial web wallet for reach, defer the native app.
Not "Coursera has a credential wallet." That is a feature claim, easily matched, and it competes on the layer Coursera is weakest at.
"A Coursera credential is the most trustworthy machine-readable claim about a person's skills that exists — because it carries the assessment behind it, and any system can check it in a millisecond without asking us."
That is a claim only an issuer with real assessment infrastructure can make, it is verifiable rather than aspirational, and it wins in exactly the world Module 1 argues is arriving: one where the entity reading the credential is software.
If LinkedIn added verifiable credential support tomorrow, is this whole program dead?
No — it would be the single best thing that could happen to it.
LinkedIn adding VC support would make it a verifier, and verifiers are the scarce resource. Coursera would remain the issuer, and the trust layer under a LinkedIn "verified" checkmark would be Coursera's signature and Coursera's assessment provenance. The value of being a high-quality issuer goes up when a high-distribution surface starts checking, because it finally makes the difference between a rigorous credential and a completion certificate visible where hiring decisions get made.
The scenario that actually threatens the program is the opposite: LinkedIn becoming an issuer of assessed credentials with its own verification, capturing both sides. LinkedIn Learning plus LinkedIn Skill Assessments is the seed of that, and it is worth watching. But it would require LinkedIn to build assessment rigor it has shown little appetite for, in a business with much worse margins than advertising and recruiter seats.
Coursera Implementation Roadmap
▾Five phases over eighteen months, with the phase-two departure from conventional wisdom flagged loudly, and explicit criteria for killing the program.
Engineering counts below are directional, outside-in estimates from someone without visibility into Coursera's internal systems, team topology, or existing credential infrastructure. Treat them as a starting shape for a planning conversation, not as a bid. The relative sizing between phases is more reliable than the absolute numbers, and the sequencing logic is the part worth arguing about.
Everything downstream depends on this and nothing downstream substitutes for it. If only one phase ships, this is the one that creates value on its own.
- Publish
did:web:coursera.orgwith a documented key-rotation policy and the never-delete rule enforced in code review. - KMS/HSM-backed signing service — small, separately deployed, dual-controlled, audited.
- Open Badges 3.0 issuance for new completions, with
criteriaandalignmentpopulated, not stubbed. - Assessment integrity tier (T1–T4) as a machine-readable field, governed by academic integrity rather than marketing.
- Bitstring status list infrastructure, CDN-served, with a written revocation policy answering "what would make us revoke?"
- Hosted verification page plus an open-source verifier library that does not call Coursera.
- 1EdTech OB 3.0 certification — start the process in week two, not month three.
- Publish the credential catalog into Credential Engine with CTDL descriptions.
~6–8 engineers (2 crypto/security, 3 backend, 1 frontend, 1–2 data for taxonomy alignment) + PM + academic-integrity stakeholder.
Exit criteria: a third party verifies a Coursera credential using only published standards and a library they did not get from Coursera.
The conventional Phase 2 is "fork MIT's Learner Credential Wallet and ship a native app in six months." I recommend against leading with that.
A native wallet is a permanent product line — roughly 3–4 engineers steady-state, two app stores, OS churn, a protocol treadmill, and a support queue whose top ticket is "I got a new phone" — competing against Apple Wallet, Google Wallet, and EUDI national wallets that all 27 EU member states must ship by December 2026. Learners in Coursera's largest markets will have a wallet regardless.
Do this instead: a custodial web wallet for reach plus OID4VCI export so any standards-compliant wallet can hold a Coursera credential. Weeks of work rather than quarters, and it makes the native-app decision a data-driven one in Phase 4 rather than a bet made now.
- Custodial web wallet: log in, see credentials, share a link, download the credential file. Honest UI labelling about custody.
- OID4VCI issuance endpoint so any conforming wallet — LCW, ASU Pocket, a EUDI wallet — can claim a Coursera credential.
- OID4VP presentation support for verifier-initiated requests.
- Lazy retroactive issuance: eligibility-and-tier index over historical completions, signing on claim.
- Legacy Open Badges 2.0 import, so a wallet is not empty on first open.
- Instrument everything: claim rate, wallet choice, share events, verification events. This data decides Phase 4.
~8–10 engineers (5 backend/protocol, 3 frontend, 1 data) + PM + design.
Exit criteria: a learner claims a Coursera credential into a third-party wallet and presents it to a third-party verifier successfully.
- CLR 2.0 issuance bundling course, specialization, and degree credentials with defined associations.
- Import of third-party credentials into the learner record — with correct semantics: bundling is assembly, not attestation, and every inner credential verifies independently.
- Coursera for Business workforce skills record — enterprise-held CLRs across their workforce, exportable to HRIS. This is the commercial centrepiece of the phase.
- Sub-issuer DIDs (
did:web:coursera.org:issuers:<partner>) for campus and enterprise partners. - EDC/ELM mapping for the European business, ahead of the December 2026 EUDI deadline.
- 1EdTech CLR 2.0 certification.
~10–12 engineers + enterprise PM + partner solutions engineering.
Exit criteria: an enterprise customer verifies its own workforce's skills from a CLR without using a Coursera dashboard.
- Production verification API on Cloudflare Workers — basic tier free and unkeyed, permanently.
- Enriched tier: skills-graph context, cohort percentiles (opt-in), assessment provenance detail, bulk operations.
- x402 metering on the enriched tier for agent traffic; conventional contract billing for enterprises. Both, not one.
- Edge-cached DID documents and status lists — performance and the Module 3 privacy mitigation in one move.
- Native wallet decision gate using Phase 2 instrumentation: if a meaningful share of learners claim into third-party wallets, do not build a native app.
~6–8 engineers (3 edge/platform, 2 data/enrichment, 1–2 payments integration) + PM.
Exit criteria: a third-party agent verifies a credential and pays for enrichment with no prior Coursera relationship.
- Verification receipt attachment flow — works with every ATS, zero partner engineering. Ship first.
- Marketplace apps for the two or three ATS platforms covering the majority of enterprise hiring volume.
- Velocity Network engagement, sized to demonstrated ATS pull rather than to the pitch.
- State talent-marketplace integration, tracking US DOE Connecting Talent to Opportunity Challenge outcomes.
- EUDI wallet interoperability testing against national implementations.
~6–8 engineers + partnerships + solutions engineering.
Exit criteria: a hiring manager sees a verified Coursera credential inside their ATS without leaving it.
Cumulative investment shape
| Phase | Window | Eng (peak) | Eng-months | Value created on its own |
|---|---|---|---|---|
| 1 — Issuer | 0–3 | 6–8 | ~21 | High — standalone credible |
| 2 — Wallet + delivery | 3–9 | 8–10 | ~54 | High — learners can actually use them |
| 3 — CLR + enterprise | 9–15 | 10–12 | ~66 | Medium-high — the enterprise wedge |
| 4 — Verification API | 12–18 | 6–8 | ~42 | Medium — option value on the agent wave |
| 5 — Ecosystem | 15–24 | 6–8 | ~63 | Medium-high — where demand is realized |
| Total (overlapping phases) | ~245 eng-months | ≈ 20 engineer-years | ||
Phases 1 and 2 create value with or without anything after them: learners get portable credentials and Coursera gets standards credibility with university partners. Phase 3 is where the money is, because the enterprise workforce record is a new budget line rather than a feature. Phase 4 is an option on the agent wave — cheap to buy, and worth buying precisely because it is cheap. Phase 5 is where demand is realized and is the phase most dependent on parties outside Coursera's control, which is why it comes last despite being the most important.
Organizational changes
A program that cannot be falsified will run forever on narrative. Set these at the outset and hold to them:
- After Phase 2: if fewer than 5% of eligible learners claim a credential into any wallet within 90 days of eligibility, the learner demand hypothesis is wrong. Stop and reconsider — do not fund Phase 3 to fix a demand problem with more features.
- After Phase 3: if no enterprise customer will pay for the workforce skills record, the enterprise wedge is wrong. That was the strongest commercial hypothesis; its failure is disqualifying, not a signal to build harder.
- After Phase 4: if paid enrichment verifications are below a few thousand per day, the agent thesis has not arrived yet. Keep the free tier running — it is cheap and it is strategically correct — and shelve the metering.
- At any point: if a neutral utility becomes the de facto standard container and Coursera's differentiated fields are not representable in it, revisit build-versus-partner immediately rather than at the next planning cycle.
Fund Phase 1, and inside Phase 1 fund the alignment and assessment-tier work above everything else.
That is a small data-and-schema project, not a platform. It produces credentials that are machine-comparable and honestly graded — which is the only asset in this entire course that competitors cannot copy by buying a vendor. The wallet, the API, and the ecosystem work are all replaceable later. Assessment provenance emitted at issuance time is not: every credential issued without it is permanently impoverished, because you cannot retroactively add fields to a signed document without reissuing it.
That last sentence is the real deadline. Every month of issuance without these fields is a month of credentials that will need reissuing to ever carry them.
What would make you argue for buying rather than building?
If two things were true simultaneously, buying would be right: (a) Coursera's assessment data is not actually rich enough to populate a meaningful integrity tier, and (b) partner-driven demand for OB 3.0 issuance is arriving faster than a 3-month build can serve.
In that world, license Credly or Accredible, ship compliant badges next quarter, and treat issuance as procurement. The tell would be discovering during Phase 1 discovery that assessment metadata is inconsistent, unavailable, or not trustworthy across the catalog — which is a real possibility worth testing in the first two weeks rather than assuming away.
The hybrid most large issuers land on stays available either way: build the pipeline for flagship credentials where provenance is the point, buy for the long tail where a plain badge is genuinely sufficient. That also gives you a live interoperability test, since your credentials and the vendor's must both verify in the same wallet.
Technical Deep Dive
▾The parts that decide whether an implementation works: securing mechanisms, DID methods, proof formats, status lists, and the lifecycle fields everyone forgets until a credential expires in production.
Two securing mechanisms, one data model
A VC 2.0 credential can be secured two ways, and a verifier must handle whichever the issuer chose. This is the single most consequential implementation decision in the stack.
| Data Integrity (JSON-LD native) | VC-JOSE-COSE (JWT / SD-JWT) | |
|---|---|---|
| Shape | Credential JSON with an embedded proof | Credential as a JWT payload; signature in the JWS |
| Canonicalization | Required (RDFC-1.0) — expensive | None — sign the bytes |
| Throughput | Canonicalization-bound | Signature-bound (much faster) |
| Selective disclosure | ecdsa-sd-2023, bbs-2023 | SD-JWT (RFC 9901) |
| Unlinkability | Possible with BBS+ | No — signature is constant |
| Multiple signatures | Natural — several proofs on one document | Awkward |
| Ecosystem pull | 1EdTech, DCC, education tooling | EUDI, mDL, OID4VC, mobile wallets |
| Debuggability | Readable JSON | Base64 blob until decoded |
Support both. Default to Data Integrity for education-ecosystem interoperability; use JWT/SD-JWT for bulk issuance and mobile-wallet delivery.
This is genuinely more work and I would normally argue against dual paths. Here it is warranted because the two ecosystems have not converged and neither is going away: 1EdTech and university tooling expect Data Integrity JSON-LD, while EUDI, mDL, and the mobile-wallet world are JOSE-native. Picking one forecloses a market.
Mitigate the cost by keeping the signing service format-agnostic — it takes a validated claim set and a target format, and everything upstream is shared. The dual path then lives in one small, well-tested component rather than spreading through the pipeline.
The JWT form, concretely
// Header
{
"alg": "EdDSA",
"typ": "vc+jwt",
"kid": "did:web:coursera.org#key-2026-01"
}
// Payload — the credential lives under "vc"
{
"iss": "did:web:coursera.org",
"sub": "did:key:z6MkhaXgBZ...",
"nbf": 1785942120,
"jti": "urn:uuid:9f2a4c81-...",
"vc": {
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
],
"type": ["VerifiableCredential", "OpenBadgeCredential"],
"credentialSubject": { ... }
}
}
Note there is no proof member. The JWS signature is the proof, and kid points at the verification method in the issuer's DID document. A verifier that only knows how to look for proof will reject this as unsigned — a common and confusing interop failure.
Proof formats and cryptosuites
| Cryptosuite / format | Curve | Selective disclosure | Unlinkable | Use for |
|---|---|---|---|---|
eddsa-rdfc-2022 | Ed25519 | No | No | Default. Fast, small, widely supported |
ecdsa-rdfc-2019 | P-256 / P-384 | No | No | FIPS / HSM environments requiring NIST curves |
ecdsa-sd-2023 | P-256 | Yes | No | Selective disclosure on NIST curves |
bbs-2023 | BLS12-381 | Yes | Yes | Privacy-sensitive credentials; still maturing |
| SD-JWT (RFC 9901) | Any JOSE alg | Yes | No | Mobile wallets, EUDI, OID4VC flows |
Ed25519 is the right default: 64-byte signatures, fast verification, no curve-parameter footguns, and support in every relevant library. Move off it only for a specific reason — a FIPS requirement pushes you to P-256, and a genuine unlinkability requirement pushes you to BBS+ with the understanding that tooling is thinner.
How SD-JWT actually achieves selective disclosure
hash(salt, claimName, claimValue)._sd. The plaintext values never appear in the signed body._sd. Revealed claims are proven; hidden ones are unknowable.Elegant, cheap, and it explains the linkability limitation precisely: the JWT signature is identical across every presentation, so two verifiers comparing notes can tell they saw the same credential even if they saw different fields.
Bitstring Status List mechanics
{
"@context": ["https://www.w3.org/ns/credentials/v2"],
"id": "https://credentials.coursera.org/status/3",
"type": ["VerifiableCredential", "BitstringStatusListCredential"],
"issuer": "did:web:coursera.org",
"validFrom": "2026-08-05T00:00:00Z",
"credentialSubject": {
"id": "https://credentials.coursera.org/status/3#list",
"type": "BitstringStatusList",
"statusPurpose": "revocation",
"encodedList": "uH4sIAAAAAAAAA-3BMQEAAADCoPVPbQwfoAAAAAAAAAAAAAAAAAAAAIC3AYbSVKsAQAAA"
},
"proof": { ... }
}
Mechanics and sizing:
- The list is a GZIP-compressed, base64url-encoded bitstring. Minimum length is 131,072 entries (16 KB raw) — and because revocations are rare, the compressed payload is typically a couple of kilobytes.
- Each credential carries its index in
credentialStatus.statusListIndex. The verifier decompresses and reads one bit. statusPurposedistinguishes revocation from suspension. Revocation is permanent; suspension is reversible. Different lists, different semantics — a suspended credential can come back.- The status list is itself signed, so a verifier can confirm the revocation data genuinely came from the issuer rather than an attacker who intercepted the fetch.
- Serve from a CDN with a short cache TTL (minutes). Long TTLs delay revocation propagation; no cache means you serve the fetch volume of every verification on earth.
- Do not log requests. Herd privacy is the property being purchased; access logs are how you accidentally sell it back.
- Keep lists large and well-mixed. One list per course shrinks the anonymity set until the herd stops helping — the fetch itself reveals which course is being checked.
- Pre-allocate index ranges per worker during batch issuance so allocation never contends.
- Never reuse an index. Ever. Reuse silently transfers one credential's revocation state to another.
Credential refresh and expiration
| Field | Meaning | Guidance for education credentials |
|---|---|---|
validFrom | When the credential becomes valid | Issuance timestamp. On backfill this is today, not the original completion date. |
validUntil | When it stops being valid | Usually omit. A completed course does not un-complete. |
awardedDate (on the subject) | When the achievement occurred | The real completion date. This is what a human cares about. |
refreshService | Where to obtain a fresh credential | Useful for renewable certifications and for credentials signed with a retired key. |
The instinct to set validUntil two years out "to be safe" is wrong and expensive. A course completion is a historical fact; it does not decay. An expired credential reads to a verifier as invalid, not as old, and at Coursera's volume that means millions of legitimate credentials silently failing verification on a rolling basis, with no event to alert anyone.
Expire only what genuinely expires: time-boxed certifications, credentials tied to a product version, credentials with a regulatory renewal cycle. For everything else, let recency be a signal the verifier weighs via awardedDate rather than a cliff you impose. Module 6 makes recency an exposed signal precisely so it does not have to be an expiration.
A verifier, end to end
async function verifyPresentation(vp: object, opts: VerifyOptions) {
const checks: Record<string, string> = {};
const warnings: string[] = [];
// 1. Presentation signature + replay protection. DO NOT SKIP.
const holderDid = getHolder(vp);
const holderDoc = await resolveDid(holderDid);
if (!(await verifyProof(vp, holderDoc))) throw new Error("bad presentation signature");
if (getChallenge(vp) !== opts.challenge) throw new Error("nonce mismatch");
if (getDomain(vp) !== opts.domain) throw new Error("domain mismatch");
checks.presentationSignature = "valid";
for (const vc of getCredentials(vp)) {
// 2. Holder binding — the credential must be about the presenter.
if (vc.credentialSubject.id !== holderDid) throw new Error("holder binding failed");
// 3. Resolve issuer and verify the credential signature.
const issuerDid = typeof vc.issuer === "string" ? vc.issuer : vc.issuer.id;
const issuerDoc = await resolveDid(issuerDid); // cached for hours
const vm = findVerificationMethod(issuerDoc, proofKeyId(vc));
if (!vm) throw new Error("unknown verification method");
if (!(await verifyProof(vc, vm))) throw new Error("bad credential signature");
// A retired key is a WARNING, not a failure — historical credentials
// stay valid, which is exactly why retired keys are never deleted.
if (isRetired(vm)) warnings.push(`signed with retired key ${vm.id}`);
// 4. Revocation — one fetch covers ~131k credentials.
if (vc.credentialStatus && await isRevoked(vc.credentialStatus)) {
throw new Error("credential revoked");
}
// 5. Validity window and schema.
assertValidityWindow(vc);
assertSchema(vc);
}
// 6. Issuer trust — POLICY, not cryptography. Yours to define.
// Everything above is mechanical; this line is the actual decision.
return { verified: true, checks, warnings, trustDecision: opts.trustPolicy(vp) };
}
Why is JSON-LD canonicalization so expensive, and can we avoid it?
Data Integrity proofs sign a canonical form of the graph, not the JSON bytes, so that semantically identical documents produce identical signatures regardless of key order or formatting. Producing that form means parsing JSON-LD, expanding every term against its @context, converting to RDF quads, and running RDFC-1.0 — which includes a deterministic labelling step for blank nodes that can be genuinely costly on complex graphs.
Three ways to avoid the pain. Pin contexts locally so expansion never hits the network — mandatory for both performance and security, since a remote context is remote code execution over your semantics. Keep credential graphs shallow, avoiding deeply nested blank-node structures. Or use JWT securing, which skips canonicalization entirely by signing the serialized bytes — at the cost of the JSON-LD-native properties and BBS+ compatibility.
For bulk backfill specifically, JWT securing turns a multi-week job into a multi-day one. That is a strong enough argument to make backfill JWT-secured even if forward issuance stays Data Integrity.
Privacy & Compliance
▾Learner-held credentials improve the privacy posture on almost every axis — and create two genuinely new problems that the architecture makes harder, not easier.
This module is an engineering-oriented analysis of where the legal questions land in the architecture, not legal advice. Every position below needs review by counsel with the actual facts of Coursera's data-processing arrangements, and several turn on contractual details no external analysis can see.
GDPR: better on most axes, genuinely harder on one
| GDPR principle | Today (issuer-hosted) | With verifiable credentials |
|---|---|---|
| Data minimisation (Art. 5) | Verification page reveals whatever the page shows | Better — selective disclosure reveals only requested fields |
| Purpose limitation | Issuer sees every verification and could repurpose it | Better — the issuer is not in the transaction |
| Data portability (Art. 20) | Export produces a PDF | Much better — machine-readable, interoperable, a live artifact |
| Right of access (Art. 15) | Subject access request to the issuer | Better — the learner already holds the data |
| Right to erasure (Art. 17) | Delete the database row | Harder — you cannot delete a copy someone else holds |
| Correlation risk | Bounded — the issuer is the only observer | New risk — a static DID is a cross-verifier identifier |
The erasure paradox, resolved
An issued credential is a signed document in the learner's possession, possibly copied to verifiers. Coursera cannot reach into a wallet and delete it. So what does erasure mean?
- Delete Coursera's copy and the issuance record — that is the personal data Coursera controls, and erasure applies to it fully.
- Revoke via the status list so any future verification fails. The credential becomes inert even where it exists.
- Recognise that the learner's own copy is theirs. A learner holding a document about themselves is not Coursera processing their data; erasure rights run against controllers, not against the data subject's own records.
- Verifier copies are the verifier's responsibility — they are a separate controller with their own retention obligations, exactly as they are today for a PDF someone emailed them.
This is a defensible position and materially better than the status quo, where a PDF emailed to fifty employers is equally unreachable and has no revocation mechanism at all.
The status list creates an ongoing processing relationship after erasure. To keep a revoked credential revoked, Coursera must keep publishing a bitstring in which that learner's index is set — which means retaining an index-to-learner mapping, which is personal data, after being asked to erase it.
Two mitigations, and neither is free. Keep the mapping in a separate minimal store with its own retention basis (legal obligation / legitimate interest in credential integrity), holding only the index and a hash rather than learner details. Or accept un-revocation on erasure — delete the mapping, let the bit stay set with no way to explain why, and document that the revocation is permanent and unattributable. Decide this deliberately in Phase 1 rather than discovering it in a Phase 3 audit.
FERPA: verifiable credentials are close to the ideal case
FERPA governs education records at US institutions receiving federal funding. Coursera's own position varies by product line — direct-to-consumer courses are generally not FERPA-covered, while degree programs delivered with university partners typically are, with Coursera acting under the school-official exception. That distinction should be settled per product line before Phase 1, because it changes who may authorize disclosure.
Where the architecture helps, the help is structural rather than incidental:
- Disclosure becomes learner-initiated by construction. FERPA's core mechanism is consent for disclosure of education records. A VC presentation is a consent event: the learner chose to present, to a named verifier, at a specific time. That maps to FERPA's model more cleanly than any consent checkbox.
- Selective disclosure is data minimisation for records. Sharing a credential rather than a transcript discloses less by default.
- The audit trail lives in the right place. The wallet can log every presentation for the learner, giving them a record of who they shared with — which is closer to FERPA's spirit than an institutional log the learner cannot see.
The Coursera for Business workforce skills record from Module 10 sits in a different position from a learner sharing their own credential. If an employer sponsors a learner in a FERPA-covered program and receives a CLR about that learner, that is disclosure to a third party and needs a consent basis independent of the employment relationship.
Design implication: the enterprise record must be built on learner-consented presentations, not on issuer-side data export. Those two produce a superficially identical dashboard and are legally very different objects. Build the consented path first even though the export path is easier — retrofitting consent into a shipped enterprise feature is far worse than designing for it.
Correlation: the new risk the architecture creates
A learner presenting the same did:key to every verifier has handed out a persistent, unique, cross-context identifier — effectively a cookie that cannot be cleared and that they cannot see.
| Mitigation | How it works | Cost |
|---|---|---|
| Pairwise DIDs | A distinct subject DID per verifier relationship | Credentials are bound to one subject DID, so this needs per-relationship issuance or re-binding — substantial |
| BBS+ derived proofs | Fresh unlinkable proof per presentation | Cryptosuite and library maturity; an L1 decision made at issuance |
| Batch issuance of single-use credentials | Issue N copies with distinct identifiers; use each once | Storage and issuance overhead; refresh logistics |
| Accept it, disclose it | Document that presentations are correlatable | Free — and honest, which counts for more than it seems |
For employment credentials, correlation is largely a non-issue: the learner is deliberately presenting under their real name to a named employer. They have already told the verifier who they are — a stable DID adds little.
Correlation matters intensely for two cases: anonymous or pseudonymous skill marketplaces, and credentials touching protected categories — disability accommodations, recovery-program completions, credentials revealing immigration or veteran status.
Recommendation: accept correlation for ordinary course credentials and say so plainly in the privacy documentation. If Coursera ever issues credentials in a sensitive category, that class needs BBS+ from day one — because as Module 2 established, the securing decision is effectively irreversible once credentials are issued at scale.
Cross-border portability
- The credential itself crosses borders trivially — it is a signed document verified against a public key, with no data transfer to a third country in the GDPR sense when a learner presents their own credential to a foreign verifier.
- EU recognition runs through EDC/ELM. Mapping Coursera achievements into the European Learning Model is what makes them describable in EU frameworks, and the December 2026 EUDI mandate makes this a dated requirement rather than an aspiration.
- The issuer-side data — the completion record, the issuance log — remains subject to ordinary transfer rules and is unaffected by any of this.
- Trust does not cross borders automatically. A European verifier may not recognize
did:web:coursera.orgas an accredited issuer, which is the trust-registry gap from Module 2 wearing a jurisdictional hat. National accreditation registries are the emerging answer, and they are not interoperable yet.
Accessibility and the equity question
A wallet-first architecture quietly assumes a modern smartphone with hardware-backed key storage, reliable connectivity, and app-store access. For a global learner base that assumption excludes real people — often exactly the learners for whom a portable credential would matter most.
Requirements that follow: the web wallet must be fully functional on low-end devices and slow connections; a downloadable credential file must work with no wallet at all; the hosted verification page must remain available indefinitely as the universal fallback; and none of these should be presented as a degraded tier.
This is not a footnote. If verifiable credentials become the high-trust path and they require hardware most of the world does not have, the technology has widened a gap rather than closed one — which would be a genuinely bad outcome for a mission-driven education platform, and one that is entirely foreseeable now.
The revocation policy question
Technical revocation is easy. The policy is not, and it must be written before the first credential is signed:
- Academic integrity violation discovered after issuance — revoke. Clear case.
- Issuance error (wrong course, wrong learner, wrong tier) — revoke and reissue correctly.
- Course later found to be substandard — do not revoke. The learner did the work in good faith. Deprecate the achievement definition instead so no new credentials are issued.
- Partner relationship ends — do not revoke. The achievement happened. Nothing about it became false.
- Learner requests deletion — revoke plus erase Coursera's copy, subject to the status-list retention question above.
- Legal order — revoke, and publish transparency reporting on the aggregate.
Revocation is for statements that were never true, or are no longer true. It is not a business lever.
The moment credentials are revoked because a partnership soured, a product was sunset, or a learner stopped paying, the signature stops meaning "this is true" and starts meaning "Coursera currently endorses this." Those are entirely different products, and the second one is worth far less — because a verifier can no longer treat a valid signature as evidence about the learner.
Write the revocation policy in Phase 1, publish it, and treat it as a commitment to the ecosystem rather than an internal runbook. It is the cheapest credibility Coursera can buy in this space, and one visible violation would cost more than the entire program.
Does issuing verifiable credentials make Coursera a data controller in new ways?
For the issuance itself, no — Coursera already processes completion data as a controller, and signing a statement about it is a new format for existing processing, not a new purpose.
Two genuinely new positions do arise. First, the status list is ongoing processing: publishing a bitstring keyed to learner-specific indexes continues indefinitely, including after an erasure request, which is the residual issue flagged above. Second, if Coursera operates a custodial wallet, it becomes a processor (arguably a controller) for credentials issued by other parties that learners store there — a materially different and larger obligation than issuing your own.
That second point is an underrated argument for the Module 4 recommendation. A custodial wallet holding third-party credentials means accepting controller-ish obligations over data Coursera did not create and cannot validate. Export-first architecture keeps that surface small, which is a compliance benefit on top of the cost and strategy arguments already made.
Resources & Primary Sources
▾Specifications
- W3C Verifiable Credentials Data Model v2.0 — Recommendation, 15 May 2025
- W3C Verifiable Credentials Overview — the best single orientation to the seven-spec family
- W3C press release — VC 2.0 published as a standard
- 1EdTech Open Badges 3.0 specification and the implementation guide
- 1EdTech Open Badges overview · CLR & Open Badges FAQ
- 1EdTech — Connecting the Dots: making sense of digital credential standards
- Open Badges 3.0 certification guide
Wallets and reference implementations
- Learner Credential Wallet — OpenWallet Foundation Labs (iOS + Android, open source)
- MIT Open Learning — DCC transfers LCW stewardship to the OpenWallet Foundation
- MIT Learn — What is the DCC and Open Badges 3.0?
- ASU Pocket — a digital wallet for real-time achievements
- ASU — how the Trusted Learner Network and ASU Pocket put privacy first
- ASU Pocket open beta announcement
Market research and primary data
- Coursera Micro-Credentials Impact Report 2026 — the 94% / 92% / 86% figures
- Credential Engine — Counting Credentials 2025 (December 2025)
- Counting Credentials 2025 full report (PDF)
- WCET — 1.85 million credentials and counting
Ecosystem and policy
- Velocity Network Foundation — the Internet of Careers
- Credential Engine's profile of Velocity Network
- US DOE — $15M Connecting Talent to Opportunity Challenge launch
- US DOE — Challenge semifinalists announced
- European Digital Credentials for Learning (Europass)
- Europass — how to receive and use a European Digital Credential
- EUDI Wallet Hub — eIDAS 2, use cases, standards
- Credly — support for Open Badges 3.0 · 1EdTech certification listing
- Google Cloud Credential Wallet announcement
Protocols and cryptography
- OpenID for Verifiable Credential Issuance — developer overview
- OpenID4VC explained — OID4VCI, OID4VP, SIOPv2
- Digital Credentials API in browsers (2026 status)
- OpenID VC interoperability testing results
Related courses in this collection
- Cloudflare Wallets — the payments half of Module 7: x402 on the wire, Account vs Virtual Wallets, the Monetization Gateway
- Cloudflare for Developers — Workers, KV, R2, and the edge platform the verification API would run on
- AI-Native Learning — the assessment and pedagogy side of what a credential should attest to
- Instructure — Canvas Credentials and the LMS flank from Module 9
- A traditional credential is a pointer to a database row the issuer controls; a verifiable credential is a signed statement the learner controls.
- The specs stopped being the bottleneck in mid-2025 — what is missing is issuers at scale and verifiers who care.
- The wallet is not the product. Machine-readable assessment provenance is the product, and the wallet is how it travels.
- Basic verification must be free forever; charge for enrichment, never for the check.
- You cannot add fields to a signed document retroactively — so every month issued without
alignmentand an assessment tier is a month of permanently impoverished credentials.
Need this for a date?
Turn this course into a ramp-up pack sized to your minutes per day, or build an interview or certification pack for the day you need it.