Importing data
Bring contacts and accounts into Pact from CSV files, CRM exports, and external integrations.
Pact supports multiple ingestion paths depending on where your data lives today. All paths converge on the same deduplication and consent logic.
CSV import
The most common way to bring data in. Go to Accounts → Import (for company records) or Contacts → Import (for individual contacts).
Required and optional columns
| Column | Entity | Notes |
|---|---|---|
email | Contact | Primary dedup key |
name | Contact | Full name, or split into first_name / last_name |
company | Contact | Creates or matches an account record |
domain | Account | Used for logo enrichment and CRM matching |
phone | Contact | Stored raw; normalized on display |
consent_status | Contact | confirmed, pending, or declined |
Any unrecognized column is stored as a custom field on the contact or account. You can rename and type those fields in Settings → Custom Fields.
Deduplication
Contacts are deduplicated on email. If a row matches an existing contact:
- New columns that are blank on the existing record are filled in.
- Existing values are not overwritten unless you check Overwrite existing data on the import screen.
- Consent status is never silently downgraded — a
confirmedcontact will not becomependingon re-import.
Column mapping
After uploading your CSV, Pact presents a mapping screen. Fuzzy matching handles common column name variations (First Name, firstname, first_name all map to first_name). Review the mapping before confirming.
Large files
Files up to 50 MB are supported. Imports over 10 000 rows are processed asynchronously — you will receive a notification when complete. Progress is visible on the Activity page.
Consent on import
Every contact record carries a consent_status field:
| Status | Meaning |
|---|---|
confirmed | Contact has explicitly opted in. Can receive marketing sequences. |
pending | Consent not yet collected. Use a re-engagement sequence before sending marketing. |
declined | Contact has opted out. All outbound is suppressed. |
If your CSV does not include a consent_status column, Pact uses your tenant's default consent policy (found in Settings → Privacy).
Set
consent_status = pendingfor any list where opt-in was implicit (e.g., a trade-show badge scan). Send a re-engagement sequence to collect explicit consent before enrolling in marketing campaigns.
API import
The REST API supports the same import logic programmatically:
POST /v1/contacts
Content-Type: application/json
{
"email": "[email protected]",
"name": "Alice Nguyen",
"company": "Acme Corp",
"consent_status": "confirmed"
}
Bulk upserts (up to 500 records per request) are available at POST /v1/contacts/bulk.
CRM sync
If you are migrating from Salesforce, HubSpot, or another CRM, see Connecting your CRM for the integration-based sync path. CRM sync preserves relationship history and maps opportunity stages to Pact pipeline stages.
What happens after import
- Enrichment — if your tenant has an enrichment provider configured, Pact enqueues a background job to fill in missing firmographic data (industry, employee count, website) for new account records.
- Account matching — contacts are linked to accounts by domain if no explicit
companycolumn is present. - Playbook evaluation — if a playbook rule matches a newly imported contact (e.g., "enroll any new contact from the
SaaSindustry segment"), it fires automatically.
Exporting data
Contacts and accounts can be exported as CSV from the list views via Export → Download CSV. The export includes all standard and custom fields.