Skip to content
TriedDocs
Monitor

Contacts

The built-in contact list: automatic contacts from phone calls, CSV import, custom fields as dynamic variables, memory, conversations and field mapping from post-call data.


title: Contacts description: The built-in contact list: automatic contacts from phone calls, CSV import, custom fields as dynamic variables, memory, conversations and field mapping from post-call data. order: 8#

Contacts is a list of the people your agents talk to, one per phone number in the workspace. Every phone call is linked to a contact, which is created automatically the first time a number calls or is called. A contact's fields become dynamic variables on later calls, its memory carries context from one conversation to the next, and its page shows every call and SMS thread with that number.

Open it from DATA > Contacts.

The Contacts list with name, number, email, custom fields, call count and status

How contacts are created and linked#

  • When a phone call is created, Tried finds or creates the contact for the other party's number: the caller on inbound calls, the callee on outbound calls. Existing fields are never overwritten by this step. The call's contact_id points at it.
  • Web calls are not linked to contacts.
  • You can also add contacts by hand, upload a CSV, or create them through the API.
  • Phone numbers must be E.164 (for example +61412345678) and are unique per workspace.

The contact list#

Column Content
Name First and last name, or "Unknown"
Phone number E.164 number
Email Email address
Custom fields key: value pairs
Calls Number of calls linked to the contact
Last call Time of the most recent call
Status Callable or Do not call

Search name, number or email filters the list. Click a row to open the contact. A link from a call (Open contact in the call drawer) opens /contacts?id=<contact_id>.

Add or edit a contact#

Add contact opens a form:

Field Notes
Phone number E.164. Australian numbers typed as 04... or 02... are converted.
First name, Last name Up to 100 characters each.
Email Must be a valid address, or empty.
Custom fields Key and value pairs. Available to agents as {{field_name}} on calls with this contact.
Do not call Marks the contact as not callable.

Contact detail#

A contact with stats, memory, fields and conversations

The drawer shows the name, number and email, then:

  • Calls, Last call and Added tiles.
  • A Do not call switch.
  • Memory: the contact's memory brief, when it was last updated and how many conversations built it. See Memory.
  • Fields: each field with the variable name your prompts use, such as {{first_name}}, {{last_name}}, {{contact_email}} and {{plan}}.
  • Conversations: up to 100 recent calls with direction, time, duration, sentiment and the call summary. Click one to open it in Call History.

The pencil edits the contact and the trash icon deletes it. Deleting keeps the calls in Call History without a contact link.

Contact fields as dynamic variables#

On every call linked to a contact, the runtime adds these variables for the agent:

Variable Source
{{first_name}} First name, when set
{{last_name}} Last name, when set
{{contact_email}} Email, when set
{{do_not_call}} true or false
{{<custom field>}} Each custom field

Use them in prompts like any other dynamic variable.

Memory#

A contact's memory is a short brief (up to 2000 characters) that agents can read on later calls as {{contact_memory}}. It is turned on per agent with contact_memory_config: enable_update rewrites the memory after each call, enable_read makes it available during calls. See Contact memory.

The Memory section of a contact

On the contact page you can Add or Edit the memory by hand, Save it, or Clear it. The call drawer shows the same memory in the caller's Contact section, with the prior conversations below it.

  • After a call, the memory is rewritten from the old memory, the workspace memory prompt and the new conversation. Each conversation is billed once at $0.01.
  • The workspace memory prompt is set in Settings > Integrations > Post call memory.
Needs keys

Needs keys The rewrite uses OpenAI. Without a key, each conversation adds a dated line with its summary and custom analysis values, keeping the last 12 lines.

Upload a CSV#

Upload CSV opens Upload contacts. Rows are matched on phone number: new numbers are added and existing contacts are updated.

  • Recognised columns: phone number (also phone), first name, last name, email, do not call. Header matching ignores case.
  • Any other column becomes a custom field, with the name lowercased and other characters replaced by _.
  • do not call is true for true, yes, 1 or y.
  • Template downloads a sample file.
  • The preview shows the first 50 rows and marks numbers that are not valid E.164 in red.
  • Import N contacts sends the rows. The result shows how many were added, updated and skipped, with the first 5 row errors.

When a contact already exists, empty cells do not clear its fields and custom fields are merged.

The dashboard upload calls POST /import-contacts, which takes up to 5000 rows in one request.

Import jobs#

For larger files use the import job API. POST /create-contact-import-job accepts a multipart CSV upload, a csv string, or a contacts array, up to 50,000 rows. It returns 202 with a job you poll:

{
  "job_id": "contact_import_9f8e7d6c5b4a39281706f5e4",
  "status": "running",
  "source": "csv",
  "total": 12000,
  "processed": 4200,
  "created": 3900,
  "updated": 280,
  "errors": [{ "row": 17, "message": "phone_number: phone_number must be E.164, e.g. +61412345678" }],
  "error": null,
  "progress": 35,
  "created_timestamp": 1760850000000,
  "completed_timestamp": null
}

status moves from pending to running to complete (or failed with error). Rows are processed in batches of 200 and up to 1000 row errors are kept. The CSV parser also accepts number and mobile for the phone column and dnc for do not call. GET /list-contact-import-jobs returns the latest 50 jobs.

Contact fields from post-call data#

You can fill contact fields from each call's analysis, variables or metadata. Set mappings in Settings > Integrations > Contact fields from post-call data, or with PUT /contact-field-mappings (Admin or Developer).

Mapping field Values
contact_field first_name, last_name, email, or any custom field name
source analysis.<field> (a custom extraction field, call_summary or user_sentiment), variable.<name> or metadata.<key>
mode overwrite (default), fill_if_empty or accumulate

accumulate appends the new value to the existing one and merges them (up to 1000 characters). It applies to custom fields; for the built-in fields it behaves like overwrite. Email values that are not valid addresses are skipped. Up to 50 mappings.

Mappings run after post-call analysis, then contact memory, then CRM sync. They do not run on analysis backfills.

Backfill contacts#

Backfill contacts (in the same settings section) or POST /backfill-contacts links ended phone calls that have no contact, creating contacts as needed, and re-applies the mappings oldest call first. Body: from, to, agent_ids, limit (1 to 5000, default 1000) and apply_mappings (default true). It returns calls_scanned, calls_linked, contacts_created and contacts_updated.

Contacts API#

Endpoint Description
POST /create-contact Create a contact. 409 if the number exists.
GET /list-contacts search, do_not_call (true or false), limit (1 to 5000, default 1000). Each contact has call_count and last_call_timestamp.
GET /get-contact/:id The contact with its 100 most recent calls.
GET /get-contact-by-phone/:phone_number Lookup by number, with memory fields and call stats. Also ?phone_number=.
PATCH /update-contact/:id Update fields. 409 if the new number belongs to another contact.
DELETE /delete-contact/:id Delete; calls keep their data without a contact link.
GET /list-contact-fields Every custom field name in use.
GET /list-contact-conversations/:id Calls and SMS threads, newest first. limit (up to 200, default 50), before (epoch ms) and kind (all, call, sms). Returns next_before for the next page.
GET /contacts/:id/memory, PUT /contacts/:id/memory Read or replace the memory (null clears it).
POST /contacts/:id/memory/save-call Save one past call to memory (call_id). Billed like the automatic update.

Contact fields: contact_id, phone_number, first_name, last_name, email, custom_fields (string values), do_not_call, created_timestamp, last_modification_timestamp.

Gotchas#

  • CRM sync pushes contacts to your CRM. Records are not pulled back from the CRM into contacts.
  • When a caller asks not to be called and the agent has DNC detection on, the call ends with user_requested_dnc and the contact is marked Do not call.