Skip to content

Issue and deliver credentials

Only published achievements can be issued, and the organization’s issuer identity must also be published. Issuing creates a signed Open Badges credential for the organization, a public credential record, and a single-use holder claim link.

  1. Open your organization’s Credentials page.
  2. Choose a published achievement and select One recipient.
  3. Enter the recipient’s email. Name, organization, expiration, and evidence are optional.
  4. Select Issue credential.

Vitni stores the credential as an immutable signed snapshot. The recipient email is hashed in the credential and encrypted in the issuer record. The claim link expires after seven days and can be regenerated from the issuance record if needed.

For one recipient, use the Evidence section to add up to five entries. Each entry has a title and needs either a narrative describing the recipient’s work or a public HTTPS link. Vitni includes these details in the signed credential and shows them on its public page. Open Badges 3.0 defines evidence on the credential and allows a description of the work or a page linking to supporting material (implementation guide, vocabulary).

Evidence travels with the credential when it is shared. Do not include private or sensitive information. Use immutable links that recipients and verifiers are allowed to access; Vitni does not upload the linked files or check that a link remains available.

Choose CSV batch and upload a file with an email header. Optional headers are name, organization, and expirationDate (date format YYYY-MM-DD). Each row can also include one optional evidence entry using evidenceName, evidenceNarrative, and evidenceUrl. Header matching ignores spaces, hyphens, and underscores. The file must be smaller than 2 MB and contain no more than 100 recipients.

Vitni reports success or failure per row. Copy claim links from the batch results where needed. Batch issuance currently runs sequentially.

name,email,organization,expirationDate,evidenceName,evidenceNarrative,evidenceUrl
Alex Morgan,alex@example.org,Northstar Academy,2027-06-30,Capstone project,Designed and presented a capstone project,https://example.org/portfolio/alex
Sam Lee,sam@example.org,Northstar Academy,,,,

Local development enables SMTP delivery to Mailpit by default. Start it with pnpm infra:up; Mailpit catches recipient messages at http://127.0.0.1:8025 so no email leaves the machine. Local configuration uses SMTP_REQUIRE_TLS=false because the Mailpit SMTP listener is unencrypted and loopback-only. Self-hosted operators can configure a real SMTP relay using SMTP_HOST, SMTP_PORT, SMTP_FROM, and relay credentials where required. Hosted Vitni uses a scheduled Cloudflare Worker and the Resend HTTPS API; set VITNI_EMAIL_DELIVERY_ENABLED=true only after configuring Hyperdrive, a verified sender, VITNI_EMAIL_FROM, and the RESEND_API_KEY and encryption-key secrets. Never use the local Mailpit SMTP address in production. If delivery is disabled, the outbox retains queued messages and the issuer can create a fresh claim link and resend the notice. Check the per-credential email state in the issuance record.

For an existing award, issuers can correct or renew the credential. Both actions create a new signed credential and preserve the old document and its status history.

Claim links are single-use and expire seven days after issue. The recipient must sign in with an account whose verified email matches the issued email. If delivery failed or a link expired, create a new link from the credential row and share it with the recipient.

Each issuance record offers the public credential page, the signed JSON-LD document, and a copyable public link. The public page checks the issuer proof, expiration, and revocation status. Issuers can revoke an active credential; verifiers then see its revoked state.

The hosted Resend adapter supplies an idempotency key based on the outbox row to suppress duplicate sends during provider retries. Local and self-hosted SMTP is at-least-once: if the worker crashes after the relay accepts a message but before Vitni records success, a duplicate email may be sent.