Your files never leave your device. All processing happens locally in your browser.
How do I bulk-create certificates, badges or labels from a CSV without uploading the spreadsheet anywhere?
Open Bulk Create from CSV, pick a template type — certificate, name badge, ID card, label / sticker, place card or event ticket. Each is a real editable layout whose text carries placeholder tokens in curly braces, e.g. {name}, {course}, {date}, {id}. Paste or load a .csv (parsed locally), then MAP each token to a column (auto‑matched by name, or pick it yourself). The tool merges every row and draws a live preview plus a thumbnail grid, and one click batch‑renders all rows into a ZIP of PNGs or a multi‑page PDF (one design per page). Everything runs in your browser — your spreadsheet, logo and rendered designs never leave your device.
Six template types: certificate, name badge, ID card, label / sticker, place card, event ticket
Text placeholders in curly braces — {name}, {course}, {date}, {id}, {title}, {seat}…
Paste or load a CSV (quoted fields, commas & newlines handled per RFC 4180)
Map each token to a column — auto‑matched by name or picked manually
Batch export all rows as a ZIP of PNGs or a multi‑page PDF — 100% in‑browser
What is
design mail merge (bulk create from CSV)
A design mail merge is variable‑data generation applied to graphics: you author ONE template whose text fields are placeholders and supply a spreadsheet with one row per recipient, and the tool renders a separate design for each row with that row’s values filled in. A 100% client‑side version parses the CSV and draws every merged design in the browser — each onto an in‑browser canvas and exported as a PNG (the batch zipped) or a multi‑page PDF — so no spreadsheet, logo or design is ever uploaded.
Design
Related terms
mail mergevariable data printingbulk certificate generatorbatch badge makerCSV to imageCSV to PDFtemplate mergepopular design apps Bulk Create alternativeID card generatorevent ticket generator
Frequently Asked Questions
No. The CSV is parsed locally and every design is drawn on an in‑browser canvas, so nothing is uploaded.
Bulk Create from CSV is 100% client‑side. Your rows are just text you type or a CSV parsed on‑device with PapaParse; the logo is read with a FileReader and drawn straight onto an in‑browser <canvas>; and each merged design is composited and exported locally (PNG via canvas.toBlob, the batch zipped with JSZip or assembled into a PDF with pdf‑lib). Nothing — not your spreadsheet, not your logo, not a single rendered design — is fetched, uploaded, logged or stored on a server. There is no CDN in the render or export path, fonts are your device’s own system stacks, and the tool works offline once cached.
Text tokens like {name} or {date} are each bound to a spreadsheet column, then replaced per row with that row’s value.
Each template’s copy contains tokens in curly braces — {name}, {course}, {date}, {id}, {title}, {seat} and so on. You load a CSV where every column becomes selectable, and a mapping panel binds each token to a column. Bindings are auto‑matched by name (case‑insensitively, so a “Name” column maps to {name}), and you can change any binding or add your own token from a column button. For every row the tool substitutes the mapped values, tidies any separator orphaned by an empty field, and auto‑shrinks text so long names or titles still fit the layout. Unmapped tokens simply render blank and are flagged.
Download any single design as a PNG, all rows as a ZIP of PNGs, or a multi‑page PDF with one design per page.
Every row renders at the template’s full pixel resolution. You can download the previewed row on its own as a PNG, export the whole batch as a ZIP packaged in‑browser with JSZip, or build a multi‑page PDF with pdf‑lib where each design is one page sized to its own dimensions. Because colours are role‑based, changing the brand or accent colour restyles every row at once, and a paginated thumbnail grid keeps large batches manageable.
No — it is a template‑driven merge tool with one shared logo; per‑row photos are not supported.
This is variable‑data merging, not a freeform drag‑and‑drop canvas. You choose a template type and edit its copy, per‑layer font and alignment, brand colours and a single shared logo, and map columns to tokens — but you don’t hand‑place every element pixel by pixel. There is no per‑row image column, so an ID card shows a placeholder silhouette rather than each person’s photo. Type uses system font stacks (no webfont download), so on‑screen type can look slightly different across machines though the exported raster is fixed, and the PDF has no crop marks, bleed or unique QR / verification per certificate.
Detailed Explanation
📖How It Works
What Bulk Create from CSV Does
Bulk Create from CSV is a design mail-merge: you pick a TEMPLATE TYPE — certificate, name badge, ID card, label / sticker, place card or event ticket — each a real editable layout whose text carries PLACEHOLDER tokens in curly braces such as {name}, {course}, {date} and {id}. You then supply a SPREADSHEET (paste text or load a .csv, parsed locally), MAP each token to a column, and the tool merges every row into a finished design. The same pure engine draws the live preview of the selected row, a paginated thumbnail grid of every row, and the full-resolution export — so what you see is exactly what you download. It is the free, private answer to “make 200 certificates with different names” without a cloud design account.
Six real template types: certificate, badge, ID card, label, place card, ticket
Text placeholders in curly braces — {name}, {course}, {date}, {id}, {title}, {seat}
CSV parsed locally; each column mapped to a token; every row merged and rendered
One engine draws preview, thumbnails and the full-resolution export
Batch export as a ZIP of PNGs or a multi-page PDF, all in-browser
⚙️Methodology
How the Merge & Column Mapping Work
Layer geometry lives in resolution-independent DESIGN UNITS on a fixed 1000-du-wide artboard, so the identical renderVariant() routine paints a 320-px thumbnail, a ~760-px preview and the template’s full export width (e.g. a 1400×990 certificate) — only the scale differs. Each text layer’s copy is scanned for {token} placeholders; a mapping panel binds every token to a spreadsheet column. Bindings auto-match by NAME, normalised case-insensitively (a “Name” column binds to {name}, “Course” to {course}), and you can override any binding or add a token from a column button. For each row the engine substitutes the mapped values, tidies any separator (·, •, |, —) orphaned by an empty field so a design never shows a stray dot, and AUTO-FITS text — shrinking the font in ~7% steps until the wrapped block fits both the width and height of its box, a core variable-data best practice so long names never overflow. Colours are ROLE-BASED (brand / accent / paper plus derived shades via culori), so changing one colour restyles every row at once.
Design units on a 1000-du artboard → preview, thumbnails and export share one routine
Tokens auto-bound to columns by normalised, case-insensitive name; manual override
Empty-field separators are tidied so merged copy never shows a stray “·”
Text auto-shrinks to fit its box — long names / titles never overflow
Role-based colours (culori) restyle every row from a single change
📋Use Cases
Who It Is For
It fits anyone who needs the SAME design produced many times with only the details changing: a course or bootcamp issuing completion certificates from a roster; an event team printing conference name badges and place cards from a guest list; an office generating staff ID cards from an HR export; a shop printing product or asset labels from an inventory sheet; or a venue producing numbered admission tickets. Instead of duplicating a design and hand-retyping every name — the slow, error-prone way mistakes creep in — you keep one template, drive the values from a spreadsheet, map the columns once, and export the whole batch in a single pass. Because it is free and fully in-browser with no account, it also suits schools, small teams and agencies who must not upload a roster of names or employee data to a third-party service.
Course / training completion certificates from a roster
Conference name badges and wedding / gala place cards from a guest list
Staff or member ID cards from an HR / membership export
Product, asset or shipping labels from an inventory sheet; numbered event tickets
No account and no upload — safe for rosters and employee data
🔧Technical Details
Export & Data Handling Details
CSV import is parsed locally with PapaParse in header mode, which handles quoted fields, embedded commas and newlines per RFC 4180; headers are trimmed and de-duplicated, cells are coerced to trimmed strings and entirely-empty rows are dropped. PNG export renders a row to an offscreen canvas at the template’s exact pixel width and calls canvas.toBlob. ZIP export loops every row, renders each at full resolution, adds it to a JSZip archive (dynamically imported so it only loads on export), de-duplicates filenames from the first mapped column, yields between renders so the progress message can paint, and downloads one ZIP. PDF export uses pdf-lib (also dynamically imported): each row is rendered to a canvas, embedded as a PNG with embedPng, and placed on its own page sized to the design, producing a multi-page document one design per page. A downloadable CSV template mirrors the current columns and rows. Type is set only in system font stacks, so no webfont is fetched and the tool works offline once cached.
CSV parsed locally with PapaParse (RFC 4180: quotes, commas, newlines)
PNG per row at the template’s exact pixels via canvas.toBlob
Batch ZIP with JSZip and multi-page PDF with pdf-lib (both dynamically imported)
Filenames de-duplicated from the first mapped column; downloadable CSV template
System-font stacks only — nothing fetched, works offline
⚠️Limitations
Honest Limitations
This is a template-driven MERGE tool, not a freeform drag-and-drop editor. You choose a template type and edit its copy, per-layer font and alignment, brand colours and a single shared logo, and map columns to tokens — but you do not hand-place each element pixel by pixel. Text auto-shrinks to fit, so extreme values render small rather than overflowing. Type uses your device’s system font stacks with no embedded webfont, so a face can look slightly different on another machine (the exported raster is fixed). There is NO per-row image column, so an ID card shows a placeholder silhouette rather than each person’s photo, and there is only one shared logo. Export is a flat PNG per row (zipped for the batch) or a multi-page PDF with one design per page — NOT an editable file, and the PDF has no imposition, crop marks, bleed or unique QR / verification per certificate. Very large batches are memory-heavy to rasterise on low-end devices, so if an export stalls, use fewer rows. Logos are drawn as supplied — no background removal or recolouring.
Template-driven merge — no per-element hand-placement
No per-row photos; one shared logo, ID-card photo is a placeholder silhouette
Flat PNG (single or ZIP) or one-design-per-page PDF — no crop marks / bleed / QR
System fonts only; large batches are memory-heavy on weak devices
🔒Privacy & Security
Private by Design
Everything happens on your device. Your spreadsheet is just text you type or a CSV parsed locally with PapaParse; the logo is read with a FileReader and drawn onto an in-browser <canvas>; and each merged design is composited and exported right here — a PNG via canvas.toBlob, the batch zipped in memory with JSZip or assembled into a PDF with pdf-lib. Nothing — not your data, not your logo, not a single rendered design — is ever fetched, uploaded, logged or stored on a server. There is no CDN in the render or export path, fonts are the device’s own system stacks, and the tool works offline once cached, keeps no accounts and sets no tracking. Close the tab and your work is gone unless you exported it. The only optional network use is consent-gated ads. This matters because bulk designs are often built from rosters of real names, employee IDs or customer records that should never leave your control.
Data is local text / CSV parsed on-device with PapaParse
Logo read with FileReader and drawn onto an in-browser <canvas> — never uploaded
PNG via canvas.toBlob; batch ZIP (JSZip) and PDF (pdf-lib) built in memory
No server, no CDN, system fonts only; optional consent-gated ads
Ways to make one design per spreadsheet row
Approach
How it works
Trade-off
Used here
This client-side merge
Map a CSV onto a template, merge every row, export ZIP of PNGs or a multi-page PDF
Powerful and freeform, but the roster and designs round-trip through an account
No
Word / desktop publishing software data merge
Desktop mail-merge to a print PDF
Print-grade, but installed / paid and not one-click web export
Alternative
Everything here runs in the browser; your spreadsheet, logo and designs are never uploaded. Output is flat PNGs (single or ZIP) or a one-design-per-page PDF, not an editable or imposed print file. As of July 2026.