> ## Documentation Index
> Fetch the complete documentation index at: https://docs.clustr-ai.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Standardise values

> Group the spellings of a value, choose the one to keep, and let CRM Cleaning rewrite the others

A field your team types by hand collects many spellings of one value: `VP Sales`,
`vp sales`, `V.P. Sales`, `VP, Sales`. Reports then count four job titles where there is
one. **Standardise values** in CRM Cleaning shows the spellings side by side, lets you
choose the one to keep, and saves that choice as a **mapping**. The **Standardise values**
rule then rewrites the other spellings in your CRM.

## Fields you can standardise

| Object | Field | CRM |
| - | - | - |
| Contacts | Job title | Every CRM |
| Contacts | Company name | Every CRM |
| Contacts | Lead status | HubSpot |
| Contacts | Lifecycle stage | HubSpot |
| Companies | Industry | HubSpot |
| Companies | Lifecycle stage | HubSpot |
| Companies | City | HubSpot |
| Companies | State or region | HubSpot |

The list of values works on every CRM. Mappings on the HubSpot fields are applied on
HubSpot only.

## What you see

Pick **Contacts** or **Companies**, then a field. The view reads the values from
Clustr's copy of your CRM, the one each scan keeps up to date, so nothing is asked of
your CRM while you look.

Values are grouped when they are likely the same value:

* they differ only by case, spacing, punctuation or accents (`V.P. Sales`, `vp sales`,
  `Société Générale` and `Societe Generale`);
* they have the same words in another order (`Sales VP` and `VP Sales`).

A longer value that is a letter or two away from another joins its group as a
**suggestion** (`Marketing Manger` next to `Marketing Manager`). A suggestion is a guess:
`Project Manager` is close to `Product Manager` and is a different job. Short values are
never grouped this way, so `CEO` and `CFO` stay apart, and neither are values that differ
in a number or a grade (`Engineer II` and `Engineer III`, `Level 2` and `Level 3`).

Each group shows its spellings with how many records hold each, and a tick box on each.
The value to keep is filled in with the most frequent spelling; type another value if you
prefer. **Save** stores the mapping for the ticked spellings only.

On a HubSpot dropdown field (lead status, lifecycle stage, industry), a value that is one
of the dropdown's options shows its label, with the stored value in small text under it:
**Computer Software** over `COMPUTER_SOFTWARE`. The value to keep is then picked from the
dropdown's options by label, and the mapping stores the option's value, which is what
HubSpot accepts. A value that is not an option shows as it is. If Clustr cannot read the
dropdown from HubSpot, the view shows values only and you type the value to keep. The spellings of the
same value start ticked; suggestions, and spellings already mapped to another value,
start unticked, so tick them only when they are the same value. A group whose spellings
are all mapped shows **Mapped**.

By default only groups with more than one spelling are listed. Turn off **Only values
with variants** to map a single value to another one, for example `Mgr` to `Manager`.
The 2,000 most common values of a field are read; the view says so when a field has
more.

Saved mappings for the field are listed above the groups. **Delete** removes one.

## Mappings that were not applied

A mapping is skipped where CRM Cleaning cannot write it. Under the mapping, the view says
how many records the latest full scan left alone, and why. For example: "Not applied to
12 records: the value to keep is not an option of this dropdown in your CRM."

| Reason | What to do |
| - | - |
| The value to keep is not an option of the dropdown | Pick one of the dropdown's options, or add the option in HubSpot |
| The field holds several values (multiple checkboxes) | Mappings rewrite single values only. Nothing to do. |
| The field is standardised on HubSpot only | Nothing to do: Clustr writes this field on HubSpot only |
| The records are not in a country where the value is a state or region | Expected: `WA` is not Washington outside the US. Map those records' spellings separately. |

The count comes from the latest full scan and is updated by the next one. It never stops
a scan or holds back the rest of its changes. A mapping that applies everywhere again
loses its warning after the next full scan.

## How mappings are applied

The **Standardise values** rule (`standardize_value`) applies your mappings on every
scan, and as soon as a contact or company changes in your CRM. A value matches a
mapping when it equals one of the mapped spellings, ignoring case and spacing. A value
that differs from the value to keep only by case or spacing is rewritten too.

| Setting | What happens |
| - | - |
| Ask me (default) | Each rewrite waits in [Review](https://docs.clustr-ai.com/crm-cleaning/queue-and-findings.md) |
| Do it | Rewrites are applied, except a change of case alone on a long text field, which still asks |
| Off | Nothing is proposed |

The rule always starts on Ask me. **Apply to all rules ▸ Do it**, and the older "never
ask me" autonomy setting, leave it there: only setting its own row to Do it applies
rewrites without asking. **Apply to all rules ▸ Off** stops it like every other check.
Change the setting under [Settings](https://docs.clustr-ai.com/crm-cleaning/settings.md), row **Standardise values**.
Applied rewrites appear in [History](https://docs.clustr-ai.com/crm-cleaning/history.md) and can be reverted for 30
days, like any other change.

Safeguards:

* **Never an empty value.** An empty field is never touched, and a mapping must have a
  value to keep.
* **Dropdown properties.** When a HubSpot property only accepts its options (lead
  status, lifecycle stage, industry), the value to keep must be one of the option's
  internal values. The view offers the options by label and saves the value. Otherwise
  the mapping is skipped, and the view says so. Fields that accept several values at
  once are skipped.
* **States follow the record's country.** A state code means different places in
  different countries: `WA` is Washington in the US and Western Australia in Australia.
  A mapping on **State or region** applies only to a company whose country has the value
  to keep as one of its states (US, Canada, Australia and India have a list). A company
  with no country is read in the one country its website and phone point at, and is
  left alone when they point nowhere or disagree. A mapping never applies to a state
  whose record is in another country. These rewrites always ask in Review under Ask me,
  never in the bulk-applicable safe changes.
* **Your mapping wins over formatting.** Values are saved with spaces trimmed and
  collapsed. Where a mapping names a value, the **Format & casing** check leaves it
  alone, so a mapping such as `California` to `CA` holds although formatting writes
  state names in full. The two never rewrite a value back and forth.
* **A record changed since the scan** is not overwritten: the change ends as a conflict.

Deleting a mapping stops new rewrites. Rewrites already waiting in Review stay there
until the next scan closes them; applied ones are not undone (revert them from History).

## Limits

| Limit | Value |
| - | - |
| Mappings per field | 200 |
| Spellings per mapping | 100 |
| Spellings per field, all mappings | 2,000 |
| Length of a value | 255 characters |

A spelling belongs to one mapping only. Saving a mapping that lists a spelling already
mapped elsewhere moves it. Listing the value another mapping keeps folds that mapping
into the new one, so `CTO` and all its spellings can become `Chief Technology Officer`
in one step.

## API

`GET /api/crm/cleaning/values/fields`

The fields you can standardise, with `hubspot_only`.

`GET /api/crm/cleaning/values?object_type=contact&field=job_title`

```json Response theme={null}
{
  "success": true,
  "data": {
    "object_type": "contact",
    "field": "job_title",
    "label": "Job title",
    "hubspot_only": false,
    "records": 1234,
    "distinct_values": 412,
    "shown_values": 412,
    "truncated": false,
    "limit": 2000,
    "clusters": [
      {
        "canonical": "VP Sales",
        "total": 32,
        "variants": [
          { "value": "VP Sales", "count": 20 },
          { "value": "V.P. Sales", "count": 6, "mapped_to": "VP Sales" },
          { "value": "vp sales", "count": 5 },
          { "value": "VP Saless", "count": 1, "suggested": true }
        ]
      }
    ],
    "mappings": [
      { "object_type": "contact", "field": "job_title", "from": ["V.P. Sales"], "to": "VP Sales" }
    ]
  }
}
```

A spelling with `suggested: true` joined the group only because it is close to another
spelling; confirm it is the same value before mapping it. `canonical` is the most frequent
of the other spellings, which come first.

On a HubSpot dropdown field the report adds labels. `value` stays the option's value,
which mappings store and write:

```json Response (dropdown field, abridged) theme={null}
{
  "clusters": [
    {
      "canonical": "COMPUTER_SOFTWARE",
      "canonical_label": "Computer Software",
      "total": 14,
      "variants": [
        { "value": "COMPUTER_SOFTWARE", "label": "Computer Software", "count": 12 },
        { "value": "computer software", "count": 2, "mapped_to": "COMPUTER_SOFTWARE", "mapped_to_label": "Computer Software" }
      ]
    }
  ],
  "options": [
    { "value": "COMPUTER_SOFTWARE", "label": "Computer Software" },
    { "value": "BANKING", "label": "Banking" }
  ],
  "mappings": [
    {
      "object_type": "company",
      "field": "industry",
      "from": ["computer software"],
      "to": "COMPUTER_SOFTWARE",
      "to_label": "Computer Software"
    },
    {
      "object_type": "company",
      "field": "industry",
      "from": ["fintech"],
      "to": "Fintech",
      "skipped": {
        "reason": "not_an_option",
        "message": "the value to keep is not an option of this dropdown in your CRM.",
        "count": 12,
        "at": "2026-10-08T03:12:00Z"
      }
    }
  ]
}
```

| Field | Meaning |
| - | - |
| `label`, `canonical_label`, `mapped_to_label`, `to_label` | The dropdown option's label. Absent for a value that is not an option, and when the dropdown cannot be read. |
| `options` | The dropdown's options in HubSpot's order, hidden ones left out. Absent for a field that is not a single-choice dropdown. |
| `skipped` | The latest full scan did not apply the mapping to `count` records. `reason` is `not_an_option`, `multi_select`, `hubspot_only` or `other_country`; `message` says it in plain English. Absent when the mapping applied everywhere it matched. |

`POST /api/crm/cleaning/values/mappings`

```json Request theme={null}
{ "object_type": "contact", "field": "job_title", "from": ["vp sales", "V.P. Sales"], "to": "VP Sales" }
```

Saves one mapping and answers `mapping` (as stored) and `mappings` (the field's
mappings). The mapping with the same value to keep is replaced.

`DELETE /api/crm/cleaning/values/mappings?object_type=contact&field=job_title&to=VP%20Sales`

Deletes the mapping to `VP Sales` and answers the field's remaining `mappings`.

| Error | When |
| - | - |
| `400 INVALID_FIELD` | The field is not in the list above |
| `400 INVALID_MAPPING` | The mapping breaks a rule: an empty value to keep, no spelling to replace, a spelling listed twice, or a limit. The message says which. |
| `404 MAPPING_NOT_FOUND` | No mapping to that value for the field |

Mappings are also stored in the settings document as `value_mappings`
(`GET` and `PUT /api/crm/cleaning/settings`).

## From your assistant

| Tool | What it does |
| - | - |
| `list_crm_field_values` | The groups of spellings for a field, or the list of fields without one. Dropdown labels and the mappings that were not applied come back too. |
| `set_crm_value_mapping` | Save a mapping |
| `delete_crm_value_mapping` | Delete a mapping |

See [CRM Cleaning from your assistant](https://docs.clustr-ai.com/crm-cleaning/mcp.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.