Skip to content
AZ Tools

Text Template (Mail Merge)

Write a template with {{placeholders}}, paste rows of data (CSV or JSON), and render one personalised text per row — entirely in your browser.

Rows: 3
Rendered output

How to use

  1. Write your template using {{placeholder}} for variables (the tool lists detected placeholders above the textarea).
  2. Pick CSV (with header row) or JSON (array of objects) and paste your data.
  3. Read the rendered output (one rendering per row, separated by --- or your custom separator), then copy or download as a text file.

About this tool

Show

A mail merge that never leaves the page. Write a template with {{key}} placeholders, paste the data as CSV with a header row or as a JSON array of objects, and get one rendered copy per row, separated by a divider you choose. Placeholders that find no matching column are flagged rather than silently left blank, which catches the typo in {{adress}} before you send forty of them.

The CSV reader implements the quoting rules properly: a field wrapped in double quotes may contain commas, and a doubled quote inside it means one literal quote character. That covers the cases that break naive splitting on commas — an address with a comma in it, a company name like Smith, Jones & Co, a note containing a quoted phrase. A quoted field may also contain line breaks, so the multi-line address or note that a spreadsheet export writes stays in one cell instead of splitting its row in two, and a blank line between rows is skipped rather than rendered as an empty copy.

The other difference between the two inputs is typing. CSV gives you strings and only strings, so a numeric column arrives as text and renders exactly as it was written, leading zeros and all. JSON preserves whatever was in the source — numbers render without their formatting, booleans render as true and false, and a null renders as an empty string or the word depending on how it was stored. If a column must appear a particular way, format it before it gets here rather than hoping the renderer will.

The output is plain text, and it is not escaped for any destination. That is the right default for emails, SMS and certificates, and the thing to watch if you paste the result into HTML: a name containing & or < will be taken as markup. Nothing is uploaded, which is the reason to do a merge here rather than in a hosted tool — a customer list, a payroll run or a set of exam results never leaves your machine, and closing the tab is the whole of the cleanup.

Frequently asked questions

What's the placeholder syntax?

Double curly braces: {{name}}, {{amount}}, etc. Whitespace inside is allowed ({{ name }} works). Keys are case-sensitive, must match the CSV header / JSON key exactly. Unknown keys render as empty and trigger a warning chip listing which ones were missing.

Does the CSV parser handle quoted fields?

Yes — basic CSV rules: a field starting with " is quoted until the next unescaped ", doubled quotes ("") inside a quoted field become a single ". Commas inside quoted fields are kept literally. A quoted field may span several lines, the way spreadsheet exports write multi-line cells.

Why use this instead of a spreadsheet's mail-merge?

Three reasons: (1) the data never leaves your browser — useful for sensitive lists; (2) iteration is instant — change template once, all rows re-render; (3) you can paste data in either CSV or JSON without converting.

Can I use this to draft 100 emails at once?

Yes — that's the most common use. Output each row separated by your divider, copy the result, paste into your mail client and split by the divider, or use the download as a .txt for later. The tool doesn't send anything itself.

Related tools