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

# Enrichment

> Which blank fields CRM Cleaning fills, where the data comes from, and how the monthly budget works

Enrichment fills fields that are blank in your CRM: a company's industry or size, a
contact's LinkedIn URL or job title. It is separate from the cleaning rules because it
can cost money, so it stays **off** until you turn it on in settings.

## What it fills

**Enrichment fills blanks.** It never replaces a value your CRM already has without
asking. A placeholder such as "n/a", "-" or "none" in a LinkedIn URL counts as blank
and is filled.

### When your CRM already has a different value

In **CRM Cleaning ▸ Settings ▸ Enrichment**, choose what happens when the new value
differs from the one in your CRM, for contacts and for companies:

| Choice | What happens |
| - | - |
| Keep yours (companies by default) | Nothing. Your value stays and no change is proposed. |
| Ask me (contacts by default) | The new value is proposed as a change that waits for you in Review, even when the field is on Do it. It reads "Your CRM says X; LinkedIn now says Y". |

Contacts ask by default because a title LinkedIn gives differently is usually a
promotion or a move worth a look. These changes wait in Review; the weekly email does
not count them.

Ask me skips values that are the same in another form (case, spacing, `DE` and
`Germany`, two forms of one LinkedIn page, "VP Sales" and "Vice President Sales"), a
headcount that moved by 5 or fewer or by less than 10%, a subdomain of the domain you
have, a job title or company from a role at another employer, and a LinkedIn profile
that drops the last name of the one you have (another person with the same first
name). Over the API it is
`enrichment.when_different`, set per object type: `{"contact": "suggest", "company":
"keep"}`.

### Companies

| Field | What is written |
| - | - |
| Industry | Your CRM's own industry option that matches the company's LinkedIn industry. An exact match is applied; a close match waits in the queue. |
| Employee count | The company's employee count as a number, never a size range |
| City | The headquarters city |
| Country | One of your CRM's country options when the field is a dropdown, otherwise the English country name. Nothing is written when the dropdown has no matching option. |
| LinkedIn URL | `https://www.linkedin.com/company/<name>` |
| Domain | The company's website domain, for example `northwind.example`. Link shorteners and email providers are refused, and the domain must fit the company name. |

### Contacts

| Field | What is written |
| - | - |
| LinkedIn URL | `https://www.linkedin.com/in/<name>`. When the contact's name is known and the profile's address contains neither the first nor the last name, the fill asks you first, even under Do it. |
| Job title | The person's current title at the contact's own company. See [Job title](#job-title) |
| Company | The company name, only when the company's domain matches the contact's work email domain |

Job title and company are on by default, on Do it. They cost nothing extra: they come
from the LinkedIn profiles Clustr already stores, or from the same lookup as the
LinkedIn URL. A contact that already has a LinkedIn URL is never bought again for its
title. A workspace whose settings list its own contact fields
(`enrichment.fields.contact`) keeps exactly that list; add `job_title` and `company` to
it to get them.

### Job title

People often hold several roles at once: a job, and a board seat, an investment or a
podcast somewhere else. Clustr only ever writes the title of the role at the company
your CRM puts the contact at, so a title never contradicts the contact's company.

1. **Who the person is.** The contact's LinkedIn URL; else the person their work email
   was looked up as; else the one current employee of the company behind the work
   email with exactly the contact's name. If two of these point at different people,
   nothing is written.
2. **Which company.** The work email's domain (also on another ending, such as
   `demodesk.com` for `demodesk.ai`, or a subdomain) and the contact's company name are
   matched against the person's current roles. When they point at different
   companies, nothing is written. When one of them matches none of the person's
   current roles, the title waits for you in Review instead of being filled.
3. **Which role there.** A job beats a side role (advisor, board member, investor,
   speaker); then the most recent one. "Sabbatical" is never a title.

The profile must have been read in the last 180 days. Measured on contacts that
already had a title, this picks a role at another company less than 1% of the time.

Contacts are looked up by their email address, so a contact with no email is skipped.
Contacts with a personal email address (Gmail, Outlook, GMX and similar) are skipped
too: an address like that says nothing about where someone works.

## Where the data comes from

Clustr first looks in its own data. A company or person Clustr already knows is filled
for free. Only records Clustr does not know yet, or knows only from data older than 30
days, are bought from paid data providers. Only those count against the budget.

A paid lookup that finds nothing is not tried again straight away. Clustr waits 14 days,
then 28, then 56, then 90 days between attempts.

> [!NOTE]
>
> Paid lookups run in the background. What they find is written on the **next** scan,
> not the one that started them.

## Turning it on

In **CRM Cleaning ▸ Settings ▸ Enrichment**, turn on **Fill in missing data**. Then, in
the Enrichment group of **What the agent checks**, choose:

* **A mode per field**: Off, Ask me or Do it, like any [check](https://docs.clustr-ai.com/crm-cleaning/settings.md).
  Every field starts on Do it. Under Ask me, Clustr still buys the data first and then
  asks you before writing it ("Credits are spent before we ask you").
* **Which records to enrich**:

| Option | Records that qualify |
| - | - |
| Active records (default) | Records someone is working: with an owner, changed in the last 180 days, or on an open deal |
| Tied to open deals | Only records on an open deal |
| Everyone | Every record Clustr can match |

Over the API, `enrichment.fields` also limits which fields are filled per object. An
object with an empty list is never spent on.

Within the audience, records on an open deal come first, then records with recent
activity, then records with an owner. Records with no activity for a year, no owner
and no open deal are skipped.

## The monthly budget

The budget is a number of records per calendar month. One record enriched is one credit,
whether it is a contact or a company. Clustr sets the cap for your workspace; it is at
most 5,000 records a month. Ask Clustr support to change it.

* **Only results count.** A lookup that finds nothing is refunded.
* **No single run takes it all.** One scan, or one click on **Enrich all**, spends at
  most about a third of what is left this month.
* **Contacts get a share.** Part of the budget is kept for contacts, based on how many
  contacts and companies you have (between 15% and 70%), so companies cannot use it
  all. What contacts do not use goes to companies. Over the API,
  `enrichment.contact_budget_share` sets a fixed share instead.
* **It resets** on the first day of each month at 00:00 UTC.
* **When it runs out**, nothing more is bought until the reset. Fills from Clustr's own
  data carry on.

**Settings ▸ Enrichment ▸ Credits this month** shows the credits used against the cap
and the reset date. Below it, the match rate says how many of the records sent to
enrichment this month the provider found, and what came of them, for example "Found 412
of 640 records (64%): 300 filled, 112 already complete", and which fields were filled
most.

| Count | Meaning |
| - | - |
| Sent | Records looked up this month: found plus not found |
| Found | The provider found the company or person, whether or not a field was filled |
| Filled | Found, and at least one blank field was filled |
| Already complete | Found, but your CRM already had a value for every field the provider returned |
| Not found | The provider could not find the company or person |

A lookup the provider could not answer in time is retried and counts as neither.
Contacts that were not found are counted from October 2026: October undercounts them,
and from November 2026 the numbers are complete. Companies are complete.

The Overview shows **Enrichment credits this month**, with what is left or "Limit
reached".
Over the API, read it from [`GET /api/crm/cleaning/budget`](https://docs.clustr-ai.com/crm-cleaning/api#health-completeness-and-summary).

## Enrich all

**Enrich all** runs an enrichment pass now, without a full scan. In the app, it sits
on **Overview ▸ Completeness**, under the trend, for fields enrichment can fill, with
the credits left this month. It is greyed out when no budget is set or the month's
budget is used up, and hidden while enrichment is off. You can also start it with
[`POST /api/crm/cleaning/enrich`](https://docs.clustr-ai.com/crm-cleaning/api#run-enrichment-only) or ask your
assistant (`start_crm_enrichment`).

* It fills every field you allowed, on contacts and companies, not only the one you
  clicked.
* It stays inside the monthly budget, and spends at most about a third of what is left.
* If a scan is already running, it does not start a second one.
* It does nothing while enrichment is off.

The results are written on the next scan.


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