# One contact record across calls, texts, and chat.

Assistable resolves every phone number, email, and web visitor to a single contact, so agents on every channel work from the same customer record. Import, tag, and act on lists at scale from one table.

## What it does

### One identity across every channel

Inbound calls, texts, and web chats resolve to a single contact record. Resolved addresses are stored per contact, so the next message from the same sender is one indexed lookup. Phone lookups try multiple format candidates, so formatting differences do not split records.

- Phone, email, and visitor ids map to one record
- Resolved addresses stored for one-lookup matching
- Voice and messaging share the same contact identity

### CSV import with dedupe built in

Upload a CSV, review auto-mapped columns with a preview, pick a dedupe key, and run it. Phones are stored in E.164 with the same normalizer the dialer uses and matched on the last 10 digits, so +1 (555) 111-2222 and 5551112222 are one contact. Matched contacts are tagged, never mutated.

- Headers auto-map across 40 recognized aliases
- Dedupe by phone, email, or none
- Matched contacts get tagged, never mutated
- Up to 5,000 rows per file

### Bulk actions verified server side

Select up to 1,000 contacts and tag, untag, set status, set DND, move to a folder, archive, unarchive, or delete in one call. The server verifies every id belongs to your account before acting and reports any it dropped. Deletes are soft archives, so nothing disappears silently.

- 8 bulk actions on up to 1,000 contacts per call
- Ownership checked per id; invalid ids reported
- Delete archives instead of destroying

### Tags that drive campaigns and agents

Tags are an account-level pool with unique names enforced. Filter by up to 25 tags, apply tags on import, and enroll campaigns from a filter on search, status, and tags. Active-tag rules pair a tag with an assistant on chosen channels, with priority and active-hour settings.

- Campaign enrollment reuses the list's filter query
- Apply up to 10 tags during import
- Rules bind a tag to an assistant per channel

### DND that outbound systems obey

Do-not-disturb is one flag on the contact. The outbound call API refuses to dial a DND contact, and the campaign engine skips them at dial time. If a contact opts out mid-campaign, the reconcile pass treats them as opted out and stops further attempts.

- Outbound API blocks DND contacts before dialing
- Campaign dialer skips DND at dial time
- Mid-campaign opt-outs are honored on reconcile

### Custom fields, folders, and the drawer

Define custom fields once at the account level with types, options, and ordering; they render on every contact in the edit drawer alongside identity, address, tags, and the DND switch. Folders and status tabs keep large lists workable, with live counts computed by grouped aggregates.

- Field definitions set once, rendered on every contact
- Folder and status counts stay live
- Tags attach and detach instantly from the drawer

## Under the hood

- **IDENTITY:** Phone, email, and web visitor ids resolve to one contact record across channels
- **IMPORT:** Up to 5,000 rows and 3 MB per CSV; 40 header aliases auto-map; dedupe by phone or email
- **PHONES:** Stored E.164 with the same normalizer the dialer uses; matched on last 10 digits
- **BULK:** 8 server-side actions on up to 1,000 contacts per call; every id ownership-checked
- **DND:** One flag blocks the outbound call API and skips the contact in campaign dialing
- **FIELDS:** Account-level custom field definitions with types, options, and required flags
- **AUDIT:** Each import logs created, matched, and skipped counts; last 20 kept as history

## FAQ

**How does Assistable unify identity across channels?**

Every inbound message resolves the sender to a contact: an indexed channel-identity lookup first, then phone, email, or web visitor fallbacks. The match is stored per contact, so the next message from that address is a single lookup. Client-supplied hints can prefill a new record but never match to an existing contact.

**What are the import and bulk limits?**

CSV imports accept up to 5,000 rows and 3 MB per file, with up to 10 tags applied on import. Bulk actions cover up to 1,000 contacts per call, and list pages return up to 100 contacts. Larger jobs run as multiple passes; imports insert in 500-row batches server side.

**Will importing a CSV overwrite my existing contacts?**

No. Rows that match an existing contact by your chosen dedupe key are never mutated; they only receive the tags you selected for the import. New rows are created, in-file duplicates drop first-occurrence-wins, and the result reports created, matched, and skipped counts.

**What does the DND flag actually stop?**

Outbound calls placed through the API are refused for DND contacts, and the campaign engine skips DND contacts at dial time. If someone opts out mid-campaign, the reconcile pass marks them opted out and stops further attempts.

**What does this cost to try?**

Signup is free pay-as-you-go. Contacts, tags, folders, custom fields, and imports are part of the platform; you pay for usage at $0.07 per minute of voice and $0.02 per message.

---
Source: https://www.assistable.ai/platform/contacts