Your engagement letter's signup form does double duty: it creates the client's record and portal login, and every answer it collects can be merged straight into the letter. This article shows how to reference those answers with Liquid.
Every named question becomes a variable
Each question on your signup form has a name, and that name becomes a variable under engagement:
Question name | Variable |
Date Filed |
|
Matter Number |
|
Business Purpose |
|
The name is lowercased with spaces turned into underscores. You don't need to work this out yourself — your template's variables list shows the exact Liquid for every question on the form, ready to copy.
So if your form asks "In which state is the business incorporated?" with the question name "Incorporation State", your letter can say:
The Company is incorporated in the State of {{ engagement.incorporation_state }}.
How each question type prints
Question type | What the variable prints |
Text / long text | Exactly what the client typed |
Number | The number as entered |
The address as entered | |
Date | The date as entered (see below for formatting) |
Country | The selected country |
Radio (choose one) | The label of the chosen option |
Checkbox (choose several) | The labels of all chosen options, separated by commas |
Address | The full address joined onto one line |
Two question types never appear in letters: file uploads and password questions. Display-only content blocks collect nothing, so they have no variable either.
Choice answers print their labels
A radio question "Rush preparation?" with options Yes and No prints exactly Yes or No — the label your client saw. That's also what you compare against in conditions:
{% if engagement.rush == "Yes" %}
A rush fee applies as described in Schedule A.
{% endif %}
A checkbox question prints every selected label in one comma-separated list. If a client picks "Trademark Search" and "Operating Agreement" from an add-ons question:
Selected add-ons: {{ engagement.add_ons }} prints Selected add-ons: Trademark Search, Operating Agreement. To check whether one particular option was selected, use contains:
{% if engagement.add_ons contains "Trademark Search" %}
We will also perform a federal trademark search.
{% endif %}
Connected fields work too
Some questions are connected to the client and contact records — First Name, Last Name, Email, Business Name, and so on. Those answers populate the records and remain available to the letter both ways:
via the record:
{{ client.name }},{{ primary_user.first_name }}via the form:
{{ engagement.user_first_name }},{{ engagement.client_name }}
Either works; the record-based variables (client.*, primary_user.*) are the conventional choice.
Formatting a date answer
Date answers print in the plain format they're stored in. To print them long-form, use the date filter:
{{ engagement.closing_date | date: "%B %-d, %Y" }}
prints something like March 5, 2026. See Advanced Liquid for more date patterns — and always confirm the result with a test letter.
Adding a question to feed the letter
If your letter needs a value the form doesn't collect yet, add a question to the signup form — its name immediately becomes a variable for the letter. For any either/or wording in the letter, add a radio question and branch on the answer label with {% if %}.
Test it
Generate a test letter with realistic answers for every question. It runs the real merge and shows you exactly what the client's letter will look like — including any variable that came out blank.
