> ## Documentation Index
> Fetch the complete documentation index at: https://docs.callkaro.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Keeping Contacts Up to Date

> How calls, chats and workflows write to the CRM on their own

You rarely need to type into the CRM. Each channel writes what it learns onto the contact behind that conversation, matched by phone number.

| Where | How it writes | Source recorded |
| - | - | - |
| **Chat agent, automatically** | The built-in `update_contact` tool. The agent calls it whenever the person mentions something that matches one of your attributes. | `llm` |
| **Chat agent, from your code** | `update_contact_custom(...)` inside a [custom function](/chat-agents/functions/custom-functions#write-to-the-contact). | `function`, with the message id |
| **Voice agent, after a call** | **Update Contacts** rules under [Post Call Variables Strategy](/agents/configurations/post-call-variables-strategy#update-contacts). | `call`, with the call id |
| **Workflow** | An [Update Contact](/workflows/build-a-workflow#update-contact) node. | `function`, with the workflow id |
| **CSV upload** | [Upload Leads](/crm/leads#upload-leads-from-a-csv). | `import` |
| **A person** | **Update lead** in the CRM. | `manual` |

## The rules every writer follows

* **Hand edits.** A chat agent (`update_contact` or `update_contact_custom`) can overwrite a value someone typed in the CRM. Calls, workflows and CSV uploads keep it.
* **Only defined attributes.** A name that is not an [attribute](/crm/attributes) is skipped.
* **Types are checked.** CSV uploads, CRM edits, post-call Update Contacts rules and workflow Update Contact nodes skip a value that does not fit its attribute's type. Custom functions skip an enum value outside its allowed values. The chat agent's `update_contact` is told each attribute's type and allowed values, so describe them clearly.
* **Empty means "nothing to write".** An automated writer with no value for an attribute leaves the stored value alone. Only a person clearing a field in the CRM removes a value.

<Tip>
  Turn off **Updatable by AI** on an attribute the AI should not guess at, such as an internal priority. Rules you set up yourself (post-call Update Contacts, workflow nodes, custom functions) can still write it, because those are your decision rather than the AI's.
</Tip>

## See what wrote a value

**View lead** shows each attribute with its source and when it was last written. If a value is not changing when you expect it to, check its source first: `manual` means a person set it, and calls, workflows and CSV uploads will not change it until that value is cleared.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.