🤖 Automations & Chatbots

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

  1. Go to Settings → Contact Attributes.
  2. Click Add Field.
  3. 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.
  4. Pick the type: text, number, date, true/false, or a dropdown list.
  5. 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.

WayUse it whenNotes
Save reply to on an Ask Customer a Question stepYou are storing the answer to the question you just askedThe right choice almost always. No extra step needed.
Update Customer Attribute stepYou are storing something you worked out, not something they typedValue 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

TriggerCustomer messages you
ConditionMessage mentions a return
Ask"What's your order number?"Free text · save reply to order_number
Ask"And what's the reason?"List · save reply to return_reason
ActionWrite a row to Google SheetsUses both saved values as column values
ActionNote for the team"Return: {{contact.order_number}} — {{contact.return_reason}}"
Send"I've logged a return for {{contact.order_number}}."

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 fieldTagRemember Info
HoldsA value ("42", "Medium")A yes/no labelA temporary value
Visible on the contactYesYesNo
Usable in audience filtersYesYesNo
Needs setup firstYesYesNo

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

  1. Field created under Settings → Contact Attributes, and enabled.
  2. Name is lowercase, no spaces, and matches what you type in {{contact.…}}.
  3. Saving a question's answer uses "save reply to", not a separate step.
  4. Every message reading the field is downstream of the step that writes it.
  5. 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.