Combine a CSV of records with a {{field}} template and bulk-generate one document per row — in-browser, no upload.
Use {{field_name}} to reference any column from the CSV.
Hi Alex, Thanks for our chat last week. As discussed, here's our proposal summary for Acme Corp: USD 12500, payable on the standard 30-day net terms. I'll send the contract over by Friday. Let me know if anything looks off. Best, Jamie
CSV and template are processed in your browser. No data is uploaded.
Combine multiple PDF files into a single document
Split a PDF document into separate files by page ranges
Extract text content from PDF documents
Convert images (JPG, PNG) to a PDF document
Mail merge is the workhorse that powers personalized outreach, batch contract drafting, and bulk customer communications: combine a list of records (typically a CSV from a CRM, spreadsheet, or signup form) with a template containing `{{placeholders}}`, and produce one filled-in document per record. Word and Google Docs have built-in mail merge but require uploading your CSV — a problem when it contains customer emails, deal sizes, or other data you'd rather not hand to a third party. The Mail Merge tool runs the full workflow client-side: paste or upload a CSV, write a Handlebars-style template (`{{first_name}}, your {{plan}} subscription renews on {{date}}`), see a per-record preview with a pager (first 10 buttons + total count), and copy or download all the rendered records as one concatenated text file with a configurable delimiter between records. The tool also tells you when your template references a column that doesn't exist (so you catch typos like `{{frist_name}}` immediately) and which CSV columns aren't being used (so you know what you're leaving on the table).
Placeholders use double-curly braces: `{{column_name}}`. Whitespace inside is ignored: `{{ column_name }}` works too. Column names are case-sensitive and match the CSV header row exactly. Quoted CSV fields with commas inside work correctly. Newlines in the template are preserved as-is. Records are joined with a delimiter (default `---`) when concatenating to a single file. To embed a literal `{{` in the output, no escape is needed — only well-formed `{{key}}` patterns are matched and substituted.