# Fields

> The fields a flow can read for a lead, where each comes from, and what a blank one means.

A field is a named value a flow holds for one lead. Conditions test fields, and text settings can hold them in `{{braces}}`.

A field's name starts with where it came from:

| Prefix | Comes from |
|---|---|
| `form.` | What the visitor typed into the form. One field for each form field, by its name in HubSpot. |
| `trigger.` | What started the flow. |
| `clean.` | The Clean and enrich step: the email address, cleaned and checked. |
| `sopro.` | The Clean and enrich step: the company, from Sopro Data. |
| `hs.` | The HubSpot lookup step: the contact, the company and its deals. |
| `ask.` | The answers to an Ask questions step, as `ask.<id>`. |
| `flow.` | Set by an earlier step of this flow. |

## Rules for every field

- **A field that is not there reads as blank.** A flow does not stop on a missing field.
- **Names ignore case.** `Form.Email` and `form.email` are the same field.
- **A yes-or-no field holds `yes` or `no`.** It is blank when the answer is not known.

## Clean and enrich

| Field | Holds |
|---|---|
| `clean.email` | The email address, cleaned |
| `clean.domain` | The company domain |
| `clean.freemail` | Free-mail address: yes or no |
| `clean.disposable` | Throwaway address: yes or no |
| `clean.website` | Has a working website: yes or no |

## Sopro Data

| Field | Holds |
|---|---|
| `sopro.matched` | Found in Sopro Data: yes or no |
| `sopro.name` | Company name |
| `sopro.headcount` | Headcount, as a number: the lower end of the band |
| `sopro.headcount_band` | Headcount band |
| `sopro.revenue` | Revenue, as a number |
| `sopro.revenue_band` | Revenue band |
| `sopro.growth` | Growth, as a number |
| `sopro.industry` | Industry |
| `sopro.industry_group` | Industry group |
| `sopro.country` | Country |
| `sopro.tier` | Tier |
| `sopro.type` | Company type |
| `sopro.founded` | Year founded, as a number |

`sopro.headcount` lets "is less than 11" and "is more than 500" work. The band `201-500` gives 201, `10,001+` gives 10001 and `Myself Only` gives 1.

When the company is not found, `sopro.matched` is `no` and every other `sopro.` field is blank. The flow carries on.

## HubSpot lookup

| Field | Holds |
|---|---|
| `hs.contact.exists` | Contact is in HubSpot: yes or no |
| `hs.contact.owner` | Contact owner, as a HubSpot owner ID |
| `hs.company.exists` | Company is in HubSpot: yes or no |
| `hs.company.name` | Company name in HubSpot |
| `hs.company.owner` | Company owner, as a HubSpot owner ID |
| `hs.deals.open` | Open deals, as a number |
| `hs.deals.customer` | Is a customer: yes or no |
| `hs.deals.latestOpen.pipeline` | Latest open deal: pipeline |
| `hs.deals.latestOpen.stage` | Latest open deal: stage |
| `hs.deals.latestOpen.owner` | Latest open deal: owner, as a HubSpot owner ID |
| `hs.deals.latestWon.date` | Latest won deal: date, as yyyy-mm-dd |
| `hs.deals.latestLost.date` | Latest lost deal: date, as yyyy-mm-dd |

The contact and company properties the lookup reads are fields too, as `hs.contact.<property>` and `hs.company.<property>`, by the property's name in HubSpot.

The deal fields are filled only when the company is in HubSpot. If HubSpot was not asked or did not answer, every `hs.` field is blank.

## The trigger

| Field | Holds |
|---|---|
| `trigger.kind` | What started the flow: form, webhook, record or meeting |
| `trigger.property` | The contact property that changed |
| `trigger.value` | What the property changed to |
| `trigger.outcome` | The meeting's outcome: COMPLETED, NO_SHOW, CANCELED or RESCHEDULED |

A flow that starts from a post to its address also has the posted values as `form.<name>`.

## Set by steps of the flow

A step adds its fields for the steps after it.

| Step | Field | Holds |
|---|---|---|
| Assign from queue | `flow.rep_name` | Rep's name |
| | `flow.rep_owner` | Rep's HubSpot owner ID |
| | `flow.queue_name` | Queue's name |
| Assign to existing owner | `flow.rep_name`, `flow.rep_owner` | As above |
| | `flow.ownerSource` | Where the owner came from |
| Assign to a person, Reassign | `flow.rep_name`, `flow.rep_owner` | As above |
| Score | `flow.score` | The score, as a number |
| Lookup table | `flow.lookup` | What the lookup table gave |
| AI classify | `flow.ai` | What the model answered: one of the step's allowed answers |
| Set value | `flow.<name>` | The value you set, under the name you chose |
| Ask questions | `ask.<id>` | The answer to each question |
| Show calendar | `flow.rep_name`, `flow.rep_owner` | The rep who hosts the meeting |
| | `flow.meeting_start` | When the meeting starts |
| | `flow.meeting_moves` | How many times the meeting was moved |
| | `flow.meeting_cancelled_by` | Who cancelled the meeting: guest, declined or rep |
| | `flow.meeting_cancel_reason` | The reason given for cancelling |
| Create deal | `hs.deal.id` | The deal's ID |

## Using a field in text

Put the field's name in double braces:

```text
New lead from {{sopro.name}} ({{sopro.headcount_band}}), given to {{flow.rep_name}}.
```

A setting's help says when it takes fields. A field that is blank or unknown becomes nothing.

## What the trace keeps

A lead's trace names the fields each step tested. It does not store what a visitor typed, such as form values, answers, the email address or the company's name. The Leads screen fills those in from the lead when it shows the trace.

## For agents

`list_fields` gives the fields a flow can use.
