CertoraBulk Certificate Generator + Verifier
Batch-generate certificate PDFs with unique verify codes and expiry tracking — on a verify page you host.
No sign-up, no password — the demo opens already signed in, on sample data.
- Full PHP source included
- Instant download + licence key
- It never phones home
The problem it solves
Training providers, course creators, event organisers, and HR teams all hit the same wall: fifty (or five hundred) people finish, and each needs a certificate — plus a way for an employer to check it's real, years later. Doing it by hand means mail-merging documents one at a time and answering verification emails forever. Certificate SaaS charges per certificate or per month, and the verify page dies with the subscription.
- One PDF per recipient, generated by hand, every cohort
- "Can you confirm this certificate?" emails, indefinitely
- A verification URL that only works while you keep paying
What you get
Each recipient gets a private link to their own PDF — no account, no login, the token is the credential. Batches send in bounded slices (a cohort of 500 can never time out halfway), every skip states its reason, and nothing sends twice.
Upload a JPEG or plain PNG and it is embedded into the PDF byte-for-byte — no imaging library, no re-encoding — centred, scaled to fit, never stretched. Certificates without a seal stay byte-identical to before.
Design templates with title, body, merge tokens ({recipient}, {course}, {date}, {issuer}, {code}), signatory line, orientation, and optional logo/seal text.
Import recipients from CSV with columns matched by header name, or add them manually.
Template × recipient list → one certificate each, with a random database-unique verification code and issue date — collision-free even at a 1,000-certificate batch.
Each certificate renders as a clean PDF — positioned text, double border, centred layout — with no external libraries or services.
Anyone can confirm a certificate at /verify/{code}: recipient, course, issuer, issue date, and validity — with a honeypot, per-IP rate limiting, and a plain not-found on a miss.
Give a template a validity period and every certificate issued from it carries an expiry date (snapshot at issue, month-end clamped). The public verify page shows expired certificates as expired, the register and CSV carry the expiry, and the dashboard counts expiring-soon and expired.
Search every issued certificate, revoke or reinstate, and export the register as a formula-injection-hardened CSV.
Add it to a phone or tablet home screen straight from the browser — a full-screen app served from your own server, with no app store involved. Business data is never cached offline, so what you see is always live.
Certora 2.0 adds the 2.0 owner layer. Upgrade by replacing the files — the database migrates itself, and it is still the same one-time purchase.
- REST API with an OpenAPI spec and signed webhooks
- Two-factor sign-in (TOTP)
- Email notifications through your own SMTP
- CSV import with a mandatory dry run
- One-click backups
- Dark mode
Six MCP tools let an agent list templates, read the register, issue a batch, verify a code and pull the expiry report — with the write tool on the same code path as the Generate screen, so an agent cannot mint a certificate the UI would refuse.
- Roles with email invitations and a last-admin guard
- Append-only audit trail across browser, API and agent
- Your logo and colours throughout
- Scheduled backups with a guided dry-run restore
- Optional single sign-on (OIDC)
The 3.1 wave gave the catalogue a way to reach the other side of the transaction: counterparty email through your own SMTP server, calendar feeds your own calendar subscribes to, attachments filed where the paperwork belongs, and export presets other people's software imports. Every outbound path ships switched off, runs on your own credentials, and can never break the thing that triggered it. What this app gained is listed at the top of this section.
Pricing — one-time, yours forever
- ✔ Full source included — PHP you can read and change
- ✔ No subscription. One payment, yours forever
- ✔ It never phones home
- ✔ Your data stays on your server
Which licence do I need?
It comes down to how many installations you need. Running your own business on one site is the Single licence. Building or running sites for other people — a second domain of your own, or an installation a client keeps — is the Extended licence.
Single licence
One (1) domain or subdomain
One business, running it on one site.
- Install it on one domain or subdomain you own or operate
- Change the source however you like for that installation
- Run your own business on it commercially, client work included
- Re-download the current build any time from your buyer portal
- A second site, or an installation you hand to a client as theirs, needs the Extended licence
- No reselling, redistributing or sublicensing the source
- Not for offering it to other people as a hosted service
Extended licence
Unlimited sites you own or operate
Agencies, and anyone running it on more than one site.
- Everything the Single licence grants
- Install it on as many domains as you own or operate — no cap on the number
- Build and hand over one installation per client project
- Still no reselling or redistributing the source itself
- Running it as a multi-tenant service others sign up for needs a SaaS agreement
Every download carries the full terms as LICENSE.txt, and the licence you bought is
named on your order and in your buyer portal. The complete wording lives on the
terms page, and the live demo is free for as long
as it takes to decide.
Honest limitations
What it does not do — written down before you buy, and kept true on purpose.
- Not a PKI/digital-signature system — verification is a database lookup on your server: the code resolves to the record you issued, or it does not. Provenance, not cryptography.
- Email goes through your own SMTP; certificates are delivered as a private link, never as an attachment, and delivery is off until you switch it on.
- A seal or logo on the certificate must be a JPEG or a plain 8-bit PNG (no transparency, interlacing or palette) — the PDF is written without an imaging library on purpose.
- Single-tenant: one issuing organisation per installation.
2-minute web installer, plain PHP 8 + MySQL (or SQLite for a trial), no Composer or build step — Docker image included.
Covered in these guides
The limitation-smash release: your tools now write to the people they serve — client emails through your own SMTP, calendar feeds, attachments, export presets — every one of them off until you switch it on.
A hosted verification URL is a dependency. Cryptographic badges are a standard. A self-hosted verify page is a third thing. Here are all three trust models compared honestly, including where the self-hosted one is the wrong choice.
Questions about Certora
Is the verification cryptographic?
No, and it doesn't need to be — a verification code is a random, database-unique lookup token. Verification is a lookup against your own register, not a signature check. Nothing is signed or encrypted.
Can verification codes collide?
No — codes are random and enforced unique at the database level; batch generation is tested collision-free at 1,000 certificates.
What stops someone brute-forcing the verify page?
The verify endpoint has a honeypot, per-IP rate limiting, and returns 404 on a miss — and a code exposes nothing beyond what's on the certificate face.
Can I revoke a certificate?
Yes — revoke or reinstate any issued certificate from the register; the public verify page reflects it immediately.
Do certificates expire?
If you want them to — set a validity in months on the template (0 = never expires). Each certificate snapshots its expiry at issue; it stays valid through the expiry date itself, and a revoked certificate always shows revoked, expired or not.
Will it run on shared hosting?
Yes — PHP 8+ with PDO, MySQL/MariaDB or SQLite, a 2-minute web installer, no Composer packages, no API keys.
Can it email certificates to recipients?
Yes — switched off until you enable it. Each certificate carries a private link to its own PDF (no account needed); batch delivery works in bounded slices with per-recipient outcomes, refusals report as skipped rather than failed, and nobody is ever emailed twice.