Every time a course batch completes, you have a list of students who need certificates.
The manual way: open Canva, duplicate the template, change the name, export, repeat — for every single student.
If you have 10 students, that's annoying. If you have 200, that's a full afternoon.
The better way
A single n8n workflow that:
- Reads student names from Google Sheets
- Calls the RenderPix batch API
- Gets back 200 certificate images
- Emails each student their certificate
Total time: ~2.5 minutes. Total manual work: zero.
What you'll need
- A RenderPix account (free tier works for testing, Starter plan for production)
- n8n (self-hosted or cloud)
-
n8n-nodes-renderpixcommunity node - A Google Sheet with student data
Install the n8n node:
npm install n8n-nodes-renderpix
Or search "RenderPix" in n8n's community node panel.
Step 1 — Design your certificate template
Write your certificate in plain HTML. Here's a clean starting point:
<div style="width:1200px;height:850px;background:white;
display:flex;flex-direction:column;align-items:center;
justify-content:center;border:20px solid #0f172a;
font-family:Georgia,serif;padding:60px;box-sizing:border-box">
<div style="font-size:16px;letter-spacing:5px;color:#64748b;
text-transform:uppercase;margin-bottom:24px">
Certificate of Completion
</div>
<div style="width:80px;height:2px;background:#22d3ee;margin-bottom:32px"></div>
<div style="font-size:52px;font-weight:700;color:#0f172a;margin-bottom:16px">
{{name}}
</div>
<div style="font-size:18px;color:#475569;text-align:center;max-width:600px">
has successfully completed
</div>
<div style="font-size:28px;font-weight:600;color:#1e293b;margin:16px 0 40px">
{{course}}
</div>
<div style="font-size:14px;color:#94a3b8">{{date}}</div>
</div>
Notice the {{name}}, {{course}}, {{date}} placeholders — RenderPix replaces these at render time.
Step 2 — Set up Google Sheets
Create a sheet with these columns:
| name | course | date |
|---|---|---|
| Jane Smith | Advanced n8n Automation | June 2026 |
| John Doe | Advanced n8n Automation | June 2026 |
Step 3 — Build the n8n workflow
Nodes:
- Manual trigger (or schedule / webhook)
- Google Sheets — read all rows
- Code node — map rows to batch items array
- RenderPix — batch render
- Loop Over Items — iterate results
- Gmail — send each student their certificate
Code node:
const rows = $input.all();
return [{
json: {
items: rows.map(row => ({
html: `YOUR_CERTIFICATE_HTML_HERE`,
vars: {
name: row.json.name,
course: row.json.course,
date: row.json.date
},
width: 1200,
height: 850,
format: 'png'
}))
}
}];
RenderPix node config:
- Operation: Batch Render
- Items:
{{ $json.items }} - API Key: your key from renderpix.dev dashboard
Step 4 — Handle the results
The batch endpoint returns:
{
"results": [
{
"index": 0,
"success": true,
"image": "data:image/png;base64,iVBORw0KGgo...",
"duration_ms": 287
}
],
"total": 200,
"succeeded": 200,
"failed": 0
}
Each image field is a base64-encoded PNG. In n8n, decode it and attach to an email.
If one cert fails, the rest still go out — the batch endpoint returns HTTP 207 with per-item success/failure flags.
Results
Real numbers from a test run:
- 200 certificates
- ~2.5 minutes total
- 100% success rate
- ~$0.0016 per certificate on Starter plan
Compared to alternatives
| Approach | Time for 200 certs | Custom design |
|---|---|---|
| Manual Canva | 3-4 hours | Limited |
| PDF library (PDFKit) | Dev time + hosting | Full |
| RenderPix batch | 2.5 minutes | Full HTML/CSS |
Wrapping up
The workflow JSON is available at github.com/ozgurdogus/renderpixn8n.
RenderPix free tier: 100 renders/month, no credit card required.
renderpix.dev
Top comments (0)