Text Template Filler

One message, twenty recipients, and the only difference is a name and a date. Doing it by hand works right up until the copy where the previous person's name survives into the next one, which is the version that gets sent. Merging from a table removes that failure mode and surfaces the empty cells before they become "Hi , your appointment is".

shown
The copy-all block always contains every row
Text Template Filler — Merge a Table Into One Message Per RowBuildFigure

Writing the template

Wrap the parts that change in braces: Hi {first_name}, your {service} appointment is on {date}. Whatever sits between the braces has to match a column name in the header row character for character, spaces and capitalisation included — {first_name} and {First Name} are two different variables and only one of them will find a column. Repeat a variable as often as you like, and multi-line templates keep their line breaks. One thing to watch: if your text legitimately contains braces, as code samples and some template syntaxes do, they will be read as variables.

Shaping the data

First line names the variables, every line after that is one record. Comma or tab separated; a range copied from a spreadsheet arrives tab-separated and is read as-is. A value that needs to contain the delimiter goes in double quotes, so "Riverside, west counter" stays one cell. Column order does not matter and extra columns the template never mentions are ignored — which makes it fine to paste a whole export rather than trimming it first. Rows where every cell is empty are skipped. The limit is 500 records per run.

Choosing what a gap looks like

A gap is either a variable with no matching column at all, or a column that exists but is empty on that row. The default writes a visible [no name] marker, and that default is deliberate: an obviously broken message does not get sent by accident. Leaving it blank produces "on Tue Sep 2 at , at the Eastgate counter", which reads as a typo and survives a quick proofread. Leaving the {placeholder} in place is the most useful for a document you intend to finish later and the most embarrassing if it goes out as-is. Whichever you pick, the gap table above lists the exact rows, so deal with those first.

Copying the results out

Each message has its own copy button for pasting one at a time into a messaging app, and the block at the bottom holds every record regardless of how many are displayed on screen. The separator setting only affects that combined block — numbering is handy when you are working through a long list and need to remember where you stopped.

Before you send

Merging is the easy half. The half that carries consequences is the list: whether the people on it agreed to hear from you, whether every message offers a way out that actually works, and whether what you are sending is a notice about something they bought or a piece of marketing wearing a notice's clothes. Those rules bite per message rather than per campaign, which is what makes a 500-row merge a different kind of object from a single email. This tool stops at the text on purpose.

Questions people ask

My spreadsheet paste all landed in one cell.

Selecting a range of cells and copying gives you tab-separated text, so leave the delimiter on detect or pick tab explicitly. Detection takes the most frequent separator in the first eight lines, which can pick wrong on a table where the free-text column is full of commas; setting it manually removes the guesswork. Copying from inside a single cell in edit mode gives you no tabs at all, which produces the same one-cell symptom.

Can I copy the messages one at a time?

Yes — each message card has its own copy button that takes just that message. The block at the bottom holds all of them at once, including the rows not displayed on screen, and the separator option controls how they are divided in that block. Numbering is the practical choice for working through a long list by hand.

Can it send the messages for me?

No, and that is a design decision rather than a missing feature. Bulk sending brings in consent records, opt-out handling and identification requirements that a static page has no way to verify or honour. This produces the text; where it goes and whether it should go there stays with you.

What if the same variable appears more than once?

It is substituted everywhere it appears, from the same column. That is the normal way to open with someone's name and use it again in the closing line. A variable that appears twice and is empty is counted once in the gap table but produces two markers in the message.

Related