Every developer thinks “I'll just use Puppeteer directly”. Then they spend weeks building template management, a preview system, auth, error handling, and an editor UI. PDFSend ships all of this out of the box — plus a visual editor your business team can use without writing a single line of code.
Puppeteer's page.pdf() is just the rendering step. Everything around it — the template system, the API, the editor, the preview — is where the real work lives.
At a $100/hour developer rate, that's $6400-$13600 of engineering time. Plus ongoing maintenance.
// DIY Puppeteer — the "simple" version
const puppeteer = require('puppeteer');
async function generatePdf(html, data, options) {
// Launch browser (cold start: 2-5 seconds)
const browser = await puppeteer.launch({
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox',
'--disable-dev-shm-usage']
});
try {
const page = await browser.newPage();
// Manually replace variables
let rendered = html;
for (const [key, value] of Object.entries(data)) {
rendered = rendered.replaceAll(`{{${key}}}`, value);
}
await page.setContent(rendered, {
waitUntil: 'networkidle0' // or 'networkidle2'?
});
const pdf = await page.pdf({
format: options.format || 'A4',
margin: options.margin || { top: '20mm', bottom: '20mm' },
printBackground: true,
});
return pdf;
} finally {
await browser.close(); // Don't forget this!
}
}
// Now you need: API route, auth, template storage,
// editor UI, preview, logs, error handling...
// That's another 60-120 hours of work.// PDFSend — one API call
const res = await fetch('https://pdfsend.up.railway.app/api/v1/render', {
method: 'POST',
headers: {
'Authorization': 'Bearer ps_live_xxxxx',
'Content-Type': 'application/json',
},
body: JSON.stringify({
template_id: 'invoice',
data: { company: 'Acme Corp', amount: '$1,500' },
}),
});
const pdf = await res.blob(); // Done.With raw Puppeteer, you get page.pdf(). That's it. Everything else — template storage, variable injection, format presets, browser lifecycle management, auth, API routes — is on you.
PDFSend wraps all of this into a production-ready system:
To be fair, there are cases where raw Puppeteer is the right choice:
But if your use case is “I have HTML templates, I need to inject data and generate PDFs via API” — that's exactly what PDFSend was built for.
Deploy PDFSend and start generating PDFs in 5 minutes instead of 5 weeks.