Your files never leave your device. All processing happens locally in your browser.
How do I make localized flyers, menus or banners for every branch from one template without uploading anything?
Open the Multi-Branch Localized Creative Factory, pick a master template (Grand Opening, Local Offer, Menu Header, Loyalty Card or Event Banner), and set your brand name, brand colours and an optional logo. Its text carries placeholder tokens — {branch}, {address}, {phone}, {hours}, {offer}, {website} and {brandName}. Enter your locations in the small branch table or paste / upload a CSV, then the tool merges each row into the tokens and renders one on‑brand variant per branch. Switch the output format (A5 / A4 flyer, 1:1 or 9:16 social, web banner, loyalty card) to re‑render them all, download any single one as a PNG, or export the whole set as a ZIP. Everything runs in your browser — your data, logo and creatives never leave your device.
One master template → a merged, on‑brand variant per branch
Type branches in a table or paste / upload a CSV (loosely matched headers)
Re‑render every branch to A5 / A4, 1:1, 9:16, banner or loyalty‑card sizes
Download one PNG or export all variants as a ZIP — 100% in‑browser
What is
multi-branch localized creative factory
A multi‑branch localized creative factory is a variable‑data (mail‑merge) design tool: you author ONE master template whose text fields are placeholders and supply a small dataset with one row per location, and it renders a separate on‑brand creative for each row with that branch’s details filled in. A 100% client‑side version does the merge and rendering in the browser — each variant is drawn onto an in‑browser canvas and exported as a PNG (the batch zipped locally) — so no dataset, logo or creative is ever uploaded.
Design
Related terms
variable data printingmail mergebulk createfranchise marketinglocalized creativeper-location flyerCSV to imagebatch designtemplate mergebrand consistency
Frequently Asked Questions
No. The CSV is parsed locally and every variant is drawn on an in‑browser canvas, so nothing is uploaded.
The factory is 100% client‑side. Your branch 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 variant is composited and exported locally (PNG via canvas.toBlob, the batch zipped with JSZip). Nothing — not your dataset, not your logo, not a single rendered creative — 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 {branch} or {offer} are replaced, per branch, with that row’s value from your table or CSV.
The master template’s copy contains tokens in curly braces — {branch}, {address}, {phone}, {hours}, {offer}, {website} and the global {brandName}. You provide the values in a small editable table (add / remove rows) or by pasting / uploading a CSV or spreadsheet export, where each column is a field and each row is a branch. Headers are matched loosely (for example name or location maps to branch, tel to phone, promo to offer). For every row the tool substitutes the tokens, tidies any separators orphaned by an empty field, and auto‑shrinks text so long names or addresses still fit the layout.
Re‑render every branch to A5 / A4, 1:1, 9:16, a web banner or a loyalty card, then export a PNG each or all as a ZIP.
One click re‑renders all branches to any output size — A5 or A4 flyer, 1080×1080 or 1080×1920 social, a 1200×628 web banner, or a wallet loyalty card — with the layout re‑flowed to the new aspect ratio. You can download any single variant as a high‑resolution PNG, or export the whole set as a ZIP packaged in‑browser with JSZip. Because colours are role‑based, changing the brand or accent colour restyles every branch variant at once.
No — it is a template‑driven merge tool. You edit copy, fonts, colours and a logo, but not the exact position of each element.
This is variable‑data merging, not a freeform canvas like a full design app. You choose a master template and edit its copy, per‑layer fonts, brand colours and logo; switching format re‑flows the layout vertically rather than letting you hand‑place elements. Type uses system font stacks (no webfont download), so on‑screen type can look slightly different across machines, though the exported PNG raster is fixed. Export is a flat PNG per branch (zipped for the batch), not an editable file, a print‑ready PDF, or a job with crop marks and bleed.
Detailed Explanation
📖How It Works
What the Multi-Branch Localized Creative Factory Does
The Multi-Branch Localized Creative Factory is a 100% client-side variable-data (mail-merge) design tool. You author ONE master template — a flyer, menu, banner or card — whose text layers carry placeholder tokens ({branch}, {address}, {phone}, {hours}, {offer}, {website} and the global {brandName}), supply a small BRANCH DATASET (typed in a table or pasted / uploaded as a CSV), and the tool merges each row into the tokens and renders one on-brand VARIANT per location. Choose an output format — A5 / A4 flyer, 1:1 or 9:16 social, web banner, or wallet loyalty card — to re-render every branch at once, download any single variant as a PNG, or export the whole set as a ZIP. Nothing is uploaded; every variant is drawn on an in-browser canvas.
One master template merged into a separate on-brand creative per branch
Branch data by editable table or pasted / uploaded CSV (loosely matched headers)
Six output formats (A5 / A4, 1:1, 9:16, banner, loyalty card) re-render all branches
Per-branch PNG download or batch ZIP export — all in the browser
⚙️Methodology
How the Merge & Render Works
This is classic variable-data printing applied to on-brand creatives. Layer geometry lives in resolution-independent DESIGN UNITS on a fixed 1000-du-wide artboard, so the SAME pure renderVariant() function paints the small live preview, every thumbnail and the full-resolution PNG export — what you see is what you download. For each branch row, applyMerge() substitutes {token} occurrences with that row’s value (or the brand name for {brandName}) and tidies any separator orphaned by an empty field, so a variant never shows a stray "·" or double space. Text layers AUTO-FIT: the font shrinks in ~8% steps until the wrapped block fits its box, so a long branch name or address never overflows the layout — a core variable-data best practice. Colours are ROLE-BASED (brand / accent / ink / paper / onBrand / muted plus derived shades computed with culori), so changing the brand or accent colour restyles every branch variant at once. Switching format re-flows the layout vertically (refit) because the artboard width is constant across formats.
Design-unit artboard → one renderVariant() drives preview, thumbnails and export
applyMerge() fills {tokens} per row and tidies separators left by empty fields
Auto-fit shrinks text so long variable values still fit the box
Role-based colours (culori-derived shades) restyle all branches at once
Format switch = vertical re-flow (refit); no per-branch hand-positioning
📋Use Cases
Who It Is For
It fits any organisation that ships the SAME design to many locations with only the local details changing: a franchise or multi-branch retailer producing a grand-opening or promo flyer per store; a restaurant group generating localized menu headers; a chain running a per-branch web banner or social post; or a loyalty programme printing wallet cards per outlet. Instead of duplicating a design and hand-editing the address and phone number for every location — the error-prone way brand consistency breaks — you keep one master, drive the details from a spreadsheet, and export the whole set in one pass. Because it is free and fully in-browser, it also suits agencies and small teams who cannot upload client data to a cloud design service.
Franchise / multi-branch grand-opening and promotional flyers
Per-location menu headers, web banners, social posts and loyalty cards
Spreadsheet-driven, so location details stay consistent across the batch
No account and no upload — safe for agencies handling client data
🔧Technical Details
Export & Data Handling Details
PNG export renders a branch to an offscreen canvas at the format’s exact pixel width (e.g. A4 at 2480×3508, a 1080×1080 social post, or a 1050×600 loyalty card) and calls canvas.toBlob. Batch export loops every branch, renders each at full resolution, adds it to a JSZip archive (jszip is already a dependency and is dynamically imported so it only loads on export), de-duplicates filenames, yields between renders so a progress message can paint, and downloads one ZIP named by brand, format and branch count. CSV import is parsed locally with PapaParse using header mode; headers are normalised against a synonym map (name / location / store → branch, tel / mobile → phone, promo / deal → offer, url / link → website) and empty rows are dropped. A downloadable CSV template mirrors the current fields and rows. Type is set only in system font stacks, so no webfont is fetched and the tool works offline once cached.
PNG per branch at the format’s exact pixels via canvas.toBlob
Batch ZIP with JSZip (dynamically imported); de-duplicated filenames
CSV parsed locally with PapaParse; headers matched via a synonym map
Downloadable CSV template; system-font stacks only, works offline
⚠️Limitations
Honest Limitations
This is a template-driven MERGE tool, not a freeform drag-and-drop editor. You choose a master template and edit its copy, per-layer fonts, brand colours and a logo — but you do not hand-position each element; switching format re-flows the layout vertically, a fast starting point that a very tall 9:16 story or a wide banner may not hold identically, so review each format. 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). Export is a FLAT PNG per branch (zipped for the batch) — NOT an editable file, a print-ready PDF, or a job with crop marks and bleed. Very large batches or the big A4 format are memory-heavy to rasterise on low-end devices, so if a ZIP stalls, use a smaller format or fewer branches. Logos are drawn as supplied — no background removal or recolouring — and when no logo is uploaded each variant shows a brand-initial monogram.
Template-driven merge, not a freeform canvas — no per-element hand-placement
Format switch re-flows vertically; review tall / wide formats
Flat PNG export (single or ZIP) — no editable file, PDF, crop marks or bleed
System fonts only; big formats / large batches are memory-heavy on weak devices
🔒Privacy & Security
Private by Design
Everything happens on your device. Your branch dataset 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 variant is composited and exported right here — a PNG via canvas.toBlob, the batch zipped in memory with JSZip. Nothing — not your dataset, not your logo, not a single rendered creative — 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.
Branch 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 packed in memory with JSZip
No server, no CDN, system fonts only; optional consent-gated ads
Ways to make one creative per branch
Approach
How it works
Trade-off
Used here
This client-side factory
Merge one master template with a branch table / CSV, re-render per format, export PNG / ZIP
Powerful, but the data and designs round-trip through an account
No
Variable-data print software / desktop publishing software data merge
Desktop data-merge to PDF for print houses
Print-grade, but installed / paid and not one-click web export
Alternative
Everything here runs in the browser; your dataset, logo and creatives are never uploaded. Output is flat PNGs (single or ZIP), not an editable or print-ready file. As of July 2026.