CRM & Notion Data Audit — Diff Your Records Against a Dataset
Under maintenancePricing
from $3.50 / 1,000 discrepancy founds
CRM & Notion Data Audit — Diff Your Records Against a Dataset
Under maintenanceCompare Notion, HubSpot, Supabase or any MCP-connected app against an Apify dataset. Reports what never made it in, what's gone stale, and which fields have drifted apart. Read-only — it never writes to your app.
Pricing
from $3.50 / 1,000 discrepancy founds
Rating
0.0
(0)
Developer
K O
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
5 days ago
Last modified
Categories
Share
Nobody trusts a CRM they haven't checked. This Actor checks it.
Give it a dataset you treat as the source of truth and a connected app to compare against, and it reports three things:
- Missing — source rows that never made it into the app.
- Stale — records in the app with no matching row in the source any more.
- Drifted — records on both sides where a field no longer agrees.
It never writes. Point it at a live production CRM without a second thought.
Why run it
Sync jobs fail quietly. Someone edits a record by hand. An import half-finishes. Six months later nobody can say whether the CRM matches reality.
This turns that into a list you can act on — and pairs naturally with the write-side Actors: audit first, see the damage, then fix it with a sync or a field fill.
Signal, not noise
The comparison is deliberately forgiving about things that don't matter:
- Blank on both sides counts as agreement — an empty cell and a missing field are not a discrepancy.
- Scalars compare trimmed and case-folded, so
" Acme "andacmedon't generate a finding. 0andfalseare treated as real values, not blanks.- Identical records are omitted from the report by default.
How it works
- Connect your app under Integrations in Apify Console.
- Run in
list-toolsmode to learn the connector's tool names. - Run in
auditmode.
{"destination": "<your connector>","mode": "audit","datasetId": "<source-of-truth dataset>","readTool": "query_database","readToolArgs": { "database_id": "abc123" },"cursorArgName": "start_cursor","cursorPath": "next_cursor","matchKey": "email","compareFields": ["phone", "owner", "status"]}
Set up pagination if your app pages. An audit against a partial read will wrongly report records as missing.
cursorArgName+cursorPathmake the read complete.
Input
| Field | Required | Description |
|---|---|---|
destination | yes | MCP connector to audit |
mode | audit (default) or list-tools | |
datasetId | for audit | Dataset treated as source of truth |
readTool / readToolArgs | for audit | Tool that lists the app's records |
cursorArgName / cursorPath / maxPages | Pagination for a complete read | |
matchKey | for audit | Field joining both sides |
destMatchKey | Only if the app names that field differently | |
compareFields | Fields to check for drift. Empty = presence only | |
fieldMap | Only if a compared field is named differently in the app | |
reportMissingAtDestination | Default on | |
reportMissingInSource | Default on | |
reportChanged | Default on | |
includeIdentical | Default off |
Output
One row per finding:
{ "status": "changed", "key": "a@example.com","differences": [{ "field": "phone", "source": "480-555-0100", "destination": "480-555-9999" }] }
{ "status": "missing_at_destination", "key": "b@example.com", "differences": [] }
Full counts — including how many records were identical — are saved to the SUMMARY key-value record, so you can track drift over time without paying per row.
Pricing
$5 per 1,000 findings reported. Records that agree are free, and an audit that finds nothing wrong costs nothing.
FAQ
Does it modify my CRM? No. This Actor only reads.
What if my app pages its results? Set cursorArgName and cursorPath, or the audit will report a false "missing" for everything past page one.
What if a record has no join key? It's counted as keyless in the summary and skipped, rather than reported as missing.
Can an AI agent call this? Yes — it's exposed through the Apify MCP server, and being read-only it's safe for an agent to call unattended.