Import Contacts and History
Bring selected contacts and conversations into CRM, preserve campaign data, and track progress in a pipeline.
Import contacts and history from another app or export with your agent, keeping the people, campaign membership, and conversations linked.
Start With Your Source
Give your agent access to the selected export or conversations and say what to bring into the company CRM. For example:
Import the contacts and X conversations from this outreach export. Keep the campaign labels and original messages. Check existing records, use our outreach pipeline, and show me the matches, stages, and conflicts before saving.
Your agent uses your existing source connection or file. The importer accepts JSON; your agent prepares it from the selected source. A spreadsheet or CSV needs mapping into that JSON first.
Choose Where Each Part Goes
| Source data | CRM destination |
|---|---|
| Person and X handle | Contact and its identity |
| Campaign label | Custom field, preserving the saved value |
| Outreach progress | Opportunity in the chosen pipeline |
| Messages and past meetings | Linked activity with original body, date, and direction |
| Follow-up still to do | Separate commitment with an owner and due date |
A campaign identifies the effort. A pipeline tracks progress. Keep both. For example, someone can belong to Product feedback sprint and be Contacted in the Outreach pipeline. An invitation alone does not establish a reply or booked meeting. Pipelines can track people without creating a company account or inventing a deal amount.
Your agent checks the company's existing fields, pipelines, people, and opportunities first. Existing entries, including closed ones, need review before adding another for the same effort. Missing field or pipeline definitions must be set up before importing their values. A contact with several campaigns may need campaign membership on each opportunity; keep existing values while agreeing that mapping.
Preview and Save
Your agent previews the import and shows new, updated, unchanged, and blocked items, with the campaign mapping and proposed stages. Names alone do not merge people. Resolve ambiguous matches before saving.
On MCP, use crm_imports_schema_get and crm_imports_create; the
cofounder-crm-import skill includes complete JSON examples. For CLI use:
cofounder crm imports schema get
cofounder crm imports create --file import.json
cofounder crm imports get --job-id <uuid>
cofounder crm imports cancel --job-id <uuid>Use --file - for redirected JSON input. Group dependent records into batches
of up to 25 items, within 100 batches and 2 MiB per import. References between
new records stay within their batch.
Set dry_run to true in the JSON for the preview. To save, set it to false
and use a new idempotency_key. Keep original source account and item IDs in
both files. Repeating identical JSON with its original key retrieves the same
import. For corrected content, use a new key and retain the source IDs.
To stop a running import, use crm_imports_cancel. It stops after the batch
being saved; batches already saved stay. Submit the same records with a new
idempotency_key to finish, and content already imported is left unchanged.
Check What Was Saved
Each batch saves all its changes or none. Other batches can succeed when one is blocked, so a completed import can still need corrections. Your agent checks the batch results, then reads back contacts, campaign values, pipeline entries, and representative messages. It reports saved and unresolved items separately and can open Contacts for you to review the pipeline.
Unchanged source content preserves later CRM edits. Corrected source content updates the fields supplied, including an activity's full links and metadata. Import only fields the source owns. History-only imports should leave current pipeline progress alone. Messages already captured by a connected channel need their existing CRM record; different source IDs do not automatically identify the same message. Source labels describe origin, not provider verification. Importing history sends no messages and grants no consent.