Documentation

Platform Documentation

The complete guide to mastering CertTrigger.

Quick Start Guide

In a rush? Here is how to send your first batch in under 2 minutes:

  1. 1Create a Template: Go to the Dashboard and click "Create New Template". Choose a preset or start blank.
  2. 2Add Dynamic Fields: Use the {{Field}} button to place placeholders like {{Name}} and {{Date}} on your design.
  3. 3Prepare Data: Create an Excel file with columns matching your placeholders (e.g. a column named "Name" and a column named "Date").
  4. 4Run Batch: Click "Run Job" on the template card — a three-step wizard opens: recipients, delivery, review.
  5. 5Launch: Pick your Excel file or a recipient list, set the email subject/body (or load a saved template), review and press Launch.

Template Builder

Our drag-and-drop builder gives you pixel-perfect control over your certificates.

  • Backgrounds: Upload high-res images (300 DPI recommended for print). Supported formats: JPG, PNG.
  • Dynamic Fields: These are the magic of CertTrigger. Any text inside double curly braces {{...}} becomes a variable. You can change their font, color, and size just like normal text.
  • Layers & Locking: Use the Layers panel to reorder elements. Lock elements to prevent accidental movement while editing.
  • QR Codes: Add a QR code element to make your certificates verifiable. You can encode the certificate ID or a custom URL.
  • Keyboard Shortcuts: Use Ctrl+C / Ctrl+V to copy/paste elements. Use Arrow Keys for precise nudging (Shift+Arrow for 10px bumps).

Design Library

The pieces you reuse across certificates live outside any single template, so a change reaches everything you issue next.

  • Attributes. The named fields your certificates can carry — Recipient Name, Course, or one you define yourself like Employee ID. Each becomes a placeholder the builder can place, and a custom one works the moment you create it: no template, gallery design or issued certificate changes.
  • Assets. Upload the logos, signatures and seals you place on certificates. They are stored once and available in the builder for every template.
  • Phrases. Save the wording you reuse — an opening line, a closing line, a compliance sentence — under a short label, and drop it into any design instead of retyping it.
  • Email templates. The covering email that carries a certificate. Write your own or have the AI assistant draft one; drafting spends AI credits from your plan, saving does not.

Recipients & Data

A recipient list is a cohort: the same course, the same date, a different person on every row. Which half a value belongs to decides where you enter it — and getting it right is the difference between typing a course name once and typing it into six hundred cells.

Two kinds of field

Same for everyone

One value set on the list and printed on every certificate it issues — the course, the event, the issue date, plus any shared attribute you add. Type it once. These are not spreadsheet columns, and a column of the same name is overridden by them.

Different for everyone

A column in the table, with its own value per recipient — the name, the score, the employee number. These are what a spreadsheet upload fills. Open a list and press the settings icon to add or delete columns, and to see what each one currently holds.

Excel / CSV Import

The most common way to bring in data. Your first row is the column headings, and each heading becomes a placeholder your designs can place. Only include columns that differ per recipient — anything shared belongs on the list itself. Format dates as text if you need specific formatting.

Smart Lists

Reusable lists for recurring groups. Add to them manually, import in bulk, or build one straight from a design — the builder reads the placeholders your certificate uses and creates a list shaped to fill them, with the shared ones set on the list and the rest as columns. Name and Email are always included, because a list that cannot address anyone cannot deliver anything.

Processing & Emailing

The Job Runner is where the magic happens. It merges your Template with your Data.

Smart Preview

Always check the preview. It renders the first 5 records of your data onto the template so you can catch alignment issues.

Email Delivery

We use high-reputation IPs to ensure delivery. You can customize the "Sender Name" in your profile settings.

Email Variables

You can use `{{Name}}` etc. in the Email Subject and Body too, not just the certificate!

Calendar

One month view of everything with a date attached, so a renewal or a scheduled send does not arrive as a surprise.

  • What appears. Scheduled sends, certificates that expire that day, and live event days.
  • Expiry. A certificate given an expiry date reports itself as expired on its verification page once the date passes — you do not have to do anything for that to happen.
  • Renewal reminders. Where a certificate has an expiry, a reminder email can go to the holder before it lapses.

Live Events & Claim Forms

Put a QR code on the screen and let people claim their own certificate. Nobody uploads a spreadsheet, and nobody types attendee names.

  • Two modes. Instant issues and emails the certificate the moment someone claims. Collect captures their details without issuing, so you can review and send as a batch later.
  • The claim page. Each form has an unguessable public URL at /f/{slug}. Show it as a QR at the venue, or send the link to remote attendees.
  • You open and close it. A form only accepts claims while it is active, and you can toggle that live. It also stops on its own at an expiry date or a submission cap, which defaults to 500.
  • What you ask for. Email is always collected; add any other fields you need, marking each required or optional. Whatever the attendee submits can be placed on the certificate.
  • Everyone lands in a recipient list. Each claim writes the attendee into the list linked to the form, in both modes — so the event leaves you with a reusable audience, not just a pile of certificates.
  • One event, one batch. The whole event appears in your history as a single batch, with per-attendee resend if somebody mistypes their address.
  • Scanning at the door. A door link opens a scanner for staff to check people in. If the camera is unavailable, the code on the ticket can be typed instead.

Webhooks & Automation

Integrate CertTrigger with Zapier, Slack, or your own backend using Webhooks.

When you configure a Webhook URL, we will send a POST request with the certificate details immediately after generation.

// <strong>Payload Structure:</strong> JSON object containing `certificate_id`, `recipient_email`, `pdf_url`, and `metadata`.

{
  "event": "certificate.generated",
  "data": {
    "certificate_id": "crt_123xyz",
    "recipient": {
      "email": "alice@example.com",
      "name": "Alice Smith"
    },
    "pdf_url": "https://certtrigger.com/d/crt_123xyz",
    "metadata": {
      "course": "Advanced React"
    }
  }
}

Security: All webhook requests include a signature header `X-CertTrigger-Signature` for verification.

Verification & Credentials

Every certificate you issue is a signed credential, not just a page on our site. Anyone can check it against your organisation’s published key — including with CertTrigger switched off.

  • Signed on issue. Each certificate is a W3C Verifiable Credential 2.0 / Open Badges 3.0 document, signed with your organisation’s own Ed25519 key. Alter any field and the signature stops matching.
  • You are the issuer, not us. Set your organisation’s name and website in Profile → Organization branding. They appear on the credential; CertTrigger never does.
  • Public documents. /credentials/{id}.json is the signed credential, /credentials/{id}.jwt the bare token, /orgs/{orgSlug}/did.json your public keys, and /status/{listId} the revocation list. No API key needed.
  • Revocation is published. Revoking flips one bit in a signed W3C status list, so even someone holding the file offline can discover it was withdrawn. The credential itself stays valid and keeps being served — that is the point.
  • Open Badges 2.0 still works. The old assertion URL is unchanged and supported indefinitely, so anything built against it keeps working.
  • Check it yourself. Our single-file verifier at /verify/offline resolves your key, verifies the signature and checks revocation — without calling any CertTrigger API.
Open the offline verifier

API Access

For deep integration, use the REST API — issue one certificate or six hundred, each a signed, verifiable credential.

  • GETAuthentication: Bearer key from Profile → API keys (Pro and Enterprise plans). Send Authorization: Bearer ct_... on every request.
  • POSTPOST /api/v1/certificates: issue one certificate; returns verifyUrl, pdfUrl, credentialUrl (the signed credential) and badgeUrl. It does not email anyone unless you set sendEmail.
  • POSTPOST /api/v1/batches: issue to many in one call, from a recipient list or an array of recipients, delivered by email by default. Returns a batchId to poll with GET /api/v1/batches/{id}. Use this rather than looping the single endpoint.
  • GETGET /api/v1/templates/{id}/fields: what a design asks for, and which of those you must supply. An unmatched placeholder prints its own label onto the certificate, so it is worth asking first.
  • GETGET /api/v1/templates: list your template IDs for integration pickers.
  • GETGET /api/v1/certificates and /certificates/{id}: list or inspect what you have issued, including live status and the same links.
  • GETGET /api/v1/lists and POST /api/v1/lists/{id}/contacts: read your recipient lists, with the values each one shares across its recipients, and append to them.
  • POSTPOST /api/v1/hooks: subscribe a URL to platform events (Zapier, Make, n8n). Every delivery is signed.
View full API Reference

Teams

Let colleagues issue under your plan without sharing a login.

  • Invitations. The plan owner invites members by email. An invitation is single-use and expires, so a forwarded link does not become a standing door.
  • Members work on your plan. A member inherits the owner's entitlements — templates, AI, branding, sending — rather than needing a paid plan of their own.
  • Usage stays per person. Members keep their own usage counters, so you can see what each of them issued rather than one merged total.
  • One bill. Sends made by a member are charged to the owner's allowance, which is what makes a shared mailbox and a shared quota work.
  • Seats. A team has a member cap that counts pending invitations as well as accepted ones.

Account & Security

Where sending, access and your issuer identity are configured.

  • Sending channel. Send through CertTrigger, or connect your own Gmail, Outlook or SMTP server so certificates arrive from your address. Connected mailbox tokens are encrypted at rest and used only to send.
  • Two-factor authentication. Turn on app-based 2FA (TOTP) from Account. You are given single-use recovery codes at setup — store them somewhere other than the phone running the authenticator.
  • Devices. Signed-in devices are listed and can be signed out. Changing your password invalidates every existing session, which is the fastest way to remove someone who should not be there.
  • API keys. Create scoped Bearer keys in Account. The full key is shown once at creation and only its hash is stored, so a lost key is replaced rather than recovered.
  • Issuer identity. Under Profile → Organization branding, set the organisation name and website that appear on every credential you issue, and upload the logo shown on claim and verification pages.

FAQ & Troubleshooting

Why isn't my email sending?

Check the sending channel in your Profile: link your Gmail or Outlook account, or rely on the platform channel (paid plans). Then confirm your monthly email quota isn't exhausted — the dashboard shows usage; failed deliveries are refunded automatically.

What fonts are supported?

31 curated print-safe fonts, including 15 Arabic families (Cairo, Amiri, Readex Pro and more). Every font renders identically in the builder preview and the final PDF. Custom corporate fonts are on the roadmap — contact us if you need one.

How long do verification pages stay live?

Indefinitely. Every certificate keeps its public verify URL; you control its status — revoke it instantly or set an expiry date and the page flips to revoked/expired on its own. Recipients can re-download the PDF from the verify page at any time.

Can I issue certificates in Arabic?

Yes — the builder, the AI assistant, emails and verify pages are fully bilingual with native RTL. The AI designs Arabic certificates with proper fonts and direction; just describe what you want in Arabic.

How do live event certificates work?

Create an event form under Live events, connect a template and a recipient list, then project the QR code. Attendees scan, fill the short form, confirm their email with a 6-digit code, and receive a verified certificate on the spot — or get collected into the list for a later batch.

Issue verifiable certificates programmatically. Create an API key in your Profile (Pro and Enterprise plans), then authenticate every request with a Bearer token. Limit: 120 requests per minute per key.

Base URL & authentication

Base URL:  https://certtrigger.com/api/v1
Header:    Authorization: Bearer ct_your_api_key

POST /certificates

Issues one verifiable certificate from a template you own. Data keys fill {{Placeholder}} fields; {{VerifyURL}} and {{CertificateID}} are added automatically (use them in QR elements).

curl -X POST https://certtrigger.com/api/v1/certificates \
  -H "Authorization: Bearer ct_..." \
  -H "Content-Type: application/json" \
  -d '{
    "templateId": "8b1e...uuid",
    "data": { "Name": "Layla Hassan", "Course": "Data Analysis", "Date": "July 2026" },
    "recipientEmail": "layla@example.com",
    "expiresAt": "2027-07-23T00:00:00Z"
  }'

Response (201):

{
  "certificateId": "VbXUxI-Wdts",
  "verifyUrl": "https://certtrigger.com/verify/VbXUxI-Wdts",
  "pdfUrl": "https://certtrigger.com/api/public/verify/VbXUxI-Wdts/pdf",
  "issuedAt": "2026-07-23T12:00:00.000Z"
}

GET /certificates/:certificateId

Returns status (valid / revoked / expired), recipient, view count and links for a certificate you issued.

GET /templates

Lists your templates (id, name, category) for integration pickers.

Error codes

CodeMeaning
API_KEY_REQUIREDMissing/malformed Authorization header
API_KEY_INVALIDUnknown or disabled key
FEATURE_NOT_IN_PLANYour plan does not include API access
VALIDATION_ERRORRequest body failed validation (details included)
NOT_FOUNDTemplate or certificate not found
429Rate limit exceeded — retry after the window resets

Outbound webhooks

Batches with webhooks enabled POST each recipient's data plus the certificate PDF (base64) to your endpoint — ideal for n8n or Zapier. Every request is signed: verify the X-CertTrigger-Signature header (sha256= HMAC of the raw body) using your signing secret from GET /api/webhooks/signing-secret.

REST hooks (event subscriptions)

Subscribe a URL to platform events and get called the moment they happen — this is what Zapier, Make and n8n use. Events: certificate.issued, claim.received (live event forms), batch.completed. Up to 10 subscriptions per account; URLs must be public https endpoints. Deliveries carry X-CertTrigger-Signature (same HMAC as webhooks) and X-CertTrigger-Event headers.

# subscribe
curl -X POST https://certtrigger.com/api/v1/hooks \
  -H "Authorization: Bearer ct_..." \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://hooks.example.com/certs", "event": "certificate.issued" }'

# list          GET    /api/v1/hooks
# unsubscribe   DELETE /api/v1/hooks/:id

Delivery payload:

{
  "event": "certificate.issued",
  "data": {
    "certificateId": "VbXUxI-Wdts",
    "recipientEmail": "layla@example.com",
    "templateName": "Workshop Certificate",
    "verifyUrl": "https://certtrigger.com/verify/VbXUxI-Wdts",
    "source": "batch"
  },
  "timestamp": "2026-07-25T12:00:00.000Z"
}

Recipient lists

List your recipient lists and push recipients into them from external systems — form tools, CRMs or automation platforms. New recipients are immediately available to batches and live event forms.

# your lists    GET /api/v1/lists

# add a contact
curl -X POST https://certtrigger.com/api/v1/lists/LIST_ID/contacts \
  -H "Authorization: Bearer ct_..." \
  -H "Content-Type: application/json" \
  -d '{ "data": { "Name": "Layla Hassan", "Email": "layla@example.com" } }'