Saving what a customer tells you, and using it later
Why your flow sends 'Hi ,' with nothing after it — and the two-minute fix.
A contact field is a named piece of information stored against a customer — their order number, their size, the slot they chose — which any later step or message can read back. Fields are what turn a chatbot from something that asks the same question every time into something that remembers.
There is one rule that catches almost everybody, so it goes first: the field has to exist before a flow can write to it. If it does not, the save step does not fail — it silently does nothing, and the variable you read later comes back empty.
Step 1 — Create the field
- Go to Settings → Contact Attributes.
- Click Add Field.
- Give it a short, lowercase name with no spaces —
order_number,preferred_size,delivery_slot. This name is what you type inside{{ }}later, so keep it simple. - Pick the type: text, number, date, true/false, or a dropdown list.
- Save, and make sure it is enabled.
If a flow is sending "Hi ," with a blank where a name should be, this is almost always the cause: the field it reads was never defined, so the save step quietly no-opped and the variable resolved to nothing. Check Settings → Contact Attributes before debugging anything else.
Step 2 — Save the answer
There are two ways to write a field, and one of them is a trap for the unwary.
| Way | Use it when | Notes |
|---|---|---|
| Save reply to on an Ask Customer a Question step | You are storing the answer to the question you just asked | The right choice almost always. No extra step needed. |
| Update Customer Attribute step | You are storing something you worked out, not something they typed | Value can be dynamic, e.g. an order total from a store event |
The trap is adding an Update Customer Attribute step after a question in order to save that question's answer. You do not need it — the question step has a "save reply to" setting that already does exactly that, and doing both is how flows end up with a step that overwrites the value with a blank.
Step 3 — Read it back
Anywhere a message accepts text, {{contact.order_number}} inserts
the stored value. So a later message can say:
"Thanks — I've logged a return for order {{contact.order_number}}."
The same variables work in a Google Sheets step's column values, in an external API call's body, and in an internal note for your team.
A worked example
Collect once, use three times
One answer, three uses: the sheet your ops team works from, the note your colleague reads before replying, and the confirmation the customer sees. That is the whole value of storing rather than just reacting.
Install this returns flow
The exact flow above. You'll need to create two contact fields and connect a Google Sheet.
Add this automation to my account It installs as a draft. Nothing is switched on and no customer is messaged until you press Publish.Fields versus tags versus memory
| Contact field | Tag | Remember Info | |
|---|---|---|---|
| Holds | A value ("42", "Medium") | A yes/no label | A temporary value |
| Visible on the contact | Yes | Yes | No |
| Usable in audience filters | Yes | Yes | No |
| Needs setup first | Yes | Yes | No |
Rule of thumb: if you will ever want to message everyone who…, use a field or a tag. If it only matters for the next three steps of this conversation, Remember Info is enough.
What fields can and cannot do for targeting
Fields are what unlock value-based audiences: number fields support "greater than" and "less than", text fields support matching, so a loyalty score or a plan name becomes a segment. That is covered in building audiences with segments.
Be aware of one real limit. Date fields only match exactly.
There is no "in the last 30 days" filter on a date field, so a stored
last_order_date cannot by itself produce a "lapsed customers" audience.
The workaround — stamping today's date on each order and comparing on the day — is
in winning back lapsed
customers.
Filling fields from outside a chat
Fields do not only come from questions. A Shopify order event carries the order number, total, city and tracking details, and an Update Customer Attribute step can store any of them. Your own software can also push values in by posting an event with your account API key — the one part of this that needs a developer.
Whichever route fills the field, the same rule applies: define it under Settings → Contact Attributes first, or the write is silently discarded.
A short checklist
- Field created under Settings → Contact Attributes, and enabled.
- Name is lowercase, no spaces, and matches what you type in
{{contact.…}}. - Saving a question's answer uses "save reply to", not a separate step.
- Every message reading the field is downstream of the step that writes it.
- Tested in the simulator, where an empty variable is immediately obvious.
That fourth point is worth dwelling on. A variable referenced on a branch that runs before the save step will always be empty, and it is easy to build by accident when a flow has several paths. Walking each path in the simulator catches it in seconds — see testing an automation safely.
Frequently asked questions
Why is my WhatsApp automation sending a blank name?
Almost always because the contact field was never defined under Settings → Contact Attributes. The save step silently does nothing if the field does not exist, so the variable resolves to an empty string.
How do I save a customer's answer to a question?
Use the 'save reply to' setting on the Ask Customer a Question step itself. You do not need a separate Update Customer Attribute step, and adding one can overwrite the value.
Can I build a 'hasn't ordered in 60 days' audience from a date field?
Not directly — date fields match exactly and there is no relative date filter. The workaround is to stamp today's date on each order and compare on the day.
What is the difference between a contact field and Remember Info?
A contact field is visible on the contact, usable in audience filters, and must be defined in Settings first. Remember Info is temporary internal storage for the flow and needs no setup.