Public Verification Portal
Tenant-branded /v/{slug} page where anyone can verify by QR or text input. Live with one click.
Embeddable Widget
Drop a 5-line iframe into any website. Auto-resizes via postMessage. Works on WordPress, Shopify, anything.
80 Polished Templates
10 designs per module × 8 modules. Pick the active one per module, swap any time.
Server-side PDF
Real HTML → PDF via Dompdf — no Node, no fonts to install. Custom paper sizes for ID cards.
QR On Every Document
Every generated PDF embeds a QR pointing to the canonical verification URL. Scannable from any phone camera.
Bulk Excel Import
Upload xlsx or csv → preview validity → confirm. Invalid rows downloadable as CSV error report.
Bulk PDF Generate
Excel in, ZIP of named PDFs out. Generate hundreds of certificates in one operation.
PDF or PNG Download
Every generated document downloads as PDF — or as a PNG named after the recipient.
Mobile QR Scanner
Built-in camera scanner on the public verify page. No app to install. Powered by Nimiq qr-scanner.
Per-Tenant Branding
Custom primary colour, logo, welcome paragraph, contact info. Live preview while editing.
Activity Log
Every state-changing action logged with actor, IP, user-agent, details. Filterable + CSV exportable.
Impersonation
Service Provider can impersonate any manager. Yellow banner across the UI; both start and end logged.
Email Onboarding
Branded HTML email auto-sent with credentials when a tenant is provisioned. SMTP configurable from admin.
Suspension & Reactivation
One toggle suspends a tenant; public portal politely shows "service unavailable" — no records lost.
Activity-aware Rate Limiting
Login: 5 fails / 15 min / email. Public verify: 30 attempts / IP / 10 min. CAPTCHA on both login pages.
Force-change Passwords
First login forces a new password. Service Providers can rotate any manager's credentials.
Tenant Isolation
Every record-touching query carries tenant_id. Managers literally cannot see each other's data.
Plain Shared Hosting
Vanilla PHP 8.3 + MySQL. Upload, import SQL, configure DB — running in under 15 minutes.