# Contactos: las personas que conoce tu agente, con atributos propios

> Guarda un registro por persona en cada agente: visitantes verificados, leads, importaciones CSV y contactos de la API con atributos propios que las acciones del lado del servidor leen como {{contact.*}}.

Un contacto es una persona que tu agente conoce: su correo, su teléfono, su nombre, su ID de usuario en tu web y hasta 50 atributos propios, como un plan o un gestor de cuenta. Cada agente tiene sus propios contactos, en la pestaña **Leads**, en **Contacts**. Las [acciones API del lado del servidor](/es/docs/api-actions) pueden leerlos como marcadores `{{contact.*}}`. La IA nunca ve los atributos.

## De dónde vienen los contactos

| Origen | Se muestra como | Qué crea o cambia el contacto |
| --- | --- | --- |
| [Verificación de identidad](/es/docs/identity-verification) | **Verified visitor** | Un visitante con sesión iniciada en tu web chatea con el agente. El contacto recibe su ID de usuario como **External ID**, el nombre y el correo que pasó tu página, y los metadatos como atributos. |
| [Formulario de leads](/es/docs/lead-collection) o [datos de contacto escritos en el chat](/es/docs/lead-alerts-and-export#guardar-los-datos-escritos-en-el-chat) | **Lead** | Se guarda un lead con un correo o un teléfono que todavía no tiene ningún contacto. |
| [Importación CSV](#importar-un-archivo-csv) | **Import** | Una fila de tu archivo. |
| [API REST](/es/docs/rest-api#contactos) o [servidor MCP](/es/docs/mcp-server) | **API** | Tus propios sistemas crean o actualizan el contacto. |

Hay un contacto por ID externo y uno por dirección de correo. Cada origen cambia un contacto solo hasta donde se puede confiar en él:

- **Visitantes verificados.** El contacto se busca únicamente por el ID de usuario. Cuando cambian el nombre, el correo o los metadatos que pasa tu página, el contacto se actualiza: las claves de los metadatos que son nombres de atributo válidos (en minúsculas, consulta [Atributos](#atributos)) pasan a ser atributos, y las demás se omiten. El correo solo se toma si ningún otro contacto lo tiene. Un visitante verificado nunca se fusiona con un contacto existente por el correo, porque solo se firma el ID de usuario: si no, un visitante con sesión iniciada podría apropiarse del contacto de otra persona pasando su correo. La hora de **Last seen** sigue a sus chats.
- **Leads.** Un correo o un teléfono nuevo crea un contacto. Si el correo o el teléfono ya pertenece a un contacto que también vino de un lead, se rellenan sus campos vacíos. Un lead nunca cambia un contacto que vino de un visitante verificado, de una importación o de la API, porque cualquiera puede escribir cualquier dirección de correo. A los visitantes nunca se les dice si un contacto ya existía.
- **Importaciones, la API y el panel.** Vienen de ti, así que sus valores sustituyen a lo que hay guardado.

Los leads siguen en **Collected Leads** como antes. Un contacto es un registro adicional junto a ellos, no un sustituto.

## Buscar y abrir un contacto

La tarjeta **Contacts** lista los contactos del agente, empezando por los vistos más recientemente, con el número usado del límite de tu plan. Busca por correo, nombre, ID externo o teléfono, o filtra por origen. Haz clic en un contacto para abrirlo:

- Su correo, su teléfono, su nombre y su ID externo, y cuándo se vio por primera y por última vez.
- Todos sus atributos.
- Sus conversaciones, hasta las 20 más recientes, cada una con un enlace a la pestaña **Conversations**. Son los chats a los que se vinculó el contacto y, para un visitante verificado, todos los chats con su ID de usuario.

## Atributos

Los atributos son campos propios de un contacto, como `plan`, `account_manager` o `seats`.

- Un nombre empieza por una letra minúscula y usa letras minúsculas, dígitos y guiones bajos, hasta 40 caracteres.
- `email`, `name`, `phone`, `external_id`, `id`, `source`, `first_seen_at`, `last_seen_at`, `created_at` y `updated_at` están reservados.
- Un valor es un texto de hasta 1.000 caracteres, un número o verdadero/falso. Desde el panel y en un archivo CSV, los valores se guardan como texto.
- Un contacto puede tener hasta 50 atributos.

Para editarlos, abre un contacto, cambia los nombres y los valores, usa **Add attribute** o la **×** junto a uno para quitarlo, y haz clic en **Save attributes**.

## Importar un archivo CSV

1. En la tarjeta **Contacts**, haz clic en **Import CSV** y elige un archivo `.csv` de hasta 5 MB y 10.000 filas. Sirven como separadores las comas, los puntos y coma y los tabuladores.
2. intoCHAT lee el archivo y muestra una vista previa sin guardar nada: cómo se usa cada columna, las primeras filas y cuántos contactos se crearían, se actualizarían y se omitirían, con los motivos de las 20 primeras filas omitidas.
3. Haz clic en **Import** para guardar. El resultado muestra cuántos contactos se crearon, se actualizaron y se omitieron.

Cómo se lee el archivo:

- Las columnas `external_id`, `email`, `phone` y `name` rellenan el contacto. Los nombres de columna se pasan antes a snake_case, así que funcionan tanto `External ID` como `externalId`.
- Cualquier otra columna pasa a ser un atributo: `Plan Tier` se guarda como `plan_tier`. Un nombre de columna que no puede convertirse en atributo, como `2024 spend`, detiene la importación con un mensaje que lo nombra.
- Las columnas `source`, `first_seen_at`, `last_seen_at`, `created_at`, `updated_at` e `id` se ignoran, para que un archivo exportado se pueda volver a importar.
- Cada fila actualiza el contacto con su `external_id`, si no el contacto con su `email`, y si no crea un contacto nuevo. Una fila cuyo correo pertenece a un contacto con otro ID externo se omite.
- Una celda vacía no cambia nada. Para quitar un atributo, edita el contacto.
- Una fila sin `external_id` ni `email` se omite, igual que una fila con un correo o un teléfono no válido, un valor de más de 1.000 caracteres o uno que daría a un contacto más de 50 atributos.
- Los contactos nuevos se detienen en el límite de tu plan; las filas que lo superan se omiten con ese motivo.

## Exportar un archivo CSV

**Export CSV** descarga los contactos que coinciden con la búsqueda y el filtro actuales: `external_id`, `email`, `phone`, `name`, `source`, `first_seen_at`, `last_seen_at` y después una columna por atributo. Una celda que empieza por `=`, `+`, `-` o `@` lleva un apóstrofo delante, para que una hoja de cálculo la muestre como texto y nunca la ejecute como fórmula. Al volver a importar el archivo se quita el apóstrofo.

## Usar los contactos en las acciones

Una [acción API del lado del servidor](/es/docs/api-actions) puede usar estos marcadores en su URL, sus parámetros, sus cabeceras y su cuerpo:

| Marcador | Se rellena con |
| --- | --- |
| `{{contact.email}}` | El correo del contacto |
| `{{contact.name}}` | El nombre del contacto |
| `{{contact.phone}}` | El teléfono del contacto |
| `{{contact.external_id}}` | El ID externo del contacto |
| `{{contact.<attribute>}}` | Un atributo, por ejemplo `{{contact.plan}}` |

```text
GET https://api.example.com/accounts/{{contact.external_id}}?plan={{contact.plan}}
```

Qué contacto se usa:

- Para un visitante que tu web identificó y verificó, el contacto con su ID de usuario como ID externo, y ningún otro.
- Para cualquier otra persona, el contacto del lead guardado en esta conversación, buscado por su correo o su teléfono. Un contacto con ID externo nunca se usa de esta forma: pertenece a un usuario de tu web, y solo sus chats verificados pueden leerlo.

intoCHAT los rellena en sus servidores. La IA nunca los ve y no puede elegirlos. Si no hay contacto, o al contacto le falta uno de los valores que usa la acción, la acción no se ejecuta. Al agente se le dice que la acción necesita datos que no tiene, con las mismas palabras exista o no el contacto, así que el visitante no averigua nada sobre tus contactos. A diferencia de `{{user.*}}`, nunca se envía nada vacío.

- Un marcador desconocido, como `{{contact.Plan}}` o `{{contact.id}}`, no se puede guardar.
- **Send test request** en el editor no tiene visitante, así que una acción que usa `{{contact.*}}` no se puede probar ahí.
- Una [acción del lado del cliente](/es/docs/client-actions) nunca recibe datos de contactos, porque su petición se monta en el navegador del visitante.
- En el Playground, **Test as a signed-in visitor** usa el contacto con ese ID de usuario, si tienes uno. Las identidades de prueba nunca crean contactos.

> Sin verificación de identidad, un contacto se encuentra por el correo o el teléfono que escribió el visitante, que cualquiera puede escribir. Pon en los atributos solo lo que no te importaría que viera la acción de ese visitante, o deja que la acción consulte lo sensible por `{{contact.external_id}}` para los visitantes verificados.

## Eliminar un contacto

Abre el contacto y haz clic en **Delete contact**. Sus atributos se van con él. Sus leads y conversaciones se conservan. Si el mismo visitante verificado vuelve a chatear, o el mismo correo llega como lead nuevo, se crea un contacto nuevo. Al eliminar un agente se eliminan sus contactos. Al [duplicar un agente](/es/docs/quick-start) no se copian.

## Quién puede hacer qué

Todos los miembros de tu [equipo](/es/docs/team) pueden ver los contactos y exportarlos. Los editors, los admins y el propietario pueden editar atributos, importar un archivo y eliminar contactos.

## Límites

| | Free | Starter | Pro | Enterprise |
| --- | --- | --- | --- | --- |
| Contactos por agente | 100 | 5.000 | 25.000 | 100.000 |

Una importación o una llamada a la API que superaría el límite se rechaza con un mensaje que indica el límite. Los visitantes verificados y los leads nuevos que lo superan simplemente no se guardan como contactos, y el chat no se ve afectado. Después de bajar de plan, un agente conserva todos sus contactos y puede seguir actualizándolos, pero no recibe contactos nuevos hasta que esté por debajo del límite.
