This n8n workflow provides a complete end-to-end system for creating, distributing, and verifying digital certificates, using PDF Generator API templates instead of raw HTML.
It is designed as a production-ready MVP, fully functional and tested, that can be imported and adapted with minimal configuration.
The workflow exposes public endpoints to:
This workflow is ideal for:
Any scenario where certificates must be generated automatically and verified reliably.
Endpoint
POST /certifications2
When triggered, the workflow:
Instead of HTML, the workflow sends a JSON payload to a predefined PDF template.
Example payload:
{
"Candidate": "John Doe",
"CourseName": "Advanced n8n Automation",
"DueDate": "2025-01-10",
"ID": "LQ4Z5H8R2A1F"
}
The PDF layout (fonts, colors, logos, formatting) is fully managed via the PDF Generator API Template UI, keeping the workflow clean and maintainable.
Endpoint
GET /certificationscheck?id=CERTIFICATION-ID
This endpoint:
Example response (valid):
{
"ok": true,
"name": "John",
"surname": "Doe"
}
This enables public, API-based certificate verification.
Before importing the workflow, you need:
n8n instance (cloud or self-hosted)
n8n Data Table with the following fields:
Name (string)Surname (string)CertificationID (string)PDF Generator API account
Gmail OAuth2 credentials
Ability to expose webhook endpoints publicly
Create (or reuse) an n8n Data Table with these fields:
| Field | Type |
|---|---|
| Name | string |
| Surname | string |
| CertificationID | string |
Update the following nodes to reference your Data Table:
Insert_CertificationFind_Certification_By_IDFind_Certification_By_ID1Create a PDF template in PDF Generator API
Add placeholders such as:
{Candidate}{CourseName}{DueDate}{ID}In n8n, set credentials on the Generate a PDF document node
⚠️ Placeholder names must exactly match the JSON keys used in the workflow.
Click Activate
Your endpoints are now live:
/certifications2/certificationscheckThis workflow is an MVP, but already production-ready
Designed to be:
Recommended version for new implementations
HTML-based version is kept only for reference/backward compatibility
You can easily extend this workflow by: