Document Mail Merge
Paste a template with {{field}} placeholders and a data table whose first row names the fields, and get one finished document per row — letters, notices, invoices, statements. Conditional sections ({{#if field}} … {{else}} … {{/if}}) let one template cover several situations, and {{#each field}} repeats a block over a list inside a single cell, for exhibit and schedule lists. A placeholder with no value never becomes a blank: it becomes a loud [NEEDS YOU: field] marker, is named in that document's footer and is counted in the summary, so nothing goes out with a silently missing name. It works on plain text and Markdown, not .docx or .pdf — paste the finished text into Word or your PDF writer. Everything runs on your device; no client data leaves the machine.
Try it now
Worked example
Learn the method
Inputs
- Data table (first row names the fields)
client_name,matter,file_no,opposing,exhibits,firm_name,today,signer Ada Lovelace,Boundary dispute,2026-114,"Babbage & Co, Solicitors",Survey plan; Deed of 1998; Photographs,Hollerith LLP,12 March 2026,R. Hollerith Grace Hopper,Employment claim,,,Contract of employment; Grievance letter,Hollerith LLP,12 March 2026,R. Hollerith - Column separator
comma / tab / semicolon / pipe - List separator inside one field
;
Frequently asked
Can it read my Word or PDF template?
No, and it says so rather than pretending. .docx and .pdf are container formats that need a parser and a writer this offline tool does not have. Paste the text of your template instead — the merge, which is the part that costs the hours, is identical, and you paste the finished document back into Word or a PDF writer.
What happens when a row is missing a value?
The placeholder becomes a visible [NEEDS YOU: field] marker, that field is named in the document's own footer, and it is counted in the summary at the top. Nothing is ever defaulted, blanked or inferred from another column — a letter reading 'Dear ,' is far more dangerous than one reading 'Dear [NEEDS YOU: client_name]'.
What if I misspell a placeholder?
It is preserved exactly as {{name}} in the document and reported at the top as not being a column in your data. A placeholder that silently disappeared would leave a document that looks finished and is wrong.
How do I put a literal {{ in the template?
Double it: {{{{ renders as {{ and }}}} renders as }}. So {{{{name}}}} comes out as the literal text {{name}} instead of being filled in.
Does a false {{#if}} section leave a blank line?
No. A line containing nothing but a block tag is removed whole, including its line break, so a section that does not apply leaves no trace. A stray blank line in a legal letter is noticed.