> ## 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.

# Every check

> What each CRM Cleaning check looks at, what it changes, its default mode, and examples

CRM Cleaning runs a set of checks on every scan. They are listed under **Settings ▸ What
the agent checks**, in four groups:

* **Fixes** and **Duplicates** propose changes that can be written to your CRM. Each
  has one setting: **Off**, **Ask me** or **Do it**.
* **Findings** only report. What they find is listed in **Findings** and never changed
  by Clustr. Each has **Off** or **Report**.
* **Enrichment** fills blank fields. See [Enrichment](https://docs.clustr-ai.com/crm-cleaning/enrichment.md).

What the modes mean is on [Modes and settings](https://docs.clustr-ai.com/crm-cleaning/settings.md). The column
"Under Do it" below says what happens when a check is set to Do it: some changes still
wait for you, because the check itself is not sure.

## Fixes and Duplicates

| Check | Rule id | Object and fields | What it changes | Default | Under Do it |
| - | - | - | - | - | - |
| **Format & casing** | `format_normalize` | Contacts: first and last name, job title, company, email, phone, mobile phone, LinkedIn URL, state, country. Companies: name, industry, phone, website, domain, state, country. | Writes the value in the [format standard](#the-format-standard). Never changes what the value means. Also suggests fixing a typo in a common email domain, and removing emoji or symbols from a name. | Do it | Applied, countries and states included. A name damaged by an import, a name with emoji or symbols, and an email domain typo always ask. |
| **Company domain** | `canonicalize_domain` | Companies: domain | Sets the domain from the company's website | Do it | Always asks |
| **LinkedIn URL** | `canonicalize_linkedin_url` | Companies: LinkedIn URL | Rewrites the company's LinkedIn URL to `https://www.linkedin.com/company/<name>`. Contact LinkedIn URLs are handled by Format & casing. | Do it | Applied |
| **Company association** | `associate_company` | Contacts | Links a contact to its company when the contact has a company name filled in but no company link yet, and its work email domain or its company name matches exactly one company record | Ask me | Always asks |
| **Contact duplicates** | `merge_contacts` | Contacts | Merges contacts that are the same person into the record you keep (HubSpot only) | Do it | Applied only when the match is certain, otherwise asks |
| **Company duplicates** | `merge_companies` | Companies | Merges companies that are the same business into the record you keep (HubSpot only) | Do it | Applied only when the match is certain, otherwise asks |
| **Standardise values** | `standardize_value` | Contacts: job title, company name, lead status, lifecycle stage. Companies: industry, lifecycle stage, city, state. All but job title and company name on HubSpot only. | Rewrites a value to the one you chose in [Standardise values](https://docs.clustr-ai.com/crm-cleaning/standardise-values.md), for every spelling you mapped. Never writes an empty value, and on a dropdown property only one of its options. A state mapping applies only to records in a country where the value to keep is one of its states, never to a state whose record is in another country. Where a mapping names a value, Format & casing leaves it alone. | Ask me, and Apply to all rules ▸ Do it leaves it there | Applied |

**Company domain** never overwrites a domain with one that belongs to a different
company. When the website points somewhere else (a careers site, a typo), it reports
the mismatch in Findings as **Normalize domain** instead.

**Company association** never matches on a personal email domain such as Gmail or
Outlook, and never links to a company record that is really an email provider.

**Duplicates** are matched on a shared email, website domain or LinkedIn URL, on a
shared phone number, or on near-identical names. A match is certain, and merged on its
own under Do it, only when the evidence agrees: a shared email, domain or LinkedIn URL,
or exactly the same name, and names that agree. A shared phone number is never enough
on its own: the names must agree too, and for contacts every record needs a full name.
Names that are only similar, or where one name contains the other (`Northwind` and
`Northwind Group`), always ask. A shared role mailbox such as `info@` or `sales@` never
counts as the same person, and a phone number more than 3 records share is ignored. You
can add your own match rules too, such as same first name, last name and company; a
pair only your rule finds always asks. See
[Duplicates and merges](https://docs.clustr-ai.com/crm-cleaning/queue-and-findings.md#duplicates-and-merges).

### New records

A contact or company created in the last 24 hours is checked for duplicates as soon as
your CRM tells Clustr about it, instead of waiting for the next scan. The check compares
it with the records Clustr already knows, on the same keys and rules as a scan.

* A certain match under **Do it** is merged straight away. Any other match waits in
  **Review**, as it would after a scan.
* Some company matches, such as near-identical names, can wait for the next scan, which
  checks them more closely. These always ask before a merge.
* A record that was just merged away is never matched again, so a merge cannot set off
  another one.
* A value shared by too many records, like an office number or a placeholder domain, is
  left to the scan.

The next scan finds the same match and keeps the change it made, rather than adding a
second one. It runs while the schedule is on and merges are on. Turn it off with
**Check new records right away** in [settings](https://docs.clustr-ai.com/crm-cleaning/settings.md#duplicates).

**Email domain typos.** When an address's domain is one or two letters away from a
common mailbox domain, such as `gmial.com` for `gmail.com` or `hotmial.com` for `hotmail.com`,
Format & casing suggests the correction. It only knows a fixed list of mailbox domains
(Gmail, Googlemail, Hotmail, Outlook, Yahoo, iCloud, Live, GMX, Web.de, T-Online,
Orange, Free, Wanadoo, La Poste), never touches a real domain or one of your companies'
domains, and always asks, even under Do it.

### Examples

| Check | Before | After |
| - | - | - |
| Format & casing, phone on a UK record | `020 7123 4567` | `+44 20 7123 4567` |
| Format & casing, phone on a US record | `(212) 555-0123` | `+1 212-555-0123` |
| Format & casing, phone with `00` | `0044 20 7123 4567` | `+44 20 7123 4567` |
| Format & casing, email | `Ana.Silva@Northwind.Example` | `ana.silva@northwind.example` |
| Format & casing, email domain typo | `ana.silva@gmial.com` | `ana.silva@gmail.com` (always asks) |
| Format & casing, website | `Northwind.example/?utm_source=ads` | `https://northwind.example` |
| Format & casing, website | `http://www.Northwind.example/about/` | `http://www.northwind.example/about` |
| Format & casing, domain | `https://www.shop.northwind.co.uk/about` | `northwind.co.uk` |
| Format & casing, contact LinkedIn | `linkedin.com/in/Ana-Silva/?trk=x` | `https://www.linkedin.com/in/ana-silva` |
| Format & casing, name | `JEAN-PAUL MARTIN` | `Jean-Paul Martin` |
| Format & casing, name damaged by an import | `lastSilva` | `Silva` (always asks) |
| Format & casing, name with emoji | `📧 Ana` | `Ana` (always asks) |
| Format & casing, job title | ` Head   of  Sales` | `Head of Sales` |
| Format & casing, country (HubSpot) | `GB` | `United Kingdom`, or your HubSpot option for it |
| Format & casing, country (HubSpot) | `france` | `France` |
| Format & casing, state (HubSpot), US record | `Calif.` or `CA` | `California`, or your HubSpot option for it |
| Format & casing, state (HubSpot), Canadian record | `on` | `Ontario` |
| LinkedIn URL | `http://linkedin.com/company/Northwind/about` | `https://www.linkedin.com/company/northwind` |
| Company domain | domain blank, website `https://www.northwind.example/careers` | domain `northwind.example` |
| Company association | Ana Silva, company field "Northwind", no company link | linked to the Northwind company record |
| Standardise values, job title mapped to `VP Sales` | `vp sales`, `V.P. Sales` | `VP Sales` |
| Company duplicates | "Northwind" and "Northwind Ltd", same domain | one record; the other is archived into it |

## The format standard

Format & casing only ever changes how a value is written. When a value could be read
two ways, it is left alone.

| Field | Standard |
| - | - |
| Phone, mobile phone | International format with the country code and spaces, for example `+44 20 7123 4567` or `+1 212-555-0123`. **Digits are never added or removed**: a leading trunk `0` or `00` can give way to the country code, and nothing else changes. A number without a country code is read in the record's country, and only when the result is certain. A field holding two numbers, an extension or letters is left alone. |
| Email | Trimmed, the whole address in lower case. Dots and `+tags` are kept. A value like `Ana <ana@example.com>`, or two addresses, is left alone. A typo in a common mailbox domain is suggested separately and always asks. |
| Website | `https://` added when there is no scheme; an `http://` you typed is kept. Host in lower case. **`www.` is kept exactly as typed**, because adding or removing it can break a site. The path is kept, without a trailing slash. `utm_` tracking parameters and `#` fragments are removed. |
| Domain | The bare company domain in lower case: no `https://`, no `www.`, no subdomain, no path. Link shorteners such as `bit.ly` are left alone. |
| LinkedIn URL | `https://www.linkedin.com/in/<name>` for people, `https://www.linkedin.com/company/<name>` for companies, with the name in lower case. A field with two URLs is left alone. |
| First and last name | Trimmed, repeated spaces collapsed. Re-cased only when written all in capitals or all in lower case and at least 3 letters long, so `McDonald`, `van der Berg` and `PG` keep their casing. Junk such as `test`, `asdf` or `n/a` is never reformatted; it is reported as an [unusable value](#findings) instead. Emoji or symbols around a real name, as in `📧 Ana`, are not junk: removing them is suggested, and always asks. |
| Company, job title, company name, industry | Trimmed, repeated spaces collapsed |
| Country | HubSpot only. When the property is a dropdown, the matching option; otherwise the English country name, so `FR` becomes `France` and `GB` becomes `United Kingdom`. Applied under Do it like any other format fix. Values Clustr does not recognise are left alone. |
| State / region | HubSpot only, and only for the United States (states, DC and territories), Canada, Australia and India. The value is read in the record's country: `CA`, `ca`, `Calif.` and `CALIFORNIA` all become `California` on a US record, and `WA` becomes `Washington` in the US but `Western Australia` in Australia. When the property is a dropdown, the matching option is written; when no option matches, nothing is. A record with no country is read as US only when its phone number is a US number and the value cannot mean anything else, so `California` is fixed but `CA` (which could be Canada) is left alone. A value Clustr does not recognise is never changed, and a value is never cleared. Applied under Do it like any other format fix. A value one of your [value mappings](https://docs.clustr-ai.com/crm-cleaning/standardise-values.md) names on that field is left to the mapping. |

Long text, such as a company description, is never reformatted.

Before writing, Clustr reads the value in your CRM again. If someone changed it since
the scan, the format fix is not written. See [conflicts](https://docs.clustr-ai.com/crm-cleaning/history.md#failed-and-conflict).

## Findings

These never write to your CRM, whatever your settings. They are listed in
[Findings](https://docs.clustr-ai.com/crm-cleaning/queue-and-findings.md#findings).

| Check | Finding kind | Label in Findings | What it finds | Default |
| - | - | - | - | - |
| **Ownerless records** | `flag_ownerless` | Ownerless record | Open deals with no owner, and contacts or companies with no owner that are on an open deal. **Configure** widens it to every record, picks object types, pipelines and lifecycle stages, skips old records, and lists shared owners that count as owned. | Report |
| **Incomplete records** | `completeness_flag` | Incomplete record | Each required field some records are missing, one row per field with a count, for example "8,140 companies have no industry". **Configure** picks the required fields. | Report |
| **Lifecycle anomalies** | `flag_lifecycle_anomaly` | Lifecycle anomaly | Stages that do not add up. **Configure** picks the rules, listed below. HubSpot only. | Report |
| **Deals missing contacts** | `deal_missing_contacts` | Deal has no contacts | Deals with no contact linked | Report |
| **Unusable values** | `flag_bad_values` | Unusable values | One finding per record and problem: a contact name that is not a name (`asdf`, `Test 123`), a contact or company phone number that cannot be read, or a throwaway email address. Fix the value in your CRM; the finding closes on its own once a scan sees the fix. | Report |
| Duplicates | `duplicate_contacts`, `duplicate_companies` | Duplicate contacts, Duplicate companies | Groups of records that look like the same person or company. Mergeable on HubSpot. Shown even when the duplicate checks are Off. | Report |
| **Duplicate deals** | `duplicate_deals` | Duplicate deals | Open deals in the same pipeline, for the same company, with the same name and amount (or both without an amount), created within 90 days of each other. Deals with no company can match on the name alone; those are reported but never offered for merge. See [Duplicate deals](https://docs.clustr-ai.com/crm-cleaning/queue-and-findings.md#duplicate-deals). | Report |
| Duplicates | `possible_subsidiary_companies` | Possible subsidiary | Companies that look like a parent and a subsidiary. Review them; they are never merged. | Report |
| Duplicates | `junk_match_key` | Identifier shared by unrelated records | 25 or more records share a domain, LinkedIn URL or name but have nothing else in common, often a placeholder pasted on an import. It hides real duplicates. Correct the value in your CRM, then scan again. | Report |
| Company domain | `canonicalize_domain` | Normalize domain | The website's domain belongs to a different company than the record's domain or name | Report |
| **Deals that moved back a stage** | `flag_deal_stage_regression` | Deals that moved back a stage | A deal that moved backwards through its pipeline, for example from opportunity back to qualified. It reads recorded stage changes, so it finds moves from when Clustr started keeping stage history. HubSpot only. Choosing Report turns it on. | Off |

### Lifecycle rules

| Object | Rule | Default |
| - | - | - |
| Deal | Won but open | On |
| Deal | Won without close date | On |
| Deal | Won with future close date | On |
| Deal | Overdue open | On |
| Deal | Stalled open (no change for 90 days by default) | Off |
| Deal | Deals that moved back a stage (the same switch as the check above) | Off |
| Contact | Customer without closed-won deal | On |
| Contact | Missing lifecycle stage | Off |
| Contact | Should be customer | Off |
| Contact | SQL without deal | Off |
| Contact | Stuck in stage (90 days by default) | Off |
| Company | Missing lifecycle stage | Off |
| Company | Customer without won deal | Off |
| Company | Should be customer | Off |

Which checks run, and which can fix things, depends on your CRM. See
[capabilities by provider](https://docs.clustr-ai.com/crm-cleaning-capabilities.md).


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