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

# CRM Cleaning Capabilities by Provider

> Which CRM Cleaning detectors can apply a fix, and which are report-only, on each connected provider

CRM Cleaning scans your connected CRM for data-quality issues — duplicate records, missing
associations, formatting problems, incomplete fields, and (on HubSpot) lifecycle-stage anomalies.
Not every fix is possible on every provider: what a detector can *do* depends on what write APIs
the provider itself exposes.

Clustr never hides this. A finding your CRM can't act on is always labeled report-only rather than
shown the same way as a finding you can apply — and the tables below tell you which is which for
your provider **before** you run a scan. You can also read this live for your own tenant from
`GET /api/crm/cleaning/capabilities`, which returns the same information this page documents.

<Note>
  This page is checked against Clustr's cleaning engine in CI — the tables below cannot go stale
  without breaking a build.
</Note>

## Provider capability matrix

These are the three CRM-write capabilities CRM Cleaning's detectors depend on.

| Capability       | HubSpot | Salesforce | Attio |
| ---------------- | ------- | ---------- | ----- |
| Record merge     | Yes     | No         | No    |
| Associations     | Yes     | Yes        | Yes   |
| Lifecycle stages | Yes     | No         | No    |

* **Record merge** — a real API to merge two records into one, keeping a single survivor.
* **Associations** — a graph/association write model (e.g. linking a contact to its company).
* **Lifecycle stages** — a HubSpot-style lifecycle-stage / deal-pipeline model. Attio has no
  equivalent concept; Salesforce's Stage/Status fields model something different, not a drop-in
  substitute.

## Detector actionability by provider

| Detector                  | HubSpot | Salesforce | Attio   |
| ------------------------- | ------- | ---------- | ------- |
| company\_canonicalize     | Full    | Full       | Full    |
| completeness\_scorecard   | Full    | Full       | Full    |
| contact\_enrichment\_fill | Full    | Full       | Full    |
| deal\_stage\_regression   | Full    | Skipped    | Skipped |
| duplicate\_detector       | Mixed   | Mixed      | Mixed   |
| enrichment\_fill          | Full    | Full       | Full    |
| format\_normalize         | Full    | Full       | Full    |
| lifecycle\_anomaly        | Full    | Skipped    | Skipped |
| missing\_association      | Full    | Full       | Full    |
| ownerless                 | Full    | Full       | Full    |

* **Full** — findings can be applied directly from the review queue.
* **Flag only** — the detector runs and findings are shown, but they're report-only: there's no
  write API on this provider to apply them, so you'll need to fix them in your CRM directly.
* **Skipped** — the detector doesn't run at all: this provider has no equivalent of the concept it
  checks (e.g. lifecycle stages on Attio), so a finding would have nothing real to point at.
* **Mixed** (duplicate detection only) — duplicate clusters are always flagged for review on every
  provider. Turning a cluster into a merge additionally requires record-merge capability, so on
  Salesforce and Attio the cluster is visible but the one-click merge action isn't offered.

Missing associations are actionable on every connected provider today — Attio and Salesforce both
added association writes after CRM Cleaning first shipped HubSpot-only. Record merge and lifecycle
stages remain HubSpot-only: Attio has no lifecycle-stage concept to build against, and record merge
on Salesforce/Attio is tracked separately and only prioritized if a customer needs it.
